ヒレガス本 16章 課題 その2¶
前回のアップデートスクリプトに加えて、ビルド時のチェックツールも作ってみた。
機能は、
既に存在しないキーで指定された、翻訳文が有れば警告
ソースコード中にキーが有るが、*.stringsに存在しないキーがあれば警告
マージがコンクリフトしている場所をエラー
とするツールを作った。
#!/bin/sh
#
# *.lproj/Localizable.stringsの内容のチェックを行う
# stringsの拡張子
theStringsExt=".strings"
# ローカライズディレクトリの拡張子
theLocalizeExt=".lproj"
# Localizable.stringのファイル名
theLocalizableStrings="Localizable"$theStringsExt
##########################################################################################
#
# missingなキーワードの警告
#
##########################################################################################
# warningMessage フルパス 行番号 警告メッセージ 警告行のテキスト
function warningMissingKeyWordMessage() {
local FULL_PATH_FILE_NAME=$1
local KEYWORD_STRING=$2
echo $FULL_PATH_FILE_NAME"::: warning:" $KEYWORD_STRING is a missing key word.":" $KEYWORD_STRING
}
##########################################################################################
#
# danglingなキーワードの警告
#
##########################################################################################
function warningDanglingKeyWordMessage() {
local FULL_PATH_FILE_NAME=$1
local KEYWORD_STRING=$2
echo $FULL_PATH_FILE_NAME":"`grep -n $KEYWORD_STRING $FULL_PATH_FILE_NAME | cut -d":" -f1`":0: warning:" $KEYWORD_STRING is a dangling key word.":" `grep $KEYWORD_STRING $FULL_PATH_FILE_NAME`
}
##########################################################################################
#
# エラーメッセージを出力
#
##########################################################################################
# errorMessage フルパス 行番号 エラーメッセージ エラー行のテキスト
function errorConflictMessage() {
local FULL_PATH_FILE_NAME=$1
local LINE_NUMBER=$2
local TEXT_STRING=$3
echo $FULL_PATH_FILE_NAME":"$LINE_NUMBER":0: error: Merge conflict :" $TEXT_STRING
}
# Base.lprojのフルパス
theBaseLocalizableStrings=`pwd`/Base$theLocalizeExt/$theLocalizableStrings
# キーだけのリストにしてtmpへ保存する
# 一時的な作業フォルダーを作成する
theTempDir="tmp"
if ! [ -d $theTempDir ]; then
mkdir $theTempDir
fi
# コメントと空白行を削除
cat $theBaseLocalizableStrings | sed -e 's:/\*.*\*/::' | sed -e '/^[<space><tab>]*$/d' | cut -d' ' -f1 > $theTempDir/tmplist.txt
# forループの区切りを改行だけにする
IFS=$'\n'
# Base.lproj/以下以外のLocalizable.stringsを全部ループ
for theIterator in `find \`pwd\` -regex ".*/Base.lproj/.*" -prune -o -regex ".*lproj/Localizable\.strings" -print`
do
# 右側にだけある項目
for theWord in `cat $theIterator | sed -e '/^<<<<<<<.*$/d' | sed -e '/^|||||||.*$/d' | sed -e '/^=======.*$/d' | sed -e '/^>>>>>>>.*$/d' | sed -e 's:/\*.*\*/::' | sed -e '/^[<space><tab>]*$/d' | cut -d' ' -f1 | sort | uniq | comm -13 $theTempDir/tmplist.txt -`
do
warningDanglingKeyWordMessage $theIterator $theWord
done
# 左側にだけある項目
for theWord in `cat $theIterator | sed -e 's/^<<<<<<<.*$//' | sed -e 's/^|||||||.*$//' | sed -e 's/^=======.*$//' | sed -e 's/^>>>>>>>.*$//' | sed -e 's:/\*.*\*/::' | sed -e '/^[<space><tab>]*$/d' | cut -d' ' -f1 | sort | uniq | comm -23 $theTempDir/tmplist.txt -`
do
warningMissingKeyWordMessage $theIterator $theWord
done
# コンフリクトな行(下の四行など)をコンクリフトだと報告する
# <<<<<<<
# |||||||
# =======
# >>>>>>>
for theConflictLine in `cat $theIterator | grep -n '^<<<<<<<\|^=======\|^>>>>>>>\|^|||||||'`
do
errorConflictMessage $theIterator `echo $theConflictLine | cut -d':' -f1` `echo $theConflictLine | cut -d':' -f2`
done
done
# 後片付け
rm -f $theTempDir/tmplist.txt
XCodeに組み込んで使います。
ここに置いて、
こんな風に設定すると。
ビルド時に、こんな風に警告が出たりエラーが出ます。
実用的になるかどうかは不明。 16章はここら辺で見切りを付けて明日からは次の章を行うつもり。
Comments
comments powered by Disqus