iOSアプリの多言語化対応で簡体字・繁体字の対応を行っていて、端末の言語環境を取得してあれこれしようとしたんだけど、結構ハマった。
なお、この記事で指す端末とはiPhone SimulatorのiPhone6(iOS9.0)とする。
まず、中国語には大きくわけて
- 簡体字
- 繁体字
の二種類が存在する。
iOSでは
- 簡体中文=zh-Hans
- 繁体中文=zh-Hant
として分類されているようだ。
設定アプリを開いて
一般>言語と地域と遷移して表示された画面で
端末の言語環境を確認することが可能だ。
使用言語を変更するときは
iPhoneの使用言語
から使用する言語を選択し、
地域を変更する場合は
地域
から使用する地域を選択する。
##UIの多言語化対応の場合
こちらは簡単でまずプロジェクトのInfoタブにあるLocalizationsに多言語化対応させたい言語を追加する。
そのあと、StoryboardのFile InspecterのLocalizationに上記で追加した言語が表示されているので、対応したStringsファイルを生成し、使用しているUIの多言語化対応をするだけである。
ざっくりした説明なので、詳しく知りたい人はググるべし。
##コード上で言語によって処理を分岐したい場合
ここでハマった。
下記のコードで端末の言語環境を取得できる。
[NSLocale currentLocale].localeIdentifier
だが、この値は端末の言語と地域の組み合わせで、取得できる値が変わってしまうようだ。
####地域が言語と一致しない場合
端末の言語環境は下記とする。
言語:簡体中文
地域:アメリカ合衆国
取得できる値。
zh-Hans_US
####地域が言語と一致する場合 その1
端末の言語環境は下記とする。
言語:簡体中文
地域:中国
取得できる値。
zh_CN
####地域が言語と一致する場合 その2
端末の言語環境は下記とする。
言語:繁体中文
地域:中国
取得できる値。
zh-Hant_CN
####検証した結果
地域の設定次第で取得できる値が変わる
困った。
ユーザーの言語環境なんてどうなっているかわからないので、簡体字を使用しているのか、繁体字を使用しているのか、
[NSLocale currentLocale].localeIdentifier
の値で判断をするのは難しいようだ。
###対応策
値を取得する方法を変えることにした。
[[NSLocale preferredLanguages] objectAtIndex:0]
参考:iOSの言語設定に応じて設定されるNSLocaleの値について簡単にまとめてみる
####地域が言語と一致しない場合
端末の言語環境は下記とする。
言語:簡体中文
地域:アメリカ合衆国
取得できる値。
zh-Hans-US
####地域が言語と一致する場合 その1
端末の言語環境は下記とする。
言語:簡体中文
地域:中国
取得できる値。
zh-Hans-CN
####地域が言語と一致する場合 その2
端末の言語環境は下記とする。
言語:繁体中文
地域:中国
取得できる値。
zh-Hant-CN
####検証した結果
この方法なら取得した値を見て、簡体字か繁体字かが判別できる。
ただし、下記のような場合はこの方法でも判別がつかなくなるので注意。
####地域が言語と一致する場合 その3
端末の言語環境は下記とする。
言語:繁体中文
地域:台湾
取得できる値。
zh-TW
詳しくは理解できていないのだが、どうやらISOで定義されている組み合わせの場合はそちらを表示して、そうでない場合は良きに計らって表示してくれるらしい。
甚だややこしい話である。
ちなみにiOS9で
[[NSLocale preferredLanguages]
が返す値が変更されている点もさらにややこしい。
###こんな使い方をしてみた
NSString *countryCode = [[NSLocale preferredLanguages] objectAtIndex:0];
if ([countryCode hasPrefix:@"ja"]) {
NSLog(@"日本語");
}
else if ([countryCode hasPrefix:@"en"]) {
NSLog(@"英語");
}
else if ([countryCode hasPrefix:@"zh-Hans"] || [countryCode hasPrefix:@"zh_CN"]) {
NSLog(@"簡体字");
}
else if ([countryCode hasPrefix:@"zh-Hant"] || [countryCode hasPrefix:@"zh_TW"]) {
NSLog(@"繁体字");
}
試行錯誤している途中なので、抜け漏れがあったらごめんなさい。
※2015.11.12 追記
言語:繁体中文(香港)
地域:日本
取得できる値。
zh-HK
言語を繁体中文(香港)に設定した場合は、地域は関係なくzh-HK
を返すようだ。