この章では、シェルスクリプトに対するロケール環境の設定とメッセージ処理コマンドを紹介し、その利用方法を説明します。
これまでの章では、主にバイナリアプリケーションでの日本語処理について説明してきました。一方で、Solaris は、XPG 準拠の国際化されたコマンド・ユーティリティを多数提供しています。これらを組み合わせることで、日本語を扱うシェルスクリプトを容易に作成できます。また、Solaris のメッセージ用コマンドを利用して、シェルスクリプト内部のメッセージに対してロケールに応じた翻訳メッセージを表示することができます。
スクリプトファイルから各コマンド・ユーティリティを起動して日本語を適切に処理したり、エラーメッセージなどを日本語で表示するには、スクリプトを実行するシェルの動作ロケールを正しく設定し、各コマンド・ユーティリティが処理を行えるような環境を用意する必要があります。この処理は、一連のロケール環境変数を設定することで行えます。シェルに対してロケールを設定する方法については、『JFP ユーザーズガイド』の第 3 章を参照してください。
シェルスクリプト内部で翻訳メッセージを出力したい場合は、 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