• 【Android】切换系统全局语言设置


    前两种为应用内部处理,第三种为发送广播由系统服务进行处理

    使用反射

    这种会直接将安卓设置内的语言列表清空,然后将选择的语言设置为系统语言
    该方法存在问题,在首次开机后设置会导致国外应用进不去(只对于here地图个别版本)
    没有问题,经过排查为国家语言代码错误导致的应用无法进入
    事实证明,不要太相信度娘,还是得看源码文件找对应的语言代码!!!!!
    吃一堑,长一智orz…

        /**
         * 设置语言,使用反射
         * @param mLocale CHINESE ENGLISH
         */
        public void setLanguage(Locale mLocale) {
            try {
                Class localPicker = Class.forName("com.android.internal.app.LocalePicker");
                Method updateLocale = localPicker.getDeclaredMethod("updateLocale",
                        Locale.class);
                updateLocale.invoke(null,mLocale);
            } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException
                    | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如果有framework的jar包支持,就可以直接调用,不用再反射,例如在安卓设置中新增功能时,就可以直接调用

    LocalePicker.updateLocale(mLocale);
    
    • 1

    更新语言列表方式

    参考安卓设置方法进行移植,该方法需要系统的framework的jar包支持

    /*
    ** 获取系统语言列表,并将选择的语言加入进去
    */
    private List<LocaleStore.LocaleInfo> getUserLocaleList(Context context) {
        final List<LocaleStore.LocaleInfo> result = new ArrayList<>();
    
        final LocaleList localeList = LocalePicker.getLocales();
        for (int i = 0; i < localeList.size(); i++) {
            //判断列表中是否有重复项,如有,略过
            Locale locale = localeList.get(i);
            if (locale.getLanguage().equals("en")) {
                continue;
            }
            result.add(LocaleStore.getLocaleInfo(locale));
        }
        Locale mLocale = new Locale("en","EN");
        result.add(0,LocaleStore.getLocaleInfo(Locale.ENGLISH));
    
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    调用

    List<LocaleStore.LocaleInfo> mFeedItemList = getUserLocaleList(getApplicationContext());
    int count = mFeedItemList.size();
    Locale[] newList = new Locale[count];
    for (int i = 0; i < count; i++) {
        final LocaleStore.LocaleInfo li = mFeedItemList.get(i);
        newList[i] = li.getLocale();
    }
    LocaleList ll = new LocaleList(newList);
    LocaleList.setDefault(ll);
    LocalePicker.updateLocales(ll);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    系统服务进行处理

    • 参考系统恢复默认设置处理
    try {
        IActivityManager am = ActivityManagerNative.getDefault();
        Configuration config = am.getConfiguration();
        config.locale = mCurrentLocale;
        config.userSetLocale = true;
        am.updateConfiguration(config);
    } catch (android.os.RemoteException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    系统/安卓设置内流程

    语言代码

    //英文 简体中文 俄语 西班牙语 越南语 韩语 土耳其语 意大利语 葡萄牙语
    private final String[] mConuntry = {"en","zh","ru","es","vi","ko","tr","it","pt"};
    private final String[] mCode = {"US","CN","RU","ES","VN","KR","TR","IT","BR"};
    
    • 1
    • 2
    • 3
  • 相关阅读:
    c语言小项目(排雷游戏实现)
    CocosCreator3.8研究笔记(四)CocosCreator 脚本说明及使用(上)
    No6-3.从零搭建spring-cloud-alibaba微服务框架,实现资源端用户认证与授权等(三,no6-3)
    M3E&ChatGLM向量化构建本地知识库
    Java进阶路线目录索引(持续更新中)
    源程序 正算主程序 GSZS
    揭秘”智能定投“
    Kafka消费一致性和幂等性分析
    在Python上用openSMILE提取IS09和eGeMAPS特征集
    【WSN定位】基于chan算法、fang算法、taylor算法实现目标定位附Matlab代码
  • 原文地址:https://blog.csdn.net/cycy1821/article/details/136268945