前端时间要实现语言切换功能,现在总结一下。
一般用 语言_地区的形式表示一种语言,如 zh_CN, zh_TW.
各国语言缩写: http://www.loc.gov/standards/iso639-2/php/code_list.php
国家和地区简写: http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
用eclipse工具建多语言文件夹: http://www.cnblogs.com/wuyunan/archive/2009/09/16/1567960.html
切换语言主要分为两类:
1、根据系统当前语言环境自动选择程序加载语言,若不存在对应语言的strings文件,则加载默认语言文件
此方法不需要其他代码设置
2、程序内部自主选择程序使用语言,需要由代码控制
程序内实现语言切换也有几种不同实现方式,在此我给大家介绍我使用一种。
直接上语言切换的工具类
public class LanguageSettingUtil {
//单例模式
private static LanguageSettingUtil instance;
private Context context;
//存储当前系统的language设置
private String defaultLanguage;
//存储当前系统Locale
private Locale defaultLocale;
public final static String ENGLISH = "en";
public final static String CHINESE = "zh";
private LanguageSettingUtil(Context paramContext) {
//得到系统语言
Locale localLocale = Locale.getDefault();
this.defaultLocale = localLocale;
//保存系统语言到defaultLanguage
String str = this.defaultLocale.getLanguage();
this.defaultLanguage = str;
this.context = paramContext;
}
//自身是否被创建
public static LanguageSettingUtil get() {
if (instance == null)
throw new IllegalStateException(
"language setting not initialized yet");
return instance;
}
//初始化
public static void init(Context paramContext) {
if (instance == null){
instance = new LanguageSettingUtil(paramContext);
}
}
// 创建Configuration
private Configuration getUpdatedLocaleConfig(String paramString) {
Configuration localConfiguration = context.getResources().getConfiguration();
Locale localLocale = getLocale(paramString);
localConfiguration.locale = localLocale;
return localConfiguration;
}
//得到APP配置文件目前的语言
public String getLanguage() {
SharedPreferences localSharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this.context);
//如果当前程序没有设置language属性,就返回系统默认语言,如果有,就返回以前的
return localSharedPreferences.getString("language", this.defaultLanguage);
}
//如果配置文件中没有语言配置
public Locale getLocale() {
String str = getLanguage();
return getLocale(str);
}
//创建新Locale并覆盖原Locale
public Locale getLocale(String paramString) {
Locale localLocale = new Locale(paramString);
Locale.setDefault(localLocale);
return localLocale;
}
//刷新显示配置
public void refreshLanguage()
{
String str = getLanguage();
Resources localResources = this.context.getResources();
if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
Configuration localConfiguration = getUpdatedLocaleConfig(str);
//A structure describing general information about a display, such as its size, density, and font scaling.
DisplayMetrics localDisplayMetrics = localResources
.getDisplayMetrics();
localResources.updateConfiguration(localConfiguration,
localDisplayMetrics);
}
}
//设置系统语言
public void saveLanguage(String paramString) {
PreferenceManager.getDefaultSharedPreferences(this.context).edit()
.putString("language", paramString).commit();
}
//保存系统的语言配置到SharedPreferences
public void saveSystemLanguage(){
PreferenceManager.getDefaultSharedPreferences(this.context).edit()
.putString("PreSysLanguage", this.defaultLanguage).commit();
}
public void checkSysChanged(String cuerSysLanguage){
//如果系统语言设置发生变化
if(!cuerSysLanguage.equals(PreferenceManager
.getDefaultSharedPreferences(this.context)
.getString("PreSysLanguage", "zh"))){
//如果系统保存了this对象,就在这里修改defaultLanguage的�?为当前系统语�?uerSysLanguage
this.defaultLanguage = cuerSysLanguage;
saveLanguage(cuerSysLanguage);
saveSystemLanguage();
}
}
}
应用语言初始化,在Application 的oncreat里调用
LanguageSettingUtil.init(this);
languageSetting = LanguageSettingUtil.get();
// 拿到当前系统语言设置
curSysLanguage = Locale.getDefault().getLanguage();
languageSetting.checkSysChanged(curSysLanguage);
languageSetting.refreshLanguage();
应用语言设置,设置代码
// 拿到当前系统语言设置
String curSysLanguage = Locale.getDefault().getLanguage();
mOmApp.languageSetting.checkSysChanged(curSysLanguage);
if (arg1)
{
// 设置更换的语言
mOmApp.languageSetting.saveLanguage("en");
} else
{
// 设置更换的语言
mOmApp.languageSetting.saveLanguage("zh");
}
// 更新
mOmApp.languageSetting.refreshLanguage();
当然要设置对应的string文件
别忘了添加权限
<!-- 更改参数配置权限 -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
到此为止,语言设置可以实现了,并且只对你的应用设置语言,但是在调试过程中出现一个问题,当横竖屏切换时候,会恢复到默认语言。后来发现需要
AndroidManifest.xml
每一个Activity中都要加: android:configChanges="locale"。(每一个未检测)
或者在你的Application里添加
@Override
public void onConfigurationChanged(Configuration newConfig)
{
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
languageSetting.refreshLanguage();
}