iOSアプリの多言語対応

# 概要
先日個人で開発していたアプリをリリースしまして、無駄に多言語対応してみようかなーと思い、実際にやってみたのでやった事をまとめてみようと思います。結構簡単にできるのでオススメです。

アプリの紹介
<br>
<a href="https://itunes.apple.com/jp/app/meshi-log/id1173943494"><img src="https://qiita-image-store.s3.amazonaws.com/0/110485/ec48c396-39a9-c48e-714c-54543c7f9c7c.png" width="200"></a>
https://itunes.apple.com/jp/app/meshi-log/id1173943494


# 多言語対応する意味
そもそもなんでアプリを多言語対応するのかなのですが、結構いろんなところでアプリを多言語対応したらDL数が伸びてよかった！みたいな記事を見かけたというのがきっかけです。

* [iOSアプリを8ヶ国語に翻訳した過程でわかったこと](http://umenon.com/2016/09/05/iostranslated/)

当たり前と言えば当たり前ですが日本でしか配信しないと市場が限られていますが世界に向ければ一気に市場が広がりますよね。
今回は英語にだけ対応したのですが、それだけでも十分市場は拡大すると思います。
日本人口は約1億人程度ですが英語を話す人口は17億くらいいると言われているので、
**英語に対応するだけで市場規模は17倍に拡大**します。


# 多言語対応方法
今回やった多言語対応方法はざっくり3つです。

## 1.Localizable.stringsの作成
アプリ内で表示させる文言を言語別に分ける設定です。
やり方はこちらに詳しく書いてあります。

* [[iOS] ゼロから始める！簡単！多言語対応！](http://qiita.com/Sim_progra/items/c9b04377dfa1425085c3)

今回はこんな感じにBaseと日本語(Japanese)、英語(English)の3つ用意してあります。
(Baseも中身は日本語にしているので本当は2つだけで良いかもしれません。。)
<img width="261" alt="スクリーンショット 2016-11-27 23.29.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/b0b4d4a7-7aa6-adb4-884c-a62a2dcf9c26.png">

中身の一部ですがこんな感じです。

```swift:Localizable.strings(日本語)
"version" = "バージョン";
"licence" = "ライセンス";
"localeIdentifier" = "ja_JP";
"noData" = "NoData";
```

```swift:Localizable.strings(英語)
"version" = "Version";
"licence" = "Licence";
"localeIdentifier" = "en_US";
"noData" = "NoDataEnglish";
```

ここでは3つほど詳細な使い方を説明します。

### ①アプリ内の文言出しわけ

```swift
label.text = NSLocalizedString("version", comment: "")
label.text = NSLocalizedString("licence", comment: "")
```
これでiOSの言語設定を日本語にしていると「バージョン」と表示され、英語に設定していると「Version」と表示されます。

|言語設定|日本語|英語|
|:-----------|:-----------|:-----------|
|表示される画像|<img width="231" alt="スクリーンショット 2016-11-29 21.53.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/ef566cec-9dae-88dc-6b69-7c1cd9d99e80.png">|<img width="233" alt="スクリーンショット 2016-11-29 21.53.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/9324ec18-c930-77fb-9d8d-59c6063b13b3.png">|

### ②日付の表示出しわけ
日本と英語圏では日付の表示の仕方が異なります。例えばUIDatePickerを使うにも言語の設定によって見せ方を変えることができます。
今回はそのUIDatePickerのlocale文字列を先ほどのLocalizable.stringsによって出しわけしています。

```swift
datePicker.locale = NSLocale(localeIdentifier: NSLocalizedString("localeIdentifier", comment: "")) as Locale
```

|言語設定|日本語|英語|
|:-----------|:-----------|:-----------|
|表示される画像|<img width="190" alt="スクリーンショット 2016-11-27 23.46.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/19762e2f-ce10-6252-41e5-83e4687ce739.png">|<img width="208" alt="スクリーンショット 2016-11-27 23.42.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/4ed9f5f2-92db-a834-bda4-b7916080c812.png">|

### ③画像の出しわけ
画像についてもAssets.xcassetsに日本語用と英語用の2つの画像を用意しておけばLocalizable.stringsに呼び出す画像の文字列を出し分けることが可能です。

```swift
let myImage: UIImage = UIImage(named: NSLocalizedString("noData", comment: ""))!
```

|言語設定|日本語|英語|
|:-----------|:-----------|:-----------|
|Assets.xcassets|NoData|NoDataEnglish|
|表示される画像|<img width="111" alt="スクリーンショット 2016-11-27 23.56.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/ca46bad0-5f1e-fb74-12eb-1982f805a7b0.png">|<img width="102" alt="スクリーンショット 2016-11-27 23.55.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/fdc979ad-06ae-ddd4-d3f2-b3952d4bf635.png">|


## 2.InfoPlist.stringsの作成
アプリの設定系の出しわけで使います。アイコンの名前を日本語と英語で変えたい場合もこちらを使います。やり方はLocalizable.stringsと同じですがこちらにも詳しいやり方が書かれています。

* [[iOS] アプリ名を国ごと変更したい場合](http://qiita.com/hiroo0529/items/da9909f6787f2dce75e3)
* [[iOSプログラミング]ユーザの許可を求めるアラートに追加のメッセージを含める方法](http://d.hatena.ne.jp/nakamura001/20131107/1383839575)

今回設定したのはこんな感じです。

```swift:InfoPlist.strings(日本語)
CFBundleDisplayName = "めしろぐ";
NSCameraUsageDescription = "カメラへアクセスします";
NSPhotoLibraryUsageDescription = "写真へアクセスします";
```

```swift:InfoPlist.strings(英語)
CFBundleDisplayName = "MESHI LOG";
NSCameraUsageDescription = "I will access the camera";
NSPhotoLibraryUsageDescription = "I will access photos";
```

|言語設定|日本語|英語|
|:-----------|:-----------|:-----------|
|アイコン|<img width="52" alt="スクリーンショット 2016-11-28 0.08.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/f3857ae0-ac52-aa1c-7b7a-515b40a4db00.png">|<img width="59" alt="スクリーンショット 2016-11-28 0.09.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/10ed4e81-4c4c-5f8f-7ece-12db8d3952ce.png">|
|メッセージ|<img width="193" alt="スクリーンショット 2016-11-28 0.13.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/bc566f57-baad-410e-b7e4-271b7d50a25d.png">|<img width="193" alt="スクリーンショット 2016-11-28 0.09.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/105a7d14-9fb5-cf0e-9306-52987f3de2a5.png">|

細かいですが上記設定した場合でも元のInfo.plistの「Privacy - Camera Usage Description」と「Privacy - Photo Library Usage Description」は設定しておかないとダメです。デフォルトのメッセージをセットしておくのが良いのだと思いますが、InfoPlist.stringsの方で設定しているからと言ってInfo.plistの方を削除するとアプリの審査に通らなくなってしまいます。
([iOS10からプライバシーアクセス周りの使用目的の記載が必須になる？](http://qiita.com/nagasakulllo/items/6716778954a40fc95ed3))

## 3.アプリ内での言語設定判定
設定ファイルでカバーできない部分は端末の言語設定を取得して、それによって色々出しわけたりする事が可能です。

* [【iOS Swift入門 #124】iPhoneの使用言語を取得する](http://swift-studying.com/blog/swift/?p=582)

例えば以下のように端末の言語設定を取得するクラスを作ります。

```swift
class Language {
    
    /**
     設定言語の取得
     - returns: String
     */
    fileprivate func get() -> String {
        let languages = NSLocale.preferredLanguages
        if let type = languages.first {
            return type
        }
        return ""
    }
    
    /**
     設定言語が日本語かどうか
     - returns: Bool
     */
    func isJapanese() -> Bool {
        return self.get().contains("ja") ? true : false
    }
    
    /**
     設定言語が英語かどうか
     - returns: Bool
     */
    func isEnglish() -> Bool {
        return self.get().contains("en") ? true : false
    }
    
}
```
これで`isJapanese()`とか`isEnglish()`によって出しわけする事で他言語に対応できます。

ただせっかく言語の設定ファイルがあるので、こんな感じにコードで出しわけを作ってしまうと、別の言語にも対応した時にロジックの修正も発生してしまいます。なので**Localizable.stringsやInfoPlist.stringsだけでうまくやれるような設計になっていた方がオススメだと思います。**そうすれば別の言語に対応する時にLocalizable.stringsやInfoPlist.stringsを作るだけで完結できます。

# 感想
自分のアプリは規模が小さいので英語に対応するくらいならサクッとできたというのはあるかもしれませんが、それでもそんなに大変ではない印象でした。
前回の投稿で[「アプリ開発未経験者がiOSアプリをストアに公開した話」](http://qiita.com/hikarut/items/586bc1c6582efcd43f2b)をしましたが、その際に簡単なアプリを作る事をオススメしましたが、ちょっと複雑な日本向けのアプリを作るよりはシンプルで誰でも使えるアプリを他言語対応した方がコスト的にも簡単ですし、アプリのDL数とかも稼げると思います。
なのであらかじめ他言語を想定してアプリを作った方が良いなーと感じました。

ちなみにこちらの他言語対応したアプリは現在審査中なので、リリースされたら結果もまとめたいと思います！