BartyCrouchでiOSアプリの多言語化(Localization)用stringsファイルを自動更新
結構前から便利そうだと思って使ってるんだけど、案外紹介されてる記事が少ないのでとりあえず書く。
BartyCrouchとは
これ。
iOSアプリを多言語対応する際に必要になる以下のファイルを、CLIから更新してくれるツールです。
- コード内で使用するローカライズ文字列の言語リソースファイル(
Localizable.strings
) - Storyboards/XIBの言語リソースファイル(
xxxx.storyboard
なら対応するxxxx.strings
)
例えばSwiftコード内でNSLocalizedString
を使ってローカライズ文字列を表示するようにしたい場合、それに対応する具体的な文字列を言語リソースファイルLocalizable.strings
の方にlocale毎に用意すると思うんですが、それら2つの編集作業はXcode上同期していないので、割とLocalizable.strings
の編集が漏れがちです。
またStoryboard/XIBのLocalizationについては、Base言語で一通りの画面作った後、InterfaceBuilderのinspectorのところにある「Localize..」ボタンを押せば、画面内各オブジェクトと紐付く言語リソースファイルの雛形が生成されるのですが、こちらの紐付けは初回生成時のみで、その後画面に新たなUILabelとか貼っても言語リソースファイルの方は同期されないので、やはり編集が漏れがちです。
BartyCrouchを実行すると、コード内のNSLocalizedString
使用箇所増減、Storyboardへの新たなUIコントロールの増減を検知し、それぞれの言語リソースファイルの定義を最新状態に更新してくれます。
BartyCrouchの使い方
基本的にGitHubのReadme通りですが、簡単に書くとこんな感じです。
インストール
Homebrewは導入済みとして。
$ brew tap flinesoft/bartycrouch $ brew install flinesoft/bartycrouch/bartycrouch
実行
# Storyboard/XIBのstringsファイルの定義を最新状態に更新 $ bartycrouch interfaces -p "/absolute/path/to/project" # コード内の`NSLocalizedString`箇所を検知して、`Localizable.strings`の定義を最新状態に更新 $ bartycrouch code -p "/path/to/code/directory" -l "/directory/containing/all/Localizables" -a # 定義文字列が空のとこにMicrosoft Translator APIを使用して自動翻訳 $ bartycrouch translate -p "/path/to/project" -l en -i "<API_ID>" -s "<API_SECRET>"
以前自動翻訳されたっぽいアプリ使ったら、やや怪しい翻訳結果が不快だったので、自分はこの自動翻訳は使ってません。
アプリのビルド時に自動でBartyCrouchを実行させる
実際は開発どんどん進めていく中でいちいちCLIコマンド実行とかやるのめんどくさいので、XcodeのRun Scriptに実行コマンドを入れて、アプリのビルドの際に自動実行するのが現実的かと思います。
if which bartycrouch > /dev/null; then # Incrementally update all Storyboards/XIBs strings files bartycrouch interfaces -p "$PROJECT_DIR" # Add new keys to Localizable.strings files from NSLocalizedString in code bartycrouch code -p "$PROJECT_DIR" -l "$PROJECT_DIR" -a else echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch" fi
Tips
自動生成する対象外にしたい場合
基本的にNSLocalizedString
や画面にローカライズできそうなUIコントロールが貼られたりすると、デフォルトでBartyCrouchが検知して定義を生成します。
ただ、UILabelは画面上に定義しつつもコード側で値を設定するときなどは特にローカライズ不要なので、BartyCrouch検知の対象外にしたい場合は以下のようにします。
NSLocalizedString
の場合comment
に#bc-ignore!
の記載を含める
NSLocalizedString("%d minute(s) ago", comment: "pluralized and localized minutes #bc-ignore!")
- Storyboard/XIBの場合
- ローカライズ対象箇所(例えばUILabelならラベルテキスト)に
#bc-ignore!
の記載を含める
- ローカライズ対象箇所(例えばUILabelならラベルテキスト)に
とこんな感じで、iOSアプリのLocalization対応時には必須かなと思うくらい便利に使ってるんですが、あまり使ってる記事見かけないのは最近はもっと別な方法あるのかしらん?