Freeciv.org ジャパン
Advertisement

翻訳 | 地域化 | 国際化 | navbarの編集


ここではgettextシステムの概要のみを説明します。より完全で正確な情報については、gettextのinfoページを参照してください。

gettextはFreecivが使用している国際化/地域化システムです。

.poファイルフォーマットの基本[]

.poファイルは人が編集可能なテキストファイルです。1カラム目に文字'#'がある行はコメント行で、行の終端までがコメントになります。gettextプログラムでは、特殊な"フラグ"や有益な情報を示すためにもコメント行が使用されます。

すべての.poファイルには"エントリ"が含まれています。1つのエントリは、翻訳が必要な文字列それぞれに対応しています。

典型的なエントリは以下のようになります。

#: client/civclient.c:104 server/civserver.c:242
   #, c-format
   msgid "Usage: %s [option ...]\n"
   msgstr "Utilisation: %s [option ...]\n"

エントリの第1行は"#:"で始まっていますが、これは翻訳対象文字列がソースコード内で含まれている場所をすべて挙げたリストになっています。リストが複数行になる場合もあります。

第2行は"#,"で始まっていますが、ここには"フラグ"が含まれています。フラグ行は常に存在するわけではありません。今回のケースでは、フラグが1つのみ(", c-format")指定されています。このフラグは、翻訳対象文字列がCフォーマットの文字列であることを意味しています。

第3行は"msgid"で始まっていますが、これは翻訳対象の英語文字列です。この文字列は複数行にわたることもあります。たとえば以下のようになります。

msgid ""
   "Usage: %s [option ...]\n"
   "Valid options are:\n"

第4行は"msgstr"で始まっていますが、これは翻訳後の文字列です。この文字列は複数行にわたることもあります。たとえば以下のようになります。

msgstr ""
   "Utilisation: %s [option ...]\n"
   "Les options valides sont:\n"


gettextの3種のプログラム: 'xgettext'、'msgmerge'、'msgfmt'[]

(以下の"make"コマンドは、'./configure'を済ませていることを仮定しています)


xgettext[]

翻訳対象となる文字列は、"マーク付け"をしたソースファイルから'xgettext'プログラムが自動的に抽出します。ソースファイルが正しくマーク付されているかを確認するのはプログラマーの仕事です。

慣例として、'xgettext'は'<パッケージ>.pot'という名前のファイルを生成します(私たちの場合は'freeciv.pot'となります。ビルド後に'./po'ディレクトリ内で確認できます)。'freeciv.pot'をリビルドするには、cdで'./po'ディレクトリに移動し、"make freeciv.pot"と入力します。


msgmerge[]

ただし、'freeciv.pot'は「空っぽの」地域化ファイルです('.po'ファイルと同じフォーマットですが、"msgid"文字列があるだけで"msgstr"文字列は含まれていません)。今度は、"新しい"'freeciv.pot'ファイルと、手持ちの"既存の"'<言語>.po'ファイルを"マージ"します。これは'msgmerge'プログラムの仕事です。

やはり慣例として、'msgmerge'は'<言語>.pox'という名前のファイルを生成します(たとえば'de.pox')。'<言語>.pox'をビルドするには、cdで'./po'ディレクトリに移動し、"make <言語>.pox"と入力します(たとえば"make de.pox")。こうすると、既存の'<言語>.po'と新しい'freeciv.pot'を読み込んで、マージした新しい'<言語>.pox'ファイルを生成します。

ここで、新しい'<language>.pox'を'<language>.po'にmoveすれば古いファイルが置換され、編集を始められるようになります(たとえば"mv de.pox de.po")。

'msgmerge'は、新たなファイルのエントリのいくつかにフラグを付けます。フラグの意味を覚えておいてください。

  • ", fuzzy"(あいまい)というフラグが付いたエントリは、「よく似ているけれども正確にはマッチしてない」ということを意味します。あいまいなエントリは'msgfmt'('.po'ファイルを読み込んでランタイム用の'.gmo'ファイルを生成するプログラム)によって翻訳されることはありません。ですから、翻訳の際は"あいまい"なところを探し、翻訳が正しくなっているか確認した上で、そのエントリの", fuzzy"フラグ(他にフラグがなければフラグ行ごと)を削除してください。

注: すべての'.po'ファイルにはあいまいエントリが必ず1つ存在します。それはファイルの先頭にあり、"msgid"の文字列が空になっているエントリです。

