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


82

私は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);

回答:


36

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


@PeterHosey私も現在の言語に関して同様の問題を抱えており、すべてを試しましたが、どれもうまくいきませんでした。とても悲しい...これを見ていただけませんか、stackoverflow.com / questions / 26572115 / … ?ありがとう!
S1U 2014年

@ s1u Xcode6.1にはバグがあります。この回答を確認してください:stackoverflow.com/a/26641497/1085556
Bart van Kuik 2014年

@ s1u:いくつかのこと:(1)複数の優先言語が存在する可能性があります。単一の「現在の言語」はありません。(2)(削除された)回答に関して、ユーザーの優先言語ではなく、現在のロケール(別名リージョン)の主要言語を返します。
Peter Hosey 2014年

2
AppleLanguagesキーは、それが前に(これらの日は非常にまれですが、それでも、OS X 10.5にシステム上のユーザーの優先言語を取得する唯一の文書化の方法だ、文書化されていない、それがされ、文書化)。
dreamlax 2015

58

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


ダレンに感謝します。私が始めたのは、現在の言語設定を取得する方法も理解したことです。これが私が本当にやろうとしていたことです。
prairiedogg 2009年

2
こんにちはPrairiedogg、どのようにして現在の言語設定を取得しましたか?私も同じ問題を抱えています..allは言語のEN値を返します。
zaldy 2010

@ZaldzBugz:次のようなもの:NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey:NSLocaleIdentifier value:[[NSLocale PreferredLanguages] objectAtIndex:0]];
powerj1984 2012年

3
これはiOS8には当てはまりません。言語がドイツ語で地域が米国の場合、iOS8は「de_US」を返します。それがやるべきことです。
odyth 2015年

たとえば、ユーザーがオーストラリアに行くと、地域は自動更新されますか?
ナゲンドララオ


9

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


この側面を指摘してくれたSimonに感謝します...テストのために私はそれを現地の言語に設定しました、そして私は後でそれを変更するのを忘れました。
Ameer 2018年

以上です!それを台無しにしていたのはXcode設定だったとは信じられません。
ペドロ

これは私のベーコンを救った!ありがとう。
カービートッド

4

私にとっては、両方

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

そして

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

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


2
実際、私の場合、iOS 8 / Xcode6では常にen_US–
Adrian

3

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

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

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

[NSLocale currentLocale]はiOS10では月の名前をフランス語に正しく翻訳していましたが、iOS11ではそうではありませんでした。使用:NSLocale * locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale PreferredLanguages] objectAtIndex:0]]; 問題を修正しました。おかげでベン1
BIRDMAN

2

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


1

質問は古すぎますが、このコードは多くの人に役立つ可能性があります。

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つではなく、アプリケーションでサポートされていない場合は、英語に設定されます。


0

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

それがトリックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.