获取设备中的当前语言


608

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


10
此处的大多数答案都获得了应用程序的语言。假定您可以在代码中设置应用程序的默认语言环境,正确的答案就是Sarpe给出的答案-它为您提供了设备的语言环境。
维克多·伊内斯库

@VictorIonescu感谢您的评论。Sarpe的答案是获取设备区域设置的正确答案。请参考。stackoverflow.com/a/28498119/3762067
Varad Mondkar '18

Answers:


834

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

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage()将本地化语言。如果您只想获取ISO代码(例如,if或switch语句),请使用“ Locale.getDefault()。getISO3Language();”
nuala 2012年

13
getISO3Language()为德国(德国)而不是德国返回“ deu”之类的东西
Tobias

372
您可以Locale.getDefault().getLanguage();用来获取常用的语言代码(例如“ de”,“ en”)。
muscardinus'5

35
@DeRagan,这并不总是为您的设备提供语言,而是仅为您的应用提供语言。例如,如果我致电Locale.setDefault("ru"),并且系统设置中的语言设置为英语,则method Locale.getDefault().getLanguage()将返回“ ru”,而不是“ en”。还有另一种获取真实的系统区域设置/语言的方法吗?我发现这里没有文档记录的解决方案,但是还有更优雅的解决方案吗?
Prizoff 2012年

47
我更喜欢Locale.getDefault().toString()给出一个可以完全识别语言环境的字符串,例如“ en_US”。
汤姆(Tom)

835

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

7
谢谢,很好,有很多可能性。您能否如“ Tom”的注释中所建议的那样添加“ Locale.getDefault()。toString()”。
RenniePet 2014年

我糊涂了。您刚刚复制了DeRagan的答案吗?
节食者

1
对于那个很抱歉。是的,我确实在里面添加了它。我应该留个字条来自这里。我在尝试帮助人们更快找到所需答案时犯了一个错误。因为您的显然是更好的答案。但是,当然,您永远都不会登上榜首,因为人们不像顶尖榜单那样频繁地看到它。如果我们在其中添加注释并指出它来自此答案,可以吗?
Patrick Boos 2015年

1
再一次问好。我不喜欢这种解决方案。目前,DeRagan的答案显示在第一位,而我的答案显示在第二位。对于研究人员而言,在问题页面中查看第二个答案应该不难。如果@pinki更改接受的答案会更好。但这似乎是3个月前出现的pinki。
trante 2015年

1
还有Locale.getDefault().getDisplayLanguage()回报"English"
体育运动

105

对我有用的是:

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

6
目前不赞成使用getConfiguration()。locale,请改用getConfiguration()。getLocales()。get(0)
Eliseo Ocampos

4
这是对这个问题的正确答案。其他答案只能在应用而非设备上找到。
霍夫斯,

6
我不知道在编写答案时是否存在此问题,但是支持库具有此功能的向后兼容版本,因此无需自己编写向后兼容性。ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

正如@Thorbear指出的那样,现在使用新的支持库方法getLocales是可行的方法。我已经更新了答案。
Sarpe

这是正确的答案。其他人则返回非系统的应用语言。
Chintan Rathod

44

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

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

10
这不是真的。他们是不同的。如果用户切换语言环境,则第一个可以更改。第二个是预装在手机上的手机。无论用户做什么,它都不会改变。
gregm

16
gregm的评论可能是错误的。参见airewyre的回答。
jan groth 2012年

4
@gregm的评论是错误的。自己尝试一下,您会发现,当更改设置中的语言时,Locale.getDefault()将会更改。
Patrick Boos


尽管@gregm的评论是错误的,但他仍然是正确的,这两行不需要返回相同的语言环境。只需Locale.setDefault()事先与其他区域设置调用,您将获得不同的结果。
arekolek

35

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

因此,我的设备的默认设置为English(United Kindom),并且在这种状态下,Johan答案中的两个字符串都给出了相同的结果。如果然后在电话设置中更改语言环境(例如更改为italiano(Italia))并重新运行,则Johan回答中的两个字符串都将语言环境设置为Italiano(Italia)。

因此,我相信Johan的原始帖子是正确的,而gregm的评论是错误的。



17

你可以用这个

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

当“ xx”是任何语言代码,例如“ en”,“ fr”,“ sp”,“ ar” ..等


3
if(Locale.ENGLISH.equals(Locale.getDefault()。getLanguage())){...}
Clement Martino

1
@ClementMartino,对于像英语这样的预定义语言环境,您的建议是可以的,但是对于其他语言环境,如阿拉伯语,我们必须使用语言代码进行解析
Simon K. Gerges

8

如果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


2020年应该是一个可以接受的答案!
Andrii Kovalchuk

6

添加到约翰·佩格里姆的答案

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 ...
}

5

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

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

1
如果您已覆盖配置的任何部分,这就是答案
Takhion


4

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

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

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


3

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

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

3

有两种语言。

操作系统默认语言:

Locale.getDefault().getDisplayLanguage();

当前的应用语言:

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

3
事实并非如此,如果您在应用程序中更改语言环境,甚至首先要给您更改的值,而不是系统的值
To Kra Kra

3

如果您选择一种语言,则无法键入此希腊文可能会有所帮助。

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

3

如果要检查当前语言,请使用@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())
CoolMind

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

2
请添加一些有关为什么此问题的答案的详细信息-仅代码段将无法帮助读者理解解决方案
Wand Maker

Locale.getDefault()。getDisplayName()提供设备的当前语言。并且我们正在检查设备语言是否为印地语..如果当前设备语言为印地语,则在块中执行所需操作。
Pratibha Sarode

1

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

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

希望能帮助到你。


1
Locale.getDefault().getDisplayLanguage()

将为您Written指定语言名称,例如,English, Dutch, French

Locale.getDefault().getLanguage()

language code例如,将给您:en, nl, fr

两种方法都返回String


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

1

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

如果您希望应用语言是最简单的方法,那就是app_langstrings.xml文件中添加一个键,并为每个语言指定语言。

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


我无法相信没有框架支持可为您提供AssetManager当前正在使用的语言。实际上,Resources.java中的字符串格式助手使用默认语言环境[0],因此,如果AssetManager中的字符串来自与设备默认语言环境不匹配的语言环境(因为您的应用程序不支持它,但支持例如下一个在清单上),然后有一个错误。
dcow

1
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";
}

如果您可以向答案中添加更多说明,而不只是粘贴代码,那会更好。
卡洛斯

0

我的解决方案是这样的

@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


0

这是获取设备国家的代码。与所有版本的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;
}

-3

如果您想为居住在说印地语的印度用户做特定任务,请在以下情况下使用

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.