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 dariDateFormat.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.