Android动态改变应用程序语言
今天主要是记录下如何让我们的应用实现语言国际化,实现本地化资源的国际化很简单,网络数据可能比较麻烦……..,一般我们实现本语言国际化主要是建立不同的values,应用app会自动加载不同的文件。
eg:
中文:values-zh-rCN
英文: values-en
今天主要实现的功能是,在app的应用程序中手动设置语言类型,应用会自动加载相关的values;
思路比较简单,首先获取到当前的系统语言,保存在SharedPreferences里,然后再Activity中注册个广播来监听语言是否发生改变,当我们手动改变语言的时候,同sendBroadcast(intent);通知应用发生改变,lsu.saveLanguage(language);然后保存当前的语言;
lsu.refreshLanguage(); 通知语言发生改变
/**
* 语言工具类
* @author joe.xiang
*/
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();
Log.i("language", localLocale.getLanguage());
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的值为当前系统语言cuerSysLanguage
this.defaultLanguage = cuerSysLanguage;
saveLanguage(cuerSysLanguage);
saveSystemLanguage();
}
}
/* 所有父类Activity/
public class SetingActivity extends SupperActivity {
private EditText language;
private Button seting,bacck;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
InitView();
}
public void InitView(){
language = (EditText) findViewById(R.id.language);
seting = (Button) findViewById(R.id.seting);
bacck = (Button) findViewById(R.id.bacck);
seting.setText(getResources().getString(R.string.seting));
bacck.setText(getResources().getString(R.string.bacck));
seting.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String strlanguage = language.getText().toString().trim();
// TODO Auto-generated method stub
Log.i("bb",strlanguage);
if(strlanguage!=null && !"".equals(strlanguage)){
Intent intent = new Intent();
intent.setAction("com.example.textcontrylanguage.language");
intent.putExtra("language", strlanguage);
//通知广播发生改变
sendBroadcast(intent);
}
}
});
bacck.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SetingActivity.this.finish();
}
});
}
最后附上Demo的源码:http://download.csdn.net/detail/xianglinglong/9362715