通用技术 android 实现自动系统语言切换有什么好的思路没 最近卡在这里

blackstone · 2016年07月26日 · 最后由 TD 回复于 2020年03月20日 · 3554 次阅读

背景:
公司的 app 有海外版本 14 个语言要求做 UI 上的自动化测试 ,我用 appium 搭了个 web 平台,基本功能也已经实现。但有个新需要 要求测试过程中单台手机自动切换语言 ,对于这点各位有不有比较好的实现思路。

我的思路是用 1 appium 调用第三方语言设置软件进行修改【不想用其他框架】2 可以用 adb 命令修改语言设置相关的项,这个好像要重启才能生效 感觉两种方式都不是很理想 对这块不是很清楚。求有相关经验的给点思路

共收到 24 条回复 时间 点赞

额。。。是为了测试 app 在不同系统下的显示?先直接静态扫描多国语言的 config 呗?

我记得 adb shell getprop 中其中一项是语言配置,通过 setprop 命令能设置,不过是重启生效,你可以试试

来 14 台手机就好了(认真脸)

认真脸 什么意思 我百度了 呵呵

#1 楼 @monkey 扫描 config 要关注什么点呢?就看有没有缺失吗?一般来说多语言都是页面显示的问题,有些国家语言太长会显示不下。之前我处理的方法是用图像识别,如果字体显示不下,对应的控件里面的文字就会显示...。不过这样的效率也不够高,遍历起来也非常麻烦。

#5 楼 @shljsh soga。。就是多语言的换行啥的吧。其实要我说呢,config 扫描就是扫描 String 的,String 本身对扫描就完成任务了。剩下的我觉得无非就是你自动化 or 不自动化。说实话,这种东西不自动化会好点。直接遍历,人肉看算了。。。。

#6 楼 @monkey 现在我们公司就人肉做的,多语言这种也不需要回归测试,一遍检查完就一直好用,确实不需要什么自动化。

#7 楼 @shljsh 。。。。。你不是 lz 呀。。我错了。。我以为是一个人。。。其实我就觉得 ROI 太低了这个东西。以前多语言我也做过。。我就很不想自动化。。😂 😂 😂 😂 😂 😂

在 14 个 string 文件中,找出每一句最长的,然后生成一份新的 string 文件,添加到测试包中,然后只验这一个就好了。

最糟心的不是多语言,而是多语言适配小屏幕机型~~

我的问题也包含小屏幕 纠结。

切换语言可以用这个方法。自己写个 apk,然后广播(adb shell am broadcast -a xxx -es xxx xxx)传参。

//切换系统语言
    public static void updateSystemLanguage(String language,String country) {
        Locale updateLocale = getLocale(language,country);
        try {
            Object objIActMag, objActMagNative;
            Class clzIActMag = Class.forName("android.app.IActivityManager");
            Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
            Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
            // IActivityManager iActMag = ActivityManagerNative.getDefault();
            objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
            // Configuration config = iActMag.getConfiguration();
            Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
            Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
            config.locale = updateLocale;
            // iActMag.updateConfiguration(config);
            // 此处需要声明权限:android.permission.CHANGE_CONFIGURATION
            // 会重新调用 onCreate();
            Class[] clzParams = { Configuration.class };
            Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod(
                    "updateConfiguration", clzParams);
            mtdIActMag$updateConfiguration.invoke(objIActMag, config);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

不过还是建议人肉,这个国际化的不仅仅涉及到静态代码扫描(如 string.xml 文件的检查),还是涉及到动态代码扫描,这个就不好搞了。

#12 楼 @sziitash 问个问题哈
有的设备默认只有两三种语言 是因为 framework-res.apk 这里面只有两三种语言文件么 还是 这个里面语言文件都是全的 就是显示的时候被阉割了

14楼 已删除

#13 楼 @blackstone 你切着试试看,看能不能切换成功。
有些情况是显示只有两三种,实际上你还是可以切换多种语言的。

#15 楼 @sziitash 没成功 能帮我看下原因么 一些贴图 感谢

手机上收到广播了

#16 楼 @blackstone 不要带""试试

26楼 已删除

#16 楼 @blackstone country 不应该是中文的。你参照这个链接http://blog.csdn.net/qiuhu0793/article/details/8689685
比如:language zh country CN

#18 楼 @sziitash 不行嗨 还有没有什么地方漏的 我 change_configeratio 权限加上了

#21 楼 @blackstone 加你 q,私聊

我的锅😭 ,忘记更改系统设置必须要有系统签名的相关权限的。
http://blog.csdn.net/wqhjfree/article/details/9125997
http://www.devstore.cn/essay/essayInfo/5738.html

#23 楼 @sziitash没事 我先按第二种思路做了

#24 楼 @blackstone 请问第二种思路具体是用什么方法?我尝试用 setprop 修改 build.prop 的 persist.sys.language 和 persist.sys.country 两个选项并重启手机,但是并没有生效😱


请问一下后面怎么解决多语言切换的问题,我这边试了 adb 的命令切不了,手机没 root 的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册