私は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);
文書化されていないキーを使用してデフォルトを直接クエリする代わりに、 NSLocaleclassに優先言語の配列を要求 。
[NSLocale currentLocale]
は、言語ではなく、デバイスの地域形式の設定に基づいています。地域が米国に設定されている場合、使用している言語に関係なくen_USを取得します。
現在のデバイス言語を取得するには、代わりにこれを使用します。
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
ここで説明されているように: iOSで現在のデバイス言語を取得していますか?
私たちにとって問題は、開発スキームでアプリケーション言語とアプリケーション領域をオーバーライドしていたことです。スキームオプションで[アプリケーション言語]が[システム言語]に設定されていることを確認します([スキームの編集]-> [オプション])。
私にとっては、両方
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
そして
NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];
シミュレータを使用しているときに同じ結果が得られます。
フランス語に設定されたデバイスで月名のフォーマットが英語で表示されるという問題がありました。
私の解決策はこれを使用することでした:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
[self.monthNameFormatter setLocale:locale];
[self.monthNameFormatter setDateFormat:@"MMMM"];
[self.monthNameFormatter stringFromDate:myDate];
「en_US」を省略したが、「en_US」のコピーである「en」ローカライズがある場合、シミュレータは自動的に言語設定を尊重し始めますが、「en_US」がオプションであるとすぐにそれを常に選択します設定の。
質問は古すぎますが、このコードは多くの人に役立つかもしれません:
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]));
これは何ですか?デバイスの現在の言語がスペイン語、英語またはポルトガル語を使用する場合、アプリケーションはローカライズされた文字列を使用しますが、現在の言語がそれらのいずれでもなく、アプリケーションでサポートされていない場合は英語に設定されます。
実際のiPadで正しいロケールを表示します。ただし、シミュレーターには独自のiOSがあり、デフォルトではen-USに設定されています。シミュレーターiOSの設定に移動し、言語と地域を希望のものに切り替えます。
それはトリックです。