Android应用内多语言切换

关于Android多语言支持的介绍,请参阅谷歌Android开发者文档,这里就不再介绍了,下面直接进入正题。

实现方案

1)在项目的资源文件夹里添加不同语言的value 文件夹strings.xml资源
这个可以借助Android Studio来完成(res->New->Android Resources File->Locale)
在这里插入图片描述
2)设置Configuration 中的 locale 属性
Configuration 包含了设备的所有的配置信息,这些配置信息会影响应用获取的资源。例如 string 资源,就是根据 Configuration 的 locale 属性来判断该取哪种语言的 string 资源,默认是 value 文件夹下的。

主要代码如下:

Resources resources = context.getResources();
        Configuration config = new Configuration(resources.getConfiguration());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                LocaleList localeList = new LocaleList(locale);
                LocaleList.setDefault(localeList);
                config.setLocales(localeList);
            } else {
                config.setLocale(locale);
            }
            context = context.createConfigurationContext(config);
        } else {
            config.locale = locale;
            resources.updateConfiguration(config, resources.getDisplayMetrics());
        }
        Locale.setDefault(locale);

3)重启首页Activity
注意:假如你的 App 存在某个 activity 和当前设置页 activity 不在一个 task 栈内的话(比如你从某个通知页用 FLAG_ACTIVITY_NEW_TASK 启动的一个 activity),就不会应用语言设置。因此可以直接杀掉当前 App 的进程,保证是“整个”重启了:

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
// 杀掉当前进程,这行代码也只能杀当前进程,杀不了其他进程
android.os.Process.killProcess(android.os.Process.myPid());
// 退出Java虚拟机,进程也就退出了,好像不加也可以
System.exit(0);

4)记住用户设置的语言,持久化处理
杀掉应用,重新打开,设置又失效了。这是因为应用重启后会读取设备默认的 Configuration 信息,其中和语言相关的 locale 属性也会变成默认值,也就是你在系统设置中选择的语言。

当你的应用需要由用户单独设置语言,而不是仅仅跟随系统语言,你就需要持久化存储用户的设置信息了。你可以选择数据库、或 SharedPreferences 来存储设置信息。

代码如下:

sCurrentLanguage = locale;
        getSharedPreferences(context).edit()
                .putString(KEY_LANGUAGE, locale.getLanguage())
                .putString(KEY_COUNTRY, locale.getCountry())
                .apply();

在应用启动时设置:

public class BaseApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        // 国际化适配(绑定语种)
        super.attachBaseContext(attach(base));
    }
}

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void attachBaseContext(Context newBase) {
        // 国际化适配(绑定语种)
        super.attachBaseContext(attach(newBase));
    }
}


public static Context attach(Context context) {
        if (!LanguagesUtils.equalsLanguages(context, getAppLanguage(context))) {
            return LanguagesUtils.updateLanguages(context, getAppLanguage(context));
        }
        return context;
    }

Demo传送门

参考
Android 开发者>文档>指南>支持不同的语言和文化
安卓APP内部多语言切换
Android App 多语言切换
关于APP内多语言切换的解决方案
Android原生多语言切换方案,兼容Android10
记APP实现多语言(国际化)过程,兼容Android 8.0以上
Android国际化(多语言)实现,支持8.0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值