Android多语言切换适配——以英语为例

Android多语言切换适配——以英语为例,第1张

Android多语言切换/适配——以英语为例

近期在做一个背单词APP来作为毕业设计,在app里面想设计一个切换语言为英语的功能,记录一下本次实现的效果以及步骤。

文章目录
    • 实现效果
      • 中文模式
      • 英文模式
    • 实现原理
    • 实现步骤
      • 1、创建相关的value文件夹和string.xml文件
      • 2、 在对应的string文件中选择合适的翻译
      • 3、在对应的view中使用该string字段
      • 4、修改资源文件对应的Locale属性
      • 5、 重启Activity
      • 6、设置重启后恢复SP储存的属性
    • 最终效果图

实现效果 中文模式


英文模式


PS: 请不要吐槽我的垃圾英语翻译水平,纯机翻哈哈哈

实现原理

在Android当中针对不同的ConfigChanges会有不同的响应事件,对于手机语言状态的改变会引起对应的res / values的目录的使用,例如对于中文模式使用的就是默认的文件夹

对于英语使用的就是values_en的文件夹下的xml文件。

语言对应的文件夹名字可以通过Android studio来直接创建对应的Resource Dictionnary:

再自己选择对应语言,这里以英语为例:

其他语言文件夹同理。

然后在对应的语言文件夹下的String.xml文件中翻译对应的字符串即可。

对于系统语言级别的切换App会自动进行响应切换为对应的语言,若对应的语言没有相关的文件夹则是使用默认的语言文件夹,若有则使用对应的语言文件夹。

对于app内部自己要进行语言的切换则是需要自己通过代码手动来进行切换对应的ConfigChanges事件。

实现步骤 1、创建相关的value文件夹和string.xml文件

2、 在对应的string文件中选择合适的翻译

values文件夹下的string文件(默认):


    乐背
    提示
    今天不再背单词了吗?
    退出
    再背会

    
    

    搜索
       设置目标   
     学习数据   
    四级词汇书
    每日
    剩余
    已学单词
    今日计划
    需新学
    需复习
    开始学习!

    功能探索

    坚持天数
    积累单词
    打卡日历
    数据分析
    单词列表
    收藏夹
    夜间模式
    晚上开启夜间模式更护眼哦
    通知栏单词
    通知栏显示单词,辅助更好学习
    英语模式
    开启英语模式,感受英语氛围
    云端
    数据云端备份/恢复
    关于
    关于我/联系我
    
    认识
    模糊
    不认识
    例句:

values_en文件夹下的string文件(英文):



    LeBei
    Tips
    No More Words Today?
    Yes
    No

    Days
    Words

    Searching
     Set 
     Learning Data 
    CET-4
    Every day
    Surplus
    Hava Learned Words
    Todays Plan
    Need To Learn
    Need To Review
    Start Learning!

    Function Expore

    Persistent Days
    Accumumlate Words
    Calendar
    Analysis
    Words List
    Stared Word
    Night Mode
    More Eye-Friendly To Turn On The Night Mode At Night
    Notification Words
    Open Notification Bar Word
    Chinese Mode
    Switch Chinese Mode
    Cloud Bridge
    Data Cloud Backup / Recovery
    about
    about Me / Contact Me

    Know
    Vague
    Don`t Know
    ES:


3、在对应的view中使用该string字段

例:



    
    

    

对于为了适应手机语言切换来适配的进行到这一步就可以了。
对于APP内部主动进行修改的还要进行下面的步骤。

4、修改资源文件对应的Locale属性

在要修改语言的相应位置中加上相关代码:

        switchToEnglish.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            // 获得res资源对象
            Resources resources = getActivity().getResources();
            // 获得屏幕参数,主要是用来下面的切换
            DisplayMetrics metrics = resources.getDisplayMetrics();
            // 获得配置对象
            Configuration config = resources.getConfiguration();
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    config.locale = Locale.ENGLISH;
                    locale = config.locale;
                    Toast.makeText(getContext(), "切换为英语模式!", Toast.LENGTH_SHORT).show();

                } else {
                    config.locale = Locale.CHINESE;
                    Toast.makeText(getContext(), "切换为中文模式!", Toast.LENGTH_SHORT).show();
                }
                if (locale == Locale.ENGLISH) {
                    updateActivity("English");
                } else {
                    updateActivity("Chinese");
                }
            }
        });

在以上代码主要做的事情就是切换了config.locale的相关属性,详细见其源码。

5、 重启Activity

在修改完之后要重启Activity的时候才会重新载入相关属性,因此我们要做的第二步就是保存当前属性,重启Actiivity。

详细代码就是updateActivity方法:

    public void updateActivity(String language) {
        //在本地SP中保存当前选择的语言
        SharedPreferencesUtils.setParem(getContext(), "languege", language);
        Locale local = this.locale;
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = local;
        res.updateConfiguration(conf, dm);
		//设置好选择的语言以后,需要清除任务栈中的所有activity,打开首页,确保以后进入的页面都是当前选择的语言
        Intent intent = new Intent(getActivity(), MainActivity.class);
        //清空任务栈确保当前打开activit为前台任务栈栈顶
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        getActivity().finish();
    }
}
6、设置重启后恢复SP储存的属性

这里我参考网上的代码,在自定义Application当中来做:

public class MyApplication extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setCurrLanguageMode();
    }

    //设置当前APP的语言模式
    private void setCurrLanguageMode() {
        String language = (String) SharedPreferencesUtils.getParem(this, "languege", "");
        Locale local = LanguageUtils.getLocale(language);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = local;
        res.updateConfiguration(conf, dm);
    }

    public void init() {
        //LitePal.initialize(this);
    }
}
最终效果图

结束。

参考文章:
https://www.jianshu.com/p/ef749f54faba在这里插入图片描述

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5612872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存