首先项目中集成
https://github.com/getActivity/MultiLanguages
初始化框架
// 在 Application 中初始化
LanguagesManager.init(this);
重写 Application 的 attachBaseContext 方法
@Override
protected void attachBaseContext(Context base) {
// 国际化适配(绑定语种)
super.attachBaseContext(LanguagesManager.attach(base));
}
重写基类 BaseActivity 的 attachBaseContext 方法
@Override
protected void attachBaseContext(Context newBase) {
// 国际化适配(绑定语种)
super.attachBaseContext(LanguagesManager.attach(newBase));
}
只要是 Context 的子类都需要重写,Service 也雷同,这里不再赘述
语种设置
// 设置当前的语种(返回 true 需要重启 App)
LanguagesManager.setAppLanguage(Context context, Locale locale);
// 获取当前的语种
LanguagesManager.getAppLanguage(Context context);
使用案例
@Override
public void onClick(View v) {
// 是否需要重启
boolean restart;
switch (v.getId()) {
// 跟随系统
case R.id.btn_language_auto:
restart = LanguagesManager.setSystemLanguage(this);
break;
// 简体中文
case R.id.btn_language_cn:
restart = LanguagesManager.setAppLanguage(this, Locale.CHINA);
break;
// 繁体中文
case R.id.btn_language_tw:
restart = LanguagesManager.setAppLanguage(this, Locale.TAIWAN);
break;
// 英语
case R.id.btn_language_en:
restart = LanguagesManager.setAppLanguage(this, Locale.ENGLISH);
break;
default:
restart = false;
break;
}
if (restart) {
// 我们可以充分运用 Activity 跳转动画,在跳转的时候设置一个渐变的效果
startActivity(new Intent(this, LanguageActivity.class));
overridePendingTransition(R.anim.activity_alpha_in, R.anim.activity_alpha_out);
finish();
}
}
其他 API
// 将 App 语种设置为系统语种(返回 true 需要重启 App)
LanguagesManager.setSystemLanguage(Context context);
// 获取系统的语种
LanguagesManager.getSystemLanguage();
// 对比两个语言是否是同一个语种(比如:中文的简体和繁体,英语的美式和英式)
LanguagesManager.equalsLanguage(Locale locale1, Locale locale2);
// 对比两个语言是否是同一个地方的(比如:中国大陆用的中文简体,中国台湾用的中文繁体)
LanguagesManager.equalsCountry(Locale locale1, Locale locale2);
// 获取某个语种下的 String
LanguagesManager.getLanguageString(Context context, Locale locale, int stringId);
// 获取某个语种下的 Resources 对象
LanguagesManager.getLanguageResources(Context context, Locale locale);
混淆规则
-keep class com.hjq.language.** {*;}
以上内容都来自GitHub上的引用。
以下是我自己的项目使用:
准备工作:项目中使用了EventBus用于通知切换语言;建立了3个国家的语言的资源文件夹
,中文,英文,日文(这里的英文资源文件夹用的en-rUS,Local对应的是US,不是English.设置错了就直接找默认的values的资源文件夹了)。具体的哪个国家的资源文件夹对应的名字是什么需要自己百度下;所有使用的Activity都继承自BaseActivity。
1.在Appliction中onCreate方法完整代码:
@Override
public void onCreate() {
super.onCreate();
LanguagesManager.init(this);
Locale local = LanguagesManager.getAppLanguage(this);
if(local == null){
local = Locale.CHINA;
}
LanguagesManager.setAppLanguage(this,local);
}
初始化多语言框架,并读已经缓存的的语言。然后判断是否为null,如果为空设置一个默认的语言。
然后设置APP的语言。
2.在BaseActivity中的一些逻辑:
重写 Application 的 attachBaseContext 方法:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(LanguagesManager.attach(newBase));
}
添加对切换语言通知的处理逻辑
通过广播或者EventBus接收的处理。本文是用EventBus接收通知,具体通过什么方式大家仁者见仁智者见智。这里只贴出收到切换语言的逻辑
{
//获取当前Activity的完整名(包括项目名,包名,Activity名)
String currentActivityName = this.getClass().getCanonicalName();
//获取指定切换完语言要跳转的Activity的完整名。本文跳转到MainActivity
String mainActivityName = MainActivity.class.getCanonicalName();
//如果当前Activity不是指定的就finish自己
if(!mainActivityName.equals(currentActivityName)) {
L.e("CHANGE_LANGUAGE","CHANGE_LANGUAGE------------->" + currentActivityName);
finish();
}
}
3.切换语言的地方:
通过操作我们能获取到一个希望要切换的语言的Local的对象
然后再触发切换语言的方法中:
// mTargetLocal是通过操作获得要切换的目标语言的Local对象。
private Locale mTargetLocal;
// 比如通过点击方法切换:
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.fl_chinese:
mTargetLocal = Locale.CHINA;
break;
case R.id.fl_english:
mTargetLocal = Locale.US;
break;
case R.id.fl_japanese:
mTargetLocal = Locale.JAPAN;
break;
default:
break;
}
changeLanguage();
}
void changeLanguage(){
// 调用切换语言方法,返回是否需要重新刷新页面,如果目标语言和当前语言一致,
// 则返回false,反之返回true
boolean restart = LanguagesManager.
setAppLanguage(SettingLanguageActivity.this,mTargetLocal);
if(restart){
// 如果需要刷新,则遍历全局变量中存放BaseActivity列表的list
for(BaseActivity activity : MyApplication.getInstance().getActivities()){
// 判断是否是要跳转的Activity,本项目要跳转MainActivity,如果有则需要提前将其关闭。重要
if(activity.getClass().getSimpleName()
.equals(MainActivity.class.getSimpleName())) {
activity.finish();
}
// 重新打刚才关闭的MainActivity,应为只有重新打开Activity,
// 才会触发BaseActivity中的attachBaseContext方法,
// 才能重新刷新设置的多语言
MainActivity.goTo(SettingLanguageActivity.this);
// 通过EventBus发送切换语言的通知,让所有的非MianActivity的Activity都关闭自己。
EventBus.post(EventKey.CHANGE_LANGUAGE,null);
}
}
到此应该就可以完成多语言的切换了。