NSLocale currentLocale gibt immer "en_US" zurück, nicht die aktuelle Sprache des Benutzers

82

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 localeimmer "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);
prairiedogg
quelle

Antworten:

36

Anstatt die Standardeinstellungen direkt mit einem undokumentierten Schlüssel abzufragen , fragen Sie die NSLocale- Klasse nach dem Array der bevorzugten Sprachen .

Peter Hosey
quelle
@PeterHosey Ich habe auch ein ähnliches Problem in Bezug auf die aktuelle Sprache und habe alles versucht, aber keiner von ihnen hat funktioniert. So traurig ... Könnten Sie sich das ansehen, stackoverflow.com/questions/26572115/… ? Vielen Dank!
S1U
@ s1u Es gibt einen Fehler in Xcode 6.1. Überprüfen Sie diese Antwort: stackoverflow.com/a/26641497/1085556
Bart van Kuik
@ s1u: Einige Dinge: (1) Es kann mehrere bevorzugte Sprachen geben; Es gibt keine einzige "aktuelle Sprache" und (2) in Bezug auf Ihre (gelöschte) Antwort, die die dominierende Sprache des aktuellen Gebietsschemas (auch bekannt als Region) zurückgibt, nicht die bevorzugten Sprachen des Benutzers.
Peter Hosey
2
Der AppleLanguagesSchlü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 ).
Dreamlax
58

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

Darren
quelle
Danke Darren, das hat mich dazu gebracht, ich habe auch herausgefunden, wie ich die aktuelle Spracheinstellung bekomme, was ich wirklich versucht habe.
Prairiedogg
2
Hallo Prairiedogg, wie hast du die aktuelle Spracheinstellung bekommen? Ich habe das gleiche Problem auch .. alle gibt EN-Wert für Sprache zurück.
Zaldy
@ZaldzBugz: so etwas wie: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [Gebietsschema displayNameForKey: NSLocaleIdentifier-Wert: [[NSLocale PreferredLanguages] objectAtIndex: 0]];
powerj1984
3
Dies ist unter iOS 8 nicht der Fall. iOS 8 gibt "de_US" zurück, wenn Ihre Sprache Deutsch ist und Ihre Region USA ist. Welches ist, was es tun soll.
odyth
Wird die Region automatisch aktualisiert, wenn der Benutzer beispielsweise nach Australien geht?
Nagendra Rao
18

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?

sust86
quelle
9

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.

Simon Bengtsson
quelle
Vielen Dank an Simon, dass er auf diesen Aspekt hingewiesen hat ... Zum Testen hatte ich ihn auf die Landessprache eingestellt und vergessen, ihn danach zu ändern.
Ameer
Das war's! Ich kann nicht glauben, dass es eine Xcode-Einstellung war, die es durcheinander gebracht hat.
Pedro
Das hat meinen Speck gerettet! Vielen Dank.
Kirby Todd
4

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.

AlexW
quelle
2
In meinem Fall ist iOS 8 / Xcode 6 in der Tat immer en_US
Adrian
3

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];
Ben Clayton
quelle
Ich fand heraus, dass [NSLocale currentLocale] Monatsnamen in iOS10 korrekt ins Französische übersetzte, aber nicht in iOS11. Verwenden von: NSLocale * locale = [NSLocale localeWithLocaleIdentifier: [[NSLocale bevorzugte Sprachen] objectAtIndex: 0]]; Das Problem wurde behoben. Vielen Dank Ben +1
Birdman
2

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.

Hose
quelle
1

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.

cdiazmo
quelle
0

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.

Ronald Hofmann
quelle