一、需求
为一个Android平台的机器人开发应用,由于设备需要在国外使用,需要支持国际化,支持英语和阿拉伯语。实现一个弹框进行语言的切换
二、实现
国际化
1、资源文件
针对英语和阿拉伯语建立对应的value文件夹和string.xml,这里有一个小技巧,为避免在多个文件中复制粘贴,可以先输入中文,然后提取资源文件,则可以一键提取到多个文件夹中,如下图
在string.xml中,如果有不需要翻译的字符串,需加上translatable=false,否则会报错。
2、java代码
开始的代码如下
// 本地语言设置
Locale myLocale = new Locale(sta);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
//Locale.setDefault(myLocale); 解决问题的代码
conf.setLayoutDirection(myLocale);
res.updateConfiguration(conf, dm)
遇到的问题:
阿拉伯语的操作习惯为从右至左,Android也对此进行了支持,也就是RTL布局;但是采用了上述代码却发现虽然字符串变成了阿拉伯语,但是布局却没有相应的倒转;
一通搜索之后,尝试各种改法,还是没有生效,包括给layout指定direction为“locale”、替换updateConfiguration为更新的Api等。之后决定从VIew中的确定布局方向的代码入手,源码如下
/**
* Resolve and cache the layout direction. LTR is set initially. This is implicitly supposing
*/
public boolean resolveLayoutDirection() {
。。。
if (hasRtlSupport()) {
。。。
case LAYOUT_DIRECTION_LOCALE:
if((LAYOUT_DIRECTION_RTL == TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()))) {
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL;
}
break;
default:
// Nothing to do, LTR by default
}
}
。。。
}
从代码中看到,决定布局方向的是Locale.getDefault()中的语言,而不是想象中的Resource中的语言;Locale.getDefault()也就是JVM中的语言。
在上面的本地语言设置的代码中添加了Locale.setDefault(myLocale),运行OK。
这样的设计也是让人有些费解。
弹框
接下来是弹框遇到的问题,弹框直接使用了系统的AlertDialog。由于应用是全屏的,起初弹框弹出时,状态栏会出现造成界面的变动,于是研究如何使弹框出现时没有状态栏;
经过一系列搜索,最终奏效的是如下代码:
Window window = dialog.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
dialog.show();
这里的flag是not_focusable,而flag_fullscreen却无效,其中的原因还有待进一步研究
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。