ploneサイトをインストールすると、最初から「ホーム」「ナビゲーション」など最初から日本語で表示されると思います。 これは、日本語を受け取れますよ(Accept-Language)と指定したWeb browserに対して、ploneは日本語に対応しているので日本語のページを返してくれているのです。
例えば、Web browserの受け取る言語をスペイン語としたとします。 (これは Firefox での設定画面例です。)
すると、このようにスペイン語で表示されるようになります。
このようにploneは最初から国際化(internatinalisation: 略して i18n と言われます)対応しており、現在対応済みの言語の数は Existing Translations のページによると42言語となっています。
このploneの国際化機能は、ploneをインストールするときに一緒にインストールした 付属するプロダクト のPlacelessTranslationServiceによって実現されています。
先ほど説明した通り、ploneサイトの国際化はPlaselessTranslationService(以下 PTS)というプロダクトによって実現されています。 このPTSは、plone用のプロダクトではなくZope 2で国際化を行なうためのプロダクトです。
具体的に、PTSがどのように動作して国際化を実現しているかというと、このような手順になっています。
ここでは、zopeサーバ起動時にPTSが行なっている国際化の準備処理について説明します。
__init__.py)が実行されます。i18n というディレクトリが存在するかを調べます。i18n ディレクトリが存在したら、その下の *.po というファイルを探します。 この *.po というファイルはPortable Object(.po)ファイルと呼ばれるものです。
.poファイルの中には「翻訳対象のメッセージ」と「翻訳した文字列」が対になって記述してあります。
(つまり、翻訳対象の言語の数だけファイルが存在します。)
*.po ファイルを一つ一つ読み込んで、
GettextMessageCatalog というオブジェクトを生成します。 zopeサーバ起動時に読み込まれた .poファイルの一覧は以下の手順で確認できます。
まず、zopeサーバの管理画面を表示し、Control_Panel/TranslationService を選択します。
すると、以下のように読み込んだ.poファイルの一覧が表示されます。
また、各アイテムをクリックすると、その.poファイル(を読み込んだGettext Message Catalog)の情報が表示されます。内容としては対応する言語、プロダクト、翻訳者の情報などが表示されています。
このように、各種プロダクトの国際化用.poファイルが読み込まれていることが確認できます。
zopeサーバ起動時にPTSが読み込んだ .poファイル(を元に生成したGettext Message Catalog)を使用して、どのようにページ表示時に国際化が行なわれるかについて説明します。
ページテンプレートやDTMLで作成されたページ表示時に、下記のような i18n:domain, i18n:translate, dtml-translate といったタグや属性が存在すると、PTSによって翻訳処理が行なわれます。
ページテンプレートの例:
<html i18n:domain="yourdomain">
:
<div i18n:translate="">some message</div>
<div i18n:translate="some_message">some long message..</div>
:
</html>
DTML:
<dtml-translate domain=yourdomain>some message</dtml-translate>
<dtml-translate domain=yourdomain msgid=some_message>some long message..
</dtml-translate>
上記のソースの domain と msgid の組によって、PTSが.poファイルから翻訳後の文字列(msgstr)を取得して置換処理を行います。
msgid が指定されていない場合は、タグに囲まれている文字列がそのまま msgid として使用されます。(上記の例では some message が msgid となります。)
国際化対応していないプロダクトを、PTSを使用して国際化するために必要な作業について説明します。
自分が作成したプロダクトをPTSに対応させて国際化するためには、ページテンプレートやDTMLで作成したコードを、修正する必要があります。
コードを修正するためには、まずドメイン名 domain を決める必要があります。ドメイン名には一般的にプロダクトの名前をそのまま使うようです。
次に、国際化対応させたい部分を i18n:tranlate 等の記述を行い、対象となる msgid を指定します。
なお、msgid の名前の付け方としては、以下のガイドラインに従って接頭辞をつけることをおすすめします。
(Guidelines for translators より)
<legend> タグに使用します。<label> と <a> タグです。<p> タグで囲まれます。 プロダクトのPTS対応が終わったら、次に.poファイルを作るための雛形となる
Portable Object Template(.pot)ファイルの作成を行ないます。
.potファイルのフォーマットは .po ファイルと同じですが、
翻訳した文字列(msgstr)が全て空の状態になっています。
PTSの動作上.potファイルは必ずしも作成する必要はありません。 しかし、自分が作成したプロダクトを公開して、他の言語圏の人に.poファイルを作ってもらうためには、.potファイルを作成する方がよりよいと思います。
PTSに付属する資料によると、.potファイルの作成にはいくつかの方法があるようです。
何もない状態からエディタ等を使用して、プロダクト用の .potファイルを作成します。msgid と msgstr を手作業で書き込んでいきます。
プロダクトの表示部分がZPT(Zope Page Template)で記述されている場合に、i18ndudeを使用してZPTファイルから .potファイルを作成することが出来ます。 なお、i18ndudeを使用するにはXMLパーサの pyXML が必要になります。
以下は、Fooプロダクト用のテンプレートファイルの一覧を TEMPLATES に設定し、 その後 i18ndude コマンドを使用して .pot ファイルを作成する手順を表しいています。
$ cd /var/lib/zope/Products/Foo $ TEMPLATES = `find . -name '*.?pt'` $ i18ndude rebuild-pot --pot /tmp/foo.pot --create foo $TEMPLATES
上記のどの手段も使えない場合には、PTSによって .pot ファイルを作成することができます。
その作業は以下の手順で行ないます。
i18n ディレクトリに、空の .poファイルを作成します。 まず最初に、english.po という名前の、中身が空の .poファイルを i18n ディレクトリに作成します。空といっても、最低限以下の内容を記述しておきます。
Domain には対象となるプロダクトのドメイン名を指定します。
msgid "" msgstr "" "Language-code: en\n" "Language-name: English\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Domain: MyProduct\n"
また、同じディレクトリに english.missing という空のファイルを作成しておきます。例えば、以下のようなファイルが作成されます。
/var/lib/zope/Products/MyProduct/i18n/english.po /var/lib/zope/Products/MyProduct/i18n/english.missing
english.po ファイルを読み込ませます。PTSが english.po を読み込む時にエラーメッセージが出力されていないことを確認します。english.missing に出力します。
(つまり、全画面を表示すれば全ての項目が出力されます。)english.po と english.missing を結合して、MyProduct.pot ファイルを作成します。english.po と english.missing ファイルを削除します。.potファイル(翻訳テンプレートファイル)を元に、翻訳を行なった.poファイルを作成します。
通常は、*.pot というファイル('*' にはプロダクト名が入る)が存在するはずなので、そのファイルを *-ja.po という名前でコピーして編集します。
編集の内容は翻訳した文字列(msgstr)を埋めていくことになります。
編集方法の詳細については プロダクトの日本語化 を参照してください。
作成した.poファイル(おそらく *-ja.po というファイル名になっていると思います。)を対象となるプロダクトの i18n ディレクトリに配置します。
その後、zopeサーバを再起動し、PTSに.poファイルを読み込ませます。
.poファイルが正しく記述できていれば、PTSによる変換が行なわれ日本語等で表示されるようになります。
プロダクトを日本語化するためには、まず プロダクト名-ja.po ファイルを作成する元となるファイルを決める必要があります。
どのファイルを元にするかの判断ですが、msgidが一番多いもの が一番安心かも知れません。
この元となるファイルはプロダクトにもよりますが、たいていは プロダクト名.pot という名前のテンプレートファイルがあるので、そのファイルを プロダクト名-ja.po にコピーします。(ファイル名の付け方に決まりはなく、便宜上このような名前の付け方になっています。)
また、プロダクト名.pot というファイルが存在せず、他の言語の プロダクト-言語.po というファイルが存在する場合は、そのファイルを プロダクト名-ja.po にコピーします。
作成する プロダクト名-ja.po ファイルの文字コードは UTF-8N(先頭にBOM(Byte Order Mark)のないUTF-8らしいです)、改行コードは LF とします。
他の文字コード、改行コードでも大丈夫な気もしますが、とりあえず plone-ja.po のファイル形式に合わせておきます。
準備が出来たので、poファイルの編集をはじめます。
まず最初に、この poファイルに関する情報が書いてある、先頭部分を編集します。
例えば、plone-ja.po の先頭部分は以下のようになっています。(一部書き換えてあります。):
1 # Translation of plone.pot to Japanese
2 # Gettext Message File for Plone
3 # Robert <rbh [at] okihawg.org>, 2002
4 # Yusei <yusei[at] domen.cx>, 2002
5 # Retsu <tyam [at] mac.com>, 2003-2004
6 # Mai <capibara [at] users.sourceforge.net> 2003-2004
7 msgid ""
8 msgstr ""
9 "Project-Id-Version: Plone 2.0\n"
10 "POT-Creation-Date: 2004-11-10 05:02+0000\n"
11 "PO-Revision-Date: 2004-03-24 03:57+0900\n"
12 "Last-Translator: Retsu <tyam [at] mac.com>\n"
13 "Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
14 "MIME-Version: 1.0\n"
15 "Content-Type: text/plain; charset=utf-8\n"
16 "Content-Transfer-Encoding: 8bit\n"
17 "Plural-Forms: nplurals=1; plural=0\n"
18 "Language-Code: ja\n"
19 "Language-Name: 日本語\n"
20 "Preferred-Encodings: utf-8\n"
21 "Domain: plone\n"
22 "X-Is-Fallback-For: ja-jp\n"
ここで、先頭部分の意味について記述します。
[at] みたいにした方がいいかも知れません。utf-8 にします。ja を入力します。Japanese などを入力します。utf-8 と指定します。Domain)です。(変更しません)ja-jp のみ指定します。 あとはひたすら、poファイル中に存在する msgid に対応する msgstr を入力していきます。基本的な翻訳の流れはこんな感じになると思います。
msgstr に対応する翻訳文を入力をしてpoファイルを保存します。Control_Panel/TranslationService にアクセスします。対応するGetText Message Catalogを開いて Reload this catalog ボタンをクリックします。翻訳を行なう際には、poファイルの中身を見ているだけでは、なかなか適切な訳語というのはわからないと思います。 実際にプロダクトを動作させて、どの部分にどのメッセージが出るか、翻訳したメッセージを表示させてニュアンスがおかしくないか、などチェックしながら翻訳をすすめることになると思います。
また、仮にどこにmsgstrで設定した文字列が出力されるかをチェックするために、英語のメッセージの前に (J) などをつけるとわかりやすいかも知れません。
あとは、他の言語ではどのように翻訳しているかなども参考になる場合があると思います。
Plone用のプロダクトの場合は、プロダクト名-plone.pot というファイルも i18n ディレクトリに存在する場合があります。
この翻訳ファイルはPlone側で表示する「アイテムの名前」や「アイテムの説明」「編集後のメッセージ」などを翻訳するために使用します。
よくあるPlone側で出力するメッセージとしては、下記のようなものがあると思います。
まず最初に、Pootle をインストールするのに必要な、Translate Toolkit, jToolit と Kid, ElementTree をダウンロードしてインストールします。
# wget http://translate.sourceforge.net/snapshots/jToolkit-0.7.8/jToolkit-0.7.8.tar.gz # tar xfz jToolkit-0.7.8.tar.gz # cd jToolkit-0.7.8 # python jToolkitSetup.py install # cd .. # wget http://translate.sourceforge.net/snapshots/translate-toolkit-0.10rc1/translate-toolkit-0.10rc1.tar.gz # tar xfz translate-toolkit-0.10rc1.tar.gz # cd translate-toolkit-0.10rc1 # python setup.py install # cd .. # wget http://effbot.org/downloads/elementtree-1.2.6-20050316.tar.gz # tar xfz elementtree-1.2.6-20050316.tar.gz # cd elementtree-1.2.6-20050316 # python setup.py install # cd .. # wget http://www.kid-templating.org/dist/0.9.3/kid-0.9.3.tar.gz # tar xfz kid-0.9.3.tar.gz # cd kid-0.9.3 # python setup.py install
次に Pootle 本体をインストールします。
ここでは 0.10rc1 というバージョンをインストールします。
なお、これらのツールはデフォルトでは python の site-packages の下にインストールされます。また、PootleServer コマンドが /usr/bin にインストールされます。
# wget http://translate.sourceforge.net/snapshots/Pootle-0.10rc1/Pootle-0.10rc1.tar.gz # tar xfz Pootle-0.10rc1.tar.gz # cd Pootle-0.10rc1 # python pootlesetup.py install
インストールが正常に終了すると、PootlerServer コマンドが実行できるようになります。
また、PootleServer --help とすることでヘルプが表示されます。
実際に PootleServer を動かす前に、設定ファイルを編集します。
設定ファイルには以下の二つがあります。
このうち主に pootle.prefs を編集する必要があります。
具体的な編集の箇所としては、以下の部分になると思います。
ちなみに私が使っている設定ファイルから重要な部分を抜粋するとこんな感じです。:
title = "Pootle in takanory.net"
description = "Pootle server for plone 2.1 japanese translation"
defaultlanguage = "ja"
registration:
fromaddress = "XXXXXX@takanory.net"
smtpserver = "localhost"
podirectory = "po"
projects:
pootle:
fullname = "Pootle"
description = "Web translation software"
checkstyle = "standard"
plone:
fullname = "Plone"
description = ""
checkstyle = "standard"
languages:
templates.fullname = 'Templates'
en.fullname = 'English'
ja.fullname = 'Japanese'
Pootle サーバを立ち上げるとデフォルトでは8080番ポートを使って立ち上がります。
(ここでは -p オプションでポート番号を 8180 に変更しています。)
それはいまいちなので、apache のバーチャルホスト機能と proxy 機能を使って、 http://pootle.takanory.net/ でアクセスできるようにします。
そのために、httpd.conf に以下のように記述します。:
<VirtualHost *>
ServerName pootle.takanory.net
ProxyPass /images !
ProxyPass /js !
ProxyPass /pootle.css !
ProxyPass /favicon.ico !
ProxyPass / http://localhost:8180/
ProxyPassReverse / http://localhost:8180/
<Directory proxy:http://localhost:8180/*>
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/pootle_error_log
CustomLog logs/pootle_log combined
# Fallback for static html content
DocumentRoot "/usr/lib/python2.3/site-packages/Pootle/html/"
<Directory "/usr/lib/python2.3/site-packages/Pootle/html/">
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
さて、ここまできたら PootleServer を起動します。
ここではバックグラウンドで実行、ポート番号を 8180 に変更、ログファイルを出力、また標準出力をファイルに書き出すようにして起動しています。
# PootleServer -B -p8180 -o/var/log/pootle.log > /var/log/pootle.out 2>&1
しかしこれだけでは翻訳を行うことはできません。
設定ファイルに指定したプロジェクト用の po ファイルを配置する必要があります。
po ファイルは po/プロジェクト/言語 というディレクトリを作成して、そこに配置しなければなりません。
例えば plone-ja.po というファイルは po/plone/ja というディレクトリに配置することによって初めて翻訳できるようになります。
実際に http://pootle.takanory.net/ にアクセスして、試しに翻訳してみてください。 なお、翻訳を行うためにはユーザの登録が必要です。
最初に各プロジェクトのページにアクセスしたときは、po ファイルの中身を解析して、どのくらい翻訳されているか調べたりするので少し表示に時間がかかります。気長に待ってあげてください。
pootle に関連する(参考にした)サイトです。
まず最初に、翻訳を行えるようにするためにユーザ登録を行います。
登録 をクリックします。
登録 ボタンをクリックします。
有効化 リンクをクリックして
アカウント有効化画面
を表示し、先ほどのメールに書かれていた有効化コード(activation code)を入力して
アカウントの有効化 ボタンをクリックします。
ログインに成功すると、オプションを変更 というリンクが表示されます。
そこをクリックするとユーザごとの
オプション設定画面
が表示されます。
とくに設定を行う必要はありませんが、自分が使うプロジェクトや言語を設定することがきでます。
プロジェクトや言語を設定すると、 ユーザのホームページ に指定したプロジェクトや言語へのリンクが表示されるようになります。
ここまででユーザ登録と設定は終了です。 あとは、実際に po ファイルの中身を参照して翻訳を行います。