String Catalog(xcstrings)ファイルでローカライズの手順をおさらい

# 概要

最近、社内のプロジェクトでローカライズが必要になったので、まとめてみました!！

ただ、今回紹介するローカライズの方法はiOSアプリ開発におけるローカライズのベストプラクティスでは**無いと自負しています**ので、もっと効率的な良い方法があればご指導ご鞭撻賜りたいです。

### 実装方針
ローカライズしたい文字列とその文字列を参照するためのKeyをString Catalog(xcstrings)内で管理します。
これは、ローカライズする際に使用するString Catalogファイルがキーとバリューで画面に表示する文字列を変更してくれるためです！

### 結論（学んだこと）
- Xcode15以降ではStringsファイルでなく、String Catalogを推奨されていることとそれを使用する方法
- ローカライズを実装する際に、必要なセットアップ方法と（今の所適切であろう）各言語の管理方法
- 画面に表示する文字列の管理が簡単になる（言語対応しない場合かつ、重複した文字列を使用することが多い場合も楽かも）

### こんな人におすすめ

:::note info
以下のような方の参考になるかと思います。
- iOS開発において、ローカライズが必要になり実装方法を知りたい方
- Xcode15以上でString Catalog(xcstrings)ファイルについて知りたい方
- iOSエンジニア
:::

:::note alert
説明しないこと
- Xcode15以上ではlegacyになってしまった『Strings』ファイルや『Stringsdict File』について
- モジュールを間でのローカライズ管理
:::

# 環境

Xcode:Version 15.0.1 (15A507)
Simulator: iPhone15 Pro
iOS Version: 17.0.1

# 実装手順

#### ①ローカライズ対象にしたい言語の追加
こちらは、【PROJECT】→【Info】→【Localizations】→【+】で言語を追加

![LocalizeLanguage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/78ed5522-7ac2-368b-8c1a-dae516cbaf15.png)


#### ②String Catalog(xcstrings)ファイルをプロジェクトに追加
プロジェクト内で【Command + N】→【String Catalogを検索】→

![Stringsファイル検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/632edee9-f378-3669-00fa-4b2dffaa9830.png)

【名前を変更せず追加】→【確認】

![スクリーンショット 2024-03-04 21.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/21a7e626-23a2-70c8-f854-2af693e0115b.png)

:::note warn
注意
String Catalogファイルは、名前を変更して追加すると使用できないらしいので、名前を変更せずに追加してください！
:::

##### 一旦以下のようにからのxcstringsファイルが生成されますが、次に進みます。

![StringCatalog追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/94b631d0-6b96-ce85-3732-c9ef2a93c078.png)


#### ③SwiftUIのTextでキーを指定
【Textにキーを追加】→

![スクリーンショット 2024-03-04 21.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/0994ad9d-f513-e7b3-3356-e01257bb3962.png)


【build】→【自動生成】

![スクリーンショット 2024-03-04 21.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/dac4bcd4-e8c2-6d5f-dfc8-17829e5c9d04.png)


ビルドすると自動的にキーとValueを生成してくれるので、ビルド後にString Catalogを確認して各言語で単語を入力しましょう！

> Add your localizable text to the string catalog
>> Xcode automatically keeps your string catalog and app in sync each time you build your project. To populate your string catalog with the localizable text from your app, choose Product > Build. Xcode identifies strings in your app that support localization, and then adds them to your string catalog.

 [公式リファレンス](https://developer.apple.com/documentation/xcode/localizing-and-varying-text-with-a-string-catalog#Add-your-localizable-text-to-the-string-catalog)


#### ④String Catalogに各言語でローカライズした文言を入力

###### 日本語でのローカライズ設定
![スクリーンショット 2024-03-04 21.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/f4f2e2ec-5b63-b835-e12e-491d3e9be1e6.png)


###### 英語でのローカライズ設定
![スクリーンショット 2024-03-04 21.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/b2013243-48ec-ec3e-4b5d-9763cfa875f6.png)

おそらくここがめんどくさポイントで、適宜ローカライズしたい箇所の単語を入力していく必要があります。
幸いにも、ローカライズKeyのValue（単語）が入っていない場合は、チェックが付かずどれだけ単語が網羅されているかをパーセンテージで表示してくれる(緑のバッジの箇所が90%のような形で)ので、どのKeyに対して適応できていないかは一目でわかります！

今まででは、ファイル内に文字列を列挙していく形しかなかったため、チェックが面倒だったと思うので助かりますよね！

#### ⑤各言語でローカライズができているかを確認
手順④で各言語に対応する文字を追加できたら、端末の言語設定を変更してみて確認してください！

| String Catalog追加前 | String Catalog追加後(ja) | String Catalog追加後(ro-maji) |
|:---:|:---:|:---:|
| ![Simulator Screenshot - iPhone 15 Pro - 2024-03-04 at 21.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/01a76a35-becc-4736-2aa1-22e3b2321980.png)  | ![Simulator Screenshot - iPhone 15 Pro - 2024-03-04 at 22.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/523763ec-f4b8-e790-f352-237cb74b9990.png) | ![Simulator Screenshot - iPhone 15 Pro - 2024-03-04 at 22.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/7599e4d5-1260-56b5-d83a-e5de0476005f.png) |

これでローカライズの準備完成ですね！

#### NG？方法
enumや定数で定義している文言はキーとして認識されないみたいなので、ローカライゼーションできませんでした！
なので、自分が関わっているプロダクトではローカライズしたい文字列は完全にString Catalogに追加することとしました！
どこの何の文字のローカライズなのかを設定するKeyの命名で間違えなければ、管理の負担や重複は少なくできるかと思います！

| String Catalog追加前 | String Catalog追加後(ja) | String Catalog追加後(ro-maji) |
|:---:|:---:|:---:|
|　![スクリーンショット 2024-03-04 21.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/be9987ec-0e26-20a9-63f7-c856cac5b997.png)　|　![スクリーンショット 2024-03-04 21.42.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/6280e42f-368d-39ec-147e-15306214c8ed.png)　|　![スクリーンショット 2024-03-04 21.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630898/4d3eeb58-d15c-92f7-f5dd-076826f70254.png)　|


# さいごに
ローカライズは、思いの外細かい作業の連続です。しかし、国内にとどまらず海外での配信の可能性がある場合には、仕込んでおくのも1つの手かと思います！
途中にもありましたが、そもそもローカライズする必要がなくても画面に表示する文字列をカタログとして管理することで、再利用性を考慮した実装になるかと思うので、オーバーエンジニアリングにならない程度で積極的に使いたいと思います！


# 参考資料

https://developer.apple.com/documentation/xcode/localizing-and-varying-text-with-a-string-catalog


https://developer.apple.com/videos/play/wwdc2023/10155/


https://developer.apple.com/documentation/xcode/localization

https://developer.apple.com/documentation/xcode/supporting-multiple-languages-in-your-app