因项目的需要,需要进行语言国际化,但项目的需求是只需要进行中英切换就行了。其中,需要明确的两点是:
1. 如果用户没有进行额外配置,App的语言首先跟随系统的语言设置。
2. 提供用户手动切换语言的功能,并进行持久化,即下次再打开时如果系统语言与App持久化语言冲突,优先选择App持久化语言。
由于只是中英切换,默认values资源文件夹作为中文语言资源包就行了,需要注意的是values文件夹是一定要提供的,如果系统没有找到其他对应本地语言的资源包,就会默认使用values下的资源。所以此时只需添加英语资源文件夹就行了。
右击res,选择Locale,再选择语言和对应的国家,点ok。完成后会在res文件下多出 values-en-rUS 这个文件夹。但此时这个文件夹下没有内容,我们复制values下的strings.xml 文件过来,studio就会刷新标识。
这时,将strings.xml(en-rUS) 的中文翻译成中文就行。
接着,进行代码编写,在Activity绑定切换语言按钮并监听点击事件。
切换语言&语言持久化:
public void switch_language(){
String lan = Utils.getAppLanguage(getActivity());
if(lan.equals("zh") || !lan.equals("en") ){
setLocale(Locale.ENGLISH);
}else if(lan.equals("en") || !lan.equals("zh")){
setLocale(Locale.SIMPLIFIED_CHINESE);
}
}
public void setLocale(Locale myLocale){
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Utils.saveLanguageSetting(getActivity(),myLocale);
refreshSelf();
}
public void refreshSelf(){
getActivity().finish();
Intent refresh = new Intent(getActivity(), HomeActivity.class);
refresh.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
getActivity().startActivity(refresh);
}
手动切换的语言配置持久化到本地后,下次启动App,默认使用用户设置的语言,在MyApplicaton类的onCreate()方法中添加如下编码:
public class MyApplicaton entends Application{
@Override
public void onCreate() {
super.onCreate();
/***/
Locale locale = Utils.getAppLocale(this);
Utils.changeAppLanguage(this,locale,true);
//注册Activity生命周期监听回调
registerActivityLifecycleCallbacks(callbacks);
}
ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (!Utils.isSameWithSetting(activity)) {
Utils.changeAppLanguage(activity,
Utils.getAppLocale(activity),true);
}
}
//其他生命周期重载方法。
};
}
Utils.java
//更改App语言
public static void changeAppLanguage(Context context, Locale locale, boolean persistence) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
Configuration configuration = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(locale);
} else {
configuration.locale = locale;
}
resources.updateConfiguration(configuration, metrics);
if (persistence) {
saveLanguageSetting(context, locale);
}
}
public static boolean isSameWithSetting(Context context) {
String lang = context.getResources().getConfiguration().locale.getLanguage();
return lang.equals(getAppLanguage(context));
}
//App 语言持久化
public static void saveLanguageSetting(Context context,Locale locale){
SPUtils.put(context,KEY_APP_LANGUAGE,locale.getLanguage());
}
public static String getAppLanguage(Context context){
return (String)SPUtils.get(context,KEY_APP_LANGUAGE,Locale.getDefault().getLanguage());
}
public static Locale getAppLocale(Context context){
String lang = (String)SPUtils.get(context,KEY_APP_LANGUAGE,Locale.getDefault().getLanguage());
if(!lang.equals(Locale.SIMPLIFIED_CHINESE.getLanguage())&&!lang.equals(Locale.ENGLISH.getLanguage())){
lang = Locale.SIMPLIFIED_CHINESE.getLanguage();
}
Locale locale = new Locale(lang);
return locale;
}
SPUtils.java
public static void put(Context context, String key, Object object) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
SharedPreferencesCompat.apply(editor);
}
public static Object get(Context context, String key, Object defaultObject) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}