Next: , Previous: , Up: sh   [Contents][Index]


15.5.2.1 インターナショナリゼーションのためにシェルスクリプトを準備する

インターナショナリゼーションにむけたシェルの準備は、概念的にはSourcesで説明したステップと似ています。以下はシェルスクリプトのための具体的なステップです。

  1. スクリプトの冒頭付近に、以下の行を挿入します。
    . gettext.sh
    

    gettext.shは、関数eval_gettext(eval_gettext Invocationを参照してください)と、eval_ngettext(eval_ngettext Invocationを参照してください)を提供するシェルの関数ライブラリーです。gettext.shは、PATHに記述された検索パスに配置されている必要があります。

  2. 環境変数TEXTDOMAINおよびTEXTDOMAINDIRを、setしてexportします。TEXTDOMAINは通常はパッケージ名かプログラム名、TEXTDOMAINDIR$prefix/share/localeに対応する絶対パスです。ここで$prefixはインストールした場所です。
    TEXTDOMAIN=@PACKAGE@
    export TEXTDOMAIN
    TEXTDOMAINDIR=@LOCALEDIR@
    export TEXTDOMAINDIR
    
  3. Preparing Stringsで説明しているように、翻訳する文字列を準備します。
  4. 翻訳可能な文字列を単純にするため、コマンドによる文字列の置き換え(("`...`"または"$(...)"))や、デフォルト値が含まれる変数(例:${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"
    
  5. 個々の翻訳可能な文字列にたいして、出力コマンド‘echo’や‘$echo’を、‘gettext’(文字列にシェル変数の参照が含まれない場合)や‘eval_gettext’(シェル変数を参照する場合)に変更して、その後ろに引数を指定しない‘echo’コマンドを記述します(これは行末の改行のためです)。pluralを扱う場合は同様に、‘echo’コマンドを‘ngettext’または‘eval_ngettext’の呼び出しに置き換えて、後に引数なしの‘echo’コマンドを記述します。

    この変更を行う際には、シェル変数への参照の前にある$記号をエスケープするためのバックスラッシュを追加する必要もあります。そうすれば‘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\"`"