העדפות שפה לכל אפליקציה

שפות לכל אפליקציה בהגדרות המערכת

במקרים רבים, משתמשים שדוברים כמה שפות מגדירים את שפת המערכת שלהם לשפה אחת — כמו אנגלית, אבל הם רוצים לבחור שפות אחרות לאפליקציות ספציפיות, הולנדית, סינית או הינדי. כדי לעזור לאפליקציות לספק חוויה טובה יותר ב-Android 13 הוספנו את התכונות הבאות לאפליקציות שתומכות במספר שפות:

  • הגדרות מערכת: מיקום מרכזי שבו המשתמשים יכולים לבחור שפה מועדפת לכל אפליקציה.

    אפשר להגדיר את האפליקציה כך שתיצור באופן אוטומטי את הקבצים שדרושים כדי לתמוך בהעדפות שפה לכל אפליקציה ולהופיע בהגדרות המערכת. שפת תרגום מידע נוסף, אפשר לקרוא את ההוראות הפעלת תמיכה אוטומטית בשפה עבור כל אפליקציה.

  • Additional APIs: ממשקי ה-API הציבוריים האלה, כמו setApplicationLocales() וגם getApplicationLocales() השיטות ב-LocaleManager, מאפשרות לאפליקציות להגדיר שפה שונה משפת המערכת בזמן הריצה.

    ממשקי ה-API האלה מסתנכרנים באופן אוטומטי עם הגדרות המערכת. כלומר, אפליקציות שמשתמשות את ממשקי ה-API האלה כדי ליצור בוחרי שפה מותאמים אישית באפליקציה, יבטיחו שהמשתמשים שלהם לספק חוויית משתמש עקבית, ללא קשר למקום שבו הם בוחרים העדפות שפה. ממשקי ה-API הציבוריים גם עוזרים להפחית קוד סטנדרטי, הם תומכים ב-APK מפוצל ותומכים בגיבוי אוטומטי אפליקציות לאחסון של שפת המשתמש ברמת האפליקציה הגדרות.

    לצורך תאימות לאחור עם גרסאות Android קודמות, ממשקי API מקבילים זמינות גם ב-AndroidX. עם זאת, ממשקי API עם תאימות לאחור פועלים עם ההקשר של AppCompatActivity, ולא עם ההקשר של האפליקציה, ב-Android 12 (רמת API 32) ודגמים קודמים. גישה לממשקי API שתואמים לאחור באמצעות Appcompat 1.6.0 ומעלה.

סקירה כללית של הטמעת התכונה הזו

בטבלה הבאה מוצגות הטמעות מומלצות לפי שימושים שונים במקרים שונים.

תרחיש לדוגמה הטמעה מומלצת
באפליקציה שלך אין כלי לבחירת שפה באפליקציה
  1. להפעיל תמיכה אוטומטית בשפה לכל אפליקציה כדי ליצור קובץ אחד (LocaleConfig) ולהוסיף את שפות האפליקציה למערכת הגדרות.
  2. אופציונלי: אם אתם רוצים להוסיף כלי לבחירת שפה בתוך האפליקציה: ספריית AndroidX והצטרפות אל הטמעת API לתמיכה לאחור תאימות באמצעות autoStoreLocales.
באפליקציה שלך כבר יש כלי לבחירת שפה
  1. להפעיל תמיכה אוטומטית בשפה לכל אפליקציה כדי ליצור קובץ אחד (LocaleConfig) ולהוסיף את שפות האפליקציה למערכת הגדרות.
  2. תעבירו את הלוגיקה המותאמת אישית של האפליקציה לשימוש ממשקי API ציבוריים, כדי להבטיח שהמשתמשים יראו לחוויה עקבית.
  3. צריך לטפל בתרחישים הפינתיים הבאים:
    1. קוראים לפונקציה AppCompatDelegate.setApplicationLocales() בפעם הראשונה שהאפליקציה מופעלת במכשיר עם Android 13.
    2. חיוג למספר AppCompatDelegate.setApplicationLocales() אל לספק למערכת לוקאלים קיימים שביקשתם על ידי המשתמשים עבור במקרים הבאים:

