获取设备中的当前语言

如何在Android设备中获取当前选择的语言?

379723 次浏览

如果您想获取设备的所选语言,这可能会帮助您:

Locale.getDefault().getDisplayLanguage();

您可以使用Locale.getDefault().getLanguage();获取常用的语言代码(例如“de”、“en”)

您可以从当前语言环境中提取语言。您可以通过标准JavaAPI或使用Android上下文提取语言环境。例如,下面的两行是等效的:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

为了节省其他人的时间和/或混淆,我想分享的是,我已经尝试了Johan Pelgrim在上面提出的两个替代方案,并且在我的设备上它们是等价的-无论默认位置是否更改。

所以我的设备的默认设置是英语(联合王国),在这种状态下,Johan的回答中的两个字符串都给出了相同的结果。如果我然后更改电话设置中的语言环境(说italiano(Italia))并重新运行,那么Johan回答中的两个字符串都会给出语言环境为italiano(Italia)。

因此,我相信约翰的原始帖子是正确的,格雷格的评论是不正确的。

添加到Johan Pelgrim的回答

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().getLanguage()

此方法根据ISO 639-1标准返回具有语言ID的字符串

您可以使用此代码找出键盘当前

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

你可以用这个

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

当“xx”是任何语言代码时,如“en”、“fr”、“sp”、“ar”……等等

我在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

您可以尝试从系统资源中获取语言环境:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

有两种语言。

操作系统的默认语言:

Locale.getDefault().getDisplayLanguage();

当前应用语言:

getResources().getConfiguration().locale.getDisplayLanguage();//return string

对我有用的是:

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

上面的答案没有区分简单的中文和传统中文。 Locale.getDefault().toString()返回“zh_CN”,“zh_TW”,“en_US”等

引用:https://developer.android.com/reference/java/util/Locale.html,ISO 639-1是旧的。

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}

如果你选择一种语言,你不能输入这个希腊语可能会有所帮助。

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

获取设备语言的正确方法如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}

希望有帮助。

我的解决方案是这样的

@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

如果你想为居住在印度的说印地语的用户做特定的任务,那么使用下面的if条件

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
//Block executed only for the users resides in India who speaks Hindi
}

如果API级别为24或更高,请使用LocaleList.getDefault().get(0).getLanguage() 或者使用Locale.getDefault.getLanguage()

private fun getSystemLocale() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList.getDefault().get(0).language
} else {
Locale.getDefault().language
}

参考:https://developer.android.com/guide/topics/resources/multilingual-support

Locale.getDefault().getDisplayLanguage()

将为语言提供Written名称,例如English, Dutch, French

Locale.getDefault().getLanguage()

会给你language code,例如:en, nl, fr

两种方法都返回String

这是获取设备国家/地区的代码。兼容所有版本的android甚至oreo。

解决方案:如果用户没有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;
}
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()));

这个解决方案对我有用。这将返回您Android设备的语言(不是应用程序的本地语言)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

这将返回“en”或“de”或“fr”或您的设备语言设置为的任何内容。

如果您想检查当前语言,请使用@Sarpe(@Thor熊)的答案:

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

其他人对设备语言给出了很好的答案,

如果您希望使用app语言,最简单的方法是将app_lang键添加到您的strings.xml文件中,并为每个lang指定lang。

这样,如果您的应用程序的默认语言与设备语言不同,您可以选择将其作为服务的参数发送。

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://learn.microsoft.com/"+langue+"/learn";
}

基本静态编程语言答案:

Locale.getDefault().language

请小心,这里的大多数答案都提供了应用程序的语言。在某些情况下,此应用程序可以具有/设置与设备不同的语言。

获取实际的设备语言(是的,如果用户在设置中添加了多种语言,它将返回所有语言!)

静态编程语言:

// Will return something like ["en_US", "de_DE"]
val deviceLanguages: LocaleListCompat = ConfigurationCompat.getLocales(Resources.getSystem().configuration)
// Will return the actual language in use, like "en" or "de". The first language in the above code will be the default language
val currentActiveDeviceLanguage = languages.get(0).language

Locale.getDefault(). getLanguage()是VM语言

Locale.getDefault().getLanguage()

它是运行您的应用程序的当前VM实例的语言。它由DateFormat等java类使用。如果您使用某些java类,您可能需要在更改应用程序区域设置时修改它。如果您在更改应用程序区域设置时修改了它,它与android的语言不同。

context.get配置()。locale.getLanguage()是活动语言

context.getConfiguration().locale.getLanguage()

这是您在活动中设置的语言。 在最新的SDK版本中,以下是首选

context.getConfiguration().getLocales().get(0).getLanguage()

Resources.getSystem(). getConfiguration(). getLocales()给出了用户在系统级别添加的所有语言环境

这将为您提供用户在系统级别设置的第一个语言环境。

Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage()

大量用户是多语言的,因此您可能希望循环访问Locales。

如果您使用jetpack编写

在可组合功能方面

Context.applicationContext.resources.configuration.locales.get(0).language

您可以使用 . setLanguage(Locale.for语言标签(Locale.getDefault(). getLanguage())); 很好