シェルスクリプト内部で翻訳メッセージを出力したい場合は、 gettext(1) コマンドを使用します。メッセージ処理によって翻訳メッセージを用意し、表示させるための手順は次のとおりです。第 5 章「メッセージ処理」で紹介した catgets() を用いる場合とは、翻訳メッセージを格納するファイルの構造が異なりますので注意してください。
テキストドメインおよび翻訳メッセージを指定します。
テキストドメインはメッセージが属する集合です。テキストドメインを単位にして、メッセージファイルが作成されます。echo や printf などで出力すべきメッセージは、 gettext(1)コマンドを介して取得されます。その際 gettext の引数として、メッセージオブジェクトおよびデフォルトのメッセージを指定します。デフォルトメッセージはメッセージオブジェクトを検索する際のインデックスとして用いられるほかに、対応する翻訳メッセージが取得できなかった場合に表示される文字列になります。なお、動作ロケールが C の場合は、gettext は常にデフォルトメッセージを表示します 。
gettext 'my_domain' "Usage: Test <args> ...¥n"
prt_total() {
str=`gettext 'sample' "Total:"`
printf "%s %s¥n" "$str" $1
}
「ポータブルオブジェクト」と呼ばれるテキストファイルを作成します。
ポータブルオブジェクトファイルは複数のテキストドメインをまとめて格納できます。各テキストドメインは domain "domainname" という行により区切られます。また各行は msgid "message_identifier"、msgstr "messagestring" の対で表されます。msgid 行に現われたメッセージを翻訳し、msgstr 行に記述します。詳しい表記形式については msgfmt(1) のマニュアルページを参照してください。これらのファイルは接尾辞 .po を付けたファイル名で保存するとわかりやすいでしょう。
sun% cat my_message.orig domain "my_domain" msgid "Usage: my_script <args> ... ¥n" msgstr "使用方法 : my_script 引数 ... ¥n" msgid "arg is" msgstr "引数は"
ポータブルオブジェクトファイルに msgfmt コマンドを適用し、「メッセージオブジェクト」と呼ばれるバイナリファイルを作成します。
メッセージオブジェクトはロケールに依存します。入力したポータブルオブジェクトファイルが複数のテキストドメインを持つ場合、そのドメインの数だけメッセージオブジェクトファイルが作成されます。これらのファイルはmsgfmt コマンドにより接尾辞 .mo を付けたファイル名を持ちます。msgfmt コマンドの詳細についてはマニュアルページを参照してください。
sun% ls my_domain* my_domain.po sun% msgfmt my_domain.po sun% ls my_domain* my_domain.mo my_domain.po
メッセージオブジェクトをインストールします。
アプリケーションスクリプト内部で翻訳メッセージを参照する場合は、手順 1 のように gettext コマンドを使用します。その際に TEXTDOMAIN 環境変数を利用して、参照すべきテキストドメインを指定します。テキストドメインファイルは、通常、システムのデフォルトのディレクトリ (/usr/lib/locale/lang/LC_MESSAGES) 以下を検索しますが、TEXTDOMAINDIR 環境変数を使用して検索ディレクトリを変更することもできます。詳細については gettext(1) のマニュアルぺージを参照してください。
sun% cat my_script.sh
#!/usr/bin/sh
LANG=${LANG:="C"}
export LANG
TEXTDOMAIN=${TEXTDOMAIN:='my_domain'}
export TEXTDOMAIN
help() {
gettext ${TEXTDOMAIN} "Usage: my_script ...¥n"
}
do_print() {
str=`gettext ${TEXTDOMAIN} "arg is"`
printf "%s %s¥n" "$str" $1
}
if [ $# -le 0 ]
then
help
exit 0
fi
str=`gettext ${TEXTDOMAIN} "arg is"`
while [ $# -ne 0 ]
do
do_print $1
shift
done
sun% mkdir -p /tmp/ja/LC_MESSAGES
sun% cp my_domain.mo /tmp/ja/LC_MESSAGES
sun% setenv TEXTDOMAINDIR /tmp
sun% chmod 755 my_script.sh
sun% locale
LANG=ja
LC_CTYPE="ja"
LC_NUMERIC="ja"
LC_TIME="ja"
LC_COLLATE="ja"
LC_MONETARY="ja"
LC_MESSAGES="ja"
LC_ALL=
sun% ./my_script.sh
使用方法: my_script 引数 ...
sun% env LANG=C ./my_script.sh
Usage: my_script ...
sun% ./my_script.sh 子 丑 寅
引数は 子
引数は 丑
引数は 寅
sun% env LANG=C ./my_script.sh Jan Feb Mar
arg is Jan
arg is Feb
arg is Mar