多言語対応を試してみた

#はじめに
実際やるとなるとこれだけでは足りない部分（複数形の話など）があると思いますが、iPhoneの言語設定によってアプリの表示言語を切り替える方法を試してみた際の作業メモです。
音量変更アプリのソースに追加・変更を行なっています。

#Localizationsへの追加
多言語の設定を行うために、まずPROJECT - Infoの「Localizations」へ設定の追加を行います。
![2017-08-04 13.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/195038/bbbecff5-e5d9-156c-a8ab-4536d871ffd2.png)

「＋」をクリックして、一覧を表示し、「Japanese(ja)」を選択します。
![2017-08-04 13.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/195038/48224f7a-e931-97d5-3d81-b4a2952c5af2.png)

選択画面が表示されますが、今回は以下の状態（変更なし）で完了します。
![2017-08-04 13.45.30.png](https://qiita-image-store.s3.amazonaws.com/0/195038/4f61ac1b-1a01-12c7-2652-bccbd4ec125e.png)

以下のように、「Japanese」が追加されます。
![2017-08-04 13.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/195038/058e2084-a5fe-bf55-3f0d-917103f309be.png)


#Localizable.stringsの追加
言語を切り替える対象となる単語を登録するファイルの追加を行います。

追加ファイルのテンプレートの追加画面で、「Strings File」を選択し、次へ進みます。
![2017-08-04 13.56.51.png](https://qiita-image-store.s3.amazonaws.com/0/195038/398f79c1-3509-9a17-f8aa-28706c0a37fc.png)

ファイル名を「Localizable.strings」にして、ファイルを作成します。
![2017-08-04 13.57.55.png](https://qiita-image-store.s3.amazonaws.com/0/195038/0a4f61ca-fcc9-d407-7233-e13ad3c97187.png)

追加されたファイルを選択すると、Inspectorに「Localization」の欄にボタンが表示されるので、これをクリックします。クリックすると、「Do you want to localize this file?」と書かれた画面が表示されるので、「Localize」を選択します。
![2017-08-04 14.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/195038/6f21c5f9-ee72-273f-6fc7-dbba356fa6de.png)
![2017-08-04 14.01.08.png](https://qiita-image-store.s3.amazonaws.com/0/195038/9a7af57a-13af-cc22-6555-2438866dce45.png)

Inspectorに「Localization」の欄にチェックボックスが表示されます。
![2017-08-04 15.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/195038/d5df3bc3-b88a-85ce-761d-c46ae5c21fa4.png)

「Japanese」のチェックボックスをオンにすると、「Localizable.strings」の下にファイルが追加されます。
![2017-08-04 14.03.23.png](https://qiita-image-store.s3.amazonaws.com/0/195038/5357ede1-108a-50eb-1e11-861a52acc2fd.png)

#Localizable.strings
Localized.stringの内容を「Key値 = 表示する文字列;」で設定します。

```:Localizable.strings（Japanese）
connectbutton = "接続";
talkbutton = "話す";
talktext = "こんにちは";
```
```:Localizable.strings（Base）
connectbutton = "connect";
talkbutton = "talk";
talktext = "Hello";
```
上記のように、キーごとに対応させてそれぞれの言語の設定を行います。

#ViewController.swift
言語によって表示を変えたい部分に使用する文字列は[以下の関数](https://developer.apple.com/documentation/foundation/1418095-nslocalizedstring)を使用して取得します。

```swift:NSLocalizedString
func NSLocalizedString(_ key: String, tableName: String? = default, bundle: Bundle = default, value: String = default, comment: String) -> String
```

viewDidLoadに以下の記述を追加する。

```swift:viewDidLoad
        let connect = NSLocalizedString("connectbutton", comment: "")
        let talk = NSLocalizedString("talkbutton", comment: "")
        myConnectButton.setTitle(connect, for: .normal)
        myTalkButton.setTitle(talk, for: .normal)
```

tapTalkButtonで以下のように変更します。

```swift:tapTalkButton
    @IBAction func tapTalkButton(_ sender: Any) {
        //話す内容の設定
        //let talkText = "こんにちは"
        let talkText = NSLocalizedString("talktext", comment: "")

        //略

    }
```

#画面表示
iPhoneの言語設定を変更すると以下のように表示が変化します。
・Japanese
![2017-08-07 10.45.19.png](https://qiita-image-store.s3.amazonaws.com/0/195038/e6f194f6-920c-e087-6e37-83cc36fb7983.png)

・English（日本語以外）
![2017-08-07 10.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/195038/847cddba-71d2-e2cc-e00a-75be82df4110.png)

※ それぞれの言語のLocalizable.stringsファイルを設定すれば、それぞれ設定した内容で表示されますが、個別に設定されていない言語が設定された場合はBaseで設定された内容が表示されます。
例）ロシア語
![2017-08-07 10.59.48.png](https://qiita-image-store.s3.amazonaws.com/0/195038/1851dd05-51ba-9d5f-75f0-3ab195d00af5.png)

#おわりに
今回は、言語設定を変更した際にそれぞれ異なる表示ができるか試した形になります。
実際に本腰を入れて多言語対応する場合は、もう少し深いところまでやっていかないとならないと思いますが、手法について学べたということで今後に活かしていきたいと思います。

#参考
以下のリンク先を参考にさせていただきました。
[Internationalization and Localization Guide](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html)
[[iOS] ゼロから始める！簡単！多言語対応！](http://qiita.com/Sim_progra/items/c9b04377dfa1425085c3)
[iOSアプリの国際化対応の勘所とTips集(Swift版)](http://qiita.com/mono0926/items/c41c1ce18b90b765a8f2)
この記事では触れていない設定についてなど記載されていますので、ご一読いただくと良いかと思います。