为啥 [NSBundle 本地化StringForKey] 不返回 iPhone 语言本地化字符串?

Posted

技术标签:

【中文标题】为啥 [NSBundle 本地化StringForKey] 不返回 iPhone 语言本地化字符串?【英文标题】:Why [NSBundle localizedStringForKey] does not return the iPhone language localised string?为什么 [NSBundle 本地化StringForKey] 不返回 iPhone 语言本地化字符串? 【发布时间】:2018-01-16 23:53:05 【问题描述】:

为什么localizedStringForKey首先返回的是开发语言的本地化,而不是iPhone的语言? documentation 中的“捆绑搜索模式”说:

如果存在首选语言的 .lproj 文件夹,则使用该本地化。否则,该包将搜索与下一个首选语言匹配的 .lproj 文件夹,依此类推,直到找到一个。如果首选语言没有本地化,则捆绑包选择开发语言本地化。

然后包按以下顺序搜索资源 [...]

但这对我来说没有意义。

测试 iPhone 是中文,法文键盘,捆绑包包含 32 种语言和英文的开发语言本地化。我不明白为什么首先返回英文本地化是有意义的。 iPhone 语言为什么不是中文呢?

NSArray* arr = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
// ( zh-Hant-FR, en-FR, fr-FR )

NSArray* localizations = [bundle localizations];
// ar,bg,ca,cs,da,de,el,en,es,fr,he,hu,id,it,ja,ko,ms,nb,nl,nn,pl,pt,pt_BR,ro,ru,sv,th,tr,uk,vi,zh-Hans,zh-Hant

NSArray* preferredLocalizations = [bundle localizations];
// same output

<key>CFBundleDevelopmentRegion</key>
<string>en</string>

NSString* str = [bundle localizedStringForKey:@"hello" value:@"" table:@"mytable"];
// hello

我应该如何解决这个问题?我希望localizedStringForKey始终返回 iPhone 语言本地化,无论开发语言是什么。

【问题讨论】:

【参考方案1】:

使用这个 NSLocalizedStringWithDefaultValue("requiredTranslationKey", @"StringFileName", [NSBundle mainBundle], @"", @"");

【讨论】:

我不相信。 NSLocalizedStringWithDefaultValuelocalizedStringForKey:value:table: 的宏,我使用的正是这个函数。

以上是关于为啥 [NSBundle 本地化StringForKey] 不返回 iPhone 语言本地化字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载 NSBundle?

NSBundle pathForResource 不适用于子目录本地化?

调用 [NSBundle pathForResource] 时得到 nil(本地化问题)

有没有办法在不重新启动应用程序的情况下使 NSBundle 本地化缓存失效? [iOS]

向 NSBundle 询问其资源名称

-[NSBundle pathForResource:ofType:inDirectory:] 为本地化资源返回 nil