Исходный язык iOS (с неполным файлом Localizable.strings)
У меня есть проект 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. английский как резерв, если для данного ключа нет значения? Я попытался добавить базовую локализацию, но это не помогает...
Спасибо большое
Ответы
Ответ 1
Насколько я знаю, нет "официального" способа сделать это, но я уже реализовал такие функции, как раньше:
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;
}
заимствован из: fooobar.com/questions/149573/...
В принципе, вместо NSLocalizedString(), который вернет входную строку, эта версия при необходимости вернется на английский.
Ответ 2
Вдохновленный этим и этот, моя быстрая версия кода:
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 предпочитает вести себя. У меня есть псевдокод, чтобы лучше понять, как Apple решит отказаться.
Ответ 3
Вы можете использовать локализацию Base
, и из нее будут взяты все неблокированные строки.