ヒレガス本 16章 課題

16章のローカライズの章には課題は無い。無いので自分で課題を作ってみた。

genstringsを使った文字列のローカライズを支援するツールを作成する。

genstringsが自動でLocalizable.stringを作れるのはよい。楽だ。 開発の最後の段階でローカライズを行い、1回の翻訳で全ての文字列を翻訳できるのならば、問題も無い。

しかし、実際には開発を行いながらローカライズも随時行うのが私のやり方です。面倒だと思ってもユーザーインターフェイスを追加したり削除したりします。 ソースコードもリファクタリングしてアラートの数を減らしたりします。

genstringsはLocalizable.stringを上書きしてしまうので、そのまま使うと翻訳済みのデータが消えてします。

そこで、genstringsとdiff3を組み合わせて、翻訳済みのデータを上書きしないようにシェルスクリプトを書いてみました。 練習でつくってみただけですので、実開発では使っていません。

#!/bin/sh
#
# updateLocalizableStrings
#
#  マージツール

# stringsの拡張子
theStringsExt=".strings"

# ローカライズディレクトリの拡張子
theLocalizeExt=".lproj"

# Localizable.stringのファイル名
theLocalizableStrings="Localizable"$theStringsExt

theTempDir="tmp"
theNewBaseLocalizableStrings=$theTempDir/$theLocalizableStrings


##########################################################################################
#
# 新たに生成されたLocalizable.stringsを"tmp/Localizable8.strings"に用意する
#
##########################################################################################

# 一時的な作業フォルダーを作成する
if ! [ -d $theTempDir ]; then
    mkdir $theTempDir
fi

# ソースコードをなめて、置換えテーブルを作成。作成場所は"./tmp/Localizable.strings"
genstrings -o $theTempDir `find . -name '*.[hcm]'`

# UTF-8に変換
iconv -f UTF-16 -t UTF-8 < $theNewBaseLocalizableStrings > $theNewBaseLocalizableStrings"_tmp"

# 後片付け
mv $theNewBaseLocalizableStrings"_tmp" $theNewBaseLocalizableStrings

##########################################################################################
#
# 古いLocalizable.stringsは"Base.lproj/Localizable.strings"にあると仮定する。なかったら作る
#
##########################################################################################

theOldBaseLocalizableStrings="Base"$theLocalizeExt/$theLocalizableStrings

if ! [ -f $theOldBaseLocalizableStrings ]; then
     cp $theNewBaseLocalizableStrings $theOldBaseLocalizableStrings
fi

##########################################################################################
#
# "Base"ディレクトリ以外の"*.lproj/Localizable.strings"をdiff3でアップデートする
#
##########################################################################################

for theLocaleStringsDir in `find . -name "*.lproj" -print`
do
    if [ $theLocaleStringsDir != "./Base.lproj" ]; then
        theLocaleStringsFile=$theLocaleStringsDir"/Localizable.strings"

        # 無ければ作り、あればdiff3でアップデート
        if ! [ -f $theLocaleStringsFile ]; then
            cp $theNewBaseLocalizableStrings $theLocaleStringsFile
        else
            diff3 -m $theLocaleStringsFile $theOldBaseLocalizableStrings $theNewBaseLocalizableStrings > $theLocaleStringsFile"_tmp"
            mv $theLocaleStringsFile"_tmp" $theLocaleStringsFile
        fi
    fi
done


# 最後に"Base.lproj/Localizable.strings"を更新する
cp $theNewBaseLocalizableStrings $theOldBaseLocalizableStrings

使い方は、 “*.m” や “*.lproj” があるディレクトリで呼出すだけです。 必要に応じて “*.lproj/Localizable.strings” のデータが更新されます。 コンクリフトが発生した場合は、gitやsvnでおなじみの”<<<<<<<<”の文字列が書き込まれますので随時対処してください。

このスクリプトの課題

  1. diffのように行毎に比較して判断するのではなく、”*.strings”をパースするコードを書けばもう少し知的な振る舞いが出来そう。
  2. ibtoolの出力に対してもアップデート出来るコマンドがあると便利かも。
  3. プログラマだけで開発するのならよいけど、翻訳担当にコマンドラインインターフェイスはキツいかも。せめてExcelで編集csvで読込みが出来るようにするべきでは?