Ich bin gerade dabei, eine iPhone-App zu internationalisieren. Ich muss programmgesteuerte Änderungen an bestimmten Ansichten vornehmen, basierend auf dem aktuellen Gebietsschema des Benutzers. Ich werde verrückt, weil egal welche Spracheinstellung auf dem iPhone-Simulator oder der tatsächlichen Hardware verwendet wird, locale
wird immer zu "en_US" ausgewertet:
NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Das Verrückte ist, dass sich der Rest der Anwendung wie erwartet verhält. Die richtigen Zeichenfolgen werden aus der Datei Localization.strings ausgewählt und in der Benutzeroberfläche verwendet, und die richtigen .xib-Dateien für das ausgewählte Gebietsschema werden verwendet.
Ich habe auch folgendes versucht, ohne Erfolg und mit demselben Ergebnis:
NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Gibt es etwas, das mir fehlt? Eine Präferenz oder ein Import vielleicht?
Was ich früher gemacht habe:
Wie Darrens Antwort schon sagt, ist die Präferenz, die ich suche, nicht in NSLocale
, sondern hier:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);
Peters Antwort scheint eine bessere Lösung zu sein:
NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);
Anstatt Standardwerte direkt mit einem undokumentierten Schlüssel abzufragen, geben Sie fragen Sie NSLocale class nach dem Array der bevorzugten Sprachen .
[NSLocale currentLocale]
basiert auf den Regionsformateinstellungen des Geräts, nicht auf der Sprache. Wenn die Region auf United States eingestellt ist, erhalten Sie unabhängig von der verwendeten Sprache en_US.
Um die aktuelle Gerätesprache zu erhalten, verwenden Sie stattdessen Folgendes:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
Wie hier beschrieben: Aktuelle Gerätesprache in iOS abrufen?
Für uns war das Problem, dass wir die Anwendungssprache und den Anwendungsbereich in unserem Entwicklungsschema überschreiben. Stellen Sie sicher, dass die Anwendungssprache in den Schemaoptionen auf Systemsprache eingestellt ist (Bearbeitungsschema -> Optionen).
für mich beide
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
und
NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];
dasselbe Ergebnis erzielen, wenn Sie sich in einem Simulator befinden.
Ich hatte ein Problem, bei dem Formatierungsmonatsnamen auf einem auf Französisch eingestellten Gerät in Englisch angezeigt wurden.
Meine Lösung bestand darin, dies zu verwenden:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
[self.monthNameFormatter setLocale:locale];
[self.monthNameFormatter setDateFormat:@"MMMM"];
[self.monthNameFormatter stringFromDate:myDate];
ich habe herausgefunden, dass, wenn ich "en_US" auslasse, aber eine "en" -Lokalisierung habe, die eine Kopie von "en_US" ist, der Simulator automatisch die Spracheinstellungen beachtet, aber sobald "en_US" eine Option ist, wird er immer ausgewählt der Einstellungen.
Die Frage ist zu alt, aber dieser Code kann vielen helfen:
Die main.m sollte so aussehen:
NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
localecode=[localecode substringToIndex:2]; //en_GB -> en
NSArray *arr = [NSLocale preferredLanguages];
NSMutableArray * mutable = [arr mutableCopy];
NSString *prefered = [mutable firstObject];
if(![localecode isEqualToString:prefered]){
if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
int index = [mutable indexOfObject:@"en"];
[mutable replaceObjectAtIndex:0 withObject:@"en"];
[mutable replaceObjectAtIndex:index withObject:prefered];
[[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
}
else{
int index = [mutable indexOfObject:localecode];
[mutable replaceObjectAtIndex:0 withObject:localecode];
[mutable replaceObjectAtIndex:index withObject:prefered];
[[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
}
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
Was machen das? Wenn die aktuelle Sprache der Geräte Spanisch, Englisch oder Portugiesisch ist, verwendet die Anwendung die lokalisierten Zeichenfolgen, wenn die aktuelle Sprache jedoch keine der Sprachen ist und von der Anwendung nicht auf Englisch eingestellt wird.
Es zeigt das richtige Gebietsschema auf einem realen iPad an, jedoch verfügt der Simulator über ein eigenes iOS, das standardmäßig auf en-US .. festgelegt ist. Wechseln Sie zu den iOS-Voreinstellungen des Simulators und ändern Sie Sprache und Region auf das eine, die du willst.
Das macht den Trick.