Резервный язык 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. Но это большая хитрость! Но также использование английских слов в качестве ключей кажется мне уловкой!

Есть ли способ сообщить моему приложению, что оно должно использовать, например, т. Е. английский как запасной вариант, если для данного ключа нет значения? Я пробовал добавить базовую локализацию, но это не помогает ...

Большое спасибо


person Georg    schedule 25.11.2013    source источник
comment
Но также использование английских слов в качестве ключей кажется мне уловкой! -- нисколько. Это довольно элегантное решение, которое точно решает проблему, которую вы описываете. Тот факт, что переводчик может изменить фактические слова, используемые в английском переводе, не означает, что необходимо изменить ключ. Тем не менее, новая базовая локализация, о которой упоминает Maxthon, в большинстве случаев является даже лучшим подходом.   -  person Rob Napier    schedule 28.11.2013


Ответы (3)


Насколько мне известно, "официального" способа сделать это не существует, но я реализовал такие функции раньше:

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;
}

заимствовано из: https://stackoverflow.com/a/8784451/1403046

По сути, вместо NSLocalizedString (), который вернет входную строку, эта версия при необходимости вернется к английскому языку.

person cjwirth    schedule 25.11.2013
comment
Это отстой ... :) Проблема в том, что если я использую L (...), genstrings (используемые Linguan) не найдут его ... но спасибо за ваш ответ ... если я не получу другого ответа, который лучше, я скоро приму твой. Ваше здоровье! - person Georg; 25.11.2013
comment
Вы можете передать -s в genstrings, чтобы указать, какую функцию вы используете вместо NSLocalizedString. - person Rob Napier; 28.11.2013

Вдохновленный этим и этим, моя версия кода 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: "")
}

Многие разработчики ожидают, что неполный перевод приведет к отказу от языка разработки ... но это не путь Apple решила вести себя. У меня есть псевдокод, чтобы лучше понять как Apple решила отступить.

person samwize    schedule 24.01.2018

Вы можете использовать Base локализацию, и все нелокализованные строки будут взяты из нее.

person Maxthon Chan    schedule 28.11.2013
comment
Я добавил базовую локализацию для своих Localizable.strings, но она не берет недостающие локализации из их ... Я надеялся, что это сделает это, но это не так ... Есть ли какой-либо параметр, который я должен активировать в Xcode? - person Georg; 28.11.2013
comment
Это не верно. Или я что-то упускаю - person jlmg5564; 20.05.2015
comment
Нет, это не поможет. Базовая интернационализация позволяет вам просто разделить локализуемые строки из ваших xibs или раскадровок в строковые файлы, что, безусловно, очень помогает, но здесь ничего не решает. - person JonEasy; 07.08.2015
comment
Прочтите документы Apple по базовой интернационализации, и вы увидите, что этот ответ совершенно неверен. - person Michael; 19.09.2017