麦芽を支える技術

麦芽(ばくが、英語:malt)とは、麦、特に大麦の種子を発芽させたもので、ビール、ウイスキー、水飴の原料となる。(Wikipediaより)

BartyCrouchでiOSアプリの多言語化(Localization)用stringsファイルを自動更新

結構前から便利そうだと思って使ってるんだけど、案外紹介されてる記事が少ないのでとりあえず書く。

BartyCrouchとは

これ。

github.com

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に実行コマンドを入れて、アプリのビルドの際に自動実行するのが現実的かと思います。

  • Xcodeで対象Target選択
    • 「Build Phases」
      • 「+」アイコン - 「New Run Script Phase」
        • Shell: /bin/sh
        • 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!の記載を含める

とこんな感じで、iOSアプリのLocalization対応時には必須かなと思うくらい便利に使ってるんですが、あまり使ってる記事見かけないのは最近はもっと別な方法あるのかしらん?