【问题标题】:Have different fallback language than the keys used in NSLocalizedString(@"Text aka. key",@"Description")具有与 NSLocalizedString(@"Text aka.key",@"Description") 中使用的键不同的备用语言
【发布时间】:2010-06-11 12:55:49
【问题描述】:
我到处使用 NSLocalizedString(@"Text in deutsch",@"das Textfeld Text in deutsch")
我有两个 Localizable.strings 文件。一个德语,一个英语。
我现在意识到的是。
如果你有一部德语 iPhone,你会得到德语文本,如果你的 iPhone 设置为英语,你会得到英文文本。但是,如果您说法语,那么您也会得到德语文本,因为我使用德语作为键,对吗?
有没有办法将英语设置为后备语言,而不是我的代码中到处使用的德语? (我有很多 NSLocalizedString 的出现,以至于现在到处更改键(在代码中,在 Localized.string.en 和 Localized.string.de 中)会很痛苦)
【问题讨论】:
标签:
iphone
xcode
localization
nslocalizedstring
【解决方案1】:
您必须将Info.plist 中的CFBundleDevelopmentRegion 设置为英文。
这样做时,只要用户的首选语言不受支持(在您的情况下不是英语和德语),就会使用开发语言。
我通常使用全局函数来包装NSLocalizedString,并且当有未翻译的德语短语并且您希望它回退到英语时也会提供回退。
public func LS(_ key: String) -> String {
let value = NSLocalizedString(key, comment: "")
if value != key || NSLocale.preferredLanguages.first == "en" {
return value
}
// Fall back to en
guard
let path = Bundle.main.path(forResource: "en", ofType: "lproj"),
let bundle = Bundle(path: path)
else { return value }
return NSLocalizedString(key, bundle: bundle, comment: "")
}
还有更多关于本地化的内容,我写了更多关于 how fallback works 的文章。
【解决方案2】:
总是选择本地化(something.lproj)。如果 l10n 提供翻译,则不使用密钥本身;这意味着您可以使用“DISCOMBOBULATE_OR_OK”之类的键,它在适合的语言中翻译为“Discombobulate”,在“Discombobulate”的翻译对于可用空间而言太长的语言中翻译为“OK”。
可能性:
- Info.plist 的 CFBundleDevelopmentRegion 中的语言用于选择默认语言。
- 手机的备用语言受购买地点的影响(例如,在我的语言屏幕上,“英语”
总是显示在第一或第二。)
值得请拥有英国/美国/澳大利亚手机的人进行测试。