הגדרות מערכת למשתמשים

החל מ-Android 13, מערכת Android כוללת מיקום מרכזי במערכת להגדרת העדפות שפה לכל אפליקציה. כדי לוודא שהמאפיינים אפשר להגדיר את השפות בהגדרות המערכת במכשירים עם Android 13 או גבוהה יותר, להפעיל תמיכה אוטומטית בשפה עבור כל אפליקציה (מומלץ) או להגדיר תמיכה ידנית.

הפעלת תמיכה אוטומטית בשפה לכל אפליקציה

החל מ-Android Studio Giraffe ו-AGP 8.1, אפשר להגדיר את האפליקציה כך: תמיכה בשפה לכל אפליקציה העדפות באופן אוטומטי. על סמך משאבי הפרויקט שלך, AGP יוצרת את LocaleConfig ומוסיפה הפניה אליו בקובץ המניפסט הסופי, כך שלא צריך לעשות זאת באופן ידני. AGP משתמשת במשאבים שנמצאים ב-res תיקיות של האפליקציה וכל יחסי תלות של מודולי ספרייה כדי לקבוע את הלוקאלים שיש לכלול בקובץ LocaleConfig. המשמעות היא שאם תוסיפו משאבים שפת האפליקציה, אין צורך לדאוג לגבי עדכון LocaleConfig חדש.

לתשומת ליבכם: התכונה 'שפה אוטומטית לכל אפליקציה' תומכת באפליקציות שפועלת בהן מערכת Android 13 (רמת API 33) ואילך. כדי להשתמש בתכונה, צריך להגדיר compileSdkVersion ל-33 ואילך. כדי להגדיר העדפות שפה לכל אפליקציה בגרסאות קודמות של Android, עדיין צריך להשתמש בממשקי ה-API ובבוחרי השפה בתוך האפליקציות.

כדי להפעיל תמיכה אוטומטית בשפה עבור כל אפליקציה, מבצעים את השלבים הבאים:

  1. כדי להפעיל את התכונה, אפשר להשתמש בgenerateLocaleConfig בבלוק androidResources {} של רמת המודול קובץ build.gradle.kts (קובץ אחד (build.gradle) אם אתם באמצעות גרובי). התכונה מושבתת כברירת מחדל.

    Kotlin

        android {
          androidResources {
            generateLocaleConfig = true
          }
        }
        

    מגניב

        android {
          androidResources {
            generateLocaleConfig true
          }
        }
        
  2. ציון לוקאל ברירת המחדל:
    1. בתיקייה res של מודול האפליקציה, יוצרים קובץ חדש בשם resources.properties.
    2. בקובץ resources.properties, מגדירים את ברירת המחדל לוקאל עם התווית unqualifiedResLocale. כדי לעצב את הקובץ שמות של לוקאלים זמינים במאמר איך יוצרים שמות של לוקאלים.

AGP מוסיפה את הלוקאל שמוגדר כברירת המחדל לוקאלים חלופיים שציינת, באמצעות ספריות values-* בתיקייה res, קובץ LocaleConfig שנוצר באופן אוטומטי.

איך יוצרים שמות של לוקאלים

כדי ליצור שמות של לוקאלים, צריך לשלב את קוד השפה עם הסקריפט האופציונלי קודי אזור, שמפרידים ביניהם במקף:

  • שפה: יש להזין שתיים או שלוש אותיות ISO 639-1
  • סקריפט (אופציונלי): משתמשים ב קוד ISO 15924.
  • אזור (אופציונלי): יש להשתמש באחת משתי האותיות ISO 3166-1-alpha-2 או UN_M.49 בן שלוש ספרות

