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条目:
- 右键点击Clock.app -> 显示包内容
- 进入
Contents/Resources/de.lproj - 查看
InfoPlist.strings文件,里面应该有类似CFBundleDisplayName = "Uhr";的条目
这样修改后,你的代码应该就能正确获取到和Launchpad一致的本地化应用名称了。
内容的提问来源于stack exchange,提问作者ManuelSchneid3r
相关产品推荐
相关产品推荐

