Dukungan Unicode dan penginternasionalan

Android memanfaatkan library ICU dan project CLDR untuk menyediakan dukungan Unicode dan internasionalisasi lainnya. Pembahasan halaman 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 memerlukan fungsi internasionalisasi di luar class yang diekspos, dan menargetkan versi platform hingga Android 6.0 (API level 23), harus menyertakan library ICU.

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

Framework Android memberikan dukungan yang lebih komprehensif untuk Unicode dan internasionalisasi aplikasi yang menargetkan Android 7.0 (API level 24) dan versi lebih tinggi. Bagian dokumen berikutnya menguraikan detail tentang dukungan tersebut.

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

Untuk Android 7.0 (API level 24) dan versi lebih tinggi, platform Android menampilkan 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. Hasilnya, Anda dapat mengurangi jejak aplikasi Anda dengan tidak mengompilasi library ICU4J ke aplikasi Anda. Sebaliknya, Anda malah dapat memanggilnya dalam framework. Jika melakukannya, Anda mungkin menyediakan beberapa versi APK agar pengguna yang menjalankan versi Android lebih rendah dari Android 7.0 (API level 24) dapat mendownload versi aplikasi yang berisi library ICU4J.

Bagian 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. Beberapa ICU4J API tidak diekspos oleh framework Android karena beberapa alasan seperti API 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 pengingat:

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

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 namespace 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 API android.icu dari API Android SDK 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

ICU4C di Android

Android mengekspos subset ICU4C API melalui library libicu.so, bukan libicuuc.so atau libicui18n.so. API ini tersedia mulai dari Android 12 (API level 31). Header NDK tersedia mulai dari rilis NDK r22b. Tidak ada API C++ yang terekspos melalui Android NDK. Beberapa API C tidak tersedia.

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
Android 11 (API level 30) 66.1 36 13.0
Android 12 (API level 31) 68.2 38.1 13.0

Setelan format waktu 24 jam/12 jam

ICU di Android tidak mengamati setelan format waktu 24 jam/12 jam pengguna yang diperoleh dari DateFormat.is24HourFormat(). Untuk mengamati setelan ini, gunakan metode pemformatan waktu DateFormat atau DateUtils atau gunakan pola pemformatan waktu ICU dengan simbol pola jam ('h' selama 12 jam, 'H' selama 24 jam) untuk nilai is24HourFormat() yang berbeda. Misalnya, kode berikut 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, yang diperoleh dari Transliterator.getAvailableIDs(), sebelum mentransliterasi teks.

Pemberian (hak) lisensi

ICU4J dirilis dengan lisensi ICU. Untuk mengetahui detailnya, lihat Panduan pengguna ICU.