Unicode ve uluslararasılaştırma desteği

Android, Unicode ve diğer uluslararasılaştırma desteğini sağlamak için ICU kitaplığından ve CLDR projesinden yararlanır. Bu sayfada Unicode ve uluslararasılaştırma desteğiyle ilgili tartışma iki bölüme ayrılmıştır: Android 6.0 (API düzeyi 23) ve önceki sürümler ile Android 7.0 (API düzeyi 24) ve sonraki sürümler.

Android 6.0 (API düzeyi 23) sürümüne kadar Unicode ve uluslararasılaştırma desteği

Android platformu, hem Latin hem de Latin olmayan yazım sistemlerini işlemek için çeşitli sınıfları uygulamak üzere ICU ve CLDR'yi kullanır. Bu sınıflar arasında Locale, Character ve java.text'nin birçok alt sınıfı bulunur. Açığa çıkarılan sınıfların ötesinde uluslararasılaştırma işlevleri gerektiren ve platformun Android 6.0 (API düzeyi 23) ile uyumlu sürümlerini hedefleyen uygulamalar ICU kitaplığını içermelidir.

Sürüm oluşturma

Android platformunun sonraki sürümleri, ICU'nun daha yeni sürümlerine ve ilgili CLDR ile Unicode sürümlerine karşılık gelir. Tablo 1'de bu yazışma Android 6.0 (API düzeyi 23) sürümüne kadar gösterilmektedir.

Tablo 1. Android 6.0 (API düzeyi 23) sürümünde kullanılan ICU ve CLDR sürümleri.

Platform (API düzeyi) yoğun bakım ünitesi CLDR Unicode
Android 1.5-2.0 (API düzeyleri 3-7) 3.8 1,5 5,0
Android 2.2 (API düzeyi 8) 4,2 1.7 5.1
Android 2.3-3.0 (API düzeyleri 9-13) 4.4 1,8 5.2
Android 4.0 (API düzeyleri 14-15) 4.6 1,9 6.0
Android 4.1 (API düzeyleri 16-17) 4.8 2,0 6.0
Android 4.3 (API düzeyi 18) 50 22.1 6.2
Android 4.4 (API düzeyleri 19-20) 51 23 6.2
Android 5.0 (API düzeyleri 21-22) 53) 25 6,3
Android 6.0 (API düzeyi 23) 55,1 27.0.1 7,0

Android çerçevesi, Android 7.0 (API düzeyi 24) ve sonraki sürümleri hedefleyen uygulamalar için Unicode ve uluslararasılaştırma konusunda daha kapsamlı destek sunar. Bu sayfanın sonraki bölümünde bu destekle ilgili ayrıntılar verilmektedir.

Android 7.0 (API düzeyi 24) ve sonraki sürümlerde Unicode ve uluslararasılaştırma desteği

Android 7.0 (API düzeyi 24) ve sonraki sürümlerde Android platformu, uygulama geliştiricilerin android.icu paketi altında kullanması için ICU4J API'lerinin bir alt kümesini kullanıma sunar. ICU4J, yazılım uygulamaları için Unicode ve uluslararasılaştırma desteği sağlayan, yaygın olarak kullanılan bir Java kitaplıkları kümesidir.

ICU4J API'leri, cihazda bulunan yerelleştirme verilerini kullanır. Sonuç olarak, ICU4J kitaplıklarını uygulamanıza derlemeyerek uygulamanızın kapladığı alanı azaltabilirsiniz. Bunun yerine, çerçevede bu kitaplıkları çağırabilirsiniz. Bunu yaparsanız Android 7.0'dan (API düzeyi 24) önceki Android sürümlerini çalıştıran kullanıcıların ICU4J kitaplıklarını içeren bir uygulama sürümünü indirebilmesi için APK'nızın birden fazla sürümünü sağlamanız gerekebilir.

Bu bölümde, söz konusu kitaplıkları desteklemek için gereken minimum Android API düzeyleri hakkında bazı temel bilgiler verilerek başlanır. Ardından, ICU4J'nin Android'e özgü uygulaması hakkında bilmeniz gerekenler açıklanır. Son olarak, Android çerçevesinde ICU4J API'lerini nasıl kullanacağınız açıklanır.

Android'de ICU4J

Android, ICU4J API'lerinin bir alt kümesini com.ibm.icu yerine android.icu paketi üzerinden kullanıma sunar. Bazı ICU4J API'leri, kullanımdan kaldırılmaları veya kararlı olarak bildirilmemeleri gibi nedenlerle Android çerçevesi tarafından kullanıma sunulmaz. ICU ekibi gelecekte API'lerin desteğini sonlandırdıkça Android de bu API'leri desteği sonlandırılmış olarak işaretler ancak bunları dahil etmeye devam eder.

