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