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 açıklamalar 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) üzerinden 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. Locale, Character ve java.text'nin birçok alt sınıfı gibi sınıfları kullanıma sunar. Kullanıma sunulan sınıfların ötesinde uluslararasılaştırma işlevleri gerektiren ve Android 6.0 (API düzeyi 23) üzerinden platform sürümlerini hedefleyen bir uygulama, ICU kitaplığını içermelidir.

Sürüm oluşturma

Android platformunun birbirini takip eden 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, Android 6.0 (API düzeyi 23) sürümüne kadar olan bu eşleşme gösterilmektedir.

Tablo 1. Android 6.0'da (API düzeyi 23) 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üzeyi 14-15) 4.6 1.9 6.0
Android 4.1 (API düzeyi 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üzeyi 19-20) 51) 23 6.2
Android 5.0 (API düzeyi 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 sağlar. 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 sunar. ICU4J, yazılım uygulamaları için Unicode ve uluslararasılaştırma desteği sağlayan, açık kaynaklı ve yaygın olarak kullanılan bir Java kitaplıkları grubudur.

ICU4J API'leri, cihazda bulunan yerelleştirme verilerini kullanır. Sonuç olarak, ICU4J kitaplıklarını uygulamanızda derlemeyerek uygulamanızın kapladığı alanı azaltabilirsiniz. Bunun yerine, çerçevede bu kitaplıkları çağırabilirsiniz. Bunu yaparsanız APK'nızın birden fazla sürümünü sunmak isteyebilirsiniz. Böylece Android 7.0'dan (API düzeyi 24) daha eski Android sürümlerini çalıştıran kullanıcılar, uygulamanın ICU4J kitaplıklarını içeren bir sürümünü indirebilir.

Bu bölümde, bu kitaplıkları desteklemek için gereken minimum Android API düzeyleri hakkında bazı temel bilgiler verilmektedir. Ardından, ICU4J'nin Android'e özgü uygulaması hakkında bilmeniz gerekenler açıklanır. Son olarak, Android çerçevesinde ICU4J API'lerinin nasıl kullanılacağını açıklar.

Android'de ICU4J

Android, ICU4J API'lerinin bir alt kümesini com.ibm.icu yerine android.icu paketi aracılığıyla kullanıma sunar. Bazı ICU4J API'leri, API'lerin desteğinin sonlandırılması veya kararlı olarak tanımlanmaması gibi nedenlerle Android çerçevesi tarafından kullanıma sunulmaz. ICU ekibi gelecekte API'leri kullanımdan kaldırdığında Android de bunları kullanımdan kaldırıldı olarak işaretler ancak dahil etmeye devam eder.

Hatırlatmak istediğimiz birkaç nokta var:

  • ICU4J Android çerçeve 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 buna bir örnektir.

com.ibm.icu'dan android.icu paketine geçiş yapma

Uygulamanızda ICU4J API'lerini kullanıyorsanız ve android.icu API'leri gereksinimlerinizi karşılıyorsa çerçeve API'lerine geçiş yapmak 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çeve 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'de bulunan 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 bazı eşdeğerlik örnekleri 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 başlıkları, NDK sürümü r22b'den itibaren kullanılabilir. Android NDK üzerinden C++ API'si sunulmaz. Bazı C API'leri kullanılamaz.

Sürüm oluşturma

Android platformunun birbirini takip eden 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, Android 7.0'dan (API düzeyi 24) itibaren bu eşleşme gösterilmektedir. Çalışma zamanında ICU sürüm bilgilerini almak için VersionInfo.ICU_VERSION API'sini (Android 7.0'dan itibaren 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 zaman biçimi ayarı

Android'deki ICU, kullanıcının DateFormat.is24HourFormat() üzerinden alınan 24 saatlik/12 saatlik zaman biçimi ayarını dikkate almaz. 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 deseni simgeleriyle (12 saat için "h", 24 saat için "H") ICU zaman biçimlendirme desenlerini kullanın. Örneğin, bu kod, kullanıcının 12 saat/24 saat ayarını dikkate alan 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());

Harf çeviricinin kararlılığı

Android 10'dan (API düzeyi 29) itibaren, metni bir biçimden diğerine dönüştürmek için Transliterator sağlanır. Kullanılabilir harf çevirisi kimlikleri, Android sürümleri ve cihazlar arasında değişiklik gösterir. Cihaz üreticileri ek harf çevirisi kimlikleri ekleyebilir. Geliştiriciler, metinleri harf çevirisi yapmadan önce Transliterator.getAvailableIDs() üzerinden elde edilen mevcut kimlikleri kontrol etmelidir.

Lisanslama

ICU4J, ICU lisansı kapsamında yayınlanmıştır. Ayrıntılar için ICU kullanıcı rehberini inceleyin.