ObjecTips

Swift & Objective-C で iOS とか macOS とか

ibtool を使って incremental にローカライズ

前回

今回は前回の ibtool を使ったローカライズの話の続き

ibtool には incremental localization という機能がある。
コマンドの形式
ibtool --previous-file <old_file> --incremental-file <old_translated_file> --localize-incremental --write <new_translated_file> <current_modified_file>

--previous-file <old_file> には翻訳元の古いファイル(編集前ファイル)を指定

f:id:Koze:20160223001449p:plain

--incremental-file <old_translated_file> には翻訳済みの古いファイル(編集前ファイル)を指定
インクリメンタルの効果を分かりやすくするために文字列の翻訳以外にラベルの位置も変更している。つまり言語毎の xib storyboard ファイルを別個に編集済みの状態。

f:id:Koze:20160223001509p:plain

--write <new_translated_file> には新規に作成する翻訳済みファイルを指定

最後に更新済みの翻訳元ファイル <current_modified_file> を指定
更新内容は以下の通りボタンを追加している

f:id:Koze:20160223001546p:plain

コマンドを実行
ibtool --previous-file Main_old.storyboard --incremental-file Main_ja_old.storyboard --localize-incremental --write Main_new_translated.storyboard Main.storyboard

作成された Main_new_translated.storyboard の中身は以下

f:id:Koze:20160223001932p:plain

翻訳済みの古いファイル(編集前ファイル)に翻訳元ファイルの変更点のみが反映されている。
(この時ボタンの追加以外にラベルの位置も変更していたとすると、それも変更点として扱われ生成後のファイルには新しいラベル位置が反映される。今回はラベルは移動させていないので変更無しと扱われて、翻訳済みの古いファイル(編集前ファイル)のラベル位置がキープされている)


コマンド実行時に --import-strings-file を使って更新分の翻訳も同時に行う事ができる。
genstrings などを使って更新内容分の strings ファイルを用意しておく。

/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "WnY-Sl-xIW"; */
"WnY-Sl-xIW.normalTitle" = "Button";

コマンド
ibtool --previous-file Main_old.storyboard --incremental-file Main_ja_old.storyboard --localize-incremental --write Main_new_translated.storyboard --import-strings-file Main_diff.strings Main.storyboard

作成された Main_new_translated.storyboard を見ると以下のように更新を反映しつつ翻訳も同時に行われている。

f:id:Koze:20160223002941p:plain


ibtool を使った incremental なローカライズを駆使すると言語毎に大きく異なるレイアウトの xib storyboard を使いつつ上手く翻訳を反映していく事が出来そう。ただし作業は複雑。
今は Base Internationalization が主流だし、その仕組みの中で Auto Layout を駆使して言語別のレイアウト変更に対応するのがベターだと思う。

関連