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

Geo*_*org 18 localization nslocalizedstring ios

我有一个本地化为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...
Run Code Online (Sandbox Code Playgroud)

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

有没有办法告诉我的应用程序,如果没有给定密钥的值,它应该使用fe english作为后备?我尝试添加基本本地化但这没有帮助...

非常感谢

cjw*_*rth 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;
}
Run Code Online (Sandbox Code Playgroud)

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

基本上,不是NSLocalizedString(),它将返回输入字符串,如果需要,此版本将回退到英语.


sam*_*ize 5

灵感来自这个这个,我的雨燕代码版本:

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: "")
}
Run Code Online (Sandbox Code Playgroud)

许多开发人员希望不完整的翻译会退回到开发语言......但这不是Apple 选择的行为方式。我有一个伪代码来帮助更好地理解 Apple 如何选择回退。