初めてのアプリ多言語化。大まかな流れと個人的詰みポイント。

#経緯
業務の中でアプリの多言語化に取り組みました。やり方はネットにたくさん転がっていたのですが、何せ初めてだったものでいろいろと苦労しました。よって、備忘録的に書き残したいと思いました。書くのめんどくさいのでスクショ多め。

#仕様
設定アプリから言語設定で日本語を選んだら日本語表記に、英語やその他の言語を選んだら英語でアプリが表示されるようにする。

#基本な流れ
Localizeの際に作業する箇所は大きく分けて3つかなと思います。

- Localizableファイル
- Storyboard
- info.plist

##Localizableファイル

PROJECT → info →  Localizations
+からJapaneseを追加
![スクリーンショット 2021-07-03 16.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586072/af9cd30a-cd66-5812-0646-b702e8d1409a.png)

File → New → FileでStrings Fileを選択し、**Localizable.strings**という名前にする
![スクリーンショット 2021-07-03 17.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586072/1b570e18-4c18-9a07-bb11-49ac841d4f4b.png)

ナビゲーションエリアのLocalizable.stringsを選択し、ユーティリティエリアのLocalize...を選択
![スクリーンショット 2021-07-03 17.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586072/ea8cd890-3614-52d0-4b1d-731282db7b76.png)

今回だとEnglishとJapaneseにチェック。すると・・・

![スクリーンショット 2021-07-03 17.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586072/92b5856d-1603-562f-dffb-cb8ac8444807.png)

英語と日本語用のファイルの出来上がり！ここに色々書いていく。

###書き方

```Localizable.strings(English)
"YES" = "Yes";
```
```Localizable.strings(Japanese)
"YES" = "はい";
```
```swift:HogeViewController
label.text = NSLocalizedString("YES", comment: "")
```
これで日本語設定だと日本語に英語設定だと英語で表記されます。

####個人的詰みポイント
- stringsファイル, 行末のセミコロン忘れ

これだとエラーを吐き出してくれるのでわかりやすいし、エラー文でググればめっちゃ解決方法ヒットする。セミコロンつけろってみんな言ってる。

```read failed: Couldn't parse property list because the input data was in an invalid format```

- stringsファイル, 空白行に誤ってセミコロンが・・・

これが自分が直面したやつです。ちなみにエラー出ないです。一部正しくLocalizeされ、一部stringsファイルのkeyの部分が表示されました。
どうやらこの不要なセミコロン以降のLocalizeがうまくいってなかったようです。このセミコロンを削除したら問題なく全てLocalizeされました！


##Storyboard

Localizeさせたいstoryboardファイル(ex. main.storyboard)を選択した状態でユーティリティエリアのLocalizeボタンをチェック。
すると、そのStoryboard専用のLocalizeファイルができる。その中にStoryboardに直書きしてたtextがザーッと全部表示されている。

元々日本語でStoryboardのボタンやラベルなどを作成していたとしたら、Englishファイルのほうで該当のラベルやボタンの箇所を英訳したものを記入。
![スクリーンショット 2021-07-05 22.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586072/988b1319-418d-7338-8964-5b6c5377870e.png)

####個人的詰みポイント

- なぜかLocalizeファイルに自動生成されてるはずのLabelやボタンが存在しない

確かにStoryboardに直書きしていて、他のラベルやボタンたちと同じようにLocalizeファイルに反映されるはずが、反映されていないものがあった。ObjectIDを調べて無理やり他の自動生成されたラベルやボタンと同じように追記するもLocalizeされず。

結局、その箇所をIBOutletでViewControllerに引っ張って、そちらでLocalizeしました・・


##info.plist
File → New → FileでStrings Fileを選択し、**InfoPlist.strings**という名前にする


####個人的詰みポイント

- 本家info.plistに引っ張られてInfoPlistをinfoPlistとしていた・・文頭のiは大文字！！
- Localizeファイルのkeyをinfo.plistのkeyそのままにしていた・・



```InfoPlist.strings(悪い例)
"Privacy - Camera Usage Description" = "hogehoge";
```
info.plistのkeyをそのまま使用しちゃってます・・。

```InfoPlist.strings(良い例）
"NSCameraUsageDescription" = "hogehoge";
```
正式名称?を使用するのが正しい。

##その他詰みポイント

最後にその他よくわからなかったが色々調べて腑に落ちたこと。

- develop native languageをenに

info.plistのnative languageがjaになってたのでenに変更。これでアプリのデフォルト言語を英語にする。
(日本語以外の言語では英語で表示したかったので)

- 設定→一般→言語と地域→言語の優先順序

英語と日本語でlocalizeしていて、例えば中国語をiPhoneで設定した場合は英語で表示されて欲しいのに日本語で表示されることがあった。
これは、iPhoneの設定で言語の優先順序というのが存在し、日本語が英語より上位であれば中国語を設定しても日本語が表示される。

## まとめ

以上今回の多言語対応の流れと詰みポイントになります。
誰かのお役に立てれば幸いです。

最後まで読んでいただきありがとうございました。

##参考にさせていただいたページ
[iOS アプリ開発](https://i-app-tec.com/ios/localization.html)