获取设备当前语言

720

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


17
这里大部分答案是关于应用程序语言的。考虑到你可以在代码中设置应用程序的默认语言环境,Sarpe 给出的答案是正确的——那会给你设备的语言环境。请注意保持原文意思不变,使翻译通俗易懂。 - Victor Ionescu
@VictorIonescu 感谢您的评论。Sarpe的答案是获取设备区域设置的正确答案。请参考此链接:https://dev59.com/lW855IYBdhLWcg3wq2TL#28498119 - Varad Mondkar
这个回答解决了你的问题吗?如何在Android 13中从应用程序语言识别设备语言? - k4dima
32个回答

1054

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

9
谢谢,列出多种可能性很不错。请按照"Tom"的评论建议,添加"Locale.getDefault().toString()"。 - RenniePet
3
还有一个 Locale.getDefault().getDisplayLanguage(),它返回 "English" - sports

945

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

Locale.getDefault().getDisplayLanguage();

您可以使用Locale.getDefault().getLanguage(); 来获取通常的语言代码(例如 "de","en")


74
getDisplayLanguage()方法将本地化语言。如果你只想获取ISO代码(例如用于if或switch语句),请使用"Locale.getDefault().getISO3Language();"。 - nuala
14
getISO3Language()方法返回的是像"deu"这样的结果,而不是像"de"这样表示德国 (Germany) 的缩写。 - Tobias
398
您可以使用 Locale.getDefault().getLanguage(); 获取常见的语言代码(例如 "de"、"en")。 - muscardinus
44
@DeRagan,这不会总是为您的设备提供语言,而只针对您的应用程序。例如,如果我调用 Locale.setDefault("ru") ,而系统设置中的语言设置为英语,则方法 Locale.getDefault().getLanguage() 将返回 "ru" 而不是 **"en"**。有没有另一种获取真正的系统区域设置/语言的方法?我在这里找到了未记录的解决方案(https://dev59.com/nHE85IYBdhLWcg3wMAfc#4683532),但是否有更优雅的解决方案? - Prizoff
52
我更喜欢使用Locale.getDefault().toString(),这会返回一个完全标识区域设置的字符串,例如"en_US"。 - Tom
显示剩余13条评论

162

对我起作用的是:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() 返回一个全局共享的 Resources 对象,仅提供访问系统资源(没有应用程序资源),并且未配置为当前屏幕(不能使用尺寸单位,不随方向改变等)。

由于 getConfiguration.locale 已经被弃用,在 Android Nougat 中获取主要语言环境的首选方法是:

Resources.getSystem().getConfiguration().getLocales().get(0);
为确保与之前的 Android 版本兼容,可能的解决方案是进行一个简单的检查:

为确保与之前的 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());

7
getConfiguration().locale目前已经过时,请使用getConfiguration().getLocales().get(0)代替。 - Eliseo Ocampos
8
这是这个问题的正确答案。其他答案获取的是应用程序的位置,而不是设备的位置。 - hofs
9
我不知道回答撰写时是否存在,但支持库具有向后兼容版本,因此无需自己编写向后兼容性。 ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()) - Thorbear
正如@Thorbear所指出的那样,现在使用新的支持库方法getLocales是正确的方法。我已经更新了我的答案。 - Sarpe
3
这是正确答案。其他答案返回的是应用程序语言而不是系统语言。 - Chintan Rathod

51

您可以从当前区域设置中“提取”语言。您可以通过标准的Java API或使用Android Context来提取区域设置。例如,以下两行代码是等效的:

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

12
这不是真的。它们是不同的。第一个可以根据用户更改 Locale 而发生变化。第二个是预装在手机上的,无论用户怎么做都不会改变。 - gregm
16
评论者gregm的观点可能是错误的。请查看airewyre的答案。 - Jan Groth
5
@gregm的评论是错误的。只要您自己尝试一下,就会发现在设置中更改语言时Locale.getDefault()会发生变化。 - Patrick Boos
应该查看 https://dev59.com/cGgv5IYBdhLWcg3wW_l_ - Wernight
尽管@gregm的评论是错误的,但他仍然是正确的,这两行不需要返回相同的区域设置。只需事先使用其他语言环境调用Locale.setDefault(),即可获得不同的结果。 - arekolek
显示剩余3条评论

39
为了节省他人的时间并避免混淆,我想分享一下我已经尝试过 Johan Pelgrim 提出的两种替代方案,并且在我的设备上它们是等效的——无论是否更改默认位置。
因此,我的设备默认设置为英语(英国),在这种状态下,如预期,Johan答案中的两个字符串给出相同的结果。如果我然后更改手机设置中的区域设置(例如更改为意大利语(意大利)),并重新运行,则 Johan 答案中的两个字符串均将该地区设置为意大利语(意大利)。
因此,我认为 Johan 的原始帖子是正确的,而 gregm 的评论是不正确的。

19
Locale参考中所述,获取语言的最佳方法是:
Locale.getDefault().getLanguage()

该方法根据ISO 639-1标准返回语言ID字符串。


17

你可以使用这个

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

当 " xx " 是任何语言代码,如 "en", "fr", "sp", "ar"...等等时


3
如果 (Locale.getDefault().getLanguage().equals(Locale.ENGLISH)) { ...} - Clement Martino
1
@ClementMartino 您的建议在预定义语言环境(如英语)中是可以的,但对于其他语言环境,如阿拉伯语,我们必须使用语言代码进行解析。 - Simon K. Gerges

13

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


7

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

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

这将返回您设备语言设置的“en”或“de”或“fr”或其他语言代码。

6
为了补充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 ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接