【Android -- 实战】-->APP 多语言切换(国际化)

网友投稿 319 2022-09-27

【Android -- 实战】-->APP 多语言切换(国际化)

最近公司开始做多语言版本,由于之前没有做过,所以在网上搜寻了一番这方面的资料,最后经过实践、总结,写下了这篇文章。

效果图

实现

1. 创建对应语言的 string.xml 简体中文,繁体和 English 三个语言。

2. MultiLanguage.java

/** * Created on 2021/11/10 17:02 * * @author Gong Youqiang */public class MultiLanguage { private static LanguageListener languageLocalListener; public static void init(LanguageListener listener) { languageLocalListener = listener; } public static Context setLocal(Context context) { return updateResources(context, getSetLanguageLocale(context)); } /** * 设置语言类型 */ public static void setApplicationLanguage(Context context) { Resources resources = context.getApplicationContext().getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); Configuration config = resources.getConfiguration(); Locale locale = getSetLanguageLocale(context); config.locale = locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { LocaleList localeList = new LocaleList(locale); LocaleList.setDefault(localeList); config.setLocales(localeList); context.getApplicationContext().createConfigurationContext(config); Locale.setDefault(locale); } resources.updateConfiguration(config, dm); } /** * @param context */ public static void onConfigurationChanged(Context context) { setLocal(context); setApplicationLanguage(context); } /** * 获取选择的语言 * * @param context * @return */ private static Locale getSetLanguageLocale(Context context) { if (languageLocalListener != null) { return languageLocalListener.getSetLanguageLocale(context); } return Locale.ENGLISH; } /** * 更新语言设置 * * @param context * @param locale * @return */ private static Context updateResources(Context context, Locale locale) { Locale.setDefault(locale); Resources res = context.getResources(); Configuration config = new Configuration(res.getConfiguration()); if (Build.VERSION.SDK_INT >= 17) { config.setLocale(locale); context = context.createConfigurationContext(config); } else { config.locale = locale; res.updateConfiguration(config, res.getDisplayMetrics()); } return context; } /** * 获取系统语言 * @param newConfig * @return */ public static Locale getSystemLocal(Configuration newConfig) { Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = newConfig.getLocales().get(0); } else { locale = newConfig.locale; } return locale; } /** * 获取系统语言 * @param context * @return */ public static Locale getSystemLocal(Context context) { Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = LocaleList.getDefault().get(0); } else { locale = Locale.getDefault(); } return locale; }}

3. SPUtil.java

/** * Created on 2021/11/10 17:04 * * @author Gong Youqiang */public class SPUtil { private final String SP_NAME = "language_setting"; private final String TAG_LANGUAGE = "language_select"; private final String TAG_SYSTEM_LANGUAGE = "system_language"; private static volatile SPUtil instance; private final SharedPreferences mSharedPreferences; private Locale systemCurrentLocal = Locale.ENGLISH; public SPUtil(Context context) { mSharedPreferences = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); } public void saveLanguage(int select) { SharedPreferences.Editor edit = mSharedPreferences.edit(); edit.putInt(TAG_LANGUAGE, select); edit.commit(); } public int getSelectLanguage() { return mSharedPreferences.getInt(TAG_LANGUAGE, 0); } public Locale getSystemCurrentLocal() { return systemCurrentLocal; } public void setSystemCurrentLocal(Locale local) { systemCurrentLocal = local; } public static SPUtil getInstance(Context context) { if (instance == null) { synchronized (SPUtil.class) { if (instance == null) { instance = new SPUtil(context); } } } return instance; }}

4. LanguageUtils.java

/** * Created on 2021/11/10 16:50 * * @author Gong Youqiang */public class LanguageUtils { private static final String TAG = "LocalManageUtil"; /** * 获取系统的locale * * @return Locale对象 */ public static Locale getSystemLocale(Context context) { return SPUtil.getInstance(context).getSystemCurrentLocal(); } public static String getSelectLanguage(Context context) { switch (SPUtil.getInstance(context).getSelectLanguage()) { case 0: return context.getString(R.string.language_auto); case 1: return context.getString(R.string.language_cn); case 2: return context.getString(R.string.language_traditional); case 3: default: return context.getString(R.string.language_en); } } /** * 获取选择的语言设置 * * @param context * @return */ public static Locale getSetLanguageLocale(Context context) { switch (SPUtil.getInstance(context).getSelectLanguage()) { case 0: return getSystemLocale(context); case 1: return Locale.CHINA; case 2: return Locale.TAIWAN; case 3: default: return Locale.ENGLISH; } } public static void saveSystemCurrentLanguage(Context context) { SPUtil.getInstance(context).setSystemCurrentLocal(MultiLanguage.getSystemLocal(context)); } /** * 保存系统语言 * @param context * @param newConfig */ public static void saveSystemCurrentLanguage(Context context, Configuration newConfig) { SPUtil.getInstance(context).setSystemCurrentLocal(MultiLanguage.getSystemLocal(newConfig)); } public static void saveSelectLanguage(Context context, int select) { SPUtil.getInstance(context).saveLanguage(select); MultiLanguage.setApplicationLanguage(context); }}

5. LanguageListener.java

/** * Created on 2021/11/10 16:49 * * @author Gong Youqiang */public interface LanguageListener { /** * 获取选择设置语言 * * @param context * @return */ Locale getSetLanguageLocale(Context context);}

6. LauncherApp.java

/** * Created on 2021/11/10 17:01 * * @author Gong Youqiang */public class LauncherApp extends Application { @Override protected void attachBaseContext(Context base) { //第一次进入app时保存系统选择语言(为了选择随系统语言时使用,如果不保存,切换语言后就拿不到了) LanguageUtils.saveSystemCurrentLanguage(base); super.attachBaseContext(MultiLanguage.setLocal(base)); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //用户在系统设置页面切换语言时保存系统选择语言(为了选择随系统语言时使用,如果不保存,切换语言后就拿不到了) LanguageUtils.saveSystemCurrentLanguage(getApplicationContext(), newConfig); MultiLanguage.onConfigurationChanged(getApplicationContext()); } @Override public void onCreate() { super.onCreate(); MultiLanguage.init(new LanguageListener() { @Override public Locale getSetLanguageLocale(Context context) { //返回自己本地保存选择的语言设置 return LanguageUtils.getSetLanguageLocale(context); } }); MultiLanguage.setApplicationLanguage(this); }}

7. 布局文件

在线工具

在线转换工具:​​中文转繁体​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JavaWeb三大组件之一的Filter详解
下一篇:service mesh 简介
相关文章

 发表评论

暂时没有评论,来抢沙发吧~