לדוגמה, אם אזור ברירת המחדל שלכם הוא אנגלית אמריקאית:

unqualifiedResLocale=en-US

כדי להוסיף שפות נתמכות להגדרות המערכת צריך להשתמש ב-android:localeConfig

אפשר להגדיר את האפליקציה באופן ידני כדי לוודא שהשפות שלה ניתנות להגדרה הגדרות המערכת במכשירים עם Android מגרסה 13 ואילך. כדי לעשות את זה, locales_config בקובץ ה-XML הרצוי ולהוסיף אותו למניפסט של האפליקציה באמצעות התחילית android:localeConfig. השמטת המניפסט android:localeConfig אותות כניסה של משתמשים לא אמורים להיות מסוגלים להגדיר את שפת האפליקציה ללא תלות בשפת המערכת בהגדרות המערכת שלהם.

כדי להוסיף באופן ידני את השפות הנתמכות באפליקציה להגדרות המערכת של המשתמש:

  1. יוצרים קובץ בשם res/xml/locales_config.xml ומציינים את כתובת האימייל של האפליקציה כולל שפות האפליקציה Ultimate fallback locale, שזו הלוקאל שצוין ב-res/values/strings.xml.

    מידע על דרישות הפורמט זמין במאמר איך יוצרים שמות של לוקאלים. אפשר לעיין גם בקובץ locale_config.xml לדוגמה כדי לראות רשימה של הלוקאלים הכי נפוצים.

    לדוגמה, יש לעצב את הקובץ locales_config.xml באופן הבא עבור אפליקציה תומך בשפות הבאות:

    • אנגלית (ארצות הברית) בתור הלוקאל האולטימטיבי החלופי
    • אנגלית (בריטניה)
    • צרפתית
    • יפנית
    • סינית (פשוטה, מקאו)
    • סינית (מסורתית, מקאו)
    <?xml version="1.0" encoding="utf-8"?>
    <locale-config xmlns:android="http://schemas.android.com/apk/res/android">
       <locale android:name="en-US"/>
       <locale android:name="en-GB"/>
       <locale android:name="fr"/>
       <locale android:name="ja"/>
       <locale android:name="zh-Hans-MO"/>
       <locale android:name="zh-Hant-MO"/>
    </locale-config>
    
  2. במניפסט, מוסיפים שורה שמצביעה אל הקובץ החדש:

    <manifest>
        ...
        <application
            ...
            android:localeConfig="@xml/locales_config">
        </application>
    </manifest>
    

אפשר לעדכן באופן דינמי את localeConfig של האפליקציה עם LocaleManager.setOverrideLocaleConfig כדי להתאים אישית את קבוצת השפות תוצג ברשימת השפות לכל אפליקציה בהגדרות Android. כך אפשר להתאים אישית את רשימת השפות לכל אזור, להריץ ניסויי A/B ולספק אם האפליקציה משתמשת בדחיפת לוקליזציה בצד השרת, כמו שמוצג בדוגמה הבאה:

Kotlin

//For setOverrideLocaleConfig
val localeManager = applicationContext
    .getSystemService(LocaleManager::class.java)
localeManager.overrideLocaleConfig = LocaleConfig(
LocaleList.forLanguageTags("en-US,ja-JP,zh-Hans-SG")
)

//For getOverrideLocaleConfig
// The app calls the API to get the override LocaleConfig
val overrideLocaleConfig = localeManager.overrideLocaleConfig
// If the returned overrideLocaleConfig isn't equal to NULL, then the app calls the API to get the supported Locales
val supportedLocales = overrideLocaleConfig.supportedLocales()

Java

//For setOverrideLocaleConfig
mContext.getSystemService(LocaleManager.class).setOverrideLocaleConfig(new LocaleConfig(LocaleList.forLanguageTags("en-US,ja-JP,zh-Hans-SG")));

