【问题标题】:How to get the current locale (API level 24)?如何获取当前语言环境(API 级别 24)?
【发布时间】:2016-11-11 01:19:54
【问题描述】:

我是这样做的:

context.getResources().getConfiguration().locale

Configuration.locale 如果目标为 24,则不推荐使用。所以我做了这个更改:

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

现在它说它只适用于minSdkVersion 24,所以我不能使用它,因为我的最小目标较低。

什么是正确的方法?

【问题讨论】:

    标签: android locale android-7.0-nougat


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这应该是公认的答案:最小且没有警告。
    【解决方案2】:

    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 基本上返回用户设置的primary 语言环境。接受答案与直接阅读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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这只会返回系统设置中指定的语言环境。许多应用程序都有自己的语言选择器功能。如果是这种情况,那么@Egor 的答案是首选。
      • 如果你手动选择语言环境,你应该调用 Locale.setDefault()
      • 这非常重要,否则 Java 库将无法正确选择正确的语言环境。
      • Peter 指出,一些应用程序有自己的语言选择器。如果他们这样做,他们应该像 Ken 所说的那样调用 Locale.setDefault。因此,此解决方案将再次起作用。这应该是首选答案。
      【解决方案4】:

      检查您正在运行的版本并退回到已弃用的解决方案:

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

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        相关资源
        最近更新 更多