ヒレガス本 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に組み込んで使います。

ここに置いて、

../../../_images/filePath.png

こんな風に設定すると。

../../../_images/setting.png

ビルド時に、こんな風に警告が出たりエラーが出ます。

../../../_images/error.png

実用的になるかどうかは不明。 16章はここら辺で見切りを付けて明日からは次の章を行うつもり。