gawk で gettext を使って翻訳する

gawk には gettext を用いた awk スクリプトの i18N 化を行うことができます。 これにより、po ファイルを準備すれば、様々な国々で翻訳を行ったものに表示を変更することができます。 もっとも、awk スクリプトでそこまでする必要のあるものがあるかどうかは疑問です。

さて、gawk では以下のようにすることで i18N 化します。

  • 変数 TEXTDOMAIN で awk スクリプトを指定する
  • 関数 bindtextdomain() で po ファイルから出力される mo ファイルの場所を指定します
  • 翻訳対象の文字列の最初に "_" (アンダースコア) を付けます
  • gawk の起動オプション gen-po を用いて po ファイルを作成します
  • po ファイルを編集します
  • msgfmt コマンドで po ファイルから mo ファイルに変換します
  • 関数 bindtextdomain() で指定した場所の対応する言語の場所にコピーします

少し面倒ですが、gettext を用いたものは大体同じ操作になります。

ここでは AWK Users JP :: エラトステネスの篩で素数を求める で使ったエラトステネスの篩を用いた素数を計算するスクリプトを用います。

#! /usr/local/bin/gawk -f
# gettext.awk
# 他国語対応テスト
# usage: gawk -f gettext.awk

BEGIN {
    TEXTDOMAIN = "gettext";
    bindtextdomain(".");

    print _"********** Count Prime Number **********";

    num = (ARGV[1] - 3) / 2;

    print _"2 is a prime number.";

    for (i = 0; i <= num; i++) {
        flag[i] = 1;
    }

    for (i = 0; i <= num; i++) {
        if (flag[i] == 1) {
            p = i + i + 3;

            printf(_"%d is a prime number.\n", p);

            for (k = i + p; k <= num; k += p) {
                flag[k] = 0;
            }
        }
    }
}

次に po ファイルを生成します。

$ gawk --gen-po -f gettext.awk > gettext.po

この gettext.po を編集します。

$ cat gettext.po
#: gettext.awk:10
msgid "********** Count Prime Number **********"
msgstr "========== 素数を数える =========="

#: gettext.awk:14
msgid "2 is a prime number."
msgstr "2 は素数です。"

#: gettext.awk:24
msgid "%d is a prime number.\n"
""
msgstr "%d は素数です。\n"

以下、ディレクトリを作成して mo ファイルをコピーします。

$ mkdir -p ja_JP/LC_MESSAGES

$ msgfmt gettext.po

$ cp messages.mo ja_JP/LC_MESSAGES/gettext.mo

さて、実行してみましょう。 ただし、私の環境は en_US.utf-8 ですので、何もしないと英語のメッセージになります。

$ gawk -f gettext.awk 10
********** Count Prime Number **********
2 is a prime number.
3 is a prime number.
5 is a prime number.
7 is a prime number.

次に環境変数 LC_ALL (面倒なので LC_ALL を使いました) を変更します。

$ LC_ALL=ja_JP gawk -f gettext.awk 10
========== 素数を数える ==========
2 は素数です。
3 は素数です。
5 は素数です。
7 は素数です。

このように表示できれば成功です。

tag_gawk.png tag_gawk.png