我们如何获得在Android设备中选择的当前语言?
我们如何获得在Android设备中选择的当前语言?
Answers:
如果要获取设备的所选语言,这可能会帮助您:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
用来获取常用的语言代码(例如“ de”,“ en”)。
Locale.setDefault("ru")
,并且系统设置中的语言设置为英语,则method Locale.getDefault().getLanguage()
将返回“ ru”,而不是“ en”。还有另一种获取真实的系统区域设置/语言的方法吗?我发现这里没有文档记录的解决方案,但是还有更优雅的解决方案吗?
Locale.getDefault().toString()
给出一个可以完全识别语言环境的字符串,例如“ en_US”。
我已经在Android 4.1.2设备上检查了Locale方法,结果如下:
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上下文来提取语言环境。例如,以下两行是等效的:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
事先与其他区域设置调用,您将获得不同的结果。
你可以用这个
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
当“ xx”是任何语言代码,例如“ en”,“ fr”,“ sp”,“ ar” ..等
如果API等级为24或更高,请使用LocaleList.getDefault().get(0).getLanguage()
elseLocale.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 ...
}
上面的答案不能区分简体中文和繁体中文。
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
}
Locale.getDefault().getDisplayLanguage()
将为您Written
指定语言名称,例如,English, Dutch, French
Locale.getDefault().getLanguage()
language code
例如,将给您:en, nl, fr
两种方法都返回String
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()));
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兼容。
解决方案:如果用户没有SIM卡,但没有获得所在国家/地区的电话卡,或当前语言选择时使用的SIM卡。
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;
}