Як ми можемо вибрати поточну мову, вибрану на пристрої Android?
Як ми можемо вибрати поточну мову, вибрану на пристрої Android?
Відповіді:
Якщо ви хочете отримати вибрану мову свого пристрою, це може допомогти вам:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
звичайний код мови (наприклад, "de", "en").
Locale.setDefault("ru")
, а мова в системних налаштуваннях встановлена на англійську, тоді метод Locale.getDefault().getLanguage()
поверне "ru" , але не "en" . Чи існує інший метод отримання реальної мови / мови SYSTEM? Я не знайшов тут документально підтвердженого рішення , але чи є більш елегантне рішення?
Locale.getDefault().toString()
який дає рядок, який повністю ідентифікує локаль, наприклад, "en_US".
Я перевірив методи локалізації на своєму пристрої Android 4.1.2 та результати:
Locale.getDefault().getLanguage() ---> en
Locale.getDefault().getISO3Language() ---> eng
Locale.getDefault().getCountry() ---> US
Locale.getDefault().getISO3Country() ---> USA
Locale.getDefault().getDisplayCountry() ---> United States
Locale.getDefault().getDisplayName() ---> English (United States)
Locale.getDefault().toString() ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag() ---> en-US
Locale.getDefault().getDisplayLanguage()
що повертається"English"
Що для мене працювало:
Resources.getSystem().getConfiguration().locale;
Resources.getSystem()
повертає глобальний об’єкт спільних ресурсів, який забезпечує доступ лише до системних ресурсів (немає ресурсів програми) і не налаштований для поточного екрана (не може використовувати одиниці виміру, не змінюється на основі орієнтації тощо).
Оскільки getConfiguration.locale
тепер застаріло, кращим способом отримання основного локального пристрою в Android Nougat є:
Resources.getSystem().getConfiguration().getLocales().get(0);
Щоб гарантувати сумісність з попередніми версіями Android, можливим рішенням буде проста перевірка:
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
//noinspection deprecation
locale = Resources.getSystem().getConfiguration().locale;
}
Оновлення
Починаючи з бібліотеки підтримки, 26.1.0
вам не потрібно перевіряти версію Android, оскільки вона пропонує зручний метод назад сумісний getLocales()
.
Просто зателефонуйте:
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
. Я оновив свою відповідь.
Ви можете "витягнути" мову з поточної мови. Ви можете витягти локальну мову за допомогою стандартного Java API або за допомогою Android Context. Наприклад, два рядки нижче є рівнозначними:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
Заздалегідь зателефонуйте з іншим місцевим місцем і отримайте різні результати.
Щоб заощадити час та / або розгубленість інших людей, я хотів поділитися тим, що я спробував дві альтернативи, запропоновані Йоханом Пелгрімом вище, і на моєму пристрої вони еквівалентні - змінили місце розташування за замовчуванням чи ні.
Тож за замовчуванням на моєму пристрої встановлено англійську мову (United Kindom), і в такому стані, як очікувалося, обидві рядки у відповіді Йохана дають однаковий результат. Якщо я потім зміню локальний параметр у налаштуваннях телефону (скажімо, на italiano (Italia)) і повторно запустіть, тоді обидві рядки у відповіді Йохана дають мова як italiano (Italia).
Тому я вважаю, що оригінальний пост Йохана є правильним, а коментар gregm - невірним.
Як описано в довіднику щодо локальної мови, найкращий спосіб отримати мову:
Locale.getDefault().getLanguage()
цей метод повертає рядок з ідентифікатором мови згідно стандарту ISO 639-1
Ви можете використовувати це
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
коли "xx" - це будь-який код мови на зразок "en", "fr", "sp", "ar" .... і так далі
якщо рівень API становить 24 або вище, використовуйте LocaleList.getDefault().get(0).getLanguage()
інше використанняLocale.getDefault.getLanguage()
private fun getSystemLocale(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return LocaleList.getDefault().get(0).getLanguage();
} else {
return Locale.getDefault.getLanguage();
}
}
довідка: https://developer.android.com/guide/topics/resources/multilingual-support
Щоб додати відповідь Йохана Пелгріма
context.getResources().getConfiguration().locale
Locale.getDefault()
еквівалентні тому, що android.text.format.DateFormat
клас використовує обидва взаємозамінно, наприклад
private static String zeroPad(int inValue, int inMinDigits) {
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
і
public static boolean is24HourFormat(Context context) {
String value = Settings.System.getString(context.getContentResolver(),
Settings.System.TIME_12_24);
if (value == null) {
Locale locale = context.getResources().getConfiguration().locale;
// ... snip the rest ...
}
Ви можете спробувати отримати локаль із системних ресурсів:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Відповіді вище не розрізняють простий китайський і традиційний китайський.
Locale.getDefault().toString()
працює, який повертає "zh_CN", "zh_TW", "en_US" тощо.
Посилання на: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 - СТАРИЙ.
Є дві мови.
Мова за замовчуванням ОС:
Locale.getDefault().getDisplayLanguage();
Поточна мова заявки:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
Якщо ви виберете мову, яку не можете ввести, ця грецька могла б бути корисною.
getDisplayLanguage().toString() = English
getLanguage().toString() = en
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng
Тепер спробуйте з грецькою
getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Якщо ви хочете перевірити поточну мову, скористайтеся відповіддю @Sarpe (@Thorbear):
val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
Правильний спосіб отримання мови вашого пристрою полягає в наступному:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
Сподіваюся, це допомагає.
Locale.getDefault().getDisplayLanguage()
дасть вам Written
ім’я для мови, наприклад,English, Dutch, French
Locale.getDefault().getLanguage()
дасть вам language code
, наприклад:en, nl, fr
Обидва методи повертають рядок
public class LocalUtils {
private static final String LANGUAGE_CODE_ENGLISH = "en";
// returns application language eg: en || fa ...
public static String getAppLanguage() {
return Locale.getDefault().getLanguage();
}
// returns device language eg: en || fa ...
public static String getDeviceLanguage() {
return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
}
public static boolean isDeviceEnglish() {
return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
}
public static boolean isAppEnglish() {
return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
}
}
Log.i("AppLanguage: ", LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ", LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ", String.valueOf(LocalUtils.isAppEnglish()));
Інші дали хороші відповіді щодо мови пристрою,
якщо ви хочете, щоб мова програми була найпростішою, це зробити, додавши app_lang
ключ до свого strings.xml
файлу та вкажіть язик для кожного з мов.
Таким чином, якщо мова за замовчуванням вашої програми відрізняється від мови пристрою, ви можете вибрати її як параметр для своїх служб.
public void GetDefaultLanguage( ) {
try {
String langue = Locale.getDefault().toString(); // ---> en_US
/*
Log.i("TAG", Locale.getDefault().getLanguage() ); // ---> en
Log.i("TAG", Locale.getDefault().getISO3Language() ); // ---> eng
Log.i("TAG", Locale.getDefault().getCountry() ); // ---> US
Log.i("TAG", Locale.getDefault().getISO3Country() ); // ---> USA
Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
Log.i("TAG", Locale.getDefault().getDisplayName() ); // ---> English (United States)
Log.i("TAG", Locale.getDefault().toString() ); // ---> en_US
Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
langue = Locale.getDefault().toLanguageTag(); // ---> en-US
url_Api = getUrlMicrosoftLearn(langue);
Log.i("TAG", url_Api );
Log.i("TAG", langue );
}else{
langue = langue.replace("_","-"); // ---> en-US
url_Api = getUrlMicrosoftLearn(langue);
Log.i("TAG", url_Api );
Log.i("TAG", langue );
}
}catch (Exception ex) {
Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
}
}
public String getUrlMicrosoftLearn(String langue) {
return "https://docs.microsoft.com/"+langue+"/learn";
}
Моє рішення таке
@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
return Resources.getSystem().getConfiguration().locale.getLanguage();
}
@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
getResources();
return Resources.getSystem().getConfiguration().getLocales().get(0);
}
і потім
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("Locale", getCurrentLocale().getLanguage());
} else {
Log.e("Locale", getCurrentLocale2().toString());
}
показано ---> en
ось код, щоб отримати країну пристрою. Сумісний з усіма версіями Android навіть oreo.
Рішення: якщо у користувача немає сім-карти, ніж отримати країну, він використовується під час налаштування телефону або поточного вибору мови.
public static String getDeviceCountry(Context context) {
String deviceCountryCode = null;
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if(tm != null) {
deviceCountryCode = tm.getNetworkCountryIso();
}
if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
deviceCountryCode = deviceCountryCode.toUpperCase();
}
else {
deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
}
// Log.d("countryCode"," : " + deviceCountryCode );
return deviceCountryCode;
}
Якщо ви хочете виконати конкретне завдання для користувачів, які проживають в Індії, які говорять хінді, тоді використовуйте нижче, якщо це умова
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
//Block executed only for the users resides in India who speaks Hindi
}