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
该解决方案是增加resConfigs在android.defaultConfig的app/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.