android实现多语言填坑之路

由于公司业务需要,需要实现印尼版本的国际化,于是开始了入坑和填坑之旅。

第一步:创建多语言的资源文件

我默认的目录印尼版本,中文简体版本放在以-zh-rCN为后缀的目录下,下面的各目录下对应的中文简体目录,其他语言类推。

  • values -> value-zh-rCN
  • drawable -> drawable-zh-rCN
  • mimap -> mimap-zh-rCN
  • raw -> raw-zh-rCN

第二步:把需要多语言的资源文件移到对应的目录下

如果之前就中文写在strings 文件中,就可以省了好多工夫,所以平时养成好的编程习惯是有必要。

第三步:切换到我们设置的语言

新建一个语言工具类:LanguageSpUtils,实现下面方法

  //获取设置的语言
    private static Locale getSetLocale() {
        String locale = "in";//简单设置为印尼语

        String[] array = locale.split("_");
        String language = array[0];
        if (array.length > 1) {
            String country = array[1];
            return new Locale(language, country);
        }
        return new Locale(language);
    }
  /**
     * 切换语言
     *
     * @param context
     */
    public static void applyChange(Context context) {
        Locale locale = getSetLocale();
        Resources res = context.getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            conf.setLocale(locale);
            LocaleList localeList = new LocaleList(locale);
            LocaleList.setDefault(localeList);
            conf.setLocales(localeList);
        } else {
            conf.setLocale(locale);
        }
        res.updateConfiguration(conf, dm);
    }

在应用的application中oncreate()中调用设置语言

 @Override
    public void onCreate() {
        super.onCreate();
        //语言切换
        LanguageSpUtils.applyChange(this);
}

到这步已经切换到我们想要的语言了,是不是很简单,等等别走,下面两大坑要注意。

坑1、webview引起语言变化。

原本是好端端的印尼文页面,打开一个h5页面后返回后再打开其他页面,都变成了中文

解决方法,在application中的LanguageSpUtils.applyChange(this);前面加 new WebView(this).destroy();即:
 @Override
    public void onCreate() {
        super.onCreate();
        //语言切换
        new WebView(this).destroy();
        LanguageSpUtils.applyChange(this);
}

坑2、页面横竖屏发生变化时引起语言变化

现象和上面的一样

解决方法,在application的onConfigurationChanged方法中重置语言,即:
  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LanguageSpUtils.applyChange(this);
    }

搞定收工

你可能感兴趣的:(android实现多语言填坑之路)