iOSアプリのローカライズとローカリゼーションのデバッグ - 開発言語の変更、ストーリーボードと文字列のローカライズ、ローカライズされていない文字列の特定とデバッグ

## ローカリゼーションとは？

自分が作ったアプリが人気になり、英語など他の言語にそのアプリを翻訳してもっと多くの人が使えるようにしたいと思うときが来るかもしれません。iOSのシステムは、ユーザー設定に基づきコンテンツを適切な言語で表示するなど、大方のローカリゼーションを行ってくれます。

## アプリをローカライズする方法

Xcode 13では、ローカライゼーションをより簡単に行う方法があります。

https://qiita.com/MaShunzhe/items/5daf3c823235ce8df061

### `Development language` の変更

開発言語とは、アプリの開発時に使用する言語のことを指します。まず、設定の内容を確認する必要があります:

プロジェクトファイルをクリックし、（ターゲットではなく）プロジェクトファイルを選択します。ローカリゼーションのセクションで、`Development Language` が日本語なのか英語なのかを確認します。日本語の場合、設定は正しいので、何もする必要はありません。英語の場合、引き続き開発言語の変更のガイドに従ってください。

<img width="1796" alt="スクリーンショット 2020-05-24 16.05.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/819e7553-86c5-4105-9877-94f658c877c4.png">

##### 次に `Xcode` を閉じ、`.xcodeproj` ファイルを右クリックして選択し、このファイルの内容を表示する：

<img width="943" alt="スクリーンショット 2020-05-24 16.08.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/3eddb722-0927-76d2-1c39-42930d294683.png">

##### `project.pbxproj` ファイルを見つけ、テキストエディターで開く。

<img width="1136" alt="スクリーンショット 2020-05-24 16.09.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/a0283160-b8ff-683e-69b7-f8bf142013e9.png">

##### `developmentRegion` を検索し、`ja` に変更する。

```swift
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
```

上記のコードを以下に変更する

```swift
compatibilityVersion = "Xcode 9.3";
developmentRegion = ja;
hasScannedForEncodings = 0;
```

##### `knownRegions` を検索する

```swift
knownRegions = (
		en,
		Base,
		);
```

上記のコードを以下に変更する

```swift
knownRegions = (
		ja,
		en,
		Base,
		);
```

##### ファイルを保存して、再度 `Xcode` を開く：

`Development Language` が日本語に変更されているのをご確認いただけます

<img width="1796" alt="スクリーンショット 2020-05-24 16.13.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/bbbe3ed3-040f-64cd-fb9f-83f9869a34db.png">

### 新しい言語の追加

1. ファイルナビゲーター内のプロジェクトファイルをクリックします
2. プロジェクトファイルをクリックします
3. 情報タブを開いていることを確認してください
4. `Localizations` セクションのプラスボタンをクリックしてください
5. 追加したい言語を選択してください

<img width="1691" alt="スクリーンショット 2020-05-24 16.15.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/c1c61ba0-f2f8-384a-b338-ce9fc1793b6c.png">

また、必ずスイッチ `Use Base Internationalization` を有効にしてください

<img width="977" alt="スクリーンショット 2020-05-24 16.53.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/bacb41b0-8283-d465-32d3-3d92274cb5ad.png">

### ストーリーボードのローカリゼーション

#### 初期設定

ローカリゼーションを最初にセットアップするとき、Xcodeはあなたのためにすべての文字列を抽出してそれらをファイルに入れる作業を行います。ストーリーボードのローカリゼーションをセットアップするには：

1. Storyboard ファイルを選択します。
2. 右側のパネルで、`Localizations` セクションを探し、追加したい言語のオプションをオンにします。

<img width="1796" alt="スクリーンショット 2020-05-24 16.18.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/50fc0256-8f29-c463-bbfc-1beec9c0ceb7.png">

これで、左側のファイルナビゲーターで、Storyboard ファイルを展開し、翻訳ファイルを確認できます：

<img width="272" alt="スクリーンショット 2020-05-24 16.20.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/3426ad00-73d0-1984-3bd7-8661c3e05381.png">

`Main.strings (English)` をクリックすると、原文と翻訳文のペアが表示されます：

```swift
/* Class = "UILabel"; text = "こんにちは"; ObjectID = "ok2-tj-BN9"; */
"ok2-tj-BN9.text" = "こんにちは";
```

さて、`ok2-tj-BN9` は、Storyboard 上にある`UILabel` の要素IDです。ストーリーボードインターフェースに戻り、そのラベルを選択すると、その要素IDが表示されます：

<img width="1796" alt="スクリーンショット 2020-05-24 16.22.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/8f1d5290-6909-9cf7-a39e-53343ac3a50c.png">

また、`.text` はその `UILabel` のテキストプロパティを示しているにすぎません。

さぁ、これで翻訳済みのストリングを `Main.strings (English)` に入れられるようになりました:

