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

系统语言切换为英文后,右键菜单里很多项目仍显示中文?一次关于 LaunchServices 本地化注册机制的深挖过程

  •  1
     
  •   ahaxzh · 40 天前 · 1407 次点击
    这是一个创建于 40 天前的主题,其中的信息可能已经有所发展或是发生改变。

    [macOS] 系统语言改成英文后,右键菜单里很多项目仍是中文 —— 记录一次对 LaunchServices 本地化机制的深挖(未解)

    起因很简单,就是我把 macOS 的系统语言从中文切换成了英文,然后在 Finder 中右键选择文字时,发现菜单里还有一项中文服务:

    将文本转为音频

    说实话这东西在一堆英文菜单里格外显眼,我本来以为是缓存没刷新,结果越查越离谱……最终没解决,但这个坑我踩得够深,就整理一下发出来,供有类似强迫症的朋友参考。


    🧩 起因 & 表现

    系统界面全英文,唯独 Finder 的服务菜单中仍有一项中文服务「将文本转为音频」。这不是自己建的 Automator ,也不是第三方插件,看起来就是系统自带的。


    🔍 排查过程

    1. ~/Library/Services 没东西

    首先排除了用户级 Quick Action 的可能。

    2. 在 /System/Library/Services/ 下找到了关键文件:

    ChineseTextConverterService.app

    目录结构正常,里面包含多语言本地化资源:

    Contents/Resources/zh.lproj/ServicesMenu.strings Contents/Resources/en.lproj/ServicesMenu.strings

    也就是说,这玩意确实支持英文显示,但我系统语言都切成英文了,它却还是显示中文服务名?很迷。


    🧪 Gemini 推荐我执行了一条命令:

    /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
    
    这条命令的作用是强制重建系统的 LaunchServices 数据库,理论上能刷新所有“打开方式”、服务项之类的注册信息。
    
    我当时抱着试试看的态度执行了,没有报错,也没有立刻生效,问题依旧。
    
    但,坑也就此埋下。
    
    ⸻
    
    🧨 后续发现:它其实注册了这个服务(并锁定了中文)
    
    我查了系统日志:
    
    log show --predicate 'eventMessage contains "ChineseTextConverterService"' --last 30d
    
    结果显示:
    
    2025-06-08 02:02:41
    com.apple.ChineseTextConverterService 被正式注册入系统
    
    也就是说,这条命令其实是“首次激活”了这个原本未注册的系统服务项,注册时使用的是中文资源( zh.lproj ),于是它现在牢牢地以「将文本转为音频」出现在菜单中,无论你系统语言是否为英文。
    
    ⸻
    
    ❓那这个服务是什么时候写入系统的?
    
    查 .app 文件的创建时间是 2025-05-04 ,结合我现在是 macOS Sequoia 15.5 ,可以合理推测是系统更新中自动部署的。
    
    当时它只是静静地存在,并未被注册为 Finder 服务,直到我执行了那条命令,把它“唤醒”了……
    
    ⸻
    
    🧱 崩溃瞬间:打开系统设置 > Keyboard > Services 后我彻底放弃
    
    你以为只有一个中文服务名?
    
    不,还有这些:
    
    ![hahah]( https://imgur.com/a/F4rjUMJ)
    
    这些全部都还是中文,系统语言为英文,Finder 语言为英文,服务却全是中文。
    
    ⸻
    
    🚫 尝试过但无效的操作
    	•	删除 ~/Library/Preferences/com.apple.finder.plist
    	•	删除 ~/Library/Preferences/com.apple.systempreferences.plist
    	•	手动编辑 .strings 文件(被 SIP 拦截)
    	•	新建用户(无效,LaunchServices 是系统级)
    	•	多次执行 lsregister (只会让更多服务“苏醒”)
    	•	怀疑人生(有效,但短暂)
    
    ⸻
    
    ✅ 所学到的冷知识
    	•	macOS 的 LaunchServices 服务名注册是一次性的
    	•	一旦注册,语言就固定了,以后语言切换不会影响已注册名称
    	•	/System/Library/Services 下很多 .app 是“预部署未激活”的,直到某些动作(或你手贱)触发才注册
    	•	lsregister -r 命令其实就是“全系统服务激活开关”,慎用
    	•	系统不会回滚注册名,SIP 不允许你改名或清除
    
    ⸻
    
    💡 可行的 Workaround (仅供参考)
    	•	在系统设置 → Keyboard → Services 中,取消勾选“将文本转为音频”
    	•	用 Automator 自建一个英文名的服务(比如叫 Convert Text to Audio )
    
    我也顺便做了一个 .workflow 模板,如果你想下载,可以留言我发给你。
    
    ⸻
    
    ❌ 最终结论
    
    这个问题没有解法,除非你抹盘重装一个最初语言为英文的 macOS 系统,才能避免注册为中文服务项。
    
    否则,这些看起来“只是语言显示”的东西,其实是系统注册层面已经写死的。
    12 条回复    2025-06-10 13:37:26 +08:00
    drymonfidelia
        1
    drymonfidelia  
       40 天前   ❤️ 1
    苹果的很多东西表面上看起来很优雅,去逆向看一下实际实现和屎一样。macOS 还有办法关 sip 改系统文件修复,我 iOS 遇到的 Bug 才真是只能抹盘解决 /t/1013867
    SeaTac
        2
    SeaTac  
       40 天前 via iPhone
    “将文本转为音频”
    SeaTac
        3
    SeaTac  
       40 天前 via iPhone
    my bad 我看岔了
    bunnyblueair
        4
    bunnyblueair  
       39 天前
    macOS 现在 bug 太多了,跟乔布斯那会是两个时代
    cpstar
        5
    cpstar  
       39 天前
    大胆设想,第一个应用安装时选择 A 语言,然后切换 B 语言安装第二个应用,然后切 C 语言安装第三个,以此类推,于是。。。
    咱就赌你初始化的时候固定到一种语言,爱咋咋地。
    cpstar
        6
    cpstar  
       39 天前   ❤️ 2
    @bunnyblueair 4# 窃以为,这种机制不太可能是近年来“创造”的,而是固化多少年的东西,甚至可以上追到上个世纪 80 年代初代苹果机。
    Kenshiro
        7
    Kenshiro  
       39 天前 via Android   ❤️ 1
    这个很早注意到了,一些关键设定的语言是走管理员的账户的设定的,把这俩的语言同步一下就好
    ahaxzh
        8
    ahaxzh  
    OP
       39 天前 via iPhone
    @Kenshiro 嚯?按照你说的意思 我添加个新的用户为管理员 把当前用户删掉 再新增回来??
    ahaxzh
        9
    ahaxzh  
    OP
       39 天前 via iPhone
    @Kenshiro 还有我目前单管理员用户的 不太明白你说的意思
    Kenshiro
        10
    Kenshiro  
       38 天前 via Android
    @ahaxzh 方便发下图吗,怀疑这是捷径的动作
    ahaxzh
        11
    ahaxzh  
    OP
       38 天前 via iPhone
    @Kenshiro Mac 上目前无捷径操作,这些中文项目我都查了,全是系统自带的。![hahah]( https://imgur.com/a/F4rjUMJ)
    Kenshiro
        12
    Kenshiro  
       37 天前 via iPhone
    @ahaxzh
    1. 重新更换语言
    2. 去设置/语音 检查是否有单一 Apps 语言指定
    3. 新建管理员用户,设定为英文,将原有账户降权为普通用户看看
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1058 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:55 · PVG 06:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.