پشتیبانی یونیکد و بین المللی سازی

Android از کتابخانه ICU و پروژه CLDR برای ارائه یونیکد و سایر پشتیبانی های بین المللی استفاده می کند. بحث این صفحه در مورد پشتیبانی از یونیکد و بین المللی سازی به دو بخش تقسیم می شود: Android 6.0 (سطح API 23) و پایین تر، و Android 7.0 (سطح API 24) و بالاتر.

پشتیبانی از یونیکد و بین المللی سازی از طریق Android 6.0 (سطح API 23)

پلتفرم اندروید از ICU و CLDR برای پیاده‌سازی کلاس‌های مختلف برای مدیریت املای لاتین و غیر لاتین، نمایش کلاس‌هایی مانند Locale ، Character و بسیاری از زیرکلاس‌های java.text استفاده می‌کند. برنامه‌ای که به عملکردهای بین‌المللی فراتر از کلاس‌های در معرض نیاز دارد و نسخه‌های پلتفرم را از طریق Android 6.0 (سطح API 23) هدف قرار می‌دهد، باید شامل کتابخانه ICU باشد.

نسخه سازی

نسخه های متوالی پلتفرم اندروید با نسخه های جدیدتر ICU و نسخه های CLDR و Unicode مربوطه مطابقت دارد. جدول 1 این مطابقت را از طریق Android 6.0 (سطح API 23) نشان می دهد.

جدول 1. نسخه های ICU و CLDR مورد استفاده از طریق Android 6.0 (سطح API 23).

پلتفرم (سطح API) آی سی یو CLDR یونیکد
Android 1.5–2.0 (سطوح API 3–7) 3.8 1.5 5.0
Android 2.2 (API سطح 8) 4.2 1.7 5.1
Android 2.3–3.0 (سطوح API 9-13) 4.4 1.8 5.2
Android 4.0 (سطوح API 14-15) 4.6 1.9 6.0
Android 4.1 (سطوح API 16-17) 4.8 2.0 6.0
Android 4.3 (سطح API 18) 50 22.1 6.2
Android 4.4 (سطوح API 19-20) 51 23 6.2
Android 5.0 (سطوح API 21–22) 53 25 6.3
Android 6.0 (سطح API 23) 55.1 27.0.1 7.0

چارچوب Android پشتیبانی جامع‌تری از Unicode و بین‌المللی‌سازی برنامه‌هایی را که Android 7.0 (سطح API 24) و بالاتر را هدف قرار می‌دهند، ارائه می‌کند. بخش بعدی این صفحه جزئیات مربوط به آن پشتیبانی را ارائه می دهد.

پشتیبانی از یونیکد و بین المللی سازی در اندروید 7.0 (سطح API 24) و بالاتر

برای Android 7.0 (سطح API 24) و بالاتر، پلتفرم Android زیرمجموعه‌ای از APIهای ICU4J را در اختیار توسعه‌دهندگان برنامه قرار می‌دهد تا تحت بسته android.icu از آن استفاده کنند. ICU4J مجموعه ای منبع باز و پرکاربرد از کتابخانه های جاوا است که از یونیکد و پشتیبانی بین المللی برای برنامه های نرم افزاری پشتیبانی می کند.

API های ICU4J از داده های محلی سازی موجود در دستگاه استفاده می کنند. در نتیجه، می توانید با کامپایل نکردن کتابخانه های ICU4J در برنامه خود، ردپای برنامه خود را کاهش دهید. در عوض، می‌توانید با آنها در چارچوب تماس بگیرید. اگر این کار را انجام می‌دهید، ممکن است بخواهید چندین نسخه از APK خود را ارائه دهید، بنابراین کاربرانی که از نسخه‌های Android پایین‌تر از Android 7.0 (سطح API 24) استفاده می‌کنند، می‌توانند نسخه‌ای از برنامه را دانلود کنند که شامل کتابخانه‌های ICU4J است.

این بخش با ارائه برخی اطلاعات اولیه در مورد حداقل سطوح API Android مورد نیاز برای پشتیبانی از این کتابخانه ها آغاز می شود. سپس آنچه را که باید در مورد پیاده سازی ICU4J مخصوص اندروید بدانید، توضیح می دهد. در نهایت به شما می گوید که چگونه از API های ICU4J در چارچوب اندروید استفاده کنید.

ICU4J در اندروید

Android زیرمجموعه ای از API های ICU4J را از طریق بسته android.icu به جای com.ibm.icu در معرض دید قرار می دهد. برخی از APIهای ICU4J به دلایلی مانند منسوخ شدن یا عدم ثبات APIها توسط چارچوب Android در معرض نمایش قرار نمی گیرند. از آنجایی که تیم ICU در آینده API ها را منسوخ می کند، اندروید نیز آنها را به عنوان منسوخ شده علامت گذاری می کند اما همچنان آنها را شامل می شود.

