2013-11-25 9 views
16

Ich habe ein iOS-Projekt, das in 16 Sprachen lokalisiert ist. Nur einige Wörter sind nicht lokalisiert (hauptsächlich diejenigen, die in ein Update gehen und das Lokalisierungsbüro nicht rechtzeitig geliefert hat). Für meine Schlüssel tue ich nicht Verwenden Sie die englische Formulierung, wie dies auch ändern kann, wenn ein Übersetzer wünscht. Also wenn ich jetzt gerade keine Übersetzung für eine Sprache habe, greift ich auf den Schlüssel zurück, den ich benutzt habe. Aber da dieser Schlüssel nicht "menschlich lesbar" oder zumindest nicht "menschlich angenehm zu lesen" ist, ist dies ein Problem.Fallback-Sprache iOS (mit unvollständiger Localizable.strings-Datei)

Ich habe etwas Forschung, aber konnte keine Lösung zu mein genaues Problem finden. Ich habe fe .:

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... 

So jetzt ich die Englisch-Übersetzung in die fehlenden Localizable.strings Dateien nur kopiert. Aber das ist ein großer Hack! Aber auch die Verwendung der englischen Wörter als Schlüssel scheint mir ein Hack zu sein!

Gibt es eine Möglichkeit, meiner App mitzuteilen, dass sie z. Englisch als Fallback, wenn es keinen Wert für einen bestimmten Schlüssel gibt? Ich habe versucht, das Hinzufügen einer Base Lokalisierung aber das hilft nicht ...

Vielen Dank

+0

"Aber auch die Verwendung der englischen Wörter als Schlüssel scheint mir ein Hack zu sein!" -- ganz und gar nicht. Es ist eine ziemlich elegante Lösung und behebt genau das Problem, das Sie beschreiben. Nur weil der Übersetzer die tatsächlichen Wörter in der englischen Übersetzung ändern könnte, heißt das nicht, dass sich der Schlüssel ändern muss. Das heißt, die neue Base-Lokalisierung, die Maxhon erwähnt, ist die meiste Zeit ein noch besserer Ansatz. –

Antwort

14

Soweit ich weiß, gibt es keine „offizielle“ Weg, es zu tun, aber ich habe Funktionen implementiert, wie dies vor:

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

entlehnt: https://stackoverflow.com/a/8784451/1403046

Grundsätzlich statt NSLocalizedString(), die den Eingabestring wird zurückkehren, wird diese Version auf Englisch Rückfall, wenn nötig.

+0

Das saugt ... :) Das Problem ist, wenn ich L (...) die Genstrings (von Linguan verwendet) werde es nicht finden ... aber danke für Ihre Antwort ... wenn ich keine andere Antwort bekommen werde das ist besser, ich werde dein bald akzeptieren. Prost! – Georg

+0

Sie können '-s' an genstrings übergeben, um ihm mitzuteilen, welche Funktion Sie anstelle von NSLocalizedString verwenden. –

+1

Ich kann nicht glauben, dass dies nicht nach all diesen Jahren eingebaut ist ... – Thomas

-3

Sie können eine Base Lokalisierung verwenden und alle nicht lokalisierten Strings werden daraus übernommen.

+8

Ich habe eine Base-Lokalisierung für meine Localizable.strings hinzugefügt, aber es ist nicht die fehlenden Lokalisierungen von ihren ... Ich hatte gehofft, dass es das tun würde , aber es ist nicht ... Gibt es irgendeine Einstellung, die ich in Xcode aktivieren muss? – Georg

+0

Es ist nicht wahr. Oder ich vermisse etwas – jlmg5564

+0

Nein, das hilft nicht. [Basis Internationalisierung] (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizationYourUserInterface/InternationalisingYourUserInterface.html) einfach lassen Sie lokalisierbare Zeichenketten von Ihren XIBs oder Storyboards in Zeichenketten-Dateien, die sicherlich eine große Hilfe ist, aber hier nichts zu lösen. – JonEasy

0

Inspiriert von this und this, meine Swift Code Version:

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: "") 
} 

Viele Entwickler eine unvollständige Übersetzung erwarten auf die Entwicklung Sprache zu Rückfall .. aber das ist nicht die Art und Weise Apple choose to behave. Ich habe eine pseudocode, um zu helfen, besser zu verstehen, wie Apple sich für einen Fallback entscheidet.

Verwandte Themen