您的位置:首页 > 移动开发

APP,实现多国语言动态切换

2017-11-29 20:44 701 查看
网上一个辅助类,找不到原博主文章链接,这里就直接贴出辅助类代码(自己再优化了一下)。公司项目APP要支持13种语言,如下:

1.工具类

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;

import java.util.Locale;

public class LanguageManager {

public static final int LANGUAHE_DEFAULT = 0;
public static final int LANGUAHE_ENGLISH = 1;
public static final int LANGUAHE_ZH_RCN = 2;
public static final int LANGUAHE_ZH_RTW = 3;//繁体
public static final int LANGUAHE_DE_RDE = 4;//德语
public static final int LANGUAHE_ES_RES = 5;//西班牙语
public static final int LANGUAHE_FR_RFR = 6;//法语
public static final int LANGUAHE_IT_RIT = 7;//意大利语
public static final int LANGUAHE_JA_RJP = 8;//日语
public static final int LANGUAHE_KO_RKR = 9;//韩语
public static final int LANGUAHE_PL_RPL = 10;//波兰
public static final int LANGUAHE_PT_RPT = 11;//葡萄牙语
public static final int LANGUAHE_RU_RRU = 12;//俄语
public static final int LANGUAHE_VI_RVN = 13;//越南语

public static final String LANGUAGE_KEY = "language";

private Context mContext;
private static LanguageManager instance = null;

private LanguageManager(Context context)
{
mContext = context;
}

public static LanguageManager getInstance(Context context)
{
if(instance == null)
{
instance = new LanguageManager(context);
}
return instance;
}

private void setLang(int lang)
{
Locale locale = Locale.SIMPLIFIED_CHINESE;
switch (lang) {

case LANGUAHE_DEFAULT:
locale = Locale.getDefault();
break;
case LANGUAHE_ENGLISH:
locale = Locale.ENGLISH;
break;
case LANGUAHE_ZH_RCN:
locale = Locale.SIMPLIFIED_CHINESE;
break;
case LANGUAHE_ZH_RTW:
locale = new Locale("zh","TW");
break;
case LANGUAHE_DE_RDE:
locale = new Locale("de","DE");
break;
case LANGUAHE_ES_RES:
locale = new Locale("es","ES");
break;
case LANGUAHE_FR_RFR:
locale = new Locale("fr","FR");
break;
case LANGUAHE_IT_RIT:
locale = new Locale("it","IT");
break;
case LANGUAHE_JA_RJP:
locale = new Locale("ja","JP");
break;
case LANGUAHE_KO_RKR:
locale = new Locale("ko","KR");
break;
case LANGUAHE_PL_RPL:
locale = new Locale("pl","PL");
break;
case LANGUAHE_PT_RPT:
locale = new Locale("pt","PT");
break;
case LANGUAHE_RU_RRU:
locale = new Locale("ru","RU");
break;
case LANGUAHE_VI_RVN:
locale = new Locale("vi","VN");
break;

default:
return;
}
// 获得res资源对象
Resources resources = mContext.getResources();
// 获得设置对象
Configuration config = resources.getConfiguration();
// 获得屏幕参数:主要是分辨率,像素等。
DisplayMetrics dm = resources.getDisplayMetrics();
// 语言
config.locale = locale;
resources.updateConfiguration(config, dm);
}

public void setLangandSave(int lang)
{
setLang(lang);
saveCurrentMode(lang);
}

private void saveCurrentMode(int lang)
{
SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = preference.edit();
editor.putInt(LANGUAGE_KEY, lang);
editor.commit();
}

public int getCurrentLanguage() {
SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(mContext);
return preference.getInt(LANGUAGE_KEY, LANGUAHE_ZH_RCN);
}

public void syncCurrentLanguage() {
setLang(getCurrentLanguage());
}
}


2.动态切换

//nLangSelectIdx为当前选中语言的索引

LanguageManager.getInstance(SettingSystemActivity.this).setLangandSave(nLangSelectIdx);
restartApp();


//restartApp()重启APP

***

private void restartApp() {
DeviceManageActivity.mDeviceActivity.finish();
MainActivity.mSingleton.finish();
removeALLActivity();//执行移除所以Activity方法

Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}


3.每次启动APP都要设置当前语言模式,否则会跟随安卓系统显示

//切换当前语言的设置模式
LanguageManager.getInstance(this).syncCurrentLanguage();


这个调用需写在通用的地方,如自定义状态栏的ActionBarActivity.java,否则你得在每个Activity的oncreate()和onresume()都要调一次。

这样就可以啦

我不是个呆若木鸡的小小英
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息