//For getOverrideLocaleConfig
// The app calls the API to get the override LocaleConfig
LocaleConfig overrideLocaleConfig = mContext.getSystemService(LocaleManager.class).getOverrideLocaleConfig();
// If the returned overrideLocaleConfig isn't equal to NULL, then the app calls the API to get the supported Locales
LocaleList supportedLocales = overrideLocaleConfig.getSupportedLocales();

בנוסף, עורכי IME יכולים עכשיו להשתמש LocaleManager.getApplicationLocales לדעת את שפת ממשק המשתמש של האפליקציה הנוכחית כדי לעדכן את שפת המקלדת בתור מוצגת:

Kotlin

val currentAppLocales: LocaleList = applicationContext.getSystemService(LocaleManager::class.java).getApplicationLocales(appPackageName)

Java

LocaleList currentAppLocales =
    mContext.getSystemService(LocaleManager.class).getApplicationLocales(appPackageName);

ציון השפות הנתמכות ב-Gradle

אם היא לא קיימת, מציינים את אותן שפות באמצעות הרכיב resourceConfigurations נכס בקובץ build.gradle ברמת המודול של האפליקציה:

android {
  ...
  defaultConfig {
    resourceConfigurations += ["en", "en-rGB", "fr", "ja", "b+zh+Hans+MO", "b+zh+Hant+MO"]
  }
}

כשהמאפיין resourceConfigurations קיים, מערכת ה-build כוללת רק של השפות שצוינו ב-APK, וכך למנוע מחרוזות מתורגמות מהכללה של ספריות אחרות שעשויות לתמוך שפות שהאפליקציה לא תומכת בהן. מידע נוסף זמין במאמר הבא: לציין את השפות שבהן האפליקציה תומכת.

איך המשתמשים בוחרים את שפת האפליקציה בהגדרות המערכת

המשתמשים יכולים לבחור את השפה המועדפת עליהם לכל אפליקציה דרך המערכת הגדרות. הם יכולים לגשת להגדרות האלה בשתי דרכים שונות:

  • גישה דרך הגדרות המערכת

    הגדרות > מערכת > שפות קלט > שפות של אפליקציות > (צריך לבחור אפליקציה)

  • גישה דרך ההגדרות של אפליקציות

    הגדרות > אפליקציות > (יש לבחור אפליקציה) > שפה

טיפול בבוררי השפה בתוך האפליקציות

לאפליקציות שכבר יש להן כלי לבחירת שפה או שרוצים להשתמש בהן, צריך להשתמש ממשקי API ציבוריים במקום לוגיקה מותאמת אישית של אפליקציה לטיפול בהגדרות וקבלת גישה השפה המועדפת לאפליקציה שלך. אם אתם משתמשים בממשקי API ציבוריים בתוך האפליקציה בוחר השפה, הגדרות המערכת של המכשיר מתעדכנות באופן אוטומטי להתאים לשפה שהמשתמש בוחר בחוויית השימוש באפליקציה.

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

הטמעה באמצעות ספריית התמיכה של AndroidX

שימוש בsetApplicationLocales() ובgetApplicationLocales() methods ב-Appcompat 1.6.0 ומעלה. שימו לב שממשקי ה-API שתואמים לאחור פועלים עם ההקשר של AppCompatActivity. לא בהקשר של האפליקציה, ל-Android 12 (רמת API 32) ומטה.

לדוגמה, כדי להגדיר את השפה המועדפת של משתמש, צריך לבקש מהמשתמש בוחרים לוקאל בכלי לבחירת שפה ואז מגדירים את הערך הזה במערכת:

Kotlin

val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("xx-YY")
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale)

Java

LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY");
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale);

חשוב לזכור שקריאה לפונקציה setApplicationLocales() תיצור מחדש את Activity, אלא אם האפליקציה שלך מטפלת בתצורת הלוקאל בפני עצמו.

