2010-07-22 8 views
17

Ich habe eine App, die ich in eine Reihe von verschiedenen Sprachen übersetze. Das Problem ist, dass die App in Australien ein paar unterschiedliche Werte haben wird als in Neuseeland, die beide englischsprachige Länder sind.iPhone App Lokalisierung - Englisch Probleme?

Ich habe eine en_AU- und eine en_NZ-Sprachdatei erstellt, aber beide verwenden die englische Standarddatei. Ich löschte die englische Sprachdatei, aber es passiert weiter ...

Irgendwelche Ideen, wie ich das zur Arbeit bringen kann?

Danke,

--d

+0

Löschen der englischen Datei verursachte eine Reihe von Problemen ... Ich habe eine Reihe von anderen Sprachen arbeiten, aber wenn ich die gleiche Sprache aber für verschiedene Regionen verwenden will, funktioniert es nicht: S – dewberry

Antwort

37

iPhone Lokalisationen (oder ist das Lokalisierungen?) Übernehmen keine Notiz von der Region der Benutzersätze (dh, UK, Aus, NZ). Es gibt nur eine "englische" Sprachübersetzung, die standardmäßig verfügbar ist. Sie können jedoch mit Dingen herumhacken, um sie dazu zu zwingen, eine andere Übersetzungseinstellung zu verwenden - ich habe das gerade getan, um zwischen "Englisch" (US) und "en_GB" (britisches Englisch) zu wählen.

In Ihrer main.m Datei ändern, damit er so etwas wie unten aussieht (put in ihren eigenen Tests für NZ oder AU)

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

Daraufhin wird das Benutzer Sprache (zB " de ") in die Sprache NSString und das Gebietsschema des Benutzers (z. B. NZ, GB, AU) in das Gebietsschema NSString. Wenn sie (in meinem Fall) mit en und GB übereinstimmen, dann setze ich die voreingestellten Spracheinstellungen der Benutzer auf "en_GB", dann auf "en".

Dann in Ihrer Anwendung Delegierten Anwendung: didFinishLaunchingWithOptions Methode Sie entfernen möchten, dass NSUserDefaults Einstellung, die Sie mit dem Code nur gesetzt

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

Es ist sicher an dieser Stelle zu entfernen, weil alle das Bündel Initialisierung abgeschlossen ist. Ihre App sollte nun eine Localization.strings-Datei im Verzeichnis en_GB.lproj verwenden.

Es ist ein bisschen eine schreckliche, hacky Lösung, aber es funktioniert für mich.

+0

es funktioniert für Sie es funktioniert für mich ... es funktioniert einfach! Cool, danke! – dewberry

+0

Danke für diese Antwort. Hat mir wirklich geholfen, meine Probleme zu lösen. – AppAspect

+0

Danke für NSString * language = [[NSLocale preferredLanguages] objectAtIndex: 0]; – CReaTuS

4

Apple documents this missing iOS feature here.

Wichtig: In iOS, die Bündel Schnittstellen nicht nehmen Dialekt oder Skriptinformationen berücksichtigt werden, wenn für lokalisierte Ressourcen suchen; Nur Der Sprachenbezeichnercode wird berücksichtigt. Daher, wenn Ihr Projekt sprachspezifische Projekt Verzeichnisse mit einer Sprache und Regionsbezeichner enthält, werden diese Verzeichnisse ignoriert. Die Bundle-Schnittstellen in Mac OS X unterstützen die Regionsbezeichner in sprachspezifischen Projektverzeichnissen .

14

Ich habe eine etwas verbesserte Version von rickerbhs angenommener Antwort gefunden. Als Erstes müssen Sie wissen, dass die Benutzerstandardwerte in Domänen organisiert sind und der Schlüssel @"AppleLanguages" nicht aus der Domäne der App stammt, sondern aus einer Domäne, die höher als die Hierarchie der Domänen ist.Das bedeutet, es ganz sicher ist es, aus dem Ausfall Benutzer zu entfernen:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

Nach diesen Code aufrufen, werden Sie, dass [defaults objectForKey:@"AppleLanguages"] Aufruf bemerken noch einen Wert zurückgibt. Anstatt @"AppleLanguages" zu einem späteren Zeitpunkt zu löschen, was je nach Komplexität Ihrer App problematisch sein könnte, möchten Sie das Gegenteil tun: löschen @"AppleLanguages" sofort. Im Wesentlichen wird dadurch der Standardwert zurückgesetzt und alle Änderungen, die das System vorgenommen hat, werden aufgezeichnet, wenn der Benutzer beispielsweise seine bevorzugte Sprache geändert hat.

Hier ist, was ich tue:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(. Beachten Sie, dass filteredArrayUsingPredicateFormat: eine Erweiterung Methode, die ich schrieb Es ist kein Hexenwerk, um herauszufinden, was es tut, oder wie es funktioniert.)

Dies schafft Lokalisierungen für jede Sprache in der Liste kombiniert mit der Region des Benutzers. Wenn z. B. die ursprüngliche Liste es en en-GB war und die Region des Benutzers AU ist, erhalten wir es-AU es en-AU en en-GB. Beachten Sie, dass es-AU nicht existiert, aber es macht keinen Unterschied. Da die App keine zugeordneten Lokalisierungen oder Ressourcen findet, ignoriert sie sie einfach.

+1

Mit ios 8.1 ist dies die Lösung. – Mike

+0

Das sieht solide aus. Eine Sache, @selector (filteredArrayUsingPredicateFormat :) hinzuzufügen, ist eine Kategoriemethode auf NSArray, die Sie hier finden können: https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m –

+0

Auch Wo fügst du das in deinen Code ein: im App-Delegaten oder deiner "Haupt" -Funktion? –

0

Ich hatte die gleichen Probleme mit Deutsch und denke, dass ich die "richtige" Lösung gefunden habe. Der Fehler war, dass ursprünglich meine Basissprache nur "Deutsch (de)" war, beim Hinzufügen von "Deutsch/Österreich (de_AT)" Lokalisierungen wurden die Dateien ignoriert. Bei der Umstellung der Grundsprache auf "Deutsch/Deutschland (de_DE)" wurden die österreichischen Übersetzungen nicht ignoriert.

0

Beachten Sie hier, dass XCode sehr irreführend ist - Sie können zu Projekt (nicht Ziel), Info, Lokalisierungen gehen, drücken Sie die + Taste, die unter der Liste der Sprachen angezeigt wird, dann scrollen Sie bis zum Ende der Liste der Sprachen die im Popup erscheinen, bis Sie zu "Andere" gelangen (mit dem Rechtspfeil daneben), öffnet sich eine schöne große Liste, die regionale Varianten für Sprachen enthält. Diese regionalen Varianten funktionieren jedoch nicht auf dem iPhone - Sie erhalten nichts (wie von Apple dokumentiert und in einer anderen Antwort, die hier erscheint). Offensichtlich ist eine der oben aufgeführten Code-basierten Lösungen notwendig.