إعدادات اللغة المخصصة حسب التطبيقات

اللغات المخصّصة حسب التطبيقات في إعدادات النظام

في كثير من الحالات، يحدِّد المستخدمون متعددو اللغات لغة واحدة للنظام، مثل الإنجليزية، لكنّهم يريدون اختيار لغات أخرى لتطبيقات معيّنة، مثل الهولندية أو الصينية أو الهندية. لمساعدة التطبيقات على توفير تجربة أفضل لهؤلاء المستخدمين، يقدم Android 13 الميزات التالية للتطبيقات التي تدعم لغات متعددة:

  • إعدادات النظام: موقع مركزي يمكن للمستخدمين فيه اختيار لغة مفضَّلة لكل تطبيق.

    يمكنك تهيئة تطبيقك لإنشاء الملفات المطلوبة تلقائيًا للتوافق مع تفضيلات اللغة لكل تطبيق وعرضها في إعدادات النظام. لمعرفة المزيد من المعلومات، يُرجى الاطّلاع على تعليمات تفعيل الدعم التلقائي للغات حسب التطبيقات.

  • واجهات برمجة التطبيقات الإضافية: تتيح واجهات برمجة التطبيقات العامة هذه، مثل طريقتَي setApplicationLocales() وgetApplicationLocales() في LocaleManager، السماح للتطبيقات بضبط لغة مختلفة عن لغة النظام في وقت التشغيل.

    تتم مزامنة واجهات برمجة التطبيقات هذه تلقائيًا مع إعدادات النظام، وبالتالي، ستضمن التطبيقات التي تستخدم واجهات برمجة التطبيقات هذه لإنشاء أدوات اختيار لغة مخصّصة داخل التطبيقات أن يحصل المستخدمون على تجربة متسقة للمستخدمين بغض النظر عن مكان اختيار إعدادات اللغة المفضّلة. وتساعد واجهات برمجة التطبيقات العامة أيضًا في تقليل كمية الرموز النموذجية، كما أنها تتوافق مع حِزم APK المجزأة، وتتيح أيضًا ميزة الاحتفاظ التلقائي بنسخة احتياطية للتطبيقات لتخزين إعدادات لغة المستخدم على مستوى التطبيق.

    للتوافق مع الأنظمة القديمة مع إصدارات Android السابقة، تتوفّر أيضًا واجهات برمجة التطبيقات المكافئة في AndroidX. ومع ذلك، تعمل واجهات برمجة التطبيقات المتوافقة مع الأنظمة القديمة مع سياق AppCompatActivity، وليس سياق التطبيق، على نظام التشغيل Android 12 (المستوى 32 من واجهة برمجة التطبيقات) والإصدارات الأقدم. يمكنك الوصول إلى واجهات برمجة التطبيقات المتوافقة مع الأنظمة القديمة باستخدام Appcompat 1.6.0 أو إصدار أحدث.

نظرة عامة حول استخدام هذه الميزة

يعرض الجدول التالي عمليات التنفيذ المقترَحة استنادًا إلى حالات الاستخدام المختلفة.

حالة الاستخدام عمليات التنفيذ المقترَحة
لا يحتوي تطبيقك على أداة اختيار اللغة.
  1. يمكنك تفعيل ميزة إتاحة اللغات تلقائيًا حسب التطبيقات لإنشاء ملف LocaleConfig وإضافة لغات تطبيقك إلى إعدادات النظام.
  2. اختياريًا، إذا أردت إضافة أداة اختيار اللغة داخل التطبيق، استخدِم مكتبة AndroidX ووافِق على تنفيذ واجهة برمجة التطبيقات لإتاحة التوافق مع الأنظمة القديمة من خلال autoStoreLocales.
يحتوي تطبيقك حاليًا على أداة اختيار اللغة.
  1. يمكنك تفعيل ميزة إتاحة اللغات تلقائيًا حسب التطبيقات لإنشاء ملف LocaleConfig وإضافة لغات تطبيقك إلى إعدادات النظام.
  2. انقل المنطق المخصّص لتطبيقك لاستخدام واجهات برمجة التطبيقات العامة لضمان حصول المستخدمين على تجربة متّسقة.
  3. تعامل مع الطلبات البسيطة التالية:
    1. يمكنك الاتصال بـ AppCompatDelegate.setApplicationLocales() في المرة الأولى التي يتم فيها تشغيل تطبيقك على جهاز يعمل بنظام التشغيل Android 13.
    2. يمكنك الاتصال بـ AppCompatDelegate.setApplicationLocales() لتوفير لغات طلبها المستخدم مسبقًا للنظام في الحالات التالية:

إعدادات النظام للمستخدمين

