web-dev-qa-db-ja.com

NSLocale currentLocaleは、ユーザーの現在の言語ではなく、常に「en_US」を返します

私はiPhoneアプリの国際化を進めています-ユーザーの現在のロケールに基づいて、特定のビューをプログラムで変更する必要があります。 iPhoneシミュレーターまたは実際のハードウェアの言語設定に関係なく、localeは常に "en_US"に評価されるため、私は夢中になります。

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

クレイジーなことは、アプリケーションの残りの部分が期待どおりに動作することです。 Localization.stringsファイルから正しい文字列が選択され、インターフェイスで使用され、選択したロケールの正しい.xibファイルが使用されます。

私はまた、次のことを試みましたが、効果はなく、同じ結果になりました:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

私が見逃している簡単なものはありますか?好みか輸入か?

私がかつて行ったこと:

ダレンの答えが示唆するように、私が探している好みはNSLocaleではなく、ここにあります:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

ピーターの答えはより良い解決策のようです:

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);
79
Prairiedogg

文書化されていないキーを使用してデフォルトを直接クエリする代わりに、 NSLocaleclassに優先言語の配列を要求

35
Peter Hosey

[NSLocale currentLocale]は、言語ではなく、デバイスの地域形式の設定に基づいています。地域が米国に設定されている場合、使用している言語に関係なくen_USを取得します。

57
Darren

現在のデバイス言語を取得するには、代わりにこれを使用します。

NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];

ここで説明されているように: iOSで現在のデバイス言語を取得していますか?

16
sust86

私たちにとって問題は、開発スキームでアプリケーション言語とアプリケーション領域をオーバーライドしていたことです。スキームオプションで[アプリケーション言語]が[システム言語]に設定されていることを確認します([スキームの編集]-> [オプション])。

7
Simon Bengtsson

私にとっては、両方

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

そして

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

シミュレータを使用しているときに同じ結果が得られます。

4
AlexW

フランス語に設定されたデバイスで月名のフォーマットが英語で表示されるという問題がありました。

私の解決策はこれを使用することでした:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];
3
Ben Clayton

「en_US」を省略したが、「en_US」のコピーである「en」ローカライズがある場合、シミュレータは自動的に言語設定を尊重し始めますが、「en_US」がオプションであるとすぐにそれを常に選択します設定の。

2
Pants

質問は古すぎますが、このコードは多くの人に役立つかもしれません:

Main.mは次のようになります。

    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]));

これは何ですか?デバイスの現在の言語がスペイン語、英語またはポルトガル語を使用する場合、アプリケーションはローカライズされた文字列を使用しますが、現在の言語がそれらのいずれでもなく、アプリケーションでサポートされていない場合は英語に設定されます。

1
cdiazmo

実際のiPadで正しいロケールを表示します。ただし、シミュレーターには独自のiOSがあり、デフォルトではen-USに設定されています。シミュレーターiOSの設定に移動し、言語と地域を希望のものに切り替えます。

それはトリックです。

0
Ronald Hofmann