如何获取当前的语言环境(API级别24)?

33

我是这样做的:

context.getResources().getConfiguration().locale

Configuration.locale在目标版本为24时已被弃用。因此,我做了以下更改:

context.getResources().getConfiguration().getLocales().get(0)
现在它说它仅适用于minSdkVersion 24,因此我无法使用它,因为我的最小目标版本较低。

正确的方法是什么?

现在它指出只能用于minSdkVersion 24,因此因为我的最低目标版本较低,我不能使用它。请问正确的方法是什么?

4个回答

61

检查你正在运行的版本,并回退到过时的解决方案:

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

6
你可以使用 Locale.getDefault(),这是Java获取当前Locale的标准方法。

1
这将仅返回系统设置中指定的语言环境。许多应用程序都有自己的语言选择器功能。如果是这种情况,则更喜欢@Egor的答案。 - Peter Serwylo
1
如果您手动选择区域设置,应调用Locale.setDefault()。 - ByteWelder
1
这非常重要,否则Java库无法正确地识别正确的Locale。 - ByteWelder
Peter表示,一些应用程序有自己的语言选择器。如果是这样,他们应该像Ken所说的那样调用Locale.setDefault。因此,这个解决方案将再次奏效。这应该是首选答案。 - LanDenLabs

6

这里是一个使用 ConfigurationCompat 类的一行代码:

ConfigurationCompat.getLocales(context.getResources().getConfiguration()).get(0)

1
谢谢您,这应该是被接受的答案:最小化且没有警告。 - Victor

3
Configuration.java文件中,有以下内容:
/**
 * ...
 * @deprecated Do not set or read this directly. Use {@link #getLocales()} and
 * {@link #setLocales(LocaleList)}. If only the primary locale is needed,
 * <code>getLocales().get(0)</code> is now the preferred accessor.
 */
@Deprecated public Locale locale;
...
configOut.mLocaleList = LocaleList.forLanguageTags(localesStr);
configOut.locale = configOut.mLocaleList.get(0);

基本上使用locale会返回用户设置的主要区域设置。接受答案与直接读取locale相同。

但是,当获取资源时,这个区域设置不一定是实际使用的区域设置。如果主要区域设置不可用,则可能是用户的次要区域设置。

以下是更正确的版本:

Resources resources = context.getResources();
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
        ? resources.getConfiguration().getLocales()
            .getFirstMatch(resources.getAssets().getLocales())
        : resources.getConfiguration().locale;

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