תמיכה ב-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 באפליקציה. במקום זאת, אתם יכולים לקרוא להן ב-framework. אם אתם עושים את זה, כדאי לספק כמה גרסאות של ה-APK, כדי שמשתמשים עם גרסאות Android ישנות יותר מ-Android 7.0 (רמת API‏ 24) יוכלו להוריד גרסה של האפליקציה שמכילה את ספריות ICU4J.

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

‫ICU4J ב-Android

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

כמה תזכורות:

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

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

אם אתם כבר משתמשים בממשקי ה-API של ICU4J באפליקציה, וממשקי ה-API של android.icu עונים על הדרישות שלכם, כדי לעבור לממשקי ה-API של ה-framework אתם צריכים לשנות את הייבוא של Java מ-com.ibm.icu ל-android.icu. לאחר מכן, תוכלו להסיר מהאפליקציה את העותק של קובצי ICU4J.

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

מעבר לממשקי API של android.icu מממשקי API אחרים של Android SDK

לחלק מהמחלקות בחבילות java ו-android יש מחלקות מקבילות לאלה שנמצאות ב-ICU4J. עם זאת, ICU4J מספקת לעיתים קרובות תמיכה רחבה יותר בתקנים ובשפות.

בטבלה 2 מוצגות כמה דוגמאות להקבלות האלה:

טבלה 2.מחלקות ICU4J ב-Android וב-Java

דרגה אפשרויות אחרות
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 זמינות החל מגרסה r22b של ה-NDK. אין ממשק API של C++‎ שחשוף דרך Android NDK. חלק מממשקי ה-API של C לא זמינים.

ניהול גרסאות

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

טבלה 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.