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

اندروید از کتابخانه ICU و پروژه CLDR برای ارائه پشتیبانی از یونیکد و سایر پشتیبانی‌های بین‌المللی‌سازی استفاده می‌کند. بحث این صفحه در مورد پشتیبانی از یونیکد و بین‌المللی‌سازی به دو بخش تقسیم می‌شود: اندروید ۶.۰ (سطح API ۲۳) و پایین‌تر، و اندروید ۷.۰ (سطح API ۲۴) و بالاتر.

پشتیبانی از یونیکد و بین‌المللی‌سازی از طریق اندروید ۶.۰ (سطح API ۲۳)

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

نسخه‌بندی

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

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

پلتفرم (سطح API) بخش مراقبت‌های ویژه سی ال دی آر یونیکد
اندروید ۱.۵–۲.۰ (سطح API ۳–۷) ۳.۸ ۱.۵ ۵.۰
اندروید ۲.۲ (سطح API ۸) ۴.۲ ۱.۷ ۵.۱
اندروید ۲.۳–۳.۰ (سطح API ۹–۱۳) ۴.۴ ۱.۸ ۵.۲
اندروید ۴.۰ (سطح API ۱۴–۱۵) ۴.۶ ۱.۹ ۶.۰
اندروید ۴.۱ (سطح API ۱۶–۱۷) ۴.۸ ۲.۰ ۶.۰
اندروید ۴.۳ (سطح API ۱۸) ۵۰ ۲۲.۱ ۶.۲
اندروید ۴.۴ (سطح API ۱۹–۲۰) ۵۱ ۲۳ ۶.۲
اندروید ۵.۰ (سطح API ۲۱–۲۲) ۵۳ ۲۵ ۶.۳
اندروید ۶.۰ (سطح API ۲۳) ۵۵.۱ ۲۷.۰.۱ ۷.۰

چارچوب اندروید پشتیبانی جامع‌تری از یونیکد و بین‌المللی‌سازی برای برنامه‌هایی که اندروید ۷.۰ (سطح API ۲۴) و بالاتر را هدف قرار می‌دهند، ارائه می‌دهد. بخش بعدی این صفحه جزئیاتی در مورد این پشتیبانی ارائه می‌دهد.

پشتیبانی از یونیکد و بین‌المللی‌سازی در اندروید ۷.۰ (سطح API ۲۴) و بالاتر

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

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

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

ICU4J در اندروید

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

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

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

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

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

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

مهاجرت به APIهای android.icu از سایر APIهای SDK اندروید

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

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

جدول 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 در اندروید

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

نسخه‌بندی

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

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

پلتفرم (سطح API) بخش مراقبت‌های ویژه سی ال دی آر یونیکد
اندروید ۷.۰ - ۷.۱ (سطح API ۲۴ - ۲۵) ۵۶ ۲۸ ۸.۰
اندروید ۸.۰ - ۸.۱ (سطح API ۲۶ - ۲۷) ۵۸.۲ ۳۰.۰.۳ ۹.۰
اندروید ۹ (سطح API 28) ۶۰.۲ ۳۲.۰.۱ ۱۰.۰
اندروید ۱۰ (سطح API ۲۹) ۶۳.۲ ۳۴ ۱۱.۰
اندروید ۱۱ (سطح API 30) ۶۶.۱ ۳۶ ۱۳.۰
اندروید ۱۲ (سطح API 31 - 32) ۶۸.۲ ۳۸.۱ ۱۳.۰
اندروید ۱۳ (سطح API ۳۳) ۷۰.۱ ۴۰ ۱۴.۰
اندروید ۱۴ (سطح API ۳۴) ۷۲.۱ ۴۲ ۱۵.۰
اندروید ۱۵ (سطح API ۳۵) ۷۵.۱ ۴۵ ۱۵.۱

تنظیم فرمت زمان 24 ساعته/12 ساعته

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

کاتلین

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

پایداری نویسه‌گردان

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

صدور مجوز

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