بدءًا من نظام التشغيل Android 13، يتضمّن Android موقعًا مركزيًا في إعدادات النظام لضبط الإعدادات المفضّلة للغة حسب التطبيقات. لضمان إمكانية ضبط لغات تطبيقك في إعدادات النظام على الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android 13 أو الإصدارات الأحدث، يمكنك تفعيل إتاحة اللغات التلقائية حسب التطبيقات (إجراء يُنصح به) أو ضبط الدعم يدويًا.

تفعيل إتاحة اللغات التلقائية حسب التطبيقات

بدءًا من إصدار Android Studio Giraffe والإصدار 8.1 من AGP، يمكنك إعداد تطبيقك ليتوافق مع الإعدادات المفضّلة للّغة حسب التطبيق تلقائيًا. استنادًا إلى موارد مشروعك، ينشئ AGP ملف LocaleConfig ويضيف مرجعًا إليه في ملف البيان النهائي، وبذلك لن تضطر إلى إجراء ذلك يدويًا. يستخدم AGP الموارد في مجلدات res بوحدات تطبيقك وأي تبعيات لوحدات المكتبة لتحديد اللغات التي يجب تضمينها في ملف LocaleConfig. ويعني هذا أنّه في حال إضافة موارد للغة جديدة إلى التطبيق، لن يكون هناك داعٍ للقلق بشأن تحديث ملف LocaleConfig.

