Как мы можем получить текущий язык, выбранный на устройстве Android?
Как мы можем получить текущий язык, выбранный на устройстве Android?
Ответы:
Если вы хотите получить выбранный язык вашего устройства, это может помочь вам:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
чтобы получить обычный код языка (например, "de", "en").
Locale.setDefault("ru")
, а язык в системных настройках установлен на английский, метод Locale.getDefault().getLanguage()
вернет «ru» , но не «en» . Есть ли другой способ получить реальный язык / язык SYSTEM? Я нашел недокументированное решение здесь , но есть ли более элегантное решение?
Locale.getDefault().toString()
который дает строку, которая полностью идентифицирует локаль, например, "en_US".
Я проверил методы Locale на моем устройстве 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
- это путь. Я обновил свой ответ.
Вы можете «извлечь» язык из текущей локали. Вы можете извлечь языковой стандарт через стандартный API Java или с помощью контекста Android. Например, две строки ниже эквивалентны:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
другой регион заранее, и вы получите другие результаты.
Чтобы сэкономить время и / или путаницу, я хотел бы поделиться с вами тем, что я попробовал две альтернативы, предложенные Йоханом Пелгримом выше, и на моем устройстве они эквивалентны - независимо от того, было ли изменено расположение по умолчанию.
Таким образом, по умолчанию на моем устройстве установлен английский (United Kindom), и в этом состоянии, как и ожидалось, обе строки в ответе Йохана дают одинаковый результат. Если я затем изменю язык в настройках телефона (скажем, italiano (Италия)) и перезапущу, то обе строки в ответе Йохана дают язык как italiano (Италия).
Поэтому я считаю, что первоначальный пост Йохана был правильным, а комментарий Грегма - неверным.
Вы можете использовать это
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
когда "xx" - это любой код языка, например "en", "fr", "sp", "ar" .... и т. д.
Как описано в справочнике по языку, лучший способ получить язык:
Locale.getDefault().getLanguage()
этот метод возвращает строку с идентификатором языка в соответствии со стандартом ISO 639-1
если уровень 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 - СТАРЫЙ.
Вы можете использовать этот код, чтобы узнать ток клавиатуры
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Есть два языка.
Язык ОС по умолчанию:
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
файлу, а также укажите lang для каждого из langs.
Таким образом, если язык вашего приложения по умолчанию отличается от языка устройства, вы можете отправить его в качестве параметра для своих служб.
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());
}
показано ---> ru
Вот код для получения страны устройства. Совместим со всеми версиями 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
}