具有与NSLocalizedString中使用的键不同的后备语言(@“Text aka.key”,@“Description”)

时间:2010-06-11 12:55:49

标签: iphone xcode localization nslocalizedstring

我到处使用NSLocalizedString(@“deutsch中的文字”,@“das Textfeld in deutsch”) 我有两个Localizable.strings文件。一个用于德语,一个用于英语。

我现在意识到的是。 如果您有德语iPhone,则会获得德语文本,如果您将iPhone设置为英语,则会获得英文文本。但如果你说法语,那么你也会得到德语文本,因为我用德语作为键,对吧? 有没有办法将英语设置为后备语言而不是我的代码中到处使用的德语? (我有很多次出现的NSLocalizedString,现在到处更改密钥会很麻烦(在代码中,在Localized.string.en和Localized.string.de中)。

2 个答案:

答案 0 :(得分:1)

您必须将CFBundleDevelopmentRegion中的Info.plist设置为英语。

这样做,只要用户的首选语言不受支持(在您的情况下不是英语和德语),就会使用开发语言。

我通常使用全局函数来包装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的内容。

答案 1 :(得分:0)

总是选择本地化(something.lproj)。如果l10n提供翻译,则不使用密钥本身;这意味着你可以使用像“DISCOMBOBULATE_OR_OK”这样的键,它在适合的语言中使用“Discombobulate”,在“Discombobulate”的翻译对于可用空间来说太长的语言中可以“OK”。

的可能性:

  • Info.plist的CFBundleDevelopmentRegion中的语言用于选择默认语言。
  • 手机的后备语言会受到购买地点的影响(例如,在我的语言屏幕上,“英语”始终显示在第一个或第二个。)

值得请一位有英国/美国/澳大利亚电话的人进行测试。