Android应用程序选择默认语言,无论语言偏好顺序配置如何设置

Jac*_*ski 10 string android locale internationalization

从Android 7.0(API级别24)开始,用户可以在其设备上设置首选语言(源:LocaleList API).我的问题是我的应用程序不尊重此设置 - 它不考虑第二语言.

Settings -> languages我选择我的语言偏好:

 1. Polish (preferred)
 2. French
Run Code Online (Sandbox Code Playgroud)

在Android应用程序中,我支持两种语言(en默认情况下,和fr):

values/strings.xml (English as default)
values-fr/strings.xml (French)
Run Code Online (Sandbox Code Playgroud)

使用此配置,应用程序以英语(默认)启动,而在我的语言首选项列表中有法语(我的应用程序支持,应该使用).

为什么Android在这种情况下会选择法语?如何解决?

注意:当我在设置中选择FR语言时,会正确设置法语

EN strings.xml文件示例:

  <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources [<!ENTITY applicationName "app\'s name">]>
<resources>
  <string name="application_name">&applicationName;</string>
  <string name="dialog_ok">OK</string>
  ...
</resources>
Run Code Online (Sandbox Code Playgroud)

FR strings.xml文件示例:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources [<!ENTITY applicationName "french name">]>
<resources>
  <string name="application_name">&applicationName;</string>
  <string name="dialog_ok">Oui</string>
  ...
</resources>
Run Code Online (Sandbox Code Playgroud)

Mih*_*ita 14

该解决方案是增加resConfigsandroid.defaultConfigapp/build.gradle包含您的确切区域列表(你在你的应用程序):

android {
  defaultConfig {
    resConfigs "nb", "nn", "in", "iw", "fr", ...
  }
}
Run Code Online (Sandbox Code Playgroud)

请参阅http://www.unicodeconference.org/presentations/上的"Android国际化"教程的幻灯片 (直接链接:http://www.unicodeconference.org/presentations/TS1T3-Nita-Pournader.pdf)

另外https://gist.github.com/amake/0ac7724681ac1c178c6f95a5b09f03ce


解释:通过语言环境列表的回退发生在开始时,而不是在加载字符串时.

如今大多数应用程序都使用某种支持库.Google支持库本地化为大约80种语言,库中的资源将合并到您的应用程序中.

在加载时,系统按列表中的顺序检查本地化资源,从支持库中查找波兰语的一些"跟踪",并确定您的应用程序已转换为波兰语.

所以它决定实际上你有波兰语,将默认语言环境设置为波兰语(因此你可以获得波兰语的日期,时间等格式).但是当它试图加载字符串时,没有任何东西可以找到,并且从默认文件夹(在值中)加载字符串,这些是英语.

通过使用resConfigs,您告诉资源编译器仅包含您在apk中需要的语言环境.因此,它将从支持库中删除少数波兰语字符串.现在装载机将检查,没有波兰语字符串,去法语,一切都很好.

这不仅解决了您的问题,而且还导致(稍微)更小的apk.