news 2026/8/16 14:10:13

Language Selector 实战:逐应用设置语言,解锁 Android 13 隐藏能力

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Language Selector 实战:逐应用设置语言,解锁 Android 13 隐藏能力

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.ktQSTile.kt,体会一段 AIDL、一个磁贴服务如何撬动系统级能力。

系统语言的"一刀切"设定持续了很多年,而真正让语言选择回归个体的,往往就是这样一个几 MB 的小工具——它没发明新权限,只是把系统早就给好、却没人认真打开的开关,放到了你触手可及的地方。

【免费下载链接】Language-SelectorLanguage Selector let users select individual app languages (Android 13+)项目地址: https://gitcode.com/gh_mirrors/la/Language-Selector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 14:05:59

linux内核原理--进程,线程

进程,进程组,会话,线程,父子进程,线程组,孤儿进程,兄弟进程,兄弟线程 1.核心概念逐个解释 进程(Process) 操作系统资源分配的最小单位。拥有独立的虚拟地址空…

作者头像 李华
网站建设 2026/8/16 13:55:01

Android 12 S SystemServer启动过程中的服务分析

SystemServer是由zygote启动的,启动后会先走main方法,看注释也可以看到此方法是"The main entry point from zygote."接着往下走,就到了run方法frameworks/base/services/java/com/android/server/SystemServer.javapublic static …

作者头像 李华