Xcodeで複数形を含むローカライズフローの自動化

# 関連リンク

WWDC21 Streamline your localized strings 

  https://developer.apple.com/videos/play/wwdc2021/10221/

Localizing Strings That Contain Plurals 

  https://developer.apple.com/documentation/xcode/localizing-strings-that-contain-plurals

# 概要

上の資料を見て実装してみたところ、かなりハマって時間を溶かしたので勘所をメモ。

# 前提

このようなローカライズ設定。
![localizations-precondition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/91536dca-5755-8baf-050d-2de97664bbd7.png)


で、SwiftUIでこのように実装しておく。お気づきと思いますがこれがキーになるのでタイポ厳禁。

```swift
Text("\(n) day(s) ago")
Text("\(n) day(s) ago", comment: "Days since last change of this user's rating.") // iOS 15
```

# "Streamline"

## stringsdictファイルを作る

とりあえずDevelopment Languageだけ作る。
Development Languageのstringsdictファイルが基準になるので、それがないとExportの対象にならない。
**`Localizable.strings`ファイルは自分で作らなくて良い。**

### フォーマット

指定する値のマッピングは以下の通り。
`NSStringLocalizedFormatKey` はこのplist内で使われる変数のようだったので、トップレベルのキーと同じである必要はないようだった。（この辺りで混乱した。）
文字列で慣れない型を記述している感じで多分ここが一番つらい作業だと思う。

![corresponding-keys](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/0f2174fb-ef9a-2f01-419d-202feef3f9be.png)

## Exportする

Xcode 13からSwiftUIの文字列リテラルもExportの対象になった。便利すぎて鼻血出る。

なおXcodeの`Product -> Export Localizations...` は毎回ディレクトリの指定が面倒で人的ミスの元なので全くもってお勧めしない。コマンドラインでサクッと叩けるようにしておくと良い。Importも同様。
以下の`Makefile`を参考にしてもらうと良い。

```bash
XCODEBUILD=xcodebuild
OPTION_XCODEPROJ=-project GTRatingSport.xcodeproj
OPTION_EXPORT_LOCALIZATIONS=-exportLocalizations 
OPTION_IMPORT_LOCALIZATIONS=-importLocalizations 
OPTION_EXPORT_LANG_EN=-exportLanguage en
OPTION_EXPORT_LANG_JA=-exportLanguage ja
PATH_LOCALIZATION_FILES_DIR=-localizationPath tmp/LocalizationFiles/
PATH_XCLOC_JA=$(PATH_LOCALIZATION_FILES_DIR)/ja.xcloc
PATH_XCLOC_EN=$(PATH_LOCALIZATION_FILES_DIR)/en.xcloc

export:
	$(XCODEBUILD) $(OPTION_EXPORT_LOCALIZATIONS) $(OPTION_EXPORT_LANG_EN) $(OPTION_XCODEPROJ) $(PATH_LOCALIZATION_FILES_DIR)
	$(XCODEBUILD) $(OPTION_EXPORT_LOCALIZATIONS) $(OPTION_EXPORT_LANG_JA) $(OPTION_XCODEPROJ) $(PATH_LOCALIZATION_FILES_DIR)

import:
	$(XCODEBUILD) $(OPTION_IMPORT_LOCALIZATIONS) $(OPTION_XCODEPROJ) $(PATH_XCLOC_EN)
	$(XCODEBUILD) $(OPTION_IMPORT_LOCALIZATIONS) $(OPTION_XCODEPROJ) $(PATH_XCLOC_JA)
```

## xclocファイルを開いて翻訳を入れる

Xcode 13から綺麗なGUIができたのでなかなか楽しい作業。
多分大きい会社とかならここを外注する形になるのだと思う。
でもXcode 13インストールしてもらうのかな？それともxliff直接いじってもらうのかな？（この辺は無知なので割愛。）
人に依頼するときはSwiftUI.Textのcommentパラメータも活用すると便利そうなのでぜひ。

![editing-xcloc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/c27a0da3-840c-ca2d-dd23-6bb7a95a9a4a.png)

`en.xcloc` `ja.xcloc` 両方更新できたらImport。

## Importする

`make import`
これで`Localizable.strings`も自動で生成される。
自分でチマチマ管理しなくていいのか〜これ。スバラシイ。

# 所感

## 感じたデメリット

Xcode Templateとかもそうだけど、plistでマッピング書かせるのやめてほしさあった。
人間が読み書きするのには無理がある気がする。仕様もメタメタしてて複雑だし。

## 感じたメリット

SwiftUIの文字列リテラルを自動でローカライズ対象としてExportしてくれるのはすごく便利だと思った。
こうした公式手順に則っておくことでストアのスクリーンショット用の画像生成とかもできるらしいし、そういえば画像アセットのローカライズとかもあるみたいだし、まあXcode便利なんじゃないか。かなり。
![スクリーンショット 2021-06-21 1.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/814064ff-152e-9489-fb95-273f73580a47.png)
plistパズルのピースがうまくハマった時は謎の達成感があった。けどまあ、この辺りもさらに良くなったら嬉しいなあ。

# 追記 2021/11/14

Xcode betaのバグで以下のような症状があったのですが、Xcode 13 beta 2で試したところ修正されていました。

https://twitter.com/toshi0383/status/1459700562836877313?s=20