אפשר להשתמש ב-AppCompatDelegate.getApplicationLocales() כדי לאחזר את הלוקאל המועדף על המשתמש. יכול להיות שהמשתמש בחר את הלוקאל של האפליקציה בהגדרות המערכת או בכלי לבחירת שפה באפליקציה.

תמיכה ב-Android מגרסה 12 ומטה

כדי לתמוך במכשירים עם Android מגרסה 12 (API ברמה 32) ומטה, צריך לציין AndroidX לטפל באחסון מקומי על ידי הגדרה של ערך autoStoreLocales ל- true וגם android:enabled אל false ברשומת המניפסט של האפליקציה שירות AppLocalesMetadataHolderService, כפי שמוצג בקוד הבא snippet:

<application
  ...
  <service
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
    android:enabled="false"
    android:exported="false">
    <meta-data
      android:name="autoStoreLocales"
      android:value="true" />
  </service>
  ...
</application>

חשוב לשים לב שהגדרת הערך של autoStoreLocales כ-true גורמת לקריאת חסימה בשרשור הראשי, ועלול לגרום StrictMode diskRead וגם הפרה של diskWrite אם מתבצע תיעוד של הפרות של השרשורים. צפייה AppCompatDelegate.setApplicationLocales() אפשר לקבל מידע נוסף.

טיפול מותאם אישית באחסון

השמטת רשומת המניפסט או הגדרת autoStoreLocales כ-false אותות שאת מטפלת באחסון שלך. במקרה כזה, צריך לספק לוקאלים שנשמרו לפני onCreate במחזור החיים של הפעילות וקריאות שער אל AppCompatDelegate.setApplicationLocales() ב-Android 12 (רמת API 32) או נמוכה יותר.

אם לאפליקציה שלך יש מיקום מותאם אישית לאחסון מקומי, מומלץ להשתמש בהגדרה חד-פעמית להעביר בין פתרון האחסון המקומי המותאם אישית שלך לבין autoStoreLocales, המשתמשים ממשיכים ליהנות מהאפליקציה בשפה שהם מעדיפים. במיוחד רלוונטי במקרים שבהם האפליקציה מופעלת בפעם הראשונה לאחר שהמכשיר שדרג ל- Android מגרסה 13. במקרה הזה, יש לך אפשרות לספק לוקאלים קיימים לפי בקשת המשתמש. באמצעות אחזור הלוקאלים מהאחסון המותאם אישית והעברת הלוקאלים אל AppCompatDelegate.setApplicationLocales()

הטמעה באמצעות ממשקי Android framework API

אנחנו ממליצים מאוד להשתמש בספריית התמיכה של AndroidX כדי להטמיע בוחרי שפה באפליקציה, אפשר גם להשתמש setApplicationLocales() ו-getApplicationLocales() שיטות ב-Android 13 למכשירים עם Android 13.

לדוגמה, כדי להגדיר את השפה המועדפת של משתמש, צריך לבקש מהמשתמש בוחרים לוקאל בכלי לבחירת שפה ואז מגדירים את הערך הזה במערכת:

// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its locale
mContext.getSystemService(LocaleManager.class
    ).setApplicationLocales(new LocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language

כדי לבדוק מהי השפה המועדפת הנוכחית של המשתמש להצגה בכלי לבחירת שפה: האפליקציה יכולה להחזיר את הערך מהמערכת:

// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales =
    mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user

שיטות מומלצות נוספות

כדאי ליישם את השיטות המומלצות הבאות.

שימוש בשפה כשמפעילים כוונת רכישה באפליקציה אחרת

כוונת רכישה ממוקדת שפה עשויה לאפשר לך לציין את השפה שבה ברצונך להשתמש הופעלה באפליקציה. אחת הדוגמאות לכך היא EXTRA_LANGUAGE מממשק ה-API של זיהוי הדיבור.

כדאי להשתמש בכותרת Accept-Language בכרטיסייה 'התאמה אישית' ב-Chrome

כדאי להוסיף את הכותרת Accept-Language דרך Browser.EXTRA_HEADERS כדי לפתוח דף אינטרנט בשפה של האפליקציה כשמפעילים כרטיסייה בהתאמה אישית ב-Chrome.

אם מסירים את העדפות השפה לכל אפליקציה בהגדרות המערכת, צריך לאפס את הלוקאל של האפליקציה ללוקאל של המערכת

אם מסירים את העדפות השפה של האפליקציה מהגדרות המערכת (על ידי הסרה של android:localeConfig מ-AndroidManifest.xml של האפליקציה), המשתמשים לא יכולים לאפס בקלות את שפת האפליקציה בחזרה לברירת המחדל של המערכת.

לכן, אם מסירים את android:localeConfig, כדאי לאפס את לוקאל האפליקציה ללוקאל של המערכת באמצעות LocaleListCompat.getEmptyLocaleList() או LocaleList.getEmptyLocaleList() כפי שאפשר לראות בקטע הקוד הבא:

Kotlin

// Use the AndroidX APIs to reset to the system locale for backward and forward compatibility
AppCompatDelegate.setApplicationLocales(
  LocaleListCompat.getEmptyLocaleList()
)

// Or use the Framework APIs for Android 13 and above to reset to the system locale
val context = LocalContext.current
context.getSystemService(LocaleManager::class.java)
  .applicationLocales = LocaleList.getEmptyLocaleList()

Java

// Use the AndroidX APIs to reset to the system locale for backward and forward compatibility
AppCompatDelegate.setApplicationLocales(
  LocaleListCompat.getEmptyLocaleList()
);

// Or use the Framework APIs for Android 13 and above to reset to the system locale
mContext.getSystemService(LocaleManager.class)
  .setApplicationLocales(LocaleList.getEmptyLocaleList());

מקורות מידע נוספים

לקבלת מידע נוסף, אפשר לעיין בדוגמאות הקוד, במאמרי הבלוגים ובסרטונים שלנו.

קובץ locale_config.xml לדוגמה

כברירת מחדל, Android כולל תרגומים ברמת המערכת ב-Android Open פרויקט מקור (AOSP) עבור קבוצה סטנדרטית של הלוקאלים הנפוצים ביותר. בקובץ locale_config.xml לדוגמה שכלול בקטע הזה אפשר לראות הפורמט המוצע לכל אחד מהלוקאלים האלה. אפשר להפנות לקובץ לדוגמה הזה כדי לקבל עזרה אתם יוצרים קובץ locale_config.xml משלכם לקבוצת השפות שהאפליקציה תומכת בהם.

<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
   <locale android:name="af"/> <!-- Afrikaans -->
   <locale android:name="am"/> <!-- Amharic -->
   <locale android:name="ar"/> <!-- Arabic -->
   <locale android:name="as"/> <!-- Assamese -->
   <locale android:name="az"/> <!-- Azerbaijani -->
   <locale android:name="be"/> <!-- Belarusian -->
   <locale android:name="bg"/> <!-- Bulgarian -->
   <locale android:name="bn"/> <!-- Bengali -->
   <locale android:name="bs"/> <!-- Bosnian -->
   <locale android:name="ca"/> <!-- Catalan -->
   <locale android:name="cs"/> <!-- Czech -->
   <locale android:name="da"/> <!-- Danish -->
   <locale android:name="de"/> <!-- German -->
   <locale android:name="el"/> <!-- Greek -->
   <locale android:name="en-AU"/> <!-- English (Australia) -->
   <locale android:name="en-CA"/> <!-- English (Canada) -->
   <locale android:name="en-GB"/> <!-- English (United Kingdom) -->
   <locale android:name="en-IN"/> <!-- English (India) -->
   <locale android:name="en-US"/> <!-- English (United States) -->
   <locale android:name="es"/> <!-- Spanish (Spain) -->
   <locale android:name="es-US"/> <!-- Spanish (United States) -->
   <locale android:name="et"/> <!-- Estonian -->
   <locale android:name="eu"/> <!-- Basque -->
   <locale android:name="fa"/> <!-- Farsi -->
   <locale android:name="fi"/> <!-- Finnish -->
   <locale android:name="fil"/> <!-- Filipino -->
   <locale android:name="fr"/> <!-- French (France) -->
   <locale android:name="fr-CA"/> <!-- French (Canada) -->
   <locale android:name="gl"/> <!-- Galician -->
   <locale android:name="gu"/> <!-- Gujarati -->
   <locale android:name="hi"/> <!-- Hindi -->
   <locale android:name="hr"/> <!-- Croatian -->
   <locale android:name="hu"/> <!-- Hungarian -->
   <locale android:name="hy"/> <!-- Armenian -->
   <locale android:name="in"/> <!-- Indonesian -->
   <locale android:name="is"/> <!-- Icelandic -->
   <locale android:name="it"/> <!-- Italian -->
   <locale android:name="iw"/> <!-- Hebrew -->
   <locale android:name="ja"/> <!-- Japanese -->
   <locale android:name="ka"/> <!-- Georgian -->
   <locale android:name="kk"/> <!-- Kazakh -->
   <locale android:name="km"/> <!-- Khmer -->
   <locale android:name="kn"/> <!-- Kannada -->
   <locale android:name="ko"/> <!-- Korean -->
   <locale android:name="ky"/> <!-- Kyrgyz -->
   <locale android:name="lo"/> <!-- Lao -->
   <locale android:name="lt"/> <!-- Lithuanian -->
   <locale android:name="lv"/> <!-- Latvian -->
   <locale android:name="mk"/> <!-- Macedonian -->
   <locale android:name="ml"/> <!-- Malayalam -->
   <locale android:name="mn"/> <!-- Mongolian -->
   <locale android:name="mr"/> <!-- Marathi -->
   <locale android:name="ms"/> <!-- Malay -->
   <locale android:name="my"/> <!-- Burmese -->
   <locale android:name="nb"/> <!-- Norwegian -->
   <locale android:name="ne"/> <!-- Nepali -->
   <locale android:name="nl"/> <!-- Dutch -->
   <locale android:name="or"/> <!-- Odia -->
   <locale android:name="pa"/> <!-- Punjabi -->
   <locale android:name="pl"/> <!-- Polish -->
   <locale android:name="pt-BR"/> <!-- Portuguese (Brazil) -->
   <locale android:name="pt-PT"/> <!-- Portuguese (Portugal) -->
   <locale android:name="ro"/> <!-- Romanian -->
   <locale android:name="ru"/> <!-- Russian -->
   <locale android:name="si"/> <!-- Sinhala -->
   <locale android:name="sk"/> <!-- Slovak -->
   <locale android:name="sl"/> <!-- Slovenian -->
   <locale android:name="sq"/> <!-- Albanian -->
   <locale android:name="sr"/> <!-- Serbian (Cyrillic) -->
   <locale android:name="sr-Latn"/> <!-- Serbian (Latin) -->
   <locale android:name="sv"/> <!-- Swedish -->
   <locale android:name="sw"/> <!-- Swahili -->
   <locale android:name="ta"/> <!-- Tamil -->
   <locale android:name="te"/> <!-- Telugu -->
   <locale android:name="th"/> <!-- Thai -->
   <locale android:name="tr"/> <!-- Turkish -->
   <locale android:name="uk"/> <!-- Ukrainian -->
   <locale android:name="ur"/> <!-- Urdu -->
   <locale android:name="uz"/> <!-- Uzbek -->
   <locale android:name="vi"/> <!-- Vietnamese -->
   <locale android:name="zh-Hans"/> <!-- Chinese (Simplified) -->
   <locale android:name="zh-Hant"/> <!-- Chinese (Traditional) -->
   <locale android:name="zu"/> <!-- Zulu -->
</locale-config>