原理:只是切换本地的strings.xml包而已
逼话不多说,先上效果图。
跟随系统语言的。
如果这是你要的,那就继续往下看吧。
第一步:创建本地的 strings.xml
因为原理便是切换本地的strings.xml,所以我们需要设置什么语言,便要创建什么语言的strings.xml。
1.在res包下创建一个新的string.xml
名字都取strings,然后选择Locale并点击箭头。
接着选择语言与国家并创建就行了
需要几种语言就创建几种语言
注意:默认strings里有的,新增strings里也要有。
第二步:MyApplication。
创建完成后,我们需要一个属于自己的 MyApplication,这个在切换系统语言会用到。
在此类中,我们得以进行获取系统语言和更改系统语言等操作。
public class MyApplication extends Application {
private static MyApplication instance = null;
private Context mContext = null;
@Override
public void onCreate() {
super.onCreate();
if (instance == null) {
instance = this;
}
mContext = getApplicationContext();
//初始化缓存
SharedPreferencesUtil.init(this);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//初始获取系统语言
initSystemLanguage();
//初始化语言(切换语言)
initLanguage();
}
/**
* 初始化系统语言
*/
private void initSystemLanguage() {
String mLocale;
// 截取java虚拟机返回字符串的前两个字符(中文:zh 英文:en )。
// 因为返回的内容为zh_CN,其中zh代表语言(中文),CN代表地区或国家(中国大陆)。
// 截取前两位只对语言进行判断。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mLocale = String.valueOf(getResources().getConfiguration().getLocales().get(0)).substring(0, 2);
} else {
mLocale = String.valueOf(getResources().getConfiguration().locale).substring(0, 2);
}
// /**
// * 也可以使用Locale获取
// */
// Locale myLocale = Locale.getDefault();
// //语言
// mLocale = myLocale.getLanguage();
// //地区
// String mCountry = myLocale.getCountry();
/**
* 缓存系统语言,非汉语或英语以外的语言显示英语
*/
switch (mLocale) {
case "zh"://中文
SharedPreferencesUtil.instance.setSystemLanguage("zh");
break;
case "en"://英文
SharedPreferencesUtil.instance.setSystemLanguage("en");
break;
default://其它语言使用英文
SharedPreferencesUtil.instance.setSystemLanguage("en");
break;
}
}
/**
* 根据缓存改变全局的语言
*/
public void initLanguage() {
//获取缓存的系统语言
String mLocale = SharedPreferencesUtil.instance.getSystemLanguage();
switch (mLocale) {
case "zh"://中文
changeAppLanguage(mContext, Locale.CHINA);
break;
case "en"://英文
changeAppLanguage(mContext, Locale.ENGLISH);
break;
default://其它语言使用英文
changeAppLanguage(mContext, Locale.ENGLISH);
break;
}
/**
* 改变全局语言时进行的一些清空或重置操作
*/
}
/**
* 根据缓存改变单个界面的语言
*
* @param context context
*/
public void initLanguage(Context context) {
String mLocale = SharedPreferencesUtil.instance.getSystemLanguage();
switch (mLocale) {
case "zh"://中文
changeAppLanguage(context, Locale.CHINA);
break;
case "en"://英文
changeAppLanguage(context, Locale.ENGLISH);
break;
default://其它语言使用英文
changeAppLanguage(context, Locale.ENGLISH);
break;
}
}
/**
* 切换语言
*
* @param locale 语言
*/
@SuppressLint("ObsoleteSdkInt")
public void changeAppLanguage(Context context, Locale locale) {
DisplayMetrics metrics = getResources().getDisplayMetrics();
Configuration configuration = getResources().getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(locale);
} else {
configuration.locale = locale;
}
//改变语言主要靠此语句
context.getResources().updateConfiguration(configuration, metrics);
}
}
在AndroidManifest.xml中使用
第三步:保存。
值得注意的是,我们在获取系统语言的同时,使用了缓存工具进行保存(使用缓存时因为后面我还会增加手动选择语言的功能)。
/**
* 缓存工具类
*/
public class SharedPreferencesUtil {
public static SharedPreferencesUtil instance;
public static Context mContext;
public static SharedPreferences pePreferences;
public static void init(Application context) {
if (instance == null) {
instance = new SharedPreferencesUtil();
}
mContext = context;
pePreferences = mContext.getSharedPreferences("SharedPreferences", Context.MODE_PRIVATE);
}
//系统语言
private String systemLanguage = "en";
public String getSystemLanguage() {
systemLanguage = pePreferences.getString("systemLanguage", "en");
return systemLanguage;
}
public void setSystemLanguage(String systemLanguage) {
this.systemLanguage = systemLanguage;
pePreferences.edit().putString("systemLanguage", systemLanguage).apply();
}
}