Dukungan Unicode dan internasionalisasi

Android memanfaatkan library ICU dan project CLDR untuk menyediakan dukungan Unicode dan internasionalisasi lainnya. Pembahasan dokumen ini mengenai dukungan Unicode dan internasionalisasi dibagi menjadi dua: Android 6.0 (API level 23) ke bawah, dan Android 7.0 (API level 24) ke atas.

Dukungan Unicode dan internasionalisasi hingga Android 6.0 (API level 23)

Platform Android menggunakan ICU dan CLDR untuk menerapkan berbagai class guna menangani ortografi Latin dan non-Latin, mengekspos class seperti Locale, Character, dan berbagai subclass java.text. Aplikasi yang menerapkan fungsionalitas internasionalisasi di luar class yang diekspos dan menargetkan versi platform sebelum Android 6.0 (API level 23) harus menyertakan library ICU dalam APK-nya.

Pembuatan versi

Setiap rilis platform Android baru disertai dengan versi ICU yang lebih baru (serta versi CLDR dan Unicode yang terkait). Tabel 1 menunjukkan keterkaitan ini hingga Android 6.0 (API level 23).

Tabel 1. Versi ICU dan CLDR yang digunakan hingga Android 6.0 (API level 23).

Platform (level API) ICU CLDR Unicode
Android 1.5–2.0 (API level 3–7) 3.8 1.5 5.0
Android 2.2 (API level 8) 4.2 1.7 5.1
Android 2.3–3.0 (API level 9–13) 4.4 1.8 5.2
Android 4.0 (API level 14–15) 4.6 1.9 6.0
Android 4.1 (API level 16–17) 4.8 2.0 6.0
Android 4.3 (API level 18) 50 22.1 6.2
Android 4.4 (API level 19–20) 51 23 6.2
Android 5.0 (API level 21–22) 53 25 6.3
Android 6.0 (API level 23) 55.1 27.0.1 7.0

Aplikasi yang menargetkan Android 7.0 (API level 24) atau yang lebih baru dapat memanfaatkan dukungan yang lebih lengkap untuk Unicode dan internasionalisasi yang diekspos oleh framework Android. Bagian dokumen berikutnya menguraikan detail tentang dukungan tersebut.

Dukungan Unicode dan internasionalisasi di Android 7.0 (API level 24) dan yang lebih tinggi

Dimulai dari Android 7.0 (API level 24), platform Android mengekspos subset ICU4J API yang dapat digunakan oleh developer aplikasi dalam paket android.icu. ICU4J adalah set library Java open source yang banyak digunakan, serta menyediakan dukungan Unicode dan internasionalisasi untuk aplikasi perangkat lunak.

ICU4J API menggunakan data pelokalan yang ada di perangkat. Oleh karena itu, Anda dapat meminimalkan jejak APK dengan tidak mengompilasi library ICU4J ke APK; library ini dapat dipanggil dengan mudah dalam framework. (Dalam hal ini, Anda mungkin perlu menyediakan beberapa versi APK agar pengguna yang menjalankan versi Android di bawah Android 7.0 (API level 24) dapat mendownload versi aplikasi yang berisi library ICU4J.)

Dokumen ini dimulai dengan beberapa informasi dasar tentang level minimum Android API yang diperlukan untuk mendukung library ini. Dokumen ini kemudian menjelaskan semua yang perlu Anda ketahui tentang penerapan ICU4J spesifik Android. Terakhir, dokumen ini memberi tahu Anda cara menggunakan ICU4J API dalam framework Android.

ICU4J di Android

Android mengekspos subset ICU4J API melalui paket android.icu, bukan com.ibm.icu. Framework Android mungkin memilih untuk tidak mengekspos ICU4J API karena berbagai alasan: misalnya, karena API sudah tidak digunakan lagi atau tidak dideklarasikan sebagai stabil. Apabila tim ICU menghentikan API di masa mendatang, Android juga akan menandainya sebagai tidak digunakan lagi, tetapi akan terus menyertakannya.

