UI のメッセージを翻訳する

Oct. 31, 2007.
Michael Stauber

Abstract

BlueQuartz がベースにしている Sausalito アーキテクチャでは、 全てのメッセージデータはプログラム(PHPなど)とは独立に保持されています。 つまり要求に応じて他の言語に翻訳することができます。

このノートはフランス語を例に、他の言語に翻訳する方法について説明しています。

このノートは coba-e #11012 に投稿された記事に基づいています。 投稿者は Michael Stauber さんです。 これを Yutaka Yasuda (Cobalt Users Group) が日本語に訳しました。
日本語に訳したほうがありがたいような人は翻訳なんてしません、という気もしますが、 おそらくこのドキュメントは自分でメッセージを追加したい人、 メッセージをカスタマイズしたい人にも有益と思えるので、この際訳しておこうと思います。



メッセージファイル

ランゲージ・サポートは一般的な I18n の方法に基づいています。 つまり言語に関するファイルは /usr/share/locale/<LANG>/LC_MESSAGES/ ディレクトリに配置されています。

English:
/usr/share/locale/en/LC_MESSAGES/

Japanese:
/usr/share/locale/ja/LC_MESSAGES/

GUI のあるソフトウェアパッケージには、それぞれ自分用のランゲージ・ファイルがあります。
base-vsite.mo -- base-vsite 用(サイト管理処理)
base-user.mo -- base-user 用(ユーザ管理処理)
... といった具合です。
英語用のファイルを見てもらえれば、それほど多くないファイルがそこに確認できると思います。

*.mo ファイルは直接編集できない点に注意してください。 gettext 関連のプログラムを使って復号して、いったんプレインテキストに戻す必要があります。



翻訳する

さてどうやって翻訳するかというと、、

まずは /usr/share/locale/en/LC_MESSAGES/*.mo ファイルを全部別のディレクトリにコピーしましょう。 例えば:

mkdir /home/my-translation
cp /usr/share/locale/en/LC_MESSAGES/*.mo /home/my-translation/
rm /home/my-translation/_swupdate* 

それから gettext をインストールします。

yum install gettext

次にひとつひとつテキストファイルに復号していきます。 msgunfmt コマンドを使って行います。

msgunfmt base-user.mo -o base-user.po

この例は base-user.mo を復号して、そのプレインテキスト版を base-user.po という名前で残します。

次にこの base-user.po ファイルをエディットして、中身の英語をフランス語に置き換えます。 すべての *.po ファイルについてすべて翻訳する必要があります。

*.po ファイルの中身を見ると、たとえばこういった感じになっています。

msgid "ipAddr"
msgstr "IP Address"

msgid "ipAddr_help"
msgstr "This is the IP address of the site."

先頭の msgid は msgstr が含んでいる文字列の識別子(id)を意味します。 つまり GUI プログラムが msgid を指定すると、これに対応する msgstr が表示されるのです。

msgid の後ろに _help という名前が付いていた場合、これはいわゆるヘルプメッセージ用です。 ユーザーが設定項目の上にマウスをもっていったときに、管理画面の最下段のフレームに表示されるものです。

例えばもしあなたが管理画面の「IP アドレス」の項目にマウスを持っていくと、 ipAddr_help で指定されたメッセージが画面下端に表示されることになります。



インストール

さて全部のファイルについて訳し終えたら、これを以下の方法で書き戻します。

msgfmt base-user.po -o base-user.mo

それが済んだら、全ての *.mo ファイルを正しい位置(ディレクトリ)にコピーします。

cp /home/my-translation/*.mo /usr/share/locale/fr/LC_MESSAGES/

見ての通り、このコマンドはフランス語に対応する fr ディレクトリにコピーしています。

もし目的の言語が違う場合は、そのディレクトリ名は正しく ISO-639 の2文字言語コードに一致するように決定してください。
例えば Code for the representation of names of languages などに情報があります。



実験

さて新しいランゲージ・ファイルが GUI で使えるようになったでしょうか? しかしいまのところでは 「個人プロフィール >> アカウント情報 >> 言語設定」 メニューには英語と日本語しか出てきていません。

以下のコマンドを実行してください。

/usr/sausalito/bin/cceclient

これによって CODB (Cobalt Object Database) を操作するための cceclient を起動します。 CODB は GUI などが各種の設定情報を保存するために使っています。 操作のためには対象となる "System" クラスのオブジェクトの ID を知る必要があります。

以下のように反応があるはずです。

100 CSCP/0.80
200 READY

そこで以下のようにタイプします。

find System

以下のような返事が戻るでしょう。

104 OBJECT 1
201 OK

ここで "System" クラスにオブジェクト ID 1 が存在することがわかります。 このオブジェクトが何を含むのか見てみましょう。

get 1

その中になにが格納されているかが示されます。

102 DATA productBuild = "5102R"
102 DATA NAMESPACE = ""
102 DATA productIdentity = "20061012"
102 DATA CLASSVER = "1.2"
102 DATA isRegistered = "0"
102 DATA CLASS = "System"
102 DATA gateway = "192.168.0.1"
102 DATA serialNumber = ""
102 DATA domainname = "smd.net"
102 DATA productName = "BlueQuartz 5100R Series"
102 DATA productBuildString = "build 20061012 for a 5102R in en_US"
102 DATA isLicenseAccepted = "1"
102 DATA OID = "1"
102 DATA productLanguage = "en"
102 DATA productSerialNumber = ""
102 DATA console = "1"
102 DATA productVendor = ""
102 DATA dns = "&192.168.2.1&192.168.10.1&68.166.46.236&"
102 DATA hostname = "cbq"
102 DATA locales = "&ja&en&"
201 OK

以下の一行
102 DATA locales = "&ja&en&"
が我々が探しているものです。 つまり "System" オブジェクトには "locales" エントリがあり、 ここには日本語を意味する ja と英語を意味する en しかありません。 フランス語を加えてみましょう。

set 1 locales = "&ja&en&fr&"

結果は、、、

201 OK

これで変更結果が反映されるはずです。

さて(念のために) CCEd をリスタートしてから結果を見ましょう。

/etc/init.d/cced.init restart
/etc/init.d/admserv restart

さて管理画面にログインして、 「個人プロフィール >> アカウント情報 >> 言語設定」 メニューにフランス語が加わっており、それを選択できることを確認しましょう。

同様にして "productLanguage" も "en" から "fr" に変更することもできるのですが、 その方法はまたちょっと別のコマンドラインによる調整が必要になるのでここでは説明しません。



うまくいきましたら....

もしうまく翻訳作業が完了しましたら、その結果をぜひ BlueQuartz プロジェクトに提供して下さい。 連絡お待ちしております。



[BACK]