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