wake-up-neo.net

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

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);
77
Prairiedogg

Anstatt Standardwerte direkt mit einem undokumentierten Schlüssel abzufragen, geben Sie fragen Sie NSLocale class nach dem Array der bevorzugten Sprachen .

35
Peter Hosey

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

55
Darren

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?

13
sust86

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

6
Simon Bengtsson

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.

4
AlexW

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];
3
Ben Clayton

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.

2
Pants

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.

1
cdiazmo

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.

0
Ronald Hofmann