我写了一个多语种的应用程序。
我有不同语言的values
文件夹,例如values-fa
和values-ru
。由于其中一些语言如波斯语和阿拉伯语是RTL,我使用不同的布局设计,将一些其他布局 .xml 文件放在主layout-ldrtl
文件夹旁边的文件夹layout
中
我还将一个名为is_right_to_left.xml
的文件放在一个名为values-ldrtl
的文件夹中,该文件夹定义了一个这样的变量:
<bool name="is_right_to_left">true</bool>
我在values
文件夹中有相同的文件,并将变量值设置为false
。
每当我需要知道代码时,我会用这一行来理解当前的语言环境是否是RTL语言:
isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left);
我用不同的设备配置测试了应用程序,一切都像魅力一样。例如,将设备语言设置为Farsi会导致应用从values-fa
读取字符串,从layout-ldrtl
读取布局,而当为设备设置阿拉伯语时,将从values-ar
读取值并布局也可以从layout-ldrtl
读取,因为它们都是RTL语言。它当然也适用于LTR语言。这就是我想要的。
当我以编程方式设置应用程序的区域设置时,会出现问题。这是我在onCreate()
的{{1}}方法中编写的代码:
MainActivity
现在,根据语言正确读取值,但永远不会读取Locale myLocale = new Locale("fa");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
和layout-ldrtl
。因此,由于错误的 .xml 文件和错误的values-ldrtl
变量值,应用程序会加载LTR设计。
我测试的一个解决方案是将这些 .xml 文件分别放在每个语言布局文件夹中,并且它可以正常工作。但我希望能够找到一种更好,更整洁的方法来解决问题。
除了解决方案,为什么android会以这种方式行事?
答案 0 :(得分:4)
试试这个:
Resources res = getResources();
Configuration newConfig = new Configuration( res.getConfiguration() );
Locale locale = new Locale("fa");
Locale.setDefault(locale);
newConfig.locale = locale;
newConfig.setLayoutDirection( locale );
res.updateConfiguration( newConfig, null );