Android获取当前语言环境,不是默认设置


299

如何在Android中获取用户的当前语言环境?

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

基本上,我希望从当前语言环境获得两个字母的语言代码。不是默认值。没有Locale.current()


default()是一个非常安全的选择,只是不要使用它进行处理(如文档所说)。
A–C

@ A--C使用它进行处理吗?
CQM 2013年

是的,看看文档怎么说:某些语言环境将使用“,”作为小数点和“。”。用于数字分组。因此parseInt()之类的东西可能会失败。请注意,他们仍然建议使用default(),但不建议使用会破坏代码的内容。
A–C

Answers:


487

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

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

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

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


1
在系统中更改默认语言环境后,是否有人检查未更改默认语言环境?我认为这是那些“配置更改”,这使得活动破坏并重新创建一个
米哈尔ķ

11
我对其进行了测试,并在保持语言环境不变的情况下输出了它们;结果是,输出是相同的。因此,Locale.getDefault()可在立即更新时安全使用。 Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio

58
在Configuration类中已弃用此方法,有关此建议,请参阅最新文档:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth 2016年

7
他们为什么不只是添加getFirstLocale()方法来避免怪异的getLocales()。get(0)?
user3290180 '16

1
如果要支持旧版本和较新版本的api怎么办?
伊万

179

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

   Locale getCurrentLocale(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;
        }
    }

6
支持库中是否有某些东西可以避免if-else?
Federico Ponzi

8
如果您包含if和后备代码,则代码中不需要@TargetApi(Build.VERSION_CODES.N)
Patrick Favre

@FedericoPonzi截至25.0.1为止,ResourceCompat似乎没有适用于语言环境的方法
Patrick Favre

2
如果用户安装了多种语言,则可能无法使用。您应该使用,LocaleList.getDefault().get(0);因为这将返回按首选语言排序的语言环境。
卷曲

21
@FedericoPonzi @ for3st我在ConfigurationCompatConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval

62

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

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

或在科特林:

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

7
如果您没有任何背景,您也可以这样做ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.

@QuentinG。是的,但是在这种情况下最好使用Application上下文。
McMath

要清楚一点,这不会返回默认语言环境,而是用户首选的语言环境?
Csaba Toth

12

getDefault的文档:

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

同样从Locale文档:

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

似乎您应该只使用它。


7
这个答案是错误的,具有默认的语言环境,但是如果用户在运行中对其进行了更改,则会显示错误。下一个答案是正确的
2013年

同意,错误的答案。就我而言,我正在寻找一种不必使用getResources()的方法,这意味着我需要一个上下文。我的问题是没有上下文的帮助程序类,但是我想我必须将其传递给我。如果您有一个可以让人们更改其语言环境并更改视图的字符串,数字格式等的应用程序,那么您需要使用Devunwired的回复
1mike12

为我工作。如果将断点设置为Locale.setDefault(),则在至少将设备语言更改回Android 5.0时会调用该断点(就我所测试的而言)
夸张的

6

以上所有答案-不起作用。因此,我将在此处放置可在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();
   }
}

可以在设备级别返回用户首选语言方向的少数答案之一。LocaleListCompat.getDefault()如果您使用的是AndroidX,也可以使用。
山姆

1

我用了这个:

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

0

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

您可以考虑使用

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

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


是的,但没有它被替换为androidx ConfigurationCompat版本,请参阅developer.android.com/reference/androidx/core/os/...
DragonLord

正确,也许只是因为androidx迁移而被提及
Rakshit Soni
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.