iOSの「設定」-> 「一般」-> 「言語環境」中の「言語」と「書式」に応じて、NSLocaleの設定値がどう変わるか忘れそうなのでメモ。
どういう目的に使われているのか確認する
同じような目的に使われているように思い込みがちですが、全く違う目的に使われています。
iPhone ユーザガイド iOS 7.1 ソフトウェア用 P.20から抜粋。
言語環境設定
「設定」 > 「一般」 > 「言語環境」と選択し、以下を設定します:
• iPhone で使用する言語
• 音声コントロールで使用する言語
• 使用するキーボード
• 書式(日付、時刻、および電話番号)
• カレンダーの書式
つまり、「言語」で設定した項目が、システム全体で使われる言語(日本語やアメリカ英語、イギリス英語...)として使用される。
「書式」で設定した項目は、日付や時刻のフォーマットを決定するのに使われます。
あと、「書式」はVoiceOverの読み上げの時にも使われるそうです。
NSLocaleの何に設定されるのか
「言語」は、NSLocaleのpreferredLanguageで取得したNSArrayの先頭の要素から取得できます。
preferredLanguageで取得したNSArrayには、IETF言語タグのBCP47で定義されたものが格納されています。
「言語」で指定したものが最初の要素に設定されているので、システムで使われている言語を確認したい場合は先頭の要素を使って確認してください。
NSString * countryCode = [[NSLocale preferredLanguages] objectAtIndex:0];
「書式」は、NSLocaleのsystemLocaleかcurrentLocaleで取得できます。
systemLocaleはシステム全体の「書式」を取得できますが、マルチユーザ環境で現在のユーザーの「書式」を取得したい場合は、currentLocaleが使えます。
NSString * locale = [[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
「言語」「書式」の設定とNSLocaleに設定される値
言語環境 | 書式 | PreferredLanguage | NSLocaleIdentifier |
---|---|---|---|
日本語 | 日本語 | ja | ja_JP |
日本語 | 英語(アメリカ合衆国) | ja | en_US |
英語(English) | 英語(アメリカ合衆国) | en | en_US |
英語(English) | 英語(イギリス) | en | en_GB |
英語(British English) | 英語(アメリカ合衆国) | en-GB | en_US |
英語(British English) | 英語(イギリス) | en-GB | en_GB |
ドイツ語 | ドイツ | de | de_DE |
フランス語 | フランス | en | en_GB |
おっかない所
「言語」はIETF言語タグに従って設定される
同じ言語だと思っていても、アメリカ英語とイギリス英語のように別な言語タグが定義されている場合があります。
事前に確認するくらいの勇気を持ちましょう。
言語と書式は別個に設定できる
「言語」と「書式」は別個に設定できるため、システムの言語は日本語でも日付や電話番号はアメリカ式の表記法で書かれてしまう場合があります。
取得した情報を何のために使うのか把握した上でどちらを使うか検討してみましょう。
言語は日本語を使うけど書式だけ入れ替えた例
言語環境 | 書式 | システムで使われる言語 | 年月日 | 電話番号 |
---|---|---|---|---|
日本語 | 日本語 | 日本語 | 2014年 1月 5日 日曜日 0:34 | 03 1234 1234 |
日本語 | 英語(アメリカ合衆国) | 日本語 | Sunday, January 5, 2014 12:34 AM | (408)555-1212 |
日本語 | 英語(イギリス) | 日本語 | Sunday, January 5, 2014 00:34 | 07700 900202 |