27
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[iOS]中国語対応のために端末の言語環境の値を取得したときにハマったこと

Last updated at Posted at 2015-11-11

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]
が返す値が変更されている点もさらにややこしい。

参考:iOS 9 での言語の identifier の変更

###こんな使い方をしてみた

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を返すようだ。

27
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?