ヒレガス本 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でおなじみの"<<<<<<<<"の文字列が書き込まれますので随時対処してください。
このスクリプトの課題
diffのように行毎に比較して判断するのではなく、"*.strings"をパースするコードを書けばもう少し知的な振る舞いが出来そう。
ibtoolの出力に対してもアップデート出来るコマンドがあると便利かも。
プログラマだけで開発するのならよいけど、翻訳担当にコマンドラインインターフェイスはキツいかも。せめてExcelで編集csvで読込みが出来るようにするべきでは?
Comments
comments powered by Disqus