一、需求

​ 为一个Android平台的机器人开发应用,由于设备需要在国外使用,需要支持国际化,支持英语和阿拉伯语。实现一个弹框进行语言的切换

二、实现

国际化

1、资源文件

​ 针对英语和阿拉伯语建立对应的value文件夹和string.xml,这里有一个小技巧,为避免在多个文件中复制粘贴,可以先输入中文,然后提取资源文件,则可以一键提取到多个文件夹中,如下图
1584428816319.png
1584428839644.png

​ 在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却无效,其中的原因还有待进一步研究


alphaYao
0 声望0 粉丝