يُرجى العِلم أنّ ميزة اللغة التلقائية المخصّصة حسب التطبيقات تتوافق مع التطبيقات التي تعمل بالإصدار 13 من نظام التشغيل Android 13 (المستوى 33 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث. لاستخدام الميزة، يجب ضبط compileSdkVersion على 33 أو أعلى. لضبط إعدادات اللغة المخصّصة حسب التطبيقات للإصدارات السابقة من Android، لا تزال بحاجة إلى استخدام واجهات برمجة التطبيقات وأداة اختيار اللغة داخل التطبيقات.

لتفعيل إتاحة اللغات تلقائيًا حسب التطبيقات، اتّبِع الخطوات التالية:

  1. لتفعيل الميزة، استخدِم الإعداد generateLocaleConfig في المجموعة androidResources {} من ملف build.gradle.kts على مستوى الوحدة (ملف build.gradle إذا كنت تستخدم تطبيق Groovy). تكون الميزة غير مفعَّلة تلقائيًا.

    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 لإضافة اللغات المتاحة إلى إعدادات النظام.

يمكنك ضبط إعدادات تطبيقك يدويًا للتأكّد من إمكانية ضبط لغاته في إعدادات النظام على الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو الإصدارات الأحدث. لتنفيذ ذلك، أنشِئ ملف locales_config بتنسيق XML وأضِفه إلى ملف البيان لتطبيقك باستخدام السمة android:localeConfig. إنّ تجاهل إشارات إدخال بيان android:localeConfig التي تفيد بأنّ المستخدمين يجب ألا يتمكّنوا من ضبط لغة تطبيقك بشكل مستقل عن لغة النظام ضمن إعدادات النظام

لإضافة اللغات التي يتيحها تطبيقك يدويًا إلى إعدادات نظام المستخدم:

  1. أنشئ ملفًا باسم res/xml/locales_config.xml وحدِّد لغات تطبيقك، بما في ذلك اللغة الاحتياطية النهائية لتطبيقك، وهي اللغة المحدّدة في 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 وتوفير لغات محدَّثة إذا كان تطبيقك يستخدم إجراءات الأقلمة من جهة الخادم.

يمكن لأدوات IME الآن استخدام LocaleManager.getApplicationLocales لمعرفة لغة واجهة المستخدم للتطبيق الحالي لتحديث لغة لوحة المفاتيح كما هو موضح في المثال التالي:

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

تحديد اللغات المتوافقة في Gradle

إذا لم تكن هذه السمة متوفّرة، يجب تحديد اللغات نفسها باستخدام السمة resourceConfigurations في ملف build.gradle على مستوى الوحدة في تطبيقك:

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

عند توفّر السمة resourceConfigurations، لا يضمِّن نظام التصميم سوى مورد اللغة في حزمة APK لهذه اللغات المحدّدة، ما يمنع تضمين السلاسل النصية المترجَمة من المكتبات الأخرى التي قد تتوافق مع اللغات التي لا يتوافق معها تطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على تحديد اللغات التي يتوافق معها تطبيقك.

كيفية اختيار المستخدمين للغة التطبيق في إعدادات النظام

يمكن للمستخدمين اختيار لغتهم المفضّلة لكل تطبيق من خلال إعدادات النظام. ويمكن للمستخدمين الوصول إلى هذه الإعدادات بطريقتين مختلفتين:

  • الوصول من خلال إعدادات النظام

    الإعدادات > النظام > اللغات والإدخال > لغات التطبيق > (اختيار تطبيق)

  • الوصول من خلال إعدادات التطبيقات

    الإعدادات > التطبيقات > (اختيار تطبيق) > اللغة

التعامل مع أدوات اختيار اللغة داخل التطبيق

بالنسبة إلى التطبيقات التي تتضمّن أداة اختيار لغة داخل التطبيق أو تريد استخدامها، استخدِم واجهات برمجة التطبيقات العامة بدلاً من منطق التطبيق المخصص لمعالجة الإعدادات والحصول على اللغة المفضّلة للمستخدم في تطبيقك. وإذا كنت تستخدم واجهات برمجة التطبيقات العامة لأداة اختيار اللغة داخل التطبيق، يتم تعديل إعدادات نظام الجهاز تلقائيًا لمطابقة اللغة التي يختارها المستخدم من خلال التجربة داخل التطبيق.

للتوافق مع الأنظمة القديمة مع إصدارات Android السابقة، ننصحك بشدة باستخدام مكتبة دعم AndroidX عند تنفيذ أداة اختيار اللغة داخل التطبيق. ويمكنك أيضًا تنفيذ واجهات برمجة التطبيقات لإطار العمل مباشرةً إذا كنت بحاجة إلى ذلك.

التنفيذ باستخدام مكتبة دعم AndroidX

استخدِم طريقتَي setApplicationLocales() وgetApplicationLocales() في Appcompat 1.6.0 أو الإصدارات الأحدث. تجدر الإشارة إلى أنّ واجهات برمجة التطبيقات المتوافقة مع الأنظمة القديمة تعمل مع سياق AppCompatActivity، وليس مع سياق التطبيق، على الأجهزة التي تعمل بالإصدار 12 من نظام Android (المستوى 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() لاسترداد اللغة المفضَّلة للمستخدم. يمكن أن يكون المستخدم قد اختار لغة تطبيقه من إعدادات النظام أو من أداة اختيار اللغة داخل التطبيق.

دعم الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم

للتوافق مع الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android (المستوى 32 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم، اطلب من AndroidX معالجة تخزين اللغة عن طريق ضبط قيمة autoStoreLocales على true وandroid:enabled على false في إدخال البيان لخدمة AppLocalesMetadataHolderService لتطبيقك، كما هو موضّح في مقتطف الرمز التالي:

<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 (المستوى 32 لواجهة برمجة التطبيقات) أو إصدار أقدم.

إذا كان لتطبيقك موقع تخزين لغة مخصص، ننصحك باستخدام عملية تبديل لمرة واحدة بين حل تخزين اللغة المخصص وautoStoreLocales حتى يستمر المستخدمون في الاستمتاع بالتطبيق باللغة التي يفضلونها. ينطبق ذلك بشكل خاص في الحالات التي يتم فيها تشغيل تطبيقك لأول مرة بعد ترقية الجهاز إلى Android 13. في هذه الحالة، يمكنك توفير رموز محلية سبق أن طلبها المستخدم من خلال استرداد اللغات من مساحة التخزين المخصّصة وتمريرها إلى AppCompatDelegate.setApplicationLocales().

التنفيذ باستخدام واجهات برمجة التطبيقات لإطار عمل Android

على الرغم من أنّنا ننصح بشدة باستخدام مكتبة الدعم الخاصة بـ AndroidX لتنفيذ أدوات اختيار اللغة داخل التطبيقات، يمكنك أيضًا استخدام الطريقتَين setApplicationLocales() وgetApplicationLocales() في إطار عمل Android على الأجهزة التي تعمل بنظام التشغيل 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 من واجهة برمجة التطبيقات Speech Recognizer API.

ضع في الاعتبار العنوان Accept-Language لعلامة التبويب Chrome Custom

يمكنك إضافة Accept-Language Header من خلال Browser.EXTRA_HEADERS لفتح صفحة ويب بلغة تطبيقك عند استدعاء علامة تبويب Chrome Custom (علامة تبويب Chrome Custom).

في حال إزالة إعدادات اللغة المخصّصة حسب التطبيقات من إعدادات النظام، عليك إعادة ضبط لغة التطبيق على لغة النظام.

إذا أزلت إعدادات اللغة المفضّلة في تطبيقك من إعدادات النظام (من خلال إزالة 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" (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="en-XA"/> <!-- English (Pseudo-Accents) -->
   <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="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="my-MM"/> <!-- Burmese (Myanmar) -->
   <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="tl"/> <!-- Filipino -->
   <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-CN"/> <!-- Chinese (Simplified) -->
   <locale android:name="zh-HK"/> <!-- Chinese (Hong Kong) -->
   <locale android:name="zh-TW"/> <!-- Chinese (Traditional) -->
   <locale android:name="zu"/> <!-- Zulu -->
</locale-config>