```swift
/* Class = "UILabel"; text = "こんにちは"; ObjectID = "ok2-tj-BN9"; */
"ok2-tj-BN9.text" = "Hello";
```

#### トランスレーションの追加

さらにトランスレーションを追加したい場合。 `UIStoryboard` でエレメントのオブジェクトIDを見つけ、それを `Main.strings (English)` ファイルに追加する。

エレメントが異なる場合、プロパティは同じではない：

```swift
//9rM-vm-U1g is an UITextField. Placeholder means placeholder.
"9rM-vm-U1g.placeholder" = "ユーザー名";

//GsY-2N-hIy is an UIButton, normalTitle means the title of the button at normal.
"GsY-2N-hIy.normalTitle" = "ボタン";

//BYZ-38-t0r is an UIViewController
"BYZ-38-t0r.title" = "登録画面";
```

### 文字列のローカライズ

#### 文字列ファイルを作成する

command-Nを押し、`Strings file` を作成する

<img width="809" alt="スクリーンショット 2020-05-24 16.33.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/da308fb7-1bdd-41cd-72e5-b265b8dcfcac.png">

ファイル `Localizable.strings` に名前を付ける

Xcodeでそのファイルを選択し、右側のローカライズボタンを選択する。ポップアップで英語を選択する。次に、右側のパネルで、すべての言語を選択する。

<img width="259" alt="スクリーンショット 2020-05-24 16.35.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/fcdac467-c55b-ea02-c8a7-14f927ed2d51.png">

#### 全ての文字列を `NSLocalizedString` に入れて下さい

この例では、元のコードは以下です：

```swift
@IBAction func actionPress(){
    let alert = UIAlertController(title: "こんにちは", message: nil, preferredStyle: .alert)
    let actionClose = UIAlertAction(title: "はい", style: .cancel, handler: nil)
    alert.addAction(actionClose)
    present(alert, animated: true, completion: nil)
}
```

```swift
@IBAction func actionPress(){
    let alert = UIAlertController(title: NSLocalizedString("こんにちは", comment: ""), message: nil, preferredStyle: .alert)
    let actionClose = UIAlertAction(title: NSLocalizedString("はい", comment: ""), style: .cancel, handler: nil)
    alert.addAction(actionClose)
    present(alert, animated: true, completion: nil)
}
```

#### コードファイルから文字列を抽出する

1. Terminal を開く
2. `cd` コマンドで `.lproj` ファイルがある場所に移動し、以下のコマンドを実行する

```shell
find . -name \*.swift | xargs genstrings -o en.lproj
find . -name \*.swift | xargs genstrings -o ja.lproj
```

`en.lproj` ファイルを開く：

ご覧の通り、すでにプログラムの文字列が含まれています：

```swift
/* No comment provided by engineer. */
"こんにちは" = "こんにちは";

/* No comment provided by engineer. */
"はい" = "はい";
```

これで、英語の訳を追加することができます：

```swift
/* No comment provided by engineer. */
"こんにちは" = "Hello";

/* No comment provided by engineer. */
"はい" = "Yes";
```

## ローカリゼーションのデバッグ

### シミュレーターの言語を変更する

シミュレーターの言語を変更するには、Edit Schemeをクリックします。

<img width="539" alt="スクリーンショット 2020-05-24 16.45.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/3ae85385-34c0-f329-8765-ba630516e466.png">

`Options` タブを選択すると、`Application Language` を編集できるようになります。

<img width="932" alt="スクリーンショット 2020-05-24 16.45.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/c14c673f-a658-97d9-0100-b263bea37906.png">

プログラムを英語で実行すると次のようになります：

<img width="400" alt="スクリーンショット 2020-05-24 16.45.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/02838691-8d1b-fa97-409a-ab54ad6f5e6a.png">

### ローカライズされていない文字列の確認方法:

再度、設定 `Edit Scheme` のタブ `Options` を開き、`Show non-localized strings` をオンに切り替える。

<img width="906" alt="スクリーンショット 2020-05-24 16.49.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/576a853b-29dc-0c20-ab7e-5d6a9c2c1d9c.png">

この状態でプログラムをテストする。ローカライズされていない文字列があれば、コンソールにエラーが表示される:

<img width="1699" alt="スクリーンショット 2020-05-24 16.57.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/2392c0d7-9a81-9a7b-5af9-078c6229f6bc.png">

Like this message:

```swift
localization[3921:116986] [strings] ERROR: pBD-R7-cpO.text not found in table Main of bundle CFBundle 0x7fdab8704210
```

### 実際のデバイスでアプリケーションの言語を変更する：

実際のデバイスでアプリケーションをテストしてから、アプリケーションの言語を切り替える必要がある。そのためには：

1. システム設定を開く

2. アプリの名前を見つけ、アプリの設定を開く

3. 言語オプションをクリックする

4. 言語を切り替える

5. これで、自分のアプリをテストすることが可能となります。

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">