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 unabhängig von der Spracheinstellung auf dem iPhone-Simulator oder der tatsächlichen Hardware locale
immer "en_US" ausgewertet wird:
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 dem gleichen Ergebnis:
NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
Gibt es etwas Einfaches, das mir fehlt? Eine Präferenz oder ein Import vielleicht?
Was ich früher gemacht habe:
Wie Darrens Antwort andeutet, ist die Präferenz, nach der 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);
quelle
AppleLanguages
Schlüssel ist nicht ohne Papiere, es ist die einzige dokumentierte Art und Weise der vom Benutzer bevorzugten Sprachen auf Systemen vor OS X 10.5 zu bekommen (was heutzutage sehr selten, aber immer noch, es ist dokumentiert ).[NSLocale currentLocale]
basiert auf den Regionsformat-Einstellungen des Geräts, nicht auf der Sprache. Wenn die Region auf USA eingestellt ist, erhalten Sie en_US, unabhängig davon, welche Sprache Sie verwenden.quelle
Verwenden Sie stattdessen Folgendes, um die aktuelle Gerätesprache abzurufen:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
Wie hier beschrieben: Aktuelle Gerätesprache in iOS abrufen?
quelle
Für uns war das Problem, dass wir die Anwendungssprache und den Anwendungsbereich in unserem Entwicklungsschema überschrieben haben. Stellen Sie sicher, dass die Anwendungssprache in den Schemaoptionen (Schema bearbeiten -> Optionen) auf Systemsprache eingestellt ist.
quelle
für mich beides
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
und
NSArray *array = [NSLocale preferredLanguages]; self.label.text = array[0];
Wenn Sie sich in einem Simulator befinden, erzielen Sie das gleiche Ergebnis.
quelle
Ich hatte ein Problem, bei dem die Formatierung von Monatsnamen auf einem Gerät in französischer Sprache in Englisch angezeigt wurde.
Meine Lösung bestand darin, Folgendes zu verwenden:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ]; [self.monthNameFormatter setLocale:locale]; [self.monthNameFormatter setDateFormat:@"MMMM"]; [self.monthNameFormatter stringFromDate:myDate];
quelle
Ich fand heraus, dass, wenn ich "en_US" weglasse, aber eine "en" -Lokalisierung habe, die eine Kopie von "en_US" ist, der Simulator automatisch anfängt, die Spracheinstellungen zu respektieren, aber sobald "en_US" eine Option ist, wählt er sie immer unabhängig davon aus der Einstellungen.
quelle
Die Frage ist zu alt, aber dieser Code kann vielen helfen:
Die main.m sollte folgendermaßen 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 macht das? Wenn die aktuelle Sprache des Geräts Spanisch, Englisch oder Portugiesisch ist, verwendet die Anwendung die lokalisierten Zeichenfolgen. Wenn die aktuelle Sprache jedoch keine dieser Sprachen ist und von der Anwendung nicht unterstützt wird, ist Englisch eingestellt.
quelle
Auf einem echten iPad wird das richtige Gebietsschema angezeigt. Der Simulator verfügt jedoch über ein eigenes iOS, das standardmäßig auf en-US eingestellt ist. Gehen Sie zu den iOS-Einstellungen des Simulators und wechseln Sie die Sprache und Region zu der gewünschten.
Das macht den Trick.
quelle