תמיכה ב-Unicode ובבינלאומיות

מערכת Android משתמשת בספריית ICU וב פרויקט CLDR כדי לספק תמיכה ב-Unicode ובתהליכי בינאום אחרים. הדיון בדף הזה על תמיכה ב-Unicode ובינלאומיות מחולק לשני חלקים: Android 6.0 (רמת API‏ 23) ומטה, ו-Android 7.0 (רמת API‏ 24) ומעלה.

תמיכה ב-Unicode ובינלאומיות דרך Android 6.0 (רמת API‏ 23)

פלטפורמת Android משתמשת ב-ICU וב-CLDR כדי להטמיע מחלקות שונות לטיפול באורתוגרפיות לטיניות ולא לטיניות, וחושפת מחלקות כמו Locale,‏ Character והרבה מחלקות משנה של java.text. אפליקציה שנדרשות לה פונקציות בינאום מעבר למחלקות החשופות, ומיועדת לגרסאות של הפלטפורמה עד Android 6.0 (רמת API‏ 23), צריכה לכלול את ספריית ICU.

ניהול גרסאות

גרסאות עוקבות של פלטפורמת Android תואמות לגרסאות חדשות יותר של ICU ולגרסאות התואמות של CLDR ו-Unicode. טבלה 1 מציגה את ההתאמה הזו עד Android 6.0 (רמת API‏ 23).

טבלה 1. גרסאות ICU ו-CLDR שנעשה בהן שימוש ב-Android 6.0 (רמת API ‏23).

פלטפורמה (רמת API) טיפול נמרץ CLDR Unicode
‫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) ומעלה. בקטע הבא בדף הזה מפורט מידע על התמיכה הזו.

תמיכה ב-Unicode ובינלאומיות ב-Android 7.0 (רמת API‏ 24) ואילך

ב-Android 7.0 (רמת API‏ 24) ומעלה, פלטפורמת Android חושפת קבוצת משנה של ממשקי ה-API של ICU4J לשימוש מפתחי אפליקציות בחבילה android.icu. ‫ICU4J היא קבוצה של ספריות Java בקוד פתוח שנמצאות בשימוש נרחב. הספריות מספקות תמיכה ב-Unicode ובבינאום של אפליקציות תוכנה.

ממשקי ה-API של ICU4J משתמשים בנתוני לוקליזציה שקיימים במכשיר. כתוצאה מכך, אפשר להקטין את טביעת הרגל של האפליקציה על ידי אי קומפילציה של ספריות ICU4J באפליקציה. במקום זאת, אפשר לקרוא להן במסגרת. אם תעשו את זה, כדאי לספק כמה גרסאות של ה-APK, כדי שמשתמשים עם גרסאות Android נמוכות מ-Android 7.0 (רמת API‏ 24) יוכלו להוריד גרסה של האפליקציה שמכילה את ספריות ICU4J.

בקטע הזה מופיע מידע בסיסי על רמות ה-API המינימליות של Android שנדרשות כדי לתמוך בספריות האלה. בהמשך מוסבר מה צריך לדעת על ההטמעה הספציפית ל-Android של ICU4J. בסוף, מוסבר איך להשתמש בממשקי ה-API של ICU4J במסגרת Android.

‫ICU4J ב-Android

‫Android חושף קבוצת משנה של ממשקי ה-API של ICU4J דרך חבילת android.icu ולא דרך com.ibm.icu. חלק מממשקי ה-API של ICU4J לא נחשפים על ידי מסגרת Android, מסיבות כמו הוצאה משימוש של ממשקי ה-API או אי-הצהרה על יציבותם. כאשר צוות ICU יוציא משימוש ממשקי API בעתיד, מערכת Android תסמן אותם גם כהוצאה משימוש, אבל תמשיך לכלול אותם.

כמה תזכורות:

  • ממשקי ה-API של ICU4J Android framework לא כוללים את כל ממשקי ה-API של ICU4J.
  • ממשקי ה-API ב-Android framework לא מחליפים את התמיכה של Android בלוקליזציה באמצעות משאבים.
  • במקרים מסוימים, מסגרת Android תומכת ביותר תווים מאשר ספריות ICU. זה נכון, למשל, לגבי התמיכה באמוג'י של המחלקה android.text.

מעבר לחבילה android.icu מ-com.ibm.icu

אם אתם כבר משתמשים בממשקי ICU4J API באפליקציה שלכם, וממשקי android.icu API עונים על הדרישות שלכם, כדי לבצע מיגרציה לממשקי framework API תצטרכו לשנות את הייבוא של Java מ-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.מחלקות Android ו-Java 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

‫Android חושף קבוצת משנה של ממשקי ה-API של ICU4C דרך הספרייה libicu.so, ולא דרך libicuuc.so או libicui18n.so. ממשקי ה-API זמינים החל מ-Android 12 (רמת API‏ 31). כותרות ה-NDK זמינות החל מגרסת NDK‏ r22b. אין C++ API שגלוי דרך Android NDK. חלק מממשקי ה-API של C לא זמינים.

ניהול גרסאות

גרסאות עוקבות של פלטפורמת Android תואמות לגרסאות חדשות יותר של ICU ולגרסאות התואמות של CLDR ו-Unicode. בטבלה 3 מוצגת ההתאמה הזו החל מ-Android 7.0 (רמת API‏ 24). משתמשים ב-API‏ VersionInfo.ICU_VERSION (זמין מגרסה Android 7.0) כדי לקבל את פרטי הגרסה של ICU בזמן ריצה.

טבלה 3. גרסאות ICU ו-CLDR שנעשה בהן שימוש בגרסאות Android מ-Android 7.0 (רמת API‏ 24) עד Android 15 (רמת API‏ 35).

פלטפורמה (רמת API) טיפול נמרץ CLDR Unicode
‫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

הגדרת פורמט זמן של 24 שעות או 12 שעות

‫ICU ב-Android לא פועל לפי הגדרת פורמט הזמן של המשתמש (24 שעות או 12 שעות), שמתקבלת מ- DateFormat.is24HourFormat(). כדי לראות את ההגדרה הזו, אפשר להשתמש בשיטות לעיצוב זמן DateFormat או DateUtils, או בדפוסי עיצוב זמן של ICU עם סמלי דפוס שעה מתאימים ('h' ל-12 שעות, 'H' ל-24 שעות) לערכי החזרה שונים של is24HourFormat(). לדוגמה, הקוד הזה יוצר מחרוזת עם השעה הנוכחית בהתאם להגדרה של המשתמש לגבי תצוגה של 12 שעות או 24 שעות:

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

יציבות הכלי לתעתיק

החל מ-Android 10 (רמת API‏ 29),‏ Transliterator מסופק כדי לתעתק טקסט מפורמט אחד לפורמט אחר. קבוצת מזהי התעתיק הזמינים לא יציבה בגרסאות ובמכשירים שונים של Android. יצרני מכשירים עשויים להוסיף מזהים נוספים לתעתיק. מפתחים צריכים לבדוק את המזהים הזמינים שמתקבלים מ- Transliterator.getAvailableIDs(), לפני שהם מבצעים תעתיק של טקסט.

רישוי

‫ICU4J מופץ ברישיון ICU. לפרטים נוספים, אפשר לעיין במדריך למשתמש של ICU.