Berikut beberapa hal penting yang perlu diperhatikan:

  • API framework Android ICU4J tidak menyertakan semua ICU4J API.
  • NDK tidak mendukung ICU4C Android.
  • API dalam framework Android tidak menggantikan dukungan Android untuk melakukan pelokalan dengan resource.
  • Dalam beberapa situasi, framework Android mendukung lebih banyak karakter daripada library ICU. Hal ini benar, misalnya, untuk dukungan emoji dari class android.text.

Melakukan migrasi ke paket android.icu dari com.ibm.icu

Jika sudah menggunakan ICU4J API dalam aplikasi, dan android.icu API dapat memenuhi persyaratan Anda, melakukan migrasi ke API framework tersebut akan mengharuskan Anda mengubah impor Java dari com.ibm.icu ke android.icu. Anda kemudian dapat menghapus salinan file ICU4J milik sendiri dari APK.

Catatan: ICU4J framework API menggunakan ruang nama android.icu, bukan com.ibm.icu. Hal ini dilakukan untuk menghindari konflik ruang nama dalam APK yang memuat library com.ibm.icu miliknya sendiri.

Melakukan migrasi ke android.icu API dari Android SDK API lain

Beberapa class dalam paket java dan android memiliki padanan dengan yang ada dalam ICU4J. Namun, ICU4J biasanya memberikan dukungan yang lebih luas untuk standar dan bahasa.

Tabel 2 menunjukkan beberapa contoh padanan ini untuk membantu Anda memulai:

Tabel 2. Class ICU4J Java dan Android

Class Alternatif
java.lang.Character android.icu.lang.UCharacter
java.text.BreakIterator android.icu.text.BreakIterator
java.text.DecimalFormat android.icu.text.DecimalFormat
java.util.Calendar android.icu.util.Calendar
android.text.BidiFormatter android.icu.text.Bidi
android.text.format.DateFormat android.icu.text.DateFormat
android.text.format.DateUtils android.icu.text.DateFormat android.icu.text.RelativeDateTimeFormatter

Pembuatan versi

Setiap rilis platform Android baru disertai dengan versi ICU yang lebih baru (serta versi CLDR dan Unicode yang terkait). Tabel 3 menunjukkan keterkaitan ini dimulai dari Android 7.0 (API level 24).

Tabel 3. Versi ICU dan CLDR yang digunakan di Android 7.0 (API level 24) dan yang lebih tinggi.

Platform (level API) ICU CLDR Unicode
Android 7.0 - 7.1 (API level 24 - 25) 56 28 8.0
Android 8.0 - 8.1 (API level 26 - 27) 58.2 30.0.3 9.0
Android 9 (API level 28) 60.2 32.0.1 10.0
Android 10 (API level 29) 63.2 34 11.0

Setelan format waktu 24 jam/12 jam

ICU di Android tidak mengikuti setelan format waktu 24 jam/12 jam yang ditetapkan pengguna (diperoleh dari DateFormat.is24HourFormat()). Untuk mengikuti setelan ini, gunakan metode pemformatan waktu DateFormat atau DateUtils, atau gunakan pola pemformatan waktu ICU dengan simbol pola jam yang sesuai ('h' untuk 12 jam, 'H' untuk 24 jam) untuk nilai hasil is24HourFormat() yang berbeda. Misalnya, kode berikut akan menghasilkan string dengan waktu saat ini yang mengikuti setelan 12 jam/24 jam pengguna:

Kotlin

    val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
    val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
            skeleton,
            Locale.getDefault()).format(Date()
    )
    

Java

    String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
    String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
    

Stabilitas Transliterator

Dimulai dari Android 10 (API level 29), Transliterator disediakan untuk mentransliterasi teks dari satu format ke format lainnya. Set ID transliterasi yang tersedia tidak cukup stabil di seluruh rilis dan perangkat Android. Produsen perangkat dapat menambahkan ID transliterasi tambahan. Developer harus memeriksa ID yang tersedia (diperoleh dari Transliterator.getAvailableIDs()) sebelum mentransliterasi teks.

Pelisensian

ICU4J dirilis dengan lisensi ICU. Untuk detailnya, lihat Panduan Pengguna ICU.