Android获取当前的Locale,而不是默认

时间:2013-01-17 22:31:26

标签: android locale

如何在Android中获取用户当前的区域设置?

我可以获得默认值,但这可能不是当前正确的吗?

基本上我想要当前语言环境中的双字母语言代码。不是默认的。没有Locale.current()

9 个答案:

答案 0 :(得分:442)

默认Locale是在运行时为系统属性设置中的应用程序进程静态构建的,因此它将代表在应用程序启动时在该设备上选择的Locale 。通常,这很好,但它确实意味着如果用户在应用程序进程运行后更改其Locale设置,则getDefaultLocale()的值可能不会立即更新。

如果您需要在应用程序中出于某种原因捕获此类事件,您可以尝试从资源Locale对象获取Configuration,即

Locale current = getResources().getConfiguration().locale;

如果您的应用程序需要更改设置,您可能会发现更快地更新此值。

答案 1 :(得分:149)

Android N(Api等级24)更新(无警告):

None

答案 2 :(得分:31)

如果您使用的是Android支持库,则可以使用ConfigurationCompat代替@ Makalele的方法来删除弃用警告:

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

或在Kotlin:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

答案 3 :(得分:14)

来自getDefault的文档:

  

返回用户首选的语言环境。可能已使用setDefault(Locale)覆盖了此过程。

同样来自Locale文档:

  

默认语言环境适用于涉及向用户显示数据的任务。

好像你应该使用它。

答案 4 :(得分:1)

以上所有答案-不起作用。 因此,我将在此处放置适用于4和9 android系统的函数

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

答案 5 :(得分:1)

我用过这个:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

答案 6 :(得分:0)

 private Locale getLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

答案 7 :(得分:0)

根据官方documentation ConfigurationCompat 在支持库中已弃用

您可以考虑使用

LocaleListCompat.getDefault()[0].toLanguageTag()第0位是用户首选的语言环境

要在第0个位置获得默认语言环境,是 LocaleListCompat.getAdjustedDefault()

答案 8 :(得分:0)

至于现在,我们可以使用 ConfigurationCompat 类来避免警告和不必要的样板。

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);