#, fuzzy
   msgid ""
   msgstr ""
   "Project-Id-Version ...

このエントリの"#, fuzzy"フラグは決して削除してはいけません。これはフェイクエントリです。ここを翻訳可能にしてしまうと、ランタイムライブラリを混乱させてしまいます。

  • 場合によっては、古いエントリがまるごと("#~"を使用して)コメントアウトされることがあります。これは新しい'.pot'ファイルにまったくマッチするものがないエントリです。'msgmerge'はそれらのファイルをファイル内に残した上でコメントアウトします。これは、新しい文字列を訳す際に役立つかもしれないからです。それらの古い翻訳がもう必要ないと判断できる場合は、削除してしまってもかまいません。


msgfmt[]

新しい'.po'ファイルの編集が終わったら、'msgfmt'を使用して、'<言語>.gmo'という名前のランタイム翻訳ファイルを生成します。'<言語>.gmo'をビルドするには、cdで'./po'ディレクトリに移動し、"make <言語>.gmo"と入力します(たとえば、'pt.gmo'をビルドする場合は"make pt.gmo")。Freecivを完全ビルドした場合には、すべての'.gmo'ファイルもビルドされます。


.poファイルをチェックする2つの方法[]

'msgfmt'には、デフォルト以上に細かくチェックする機能があります。"-c"パラメータは言語特有のチェックを要求するものです。たとえば、'./po'ディレクトリで"msgfmt -c -o junk.gmo <言語>.po"と入力します。すると、Cフォーマット文字列の翻訳時に発生するエラーを表示します。

残念ながら、Freecivで "msgfmt -c"をすると、実際には問題にならないことが問題として報告されることがあります。そこで、Freecivでは独自の'.po'ファイルチェッカー'check_po.pl'を用意しています。

'check_po.pl'は'./po'ディレクトリにあります。'./po'ディレクトリから実行するには、"./check_po.pl <言語>.po"と入力します。すると、'.po'ファイル内のエラーが表示されます。このエラーには、実際に問題となるであろうものが挙げられます。


作成した.gmoファイルをソースツリー内で使用する方法[]

私はいつもソースツリー内から実行しています(テストのためだけにインストールしたくはないのです)。私がしている方法はエレガントではないですが、使えているのでいいのです。すべてのロケールディレクトリから、私の開発ディレクトリ内のそれぞれの'.gmo'ファイルへのシンボリックリンクを作成します。たとえば以下のようになります(環境によってパスは異なります)。

su   # パーミッション確保
 cd /usr/local/share/locale/<言語>/LC_MESSAGES
 ln -s ~/prj/freeciv/po/<言語>.gmo freeciv.mo
 exit

(リンクは'freeciv.mo'と呼ばれていますが、これがリンクしているファイルはあなたが作成した'<言語>.gmo'になっていることに注意してください)

これで、'<言語>'ロケールをテストしたいと思ったら、以下のようにすればよくなりました。

LANG=<言語> ./ser ...

あるいは

LANG=<言語> ./civ ...

バージョン2.6の場合[]

ソースが.moファイルを探している場所に注意を払う必要があります。 これを行うには、ユーティリティディレクトリのMakefileを確認する必要があります。 現在${datarootdir}/localeであるLOCALEDIRの値を見つけたいと考えています。 datarootdirは${prefix}/shareで、プレフィックスは/usr/localです。 したがって、ソースは/usr/local/share/localeでmoファイルを探しています(現在のディストリビューションはおそらく別のディレクトリを使用しています。これで問題ありません)。 ソースから再生するには、必要に応じてすべての変数を設定する2つのスクリプトからfreecivを呼び出す必要があります。

sudo mkdir /usr/local/share/locale
sudo mkdir /usr/local/share/locale/<言語>
sudo mkdir /usr/local/share/locale/<言語>/LC_MESSAGES
sudo ln -s ~/prj/translations/freeciv/<言語>.gmo /usr/local/share/locale/<言語>/LC_MESSAGES/freeciv.mo
sudo ln -s ~/prj/translations/nations/<言語>.gmo /usr/local/share/locale/<言語>/LC_MESSAGES/freeciv-nations.mo

現在freeciv.moとfreeciv-nations.moの2つの.moファイルがあるため、指示は次のようになります。

./fcser ...    #オプションを設定してサーバーを立ちあげます

./fcgui ...    #クライアントオプションを加えます。たとえば -t amplio
Advertisement