Language Selector 实战:逐应用设置语言,解锁 Android 13 隐藏能力
【免费下载链接】Language-SelectorLanguage Selector let users select individual app languages (Android 13+)项目地址: https://gitcode.com/gh_mirrors/la/Language-Selector
Android 13 引入了一项被多数人忽略的能力——逐应用设置语言(per-app locales),它允许你为每个 App 单独指定显示语言。问题在于,并非所有 ROM 都把这个入口放进设置里。Language Selector 正是为此而生:它复刻 Android 13 原生的"App languages"行为,通过 Shizuku 调用系统 LocaleManager,让"一个应用一种语言"真正落地。本文从原理、上手、进阶到避坑,一次性讲透。
系统语言不该是一刀切:这项能力的来龙去脉
一次被藏起来的系统授权
Android 13 在框架层加入了LocaleManager,允许为单个应用覆盖系统语言。但很多定制 ROM(如作者的 MIUI 14)虽然跑着 Android 13 内核,设置里却找不到"应用语言"入口。能力在,入口没了,这就是 Language Selector 要补的缺口。
从 ADB 命令到图形前端
没有入口,不等于没有通道——adb shell cmd locale可以直接操作其他应用的语言。作者最初的动机很简单:既然命令行能改,那就自己做一个"前端"来管理应用语言。于是 Shizuku 成为必选项,因为它能在免 root 的前提下,把 ADB 级别的权限交给普通 App。
一段 AIDL 桥接的细节
权限拿到后,剩下的就是调用系统服务。核心逻辑在app/src/main/java/vegabobo/languageselector/service/UserService.kt:通过SystemServiceHelper获取locale服务,转成ILocaleManager后调用setApplicationLocales(packageName, currentUser, locales),一条命令完成语言覆盖。Android 13 与 14 的参数差异(多一个fromUserId标志)也在代码里做了兼容处理。
三步走通最小上手流程
第一步:准备 Shizuku 并完成授权
打开 Language Selector 前,你需要先安装并启动 Shizuku。应用主界面会检测 Shizuku 的 binder 与权限状态,未就绪时显示提示页,点击 Proceed 完成授权后即可进入应用列表。
第二步:选应用,选语言
应用列表默认只显示第三方应用,支持按名称或包名搜索。点进任意应用,你会看到它当前的覆盖语言(如系统默认),下方就是完整的语言清单。
第三步:验证是否生效
选好语言后,直接点击界面上的 Open 按钮启动该应用。若目标应用本身支持所选语言,下次启动即按新语言渲染界面。整个过程不需要重启系统,也不必修改系统语言。
语言选择界面拆解:三个分区各司其职
Pinned:长按置顶常用语言
在任意语言上长按即可"钉住"它,被固定的语言会集中显示在 Pinned 分区顶部。再次长按可取消。这个设计直接服务于高频切换场景,也是后文快捷磁贴的数据来源。
User languages:贴近你的使用习惯
这一区展示系统当前语言环境下的推荐项,包含"System default"选项。选择它等于清除该应用的语言覆盖,回到跟随系统语言的状态。
All languages:庞大的完整清单
完整的语言列表来自Locale.getAvailableLocales(),由app/src/main/java/vegabobo/languageselector/LocaleManager.kt按语言分组、排序生成。选择一门语言后,还会进入 Region 二级页面,细分到具体国家/地区变体,例如"Portuguese"之下可单独选择巴西或葡萄牙。
快捷设置磁贴:给前台应用换语言的零级入口
磁贴只认固定语言
下拉通知栏找到 Language Selector 磁贴后,它会把钉住的那些语言作为候选。也就是说,Pinned 分区既服务于应用内快速切换,也决定了磁贴的可选项——没钉任何语言时,磁贴会显示 Unavailable。
点击一次,循环换语言
磁贴会读取当前前台应用(通过ActivityTaskManager.getTasks()获取顶部任务),点击后按固定语言列表顺序循环切换,支持切回系统默认。实现上,app/src/main/java/vegabobo/languageselector/QSTile.kt还做了保护:系统应用与本应用自身被排除,避免误改引发异常。
原理与边界:它到底做了什么,又没做什么
只指定 locale,不做翻译
必须澄清:Language Selector 不是翻译器。它只设置应用运行时使用的 locale,应用是否支持该语言、能否正确渲染,取决于应用自身的多语言资源。选一门应用不提供的语言,界面大概率不会变化。
系统应用是高危区
为系统应用或某些未适配 locale 的第三方应用覆盖语言,可能导致显示异常。主界面在开启"显示系统应用"时会弹出二次确认警告,这不是形式主义,而是作者明确标注的已知风险。
列表长但不够精确的取舍
直接遍历getAvailableLocales()的做法会产生数量庞大的语言条目,且包含不少实际用不到的区域变体。README 中作者也坦言这种方式"pretty slow and languages aren't filtered accurately",并欢迎通过 PR 改进——对想参与开源的人来说,这是一个现成的切入点。
适合谁,不适合谁
| 场景 | 适配度 | 说明 |
|---|---|---|
| 多语言家庭共用一台手机 | 高 | 微信保持中文、YouTube 用英文,互不干扰 |
| 语言学习者创造沉浸环境 | 高 | 把学习类应用单独切到目标语言 |
| 开发者调试多语言界面 | 高 | 快速验证应用各语言资源是否正常 |
| 单语言重度用户 | 低 | 收益有限,还需额外维护固定列表 |
| 系统应用依赖者 | 低 | 不建议触碰系统级应用的语言 |
硬性门槛只有三条:Android 13 及以上(12 及以下无 LocaleManager 支持)、已运行的 Shizuku、目标是普通第三方应用。满足即可上手,全程免 root。
从哪获取,如何开始
获取源码并开始体验:
git clone https://gitcode.com/gh_mirrors/la/Language-Selector构建安装后按前面三步走一遍,再顺手长按钉住两三个常用语言,把磁贴加到快捷设置里,整个工作流就闭环了。后续想深入,可以读一读app/src/main/java/vegabobo/languageselector/service/UserService.kt与QSTile.kt,体会一段 AIDL、一个磁贴服务如何撬动系统级能力。
系统语言的"一刀切"设定持续了很多年,而真正让语言选择回归个体的,往往就是这样一个几 MB 的小工具——它没发明新权限,只是把系统早就给好、却没人认真打开的开关,放到了你触手可及的地方。
【免费下载链接】Language-SelectorLanguage Selector let users select individual app languages (Android 13+)项目地址: https://gitcode.com/gh_mirrors/la/Language-Selector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考