V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liyafe1997
V2EX  ›  Android

Tips: 给不支持语言偏好列表的国产安卓(如 MIUI)设置语言偏好(需 ROOT)

  •  
  •   liyafe1997 · 3 天前 · 574 次点击

    感觉好多国产安卓砍了这个功能( UI 层面),比如我手上的 MIUI/HyperOS ,设置菜单里就只能设置系统语言,不能设置那个语言偏好列表。(国际版是有的,我实在不知道国内版为啥要砍这个人畜无害的 UI )

    这就导致一些 App 无法显示我期望的语言(在不更改系统语言的情况下)。比如我的系统语言为中文(此时你的语言列表里也只有中文),假如有一个 App 支持德语西班牙语和英语,我期望它显示英语,但它的逻辑很可能是,在你的语言列表里都没有这三种语言的情况下,默认显示德语,然而假如说我想让它显示英语,在 MIUI 下只能把系统语言设成英语(然而我并不想),如果我想显示西班牙语,就完全做不到了,因为 MIUI 系统语言选项压根没有西班牙语。

    我有 root 权限,于是我就想,能否绕过 UI 直接改这个参数。翻了半天互联网以及 Android 源码,发现这个设置存储在 system 空间的 system_locales 键中。可以通过

    settings get system system_locales
    

    来读取。更改之前建议先读一下你当前的 locales ,因为“中文”在不同 Android 版本上表示似乎不同,比如有的是zh-Hans-CN 有的是 zh-CN 然后设置你自己的语言偏好列表,逗号分开不同的 locales ,比如

    settings put system system_locales zh-Hans-CN,en-US,ja-JP
    

    (补充:对于系统语言,是在 persist.sys.locale 这个 prop 中,而不是在 settings 里。可以通过getprop persist.sys.locale / setprop persist.sys.locale xxx 来操作)。

    之后,发送CONFIGURATION_CHANGEDLOCALE_CHANGED广播,通知 App 语言变更

    am broadcast -a android.intent.action.CONFIGURATION_CHANGED
    am broadcast -a android.intent.action.LOCALE_CHANGED
    

    尤其是对 Google Play 有用,因为现在许多 App 都用的 aab 包,以及 Play Asset Delivery 机制,只下载你需要的资源(比如不在你语言列表里的语言资源就不会下载),在更新了语言列表后,Google Play 会自动下载这些 App 对应的语言资源。

    如果发了广播 App 还是没有自动下载/更新,可以尝试重启一下。

    我发现在我的设备上挺奇怪的,无论是我发了广播还是重启之后,好像都没见 Google Play 立马有动静(在原生支持的安卓里,在设置中改了语言列表设置之后,Play 马上能看到一堆 App 在那更新转圈圈,其实不是更新版本是在下载语言资源),但是过了一会才发现,实际上是已经更新了语言资源的,可以在 Play 的管理中看到,一堆软件包刚刚被更新过。

    https://i.imgur.com/QxtBQXq.png

    然后各种 App 就能通过你期望的语言来显示了。

    第 1 条附言  ·  3 天前
    补充:其实无需 root ,用 adb shell 也能写那个 system_locales 设置项。但是 adb shell 没有权限发广播,设置完只能重启看看能不能触发 Google Play 更新 App 的语言资源了。
    第 2 条附言  ·  2 天前
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1287 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 23:57 · PVG 07:57 · LAX 16:57 · JFK 19:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.