Next: gettext.sh, Previous: sh, Up: sh [Contents][Index]
インターナショナリゼーションにむけたシェルの準備は、概念的にはSourcesで説明したステップと似ています。以下はシェルスクリプトのための具体的なステップです。
. gettext.sh
gettext.shは、関数eval_gettext(eval_gettext Invocationを参照してください)と、eval_ngettext(eval_ngettext Invocationを参照してください)を提供するシェルの関数ライブラリーです。gettext.shは、PATHに記述された検索パスに配置されている必要があります。
TEXTDOMAINおよびTEXTDOMAINDIRを、setしてexportします。TEXTDOMAINは通常はパッケージ名かプログラム名、TEXTDOMAINDIRは$prefix/share/localeに対応する絶対パスです。ここで$prefixはインストールした場所です。
TEXTDOMAIN=@PACKAGE@ export TEXTDOMAIN TEXTDOMAINDIR=@LOCALEDIR@ export TEXTDOMAINDIR
"`...`"または"$(...)"))や、デフォルト値が含まれる変数(例:${variable-default})、$0,
$1, ...のような引数参照、一時的なシェル変数(例:
$?)を含めないようにします。こうすることにより、常に単純なlocalコードを再構築することができます。たとえば、
echo "Usage: $0 [OPTION] FILE..."
は以下のように書き換えます
program_name=$0 echo "Usage: $program_name [OPTION] FILE..."
同様に、
echo "Remaining files: `ls | wc -l`"
は以下のように書き換えます
filecount="`ls | wc -l`" echo "Remaining files: $filecount"
この変更を行う際には、シェル変数への参照の前にある$記号をエスケープするためのバックスラッシュを追加する必要もあります。そうすれば‘eval_gettext’関数が変数が置き換える前の、翻訳可能な文字列を受けとることができます。例えば以下のような文字列で考えてみましょう
echo "Remaining files: $filecount"
は以下のように書き換えます
eval_gettext "Remaining files: \$filecount"; echo
出力コマンドが‘echo’ではないときも、バッククォートにより‘echo’を使うことができます。バッククォートの内側では、バックスラッシュを2重に指定しなければ効果がないことに注意しなければなりません(これはバッククォートすることにより、バックスラッシュが1階層分消費されるからです)。例として、‘echo’がエラーをシグナルするシェル関数だとすると、
error "file not found: $filename"
は最初に以下へ変換され
error "`echo \"file not found: \$filename\"`"
となり、その後以下のようになります
error "`eval_gettext \"file not found: \\\$filename\"`"