You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS下如何获取NSBundle的本地化应用名称?

正确获取MacOS应用本地化名称的解决方案

看起来你遇到的问题是localizedInfoDictionary没有正确返回符合系统语言偏好的应用名称——明明系统首选语言是德语,但拿到的还是英文名称,而Launchpad里却能正确显示德语的Uhr。这是因为直接访问localizedInfoDictionary的键值并不是获取本地化InfoPlist条目的最可靠方式,我们需要换一种方式来读取应用的本地化显示名称。

问题根源

应用的本地化名称(比如德语的Uhr)通常存储在Contents/Resources/[语言代码].lproj/InfoPlist.strings文件中,而localizedInfoDictionary虽然会尝试合并主Info.plist和本地化资源,但它的加载逻辑并不总是能严格遵循系统的语言偏好顺序,或者可能因为bundle的初始化方式导致没有正确加载目标本地化资源。

正确的实现方式

我们应该使用NSBundle的localizedStringForKey:value:table:方法,明确指定读取InfoPlist.strings文件中的本地化键值。这个方法会自动按照系统的语言偏好优先级去查找对应的本地化资源,找不到时会回退到主Info.plist的默认值。

修改后的代码片段

替换你原来获取本地化名称的代码部分,改用以下逻辑:

// 优先获取CFBundleDisplayName(这是Launchpad显示的名称)
NSString *localizedDisplayName = [bundle localizedStringForKey:(NSString*)kCFBundleDisplayNameKey
                                                         value:nil
                                                         table:@"InfoPlist"];

// 如果没有CFBundleDisplayName, fallback到CFBundleName
if (!localizedDisplayName || localizedDisplayName.length == 0) {
    localizedDisplayName = [bundle localizedStringForKey:(NSString*)kCFBundleNameKey
                                                   value:nil
                                                   table:@"InfoPlist"];
}

printNSString(localizedDisplayName);

为什么这个方法有效

  • localizedStringForKey:value:table:会严格遵循系统的语言偏好列表(就是你代码里的NSLocale.preferredLanguages)去查找对应的InfoPlist.strings文件。
  • 指定table:@"InfoPlist"明确告诉系统我们要读取的是本地化的InfoPlist资源,而不是应用的其他字符串表。
  • 优先选择CFBundleDisplayName是因为大多数应用会用这个键设置Launchpad中显示的友好名称,而CFBundleName通常是应用的内部名称。

额外验证

你可以手动检查Clock.app的本地化资源,确认它确实包含德语的InfoPlist条目:

  1. 右键点击Clock.app -> 显示包内容
  2. 进入Contents/Resources/de.lproj
  3. 查看InfoPlist.strings文件,里面应该有类似CFBundleDisplayName = "Uhr";的条目

这样修改后,你的代码应该就能正确获取到和Launchpad一致的本地化应用名称了。

内容的提问来源于stack exchange,提问作者ManuelSchneid3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:50:29