随着毕设的一步步推进。今天给毕设加了多语言适配。虽然只设配了英语跟简体中文、繁体英文。但是道理是相同的,其它语种也是一个道理。
首先,我们附上项目地址:https://github.com/RuijiePan/FileManager.git
欢迎star、fork。
直接附上关键代码:
/**
* Created by panruijie on 2017/3/15.
* Email : zquprj@gmail.com
*/
public class LanguageUtil {
private static LanguageUtil sInstacne;
private Context mContext;
//单例初始化
public static void init(Context mContext) {
if (sInstacne == null) {
synchronized (LanguageUtil.class) {
if (sInstacne == null) {
sInstacne = new LanguageUtil(mContext);
}
}
}
}
public static LanguageUtil getInstance() {
if (sInstacne == null) {
throw new IllegalStateException("You must be init LanguageUtil first");
}
return sInstacne;
}
private LanguageUtil(Context context) {
//防止内存泄漏
this.mContext = context.getApplicationContext();
}
//设置语言配置
public void setConfiguration() {
//首先获取本地配置,因为6.0以上的设备需要特别处理,否则按下方的方法处理即可
Locale targetLocale = getTragetLocale();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Locale.setDefault(targetLocale);
} else {
Resources resources = mContext.getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
config.locale = targetLocale;
resources.updateConfiguration(config, dm);
}
}
/**
* 如果不是英文、简体中文、繁体中文,默认返回英文
* 自己定义的是跟随系统、英文、简体中文、繁体中文四种格式
* @return
*/
private Locale getTragetLocale() {
//从SharedPreferences中取出配置,看看是哪种语言
int userType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);
if (userType == LanguageType.FOLLOW_SYSTEM) {
Locale sysType = getSysLocale();
if (sysType.equals(Locale.ENGLISH)) {
return Locale.ENGLISH;
} else if (sysType.equals(Locale.SIMPLIFIED_CHINESE)) {
return Locale.SIMPLIFIED_CHINESE;
} else if (sysType.equals(Locale.TRADITIONAL_CHINESE)) {
return Locale.TRADITIONAL_CHINESE;
}
return Locale.ENGLISH;
} else if (userType == LanguageType.ENGLISH) {
return Locale.ENGLISH;
} else if (userType == LanguageType.SIMPLE_CHINISE) {
return Locale.SIMPLIFIED_CHINESE;
} else if (userType == LanguageType.TRADITIONAL_CHINESE) {
return Locale.TRADITIONAL_CHINESE;
}
return Locale.ENGLISH;
}
//6.0以上获取方式需要特殊处理一下
private Locale getSysLocale() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
return mContext.getResources().getConfiguration().locale;
} else {
return mContext.getResources().getConfiguration().getLocales().get(0);
}
}
//修改了语言之后,修改SharedPreferences里面的配置信息,通过rxbus进行通知页面进行重新加载。可以用eventbus或者广播,你喜欢就行。
public void updateLanguage(int languageType) {
if (languageType != SharedUtil.getInt(mContext, AppConstant.LANGUAGE)) {
SharedUtil.putInt(mContext, AppConstant.LANGUAGE, languageType);
RxBus.getDefault().post(new LanguageEvent());
}
}
//这里是获取对应的配置信息代表的名字:分别是:跟随系统、英文、简体中文、繁体中文
public String getLanguageName() {
int languageType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);
if (languageType == LanguageType.ENGLISH) {
return mContext.getString(R.string.settings_language_english);
} else if (languageType == LanguageType.SIMPLE_CHINISE) {
return mContext.getString(R.string.settings_language_simple_chinise);
} else if (languageType == LanguageType.TRADITIONAL_CHINESE) {
return mContext.getString(R.string.settings_language_traditional_chinise);
}
return mContext.getString(R.string.settings_language_follow_system);
}
}
下面是上述用到的语言信息lei,你有几种语言就配置几个。
/**
* Created by panruijie on 2017/3/15.
* Email : zquprj@gmail.com
*/
public class LanguageType {
public static final int FOLLOW_SYSTEM = 0;
public static final int ENGLISH = 1;
public static final int SIMPLE_CHINISE = 2;
public static final int TRADITIONAL_CHINESE = 3;
}
接下来,到这里,代码层面已经可以实现多语言了。那么,如何配置多种string类型,用于多语言的切换呢。
首先,我们来到项目的res/values下.右键new->values resource file,接着便会出现图2.
(图1)
到这里,我们在file name填上strings,由于原本已经有一个strings文件了。那么等下再构建的时候系统会自动帮我们构造一个strings的文件夹用于存放不同语种的strings.xml。在图2这里选择Local,接着点’》’即可。
(图2)
到这里,就是选择你所要的国家了,假如我要中国,而且不分地区,那么在specific region only那里选择any region即可。同理,其它语种一次类推。
(图3)
到这里,我们只需在我们自己的基类BaseActivity的oncretae里面添加一句LanguageUtil.getInstance().setConfiguration();即可实现语言的动态设置。
还有就是,在更换语言设置的时候,记得要reload一下界面。否则语言不会刷新。就是在接受到语言更改事件的时候进行更新。代码如下:
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
如果还有疑问,可以留言。或者star、fork我的代码看一下。