در اینجا چند یادآوری وجود دارد:

  • APIهای چارچوب Android ICU4J شامل همه APIهای ICU4J نمی‌شوند.
  • APIهای موجود در چارچوب Android جایگزین پشتیبانی Android برای بومی‌سازی با منابع نمی‌شوند.
  • در برخی موارد، چارچوب Android از کاراکترهای بیشتری نسبت به کتابخانه های ICU پشتیبانی می کند. برای مثال، این موضوع در مورد پشتیبانی کلاس android.text از ایموجی صادق است.

از com.ibm.icu به بسته android.icu مهاجرت کنید

اگر قبلاً از APIهای ICU4J در برنامه خود استفاده می‌کنید و APIهای android.icu نیازهای شما را برآورده می‌کنند، پس مهاجرت به APIهای فریمورک از شما می‌خواهد تا واردات جاوا خود را از com.ibm.icu به android.icu تغییر دهید. سپس می توانید کپی فایل های ICU4J خود را از برنامه حذف کنید.

توجه : APIهای چارچوب ICU4J از فضای نام android.icu به جای com.ibm.icu استفاده می کنند. این برای جلوگیری از تداخل فضای نام در برنامه‌هایی است که دارای کتابخانه‌های com.ibm.icu خود هستند.

از دیگر APIهای Android SDK به APIهای android.icu مهاجرت کنید

برخی از کلاس‌ها در بسته‌های java و android دارای معادل‌هایی با کلاس‌های ICU4J هستند. با این حال، ICU4J اغلب پشتیبانی گسترده تری از استانداردها و زبان ها ارائه می کند.

جدول 2 چند نمونه از این معادل ها را برای شروع کار نشان می دهد:

جدول 2. کلاس های اندروید و جاوا ICU4J

کلاس جایگزین ها
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 در اندروید

Android زیرمجموعه‌ای از APIهای ICU4C را از طریق کتابخانه libicu.so به جای libicuuc.so یا libicui18n.so نشان می‌دهد. APIها با اندروید 12 (سطح API 31) در دسترس هستند. هدرهای NDK با نسخه NDK r22b در دسترس هستند. هیچ C++ API از طریق Android NDK نمایش داده نمی شود. برخی از C API در دسترس نیستند.

نسخه سازی

نسخه‌های متوالی پلت‌فرم اندروید مربوط به نسخه‌های جدیدتر ICU و نسخه‌های CLDR و Unicode مربوطه است. جدول 3 این مطابقت را از Android 7.0 (سطح API 24) نشان می دهد. از VersionInfo.ICU_VERSION API (از Android 7.0 موجود است) برای به دست آوردن اطلاعات نسخه ICU در زمان اجرا استفاده کنید.

جدول 3. نسخه های ICU و CLDR مورد استفاده در نسخه های اندروید از اندروید 7.0 (سطح API 24) تا اندروید 15 (سطح API 35).

پلتفرم (سطح API) آی سی یو CLDR یونیکد
Android 7.0 - 7.1 (سطوح API 24 - 25) 56 28 8.0
Android 8.0 - 8.1 (سطوح API 26 - 27) 58.2 30.0.3 9.0
Android 9 (سطح API 28) 60.2 32.0.1 10.0
Android 10 (سطح API 29) 63.2 34 11.0
Android 11 (سطح API 30) 66.1 36 13.0
Android 12 (سطح API 31 - 32) 68.2 38.1 13.0
Android 13 (سطح API 33) 70.1 40 14.0
Android 14 (سطح API 34) 72.1 42 15.0
Android 15 (سطح API 35) 75.1 45 15.1

تنظیم فرمت زمان 24h/12h

ICU در Android تنظیمات قالب ساعت 24/12 ساعت کاربر را که از DateFormat.is24HourFormat() بدست آمده است، رعایت نمی کند. برای مشاهده این تنظیم، از روش‌های قالب‌بندی زمان DateFormat یا DateUtils استفاده کنید یا از الگوهای قالب‌بندی زمان ICU با نمادهای الگوی ساعت مناسب ('h' برای 12h، 'H' برای 24h) برای مقادیر مختلف is24HourFormat() استفاده کنید. به عنوان مثال، این کد یک رشته با زمان فعلی تولید می کند که تنظیمات 12h/24h کاربر را مشاهده می کند:

کاتلین

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

جاوا

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

پایداری Transliterator

با شروع از Android 10 (سطح API 29)، Transliterator برای نویسه‌گردانی متن از یک قالب به فرمت دیگر ارائه شده است. مجموعه شناسه‌های نویسه‌گردانی موجود در نسخه‌ها و دستگاه‌های Android ناپایدار است. سازندگان دستگاه ممکن است شناسه‌های نویسه‌گردانی اضافی اضافه کنند. توسعه‌دهندگان باید شناسه‌های موجود را که از Transliterator.getAvailableIDs() گرفته‌اند، قبل از نویسه‌گردانی متن بررسی کنند.

صدور مجوز

ICU4J تحت مجوز ICU منتشر شده است. برای جزئیات، به راهنمای کاربر ICU مراجعه کنید.