Android(安卓)应用内切换语言 实现多语言功能
16lz
2021-01-26
1:在res资源文件夹下创建values-en文件夹 原来的values作为默认语言 默认为中文 在values-en里面创建strings.xml
2:在values values-xx下面的strings.xml实现翻译
value
3:在需要的地方里面通过key来获取value进行显示
4:创建语言util
package co.nano.nanowallet.util; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Build; import android.os.LocaleList; import android.util.DisplayMetrics; import android.util.Log; import java.util.Locale; import co.nano.nanowallet.R;public class LocalManageUtil { 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_en); default: return context.getString(R.string.language_cn); } } /** * 获取选择的语言设置 * * @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 saveSelectLanguage(Context context, int select) { SPUtil.getInstance(context).saveLanguage(select); setApplicationLanguage(context); } public static Context setLocal(Context context) { return updateResources(context, getSetLanguageLocale(context)); } 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; } /** * 设置语言类型 */ 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); } public static void saveSystemCurrentLanguage(Context context) { Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = LocaleList.getDefault().get(0); } else { locale = Locale.getDefault(); } Log.d(TAG, locale.getLanguage()); SPUtil.getInstance(context).setSystemCurrentLocal(locale); } public static void onConfigurationChanged(Context context){ saveSystemCurrentLanguage(context); setLocal(context); setApplicationLanguage(context); }}
5:在application中的oncreate方法设置首次进入app的语言
LocalManageUtil.setApplicationLanguage(this);
实现两个方法
@Overrideprotected void attachBaseContext(Context base) { LocalManageUtil.saveSystemCurrentLanguage(base); super.attachBaseContext(LocalManageUtil.setLocal(base));}@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //保存系统选择语言 LocalManageUtil.onConfigurationChanged(getApplicationContext());}
6:在baseactivity中实现
@Overrideprotected void attachBaseContext(Context newBase) { super.attachBaseContext(LocalManageUtil.setLocal(newBase));}
7:在设置里面增加两个按钮 点击调用
public static void selectLanguage(int select,Context context) { LocalManageUtil.saveSelectLanguage(context, select); MainActivity.reStart(context);}
8:实现reStart应用来展示效果
public static void reStart(Context context) { Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);}
更多相关文章
- Android卡片组件(CardView)
- android通过线程实现逐行显示信息
- Android实现短信验证码获取自动填写功能(详细版)
- Android(安卓)自定义View之View的绘制
- Android实例练习-可爱的小闹钟
- Linux设置qt-android开发环境
- Android39_Clock和TimePicker
- Android(安卓)通过高德地图获取地址的经纬度
- Android(安卓)Material Design之CardView(卡片式布局)