后备语言iOS(包含不完整的Localizable.strings文件)

时间:2013-11-25 15:17:46

标签: ios localization nslocalizedstring

我有一个本地化为16种语言的iOS项目。只有一些单词没有本地化(主要是那些进入更新并且本地化办公室没有及时交付的单词)。 对于我的按键,我使用英语措辞,因为如果翻译人员愿意,这也会改变。 所以现在如果我没有语言的翻译,如果我回到我使用的密钥。但由于这个关键不是“人类可读的”,或者至少不是“人类阅读的乐趣”,这是一个问题。

我做了一些研究,但找不到我的确切问题的解决方案。 我有。:

Localizable.strings in en.lproj
@"Key1" = @"Value 1"
@"Key2" = @"Value 2"

Localizable.strings in de.lproj
@"Key1" = @"Wert 1"
// Note that @"Key2" is missing here in my de.lproj

I would expect that if I make NSLocalizedString(@"Key2", ...)
and am running on a german phone, it falls back to the english
translation for this key as it exists...

所以现在我只是将英文翻译复制到缺少的Localizable.strings文件中。但这是一个大黑客! 但是使用英语单词作为键似乎对我来说是一个黑客攻击!

有没有办法告诉我的应用程序,它应该使用f.e.如果某个键没有值,那么英语作为后备?我尝试添加基本本地化,但这没有帮助......

非常感谢

3 个答案:

答案 0 :(得分:15)

据我所知,没有“官方”的方法可以做到这一点,但我之前已经实现了这样的功能:

NSString * L(NSString * translation_key) {
    NSString * s = NSLocalizedString(translation_key, nil);
    if (![[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"] && [s isEqualToString:translation_key]) {
        NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
        NSBundle * languageBundle = [NSBundle bundleWithPath:path];
        s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
    }
    return s;
}

借鉴:https://stackoverflow.com/a/8784451/1403046

基本上,如果需要返回输入字符串的NSLocalizedString(),此版本将在必要时回退到英语。

答案 1 :(得分:0)

thisthis的启发,我的Swift代码版本:

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: "")
}

许多开发人员期望不完整的翻译会影响开发语言......但这不是Apple choose to behave的方式。我有一个pseudocode来帮助我更好地了解Apple如何选择回退。

答案 2 :(得分:-4)

您可以使用Base本地化,并且将从中获取所有未本地化的字符串。