42 Stimmen

Lokalisierung von Zeichenketten in iOS: Standardsprache (Fallback)?

Gibt es eine Möglichkeit, eine Standardsprache festzulegen, die verwendet wird, wenn die Sprache der Geräteoberfläche von einer Anwendung nicht unterstützt wird?

Beispiel: Meine App ist auf Englisch und Deutsch lokalisiert:

// en.lproj:
"POWER_TO_THE_PEOPLE_BTN" = "Power";
"POWER_PLUG_BTN" = "Power";

// de.lproj:
"POWER_TO_THE_PEOPLE_BTN"  = "Macht";
"POWER_PLUG_BTN" = "Spannung";

Wenn ich nun die Anwendung auf einem Gerät ausführe, bei dem die UI-Sprache auf Italian wird die Anwendung die Schlüsselstrings verwenden POWER_TO_THE_PEOPLE_BTN y POWER_PLUG_BTN .

Es muss eine Möglichkeit geben, eine Standardsprache (Fallback) anzugeben, die von der Anwendung in einem solchen Fall verwendet wird.

Aus dem obigen Beispiel sollte ersichtlich sein, dass die Verwendung der englischen Zeichenfolge als Schlüssel nicht funktionieren wird.

Die einzige Möglichkeit, die ich im Moment sehe, ist die Verwendung von NSLocalizedStringWithDefaultValue 代わりに NSLocalizedString .

21voto

Kent Nguyen Punkte 2762

Um all diese langwierige Syntax zu vermeiden und mehr beschreibende Var-Namen für Übersetzer zu haben, habe ich meine eigene Hilfsmethode entwickelt L() für die Übersetzung und den Rücksprung ins Englische

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

Meine Localizable.strings würde wie folgt aussehen

"SOME_ACTION_BUTTON" = "Do action";

In meinem Code würde ich also verwenden L(@"SOME_ACTION_BUTTON") um die richtige Zeichenfolge zu erhalten

Allerdings ist der Schlüssel manchmal länger als die Übersetzung selbst HELP_BUTTON_IN_NAV_BAR = 'Help' aber es erspart mir eine Menge Zeit, demjenigen, der mir bei der Übersetzung hilft, zu erklären, was es ist.

19voto

Sea Coast of Tibet Punkte 4966

Vielleicht hilft das? -- iPhone: Lokalisierung / Internationalisierung Standard-Strings-Datei

Es sollte standardmäßig auf Englisch zurückgreifen. Ich habe gerade mein Telefon auf eine Sprache umgestellt, in der meine App nicht lokalisiert ist, und der Text war wie erwartet auf Englisch.

Das ist wichtig: wie @hyperspasm kommentierte: Um dies zu erweitern/umzuformulieren, ist die Fallback-Sprache die Sprache, die der Benutzer zuletzt in den Geräteeinstellungen gewählt hat und die auch im App-Paket enthalten ist.

19voto

Pattrawoot S. Punkte 227

Sie müssen sicherstellen, dass der Wert von CFBundleDevelopmentRegion in Ihrer Info.plist der Sprachregion entspricht, auf die Sie zurückgreifen möchten. (z. B. "en")

7voto

Makalele Punkte 7169

@Bogus Antwort in Swift 4, funktioniert wie ein Charme auf iOS 11.1:

public func NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle = Bundle.main, value: String = "", comment: String) -> String {
    let fallbackLanguage = "en"
    guard let fallbackBundlePath = Bundle.main.path(forResource: fallbackLanguage, ofType: "lproj") else { return key }
    guard let fallbackBundle = Bundle(path: fallbackBundlePath) else { return key }
    let fallbackString = fallbackBundle.localizedString(forKey: key, value: comment, table: nil)
    return Bundle.main.localizedString(forKey: key, value: fallbackString, table: nil)
}

4voto

Bogus Punkte 263

Ein schneller Weg, dies zu tun, ohne irgendwelche Methoden zu ersetzen, ist das "Überschreiben" der NSLocalizedString-Definition und die Verwendung der Methoden, die Apple verwendet für diese Definition, um sie zu ersetzen und die zusätzliche Fallback-Logik in der "überschriebenen" Methode hinzuzufügen.

#undef NSLocalizedString
#define NSLocalizedString(key, comment) [self localizedStringForKey:(key) replaceValue:(comment)]

+ (NSString *)localizedStringForKey:(NSString *)key replaceValue:(NSString *)comment {
    NSString *fallbackLanguage = @"en";
    NSString *fallbackBundlePath = [[NSBundle mainBundle] pathForResource:fallbackLanguage ofType:@"lproj"];    
    NSBundle *fallbackBundle = [NSBundle bundleWithPath:fallbackBundlePath];
    NSString *fallbackString = [fallbackBundle localizedStringForKey:key value:comment table:nil];    
    NSString *localizedString = [[NSBundle mainBundle] localizedStringForKey:key value:fallbackString table:nil];

    return localizedString;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X