この描出は,2008年2月2日投稿の旧ブログ記事を再録したものです。長らく更新されていませんので,最新の情報は著者のページからお探し下さい。
WordPress は、gettext を利用して多言語に対応しています。
WordPress 上の日本語で表示されている見出しやメッセージ類を変更したい場合や、未訳部分を日本語化したい場合などには、gettext に関する多少の知識が必要になります。
本記事では、WordPress を利用していて、日本語化部分を少し修正できればいいという方から、gettext の仕組みをある程度理解したい方までを対象に、段階的に gettext への理解が進むような解説を心がけています。
gettext とは
gettext とは、ソフトウェアの利用者に対して表示される定型文などの言語を、利用者の母国語などに合わせて簡単に翻訳文に差し替えるための仕組みを実現する、ライブラリ (システム側で用意するもの) とツール一式 (利用者側で使用するもの) のことを差します。
WordPress では PHP-gettext というライブラリを利用して、この仕組みを提供しています。
これによって、一般のブログ運用者でも gettext のツールを利用すれば、ソフトウェア内部の仕組みに立ち入らずに割と簡単に翻訳内容を修正することができます。
gettext ツールは UNIX 向けの GNU gettext が主流です。Windows では、PoEdit という直感的に操作できるものもあります (MMRT daily life さんのページで解説されています)。Windows 上で GNU gettext を使用したい場合は、Cygwin を導入するか、移植版を利用することになります。
既存の翻訳を修正したい場合
WordPress Japan で配布されている日本語版 WordPress (ME 2.2.3) を例にとり、既に表示されている日本語文を修正する手順を見ていきます。
(インストール先) wp-content/languages/ に ja.po と ja.mo というファイルがあります。それぞれ拡張子と同じく PO ファイル、MO ファイルと呼ばれており、次のような役割があります。
- PO ファイル (Portable Object File, 可搬データファイル)
- 後述の MO ファイルを作成するために、人間が翻訳内容を直接編集できるテキストファイルです。テキストファイルなので、MO ファイルがシステムに依存するのに対し、可搬 (Portable) 的といいます。メッセージ・カタログとも呼ばれ、翻訳対象とする文字列と翻訳後の文字列が一覧になっています。
- MO ファイル (Machine Object File, 機械データファイル)
- プログラムが翻訳内容を効率的に読み込むために数値的に記録されたバイナリファイルです。最終的にプログラムが適用する翻訳内容はこのファイルに基づきます。
実際に翻訳内容を修正するためには最低限、PO ファイルを編集し、それを gettext ツールによって MO ファイルへ変換するという作業が必要になります。なお、本記事ではGNU gettext を使って解説していきますが、この基本的な流れはどのツールを利用しても共通です。
PO ファイルの書式
PO ファイルをテキストエディタなどで覗いてみると、このような形式で翻訳前・翻訳後の文が羅列されています。
#: wp-content/themes/abc/index.php:11 msgid "This is a translatable string." msgstr "これが可訳文字列です。"
このうち、重要なのは "msgid" と "msgstr" で始まる二つの行です。プログラムのソースファイル中で翻訳対象として記述された「可訳文字列」(translatable string, 翻訳可能な文字列の意) が msgid の行に抽出されています。翻訳者は msgstr の行で、可訳文字列に対する翻訳後の文字列を記述します。この二つの行は必ず対で、翻訳前後の文字列を表わすようになっています。
"#" で始まる行はコメントです。コメントにはいくつか種類がありますが、いずれも読み手に情報を与えるためのもので、システム上の意味は通常ありません。翻訳上の必要が生じた時に参照します。
- "#" は通常のコメント。
- "#:" はその可訳文字列が抽出された元のファイル名と行番号。
- "#." はソースファイルから抽出されたコメント。主にプログラム開発者が翻訳者に対して記述しておいた補足や注意書きが抽出されている。
- "#," は書式。php-format と書かれていれば PHP の書式を適用するという意味。
WordPress ME の ja.po ファイルには、Default テーマや Classic テーマ、付属のプラグインなどの可訳文字列が抽出されているので、どの英語をどういう日本語に訳しているのか、ということがこのファイルを見れば分かります。念のため ja.po ファイルのバックアップを取り、msgstr で始まる行の文を好きなように書き換えてみても大丈夫です (msgid で始まる行は変更しないで下さい)。
MO ファイルを作る
PO ファイルは翻訳作業を行なうためのファイルです。PO ファイルを書き換えるだけでは、プログラムに新しい翻訳内容は反映されません。修正した翻訳内容を反映させるには、PO ファイルをもとに作成した MO ファイルがプログラム指定の場所に置かれている必要があります。WordPress ME では ja.po と同じ場所に ja.mo というファイルを置きます。
MO ファイルは、 GNU gettext を使う場合、付属の msgfmt というコマンドで作成します。msgfmt は下記の要領で使います。
$ msgfmt -o [作成する MO ファイル名] [PO ファイル名]
WordPress ME の場合、ja.po と同じディレクトリに移動して、下記のように実行します。
$ msgfmt -o ja.mo ja.po
これで修正した PO ファイルにもとづいた MO ファイルが作成され、プログラムに翻訳内容が反映されるようになります。
新しく可訳文字列を指定する
これまでの方法で、すでに用意されている (PO ファイルに抽出されている) 可訳文字列を修正することは出来ます。しかし、プログラム中のある文字列が可訳文字列かどうか、ということは逐一プログラムのソースファイル中で指定する必要があり、これは当該プログラム開発者の翻訳者に対する配慮に依っています。特に WordPress の場合、一般にブログ等として公開されるページデザインの全ては「テーマ」という単位で定義するため、利用したテーマが海外製で多言語化に配慮されていないと、当然ほとんどの部分が元の言語のまま表示されます。
こういう場合は、ソースファイルを修正して目的の文字列を可訳文字列として指定する以外ありません。幸い、WordPress は PHP で作られているので、HTML コードを修正する感覚でこうした作業ができます。可訳文字列の指定は文字列を特定のキーワード関数の引数として指定するだけです。
WordPress で可訳文字列の指定に使用するのは以下の二つのキーワード関数です。
<dl> <dt>_e()</dt> <dd>可訳文字列を標準出力 (echo) する関数。ただ単にその文字列を表示したい時に用いる。関数内で引数になっている文字列の指定には使えない。</dd> <dt>__()</dt> <dd>可訳文字列を戻り値として返す関数。その文字列を別の関数に引数として渡したい時に用いる。単体で使うだけでは何も出力 (表示) されない。</dd> </dl>ここではソースファイル
(インストール先) wp-content/themes/default/index.php
を参考にして、実際にどのように修正すればよいかを説明します。
<div class="entry"> <?php the_content('Read the rest of this entry »'); ?> </div>
これはエントリを出力する the_content() 関数の例です。この関数の第一引数へは、エントリ一覧などで長い文章を省略するときに全文へのリンクになっている、「続きを読む」のような文を指定します。これを可訳文字列に指定したい場合は、別の関数への引数としての指定なので __() 関数を使用します。
<div class="entry"> <?php the_content(__('Read the rest of this entry »')); ?> </div>
これで、__() 関数で指定された可訳文字列が、__() 関数の戻り値として the_content() 関数に渡されることになります。
<h2 class="center">Not Found</h2> <p class="center">Sorry, but you are looking for something that isn't here.</p>
一方、こちらはエントリが見つからなかった場合に表示される文です。これは、PHP 文ではなく単に HTML コードとして書かれています。この場合は単純にそのまま表示される文字列を可訳文字列に置き換えたいだけなので、指定したい箇所を PHP 文にして __e 関数を使用します。
<h2 class="center"><?php _e('Not Found') ?></h2> <p class="center"><?php _e('Sorry, but you are looking for something that isn't here.') ?></p>
あとは、下記のように PO ファイルでこれらの可訳文字列に対応する翻訳文を設定し、MO ファイルを作成すればよいです。後述するように gettext には、ソースファイル中の可訳文字列を自動的に抽出して PO ファイルの雛形を作成するコマンドがありますが、ここでは簡単に効果を確かめるため、既存の ja.po ファイルに手入力で追記する例を示します。このようにしても、各可訳文字列に対する翻訳文が適用されます。msgid に指定する文字列は、キーワード関数に渡した文字列と同じにしなくてはなりません (msgid は当の可訳文字列を識別する ID という意味です)。
# test msgid "Read the rest of this entry »" msgstr "続きを読む »" msgid "Not Found" msgstr "見つかりません" msgid "Sorry, but you are looking for something that isn't here." msgstr "ごめんなさい。お探しのものはここにはありません。"
ソースファイルから可訳文字列や特定のコメントを抽出する xgettext コマンドの使い方、テーマ別に PO ファイルを用意する方法などの解説は「その2」に続きます。
2008/2/28 修正