背景
有一个项目,需要提供英文版 app
给到海外客户使用,正常来说切换系统语言为英文即可(因为原来就有做多语言适配,支持英文语言)。
但是为了方便海外客户,就提了个变态需求给到开发:不管系统语言设置是啥,都使用英文语言展示。
实现
关于 app
多语言适配的方案这里就不再提了,网上有很多解决方案供同学们自己参考学习。
工具类代码如下:
package com.example.multilangfitdemo.util;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import java.util.Locale;
public class LanguageUtil {
private volatile static LanguageUtil languageUtil;
private LanguageUtil(){}
// instance
public static LanguageUtil instance(){
if (languageUtil == null){
synchronized (LanguageUtil.class){
if (languageUtil == null){
languageUtil = new LanguageUtil();
}
}
}
return languageUtil;
}
/**
*
* @param context
* @param language
*/
public static void setDefaultLanguage(Context context, String language){
if (TextUtils.isEmpty(language)){
return;
}
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration();
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
// 不为 en 的值,默认为使用中文。(有需要同学可自行修改逻辑)
Locale loc = Locale.CHINA;
if (language.equals("en")){
loc = Locale.ENGLISH;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
configuration.setLocale(loc);
}else {
configuration.locale = loc;
}
context.getResources().updateConfiguration(configuration, metrics);
}
}
在 Activity
基类的 onCreate()
生命周期方法中调用:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LanguageUtil.setDefaultLanguage(this, "en");
}
}
验证
运行后如上图示,系统语言为中文,不过 app
展示的也是英文语言版本。
总结
另外不要在自定义的 Application 类中获取 getResources() ,亲自测试后发现设置指定语言功能并没有生效,后面发现是 getResources 这个方法导致。
想深入了解的同学参考如下:
Android Appication及Activity的 Resource 生成代码分析
千万不要在application里面重写getResources
技术永不眠!我们下期见!