如何获取当前Android应用程序显示的语言(区域设置)?

Ale*_*iks 28 android locale localization

如何获知当前Android应用用于向用户显示文本的语言(语言环境)?

我知道我可以Locale.getDefault()用来获取默认的操作系统区域设置.但它可能与应用程序用于显示文本和其他资源的区域设置不同,如果app不支持此区域设置.


我需要确定应用程序显示的语言(语言环境),因此应用程序可以将语言传递给服务器,因此它可以本地化返回的结果.

Ale*_*iks 46

我自己的解决方案是添加strings.xml键值对locale=<locale code>,因此context.getResources().getString(R.string.locale)将返回特定于使用的语言环境的语言环境代码.

  • @YaqubAhmad 我后来想到了这个解决方案。但我仍在等待可能的更好的解决方案。 (2认同)
  • 10 年过去了,这仍然是获得所需语言环境的唯一方法。 (2认同)

sot*_*cha 31

这是你的应用程序配置,所以你可以得到它:

getResources().getConfiguration().locale
Run Code Online (Sandbox Code Playgroud)

这不同于

Locale.getDefault()
Run Code Online (Sandbox Code Playgroud)

并显示应用程序使用的区域设置可能不同.

它可能不同,因为开发人员可以通过更新应用程序配置来更改它,请检查:Resources.updateConfiguration

  • 不幸的是,这不像我需要的那样工作.如果设置系统语言,例如,对于Dansk(丹麦语),`getResources().getConfiguration().locale`返回da_DK,同时显示英文字符串(来自`values/strings.xml`). (9认同)
  • getResources().getConfiguration().locale.getLanguage(); 是正确的方法 (2认同)

Li *_* Li 5

以下代码对我有用:

@TargetApi(Build.VERSION_CODES.M)
private String getCurrentDefaultLocaleStr(Context context) {
    Locale locale = context.getResources().getConfiguration().locale;
    return locale.getDefault().toString();
}
Run Code Online (Sandbox Code Playgroud)

注意:在Build.VERSION_CODES.N上获取语言环境的方式略有变化。对于N或更高版本,代码应类似于下面的代码块;但是,我只在上面的代码块中对M及以下执行此操作,并且对N及以上也兼容。

    // Build.VERSION_CODES.N
    Locale locale = context.getResources().getConfiguration().getLocales().get(0);
Run Code Online (Sandbox Code Playgroud)

关于支持的本国语言,我得到了以下信息:

English:             en 
Traditional Chinese: zh_TW_#Hant 
Simplified Chinese:  zh_CN_#Hans
Spanish:             es_ES
French:              fr_FR
Japanese:            ja_JP
German:              de_DE
Run Code Online (Sandbox Code Playgroud)

有一系列方法以不同的格式提供相同的语言环境信息:

locale.getDefault()。getCountry();
locale.getDefault()。getISO3Language();
locale.getDefault()。getISO3Country();
locale.getDefault()。getDisplayCountry();
locale.getDefault()。getDisplayName();
locale.getDefault()。getDisplayLanguage();
locale.getDefault()。getLanguage();
locale.getDefault()。toString();