JFP 開発ガイド

第 6 章 シェルスクリプトの国際化と日本語化

この章では、シェルスクリプトに対するロケール環境の設定とメッセージ処理コマンドを紹介し、その利用方法を説明します。

概説

これまでの章では、主にバイナリアプリケーションでの日本語処理について説明してきました。一方で、Solaris は、XPG 準拠の国際化されたコマンド・ユーティリティを多数提供しています。これらを組み合わせることで、日本語を扱うシェルスクリプトを容易に作成できます。また、Solaris のメッセージ用コマンドを利用して、シェルスクリプト内部のメッセージに対してロケールに応じた翻訳メッセージを表示することができます。

国際化に影響するロケール環境変数

スクリプトファイルから各コマンド・ユーティリティを起動して日本語を適切に処理したり、エラーメッセージなどを日本語で表示するには、スクリプトを実行するシェルの動作ロケールを正しく設定し、各コマンド・ユーティリティが処理を行えるような環境を用意する必要があります。この処理は、一連のロケール環境変数を設定することで行えます。シェルに対してロケールを設定する方法については、『JFP ユーザーズガイド』の第 3 章を参照してください。

スクリプトのメッセージ処理

シェルスクリプト内部で翻訳メッセージを出力したい場合は、 gettext(1) コマンドを使用します。メッセージ処理によって翻訳メッセージを用意し、表示させるには、次の手順に従ってください。なお、第 5 章「メッセージ処理」で紹介した catgets() を使用する場合とは、翻訳メッセージを格納するファイルの構造が異なっていることに注意してください。

  1. テキストドメインと翻訳メッセージを指定します。

    テキストドメインはメッセージが属する集合です。テキストドメインを単位にして、メッセージファイルが作成されます。echoprintf などで出力するメッセージは、 gettext(1)コマンドを介して取得されます。その際 gettext の引数として、メッセージオブジェクトとデフォルトのメッセージを指定します。デフォルトメッセージはメッセージオブジェクトを検索する際のインデックスとして使用されるほか、対応する翻訳メッセージが取得できなかった場合に表示される文字列になります。なお、動作ロケールが C の場合、gettext は常にデフォルトメッセージを表示します 。

    gettext 'my_domain' "Usage: Test <args> ...¥n"
    prt_total() {
    		str=`gettext 'sample' "Total:"`
    		printf "%s %s¥n" "$str" $1
    }

  2. 「ポータブルオブジェクト」と呼ばれるテキストファイルを作成します。

    ポータブルオブジェクトファイルには、複数のテキストドメインをまとめて格納できます。各テキストドメインは 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 "引数は"

  3. ポータブルオブジェクトファイルに 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

  4. メッセージオブジェクトをインストールします。

    アプリケーションスクリプト内部で翻訳メッセージを参照する場合は、手順 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