Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
后备语言iOS(带有不完整的Localizable.strings文件)_Ios_Localization_Nslocalizedstring - Fatal编程技术网

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

后备语言iOS(带有不完整的Localizable.strings文件),ios,localization,nslocalizedstring,Ios,Localization,Nslocalizedstring,我有一个iOS项目,它被本地化为16种语言。只有一些单词没有本地化(主要是那些进入更新并且本地化办公室没有及时交付的单词)。 对于我的钥匙,我不使用英文措辞,因为如果翻译人员愿意,这也会改变。 所以现在,如果我没有一种语言的翻译,我会回到我使用的键。但由于这把钥匙不是“人类可读的”,或者至少不是“人类阅读的乐趣”,这是一个问题 我做了一些研究,但没有找到解决我确切问题的方法。 我有一个朋友 Localizable.strings in en.lproj @"Key1" = @"Value 1"

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

我做了一些研究,但没有找到解决我确切问题的方法。 我有一个朋友

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.英语作为后备?我尝试添加一个基本本地化,但这没有帮助


非常感谢

据我所知,目前还没有“官方”的方法,但我以前已经实现过这样的功能:

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;
}
借用自:


基本上,此版本将取代将返回输入字符串的NSLocalizedString(),如有必要,将退回到英语版本。

您可以使用
基本本地化,所有未本地化的字符串都将从此版本中提取。

受和的启发,我的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: "")
}

许多开发人员希望不完整的翻译会依赖于开发语言。。但事实并非如此。我有一个方法可以帮助更好地理解苹果是如何选择退却的。

这太糟糕了……:)问题是如果我使用L(…),genstring(由Linguan使用)将找不到它。。。但是谢谢你的回答。。。如果我得不到更好的答复,我会很快接受你的答复。干杯您可以将
-s
传递给genstrings,告诉它您使用的是什么函数,而不是NSLocalizedString。“但对我来说,使用英语单词作为键似乎是一种黑客行为!”——一点也不。这是一个非常优雅的解决方案,完全解决了您描述的问题。仅仅因为译者可能会更改英文翻译中使用的实际单词,并不意味着必须更改关键字。也就是说,Maxthon提到的新的基本本地化在大多数情况下是一种更好的方法。我确实为我的Localizable.strings添加了一个基本本地化,但它并没有从它们的。。。我希望它能做到,但它不是。。。在Xcode中是否有我必须激活的设置?这不是真的。或者我错过了什么不,这没用。让我们简单地将可本地化字符串从XIB或故事板分离到字符串文件中,这无疑是一个很大的帮助,但在这里并不能解决任何问题。阅读Apple docs on Base Internationalization,您会发现这个答案是完全错误的