Hatırlatmak istediğimiz bazı konular:

  • ICU4J Android çerçevesi API'leri, tüm ICU4J API'lerini içermez.
  • Android çerçevesindeki API'ler, Android'in kaynaklarla yerelleştirme desteğinin yerini almaz.
  • Bazı durumlarda, Android çerçevesi ICU kitaplıklarından daha fazla karakteri destekler. Örneğin, android.text sınıfının emoji desteği bu durum için geçerlidir.

com.ibm.icu'dan android.icu paketine taşıma

Uygulamanızda zaten ICU4J API'lerini kullanıyorsanız ve android.icu API'leri gereksinimlerinizi karşılıyorsa çerçeve API'lerine geçmek için Java içe aktarma işlemlerinizi com.ibm.icu yerine android.icu olarak değiştirmeniz gerekir. Ardından, ICU4J dosyalarının kendi kopyanızı uygulamadan kaldırabilirsiniz.

Not: ICU4J çerçevesi API'leri com.ibm.icu yerine android.icu ad alanını kullanır. Bu, kendi com.ibm.icu kitaplıklarını içeren uygulamalarda ad alanı çakışmalarını önlemek için yapılır.

Diğer Android SDK API'lerinden android.icu API'lerine geçiş yapma

java ve android paketlerindeki bazı sınıflar, ICU4J'deki sınıflarla eşdeğerdir. Ancak ICU4J genellikle standartlar ve diller için daha geniş destek sunar.

Tablo 2'de, başlamanıza yardımcı olacak bu eşdeğerliklere ilişkin bazı örnekler gösterilmektedir:

Tablo 2. Android ve Java ICU4J sınıfları

Sınıf Alternatifler
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

Android'de ICU4C

Android, ICU4C API'lerinin bir alt kümesini libicuuc.so veya libicui18n.so yerine libicu.so kitaplığı aracılığıyla kullanıma sunar. API'ler Android 12 (API düzeyi 31) ve sonraki sürümlerde kullanılabilir. NDK üstbilgileri, NDK sürümü r22b'den itibaren kullanılabilir. Android NDK aracılığıyla C++ API'si kullanıma sunulmaz. Bazı C API'leri kullanılamaz.

Sürüm oluşturma

Android platformunun sonraki sürümleri, ICU'nun daha yeni sürümlerine ve ilgili CLDR ile Unicode sürümlerine karşılık gelir. Tablo 3'te bu yazışma Android 7.0 (API düzeyi 24) sürümünden itibaren gösterilmektedir. Çalışma zamanında ICU sürüm bilgilerini almak için VersionInfo.ICU_VERSION API'yi (Android 7.0'dan beri kullanılabilir) kullanın.

Tablo 3. Android 7.0 (API düzeyi 24) ile Android 15 (API düzeyi 35) arasındaki Android sürümlerinde kullanılan ICU ve CLDR sürümleri.

Platform (API düzeyi) yoğun bakım ünitesi CLDR Unicode
Android 7.0 - 7.1 (API düzeyleri 24 - 25) 56 28 8.0
Android 8.0 - 8.1 (API düzeyleri 26 - 27) 58,2 30.0.3 9.0
Android 9 (API düzeyi 28) 60,2 32.0.1 10,0
Android 10 (API düzeyi 29) 63,2 34 11.0
Android 11 (API düzeyi 30) 66,1 36 13.0
Android 12 (API düzeyi 31-32) 68,2 38,1 13.0
Android 13 (API düzeyi 33) 70,1 40 14,0
Android 14 (API düzeyi 34) 72,1 42 15,0
Android 15 (API düzeyi 35) 75,1 45 15.1

24 saat/12 saat biçimi ayarı

Android'deki ICU, DateFormat.is24HourFormat() kaynağından alınan kullanıcının 24 saatlik/12 saatlik zaman biçimi ayarını dikkate almıyor. Bu ayarı gözlemlemek için DateFormat veya DateUtils zaman biçimlendirme yöntemlerini kullanın ya da farklı is24HourFormat() dönüş değerleri için uygun saat kalıbı sembolleriyle (12 saat için "h", 24 saat için "H") ICU zaman biçimlendirme kalıplarını kullanın. Örneğin, bu kod, kullanıcının 12 saatlik/24 saatlik ayarını dikkate alan ve geçerli saati içeren bir dize oluşturur:

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());

Çeviri Aracı'nın Kararlılığı

Android 10'dan (API düzeyi 29) itibaren, Transliterator metni bir biçimden diğerine çevirmek için sağlanır. Kullanılabilir transliterasyon kimlikleri, Android sürümleri ve cihazlar arasında tutarsızlık gösterir. Cihaz üreticileri ek çeviri yazısı kimlikleri ekleyebilir. Geliştiriciler, metni çevirmeden önce Transliterator.getAvailableIDs() kaynağından alınan mevcut kimlikleri kontrol etmelidir.

Lisanslama

ICU4J, ICU lisansı kapsamında yayınlanır. Ayrıntılı bilgi için ICU kullanıcı rehberine bakın.