Исходный язык 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, и из нее будут взяты все неблокированные строки.