日本語

Ploneの日本語化ファイルの分析や、付加プロダクツを日本語化する方法について説明します。

takanori

国際化の仕組み

目次

  • ploneサイトの国際化[i18n]
  • PlacelessTranslationServiceの動作[pts]

ploneサイトの国際化[i18n]

ploneサイトをインストールすると、最初から「ホーム」「ナビゲーション」など最初から日本語で表示されると思います。 これは、日本語を受け取れますよ(Accept-Language)と指定したWeb browserに対して、ploneは日本語に対応しているので日本語のページを返してくれているのです。

例えば、Web browserの受け取る言語をスペイン語としたとします。 (これは Firefox での設定画面例です。)

Browser language setup

すると、このようにスペイン語で表示されるようになります。

Espanol plone site

このようにploneは最初から国際化(internatinalisation: 略して i18n と言われます)対応しており、現在対応済みの言語の数は Existing Translations のページによると42言語となっています。

このploneの国際化機能は、ploneをインストールするときに一緒にインストールした 付属するプロダクト のPlacelessTranslationServiceによって実現されています。

PlacelessTranslationServiceの動作[pts]

先ほど説明した通り、ploneサイトの国際化はPlaselessTranslationService(以下 PTS)というプロダクトによって実現されています。 このPTSは、plone用のプロダクトではなくZope 2で国際化を行なうためのプロダクトです。

具体的に、PTSがどのように動作して国際化を実現しているかというと、このような手順になっています。

zopeサーバ起動時[startup]

ここでは、zopeサーバ起動時にPTSが行なっている国際化の準備処理について説明します。

  1. PTSがzopeサーバにロードされ、初期化スクリプト(__init__.py)が実行されます。
  2. PTSは初期化スクリプトの中で、各プロダクトに i18n というディレクトリが存在するかを調べます。
  3. i18n ディレクトリが存在したら、その下の *.po というファイルを探します。

    この *.po というファイルはPortable Object(.po)ファイルと呼ばれるものです。 .poファイルの中には「翻訳対象のメッセージ」と「翻訳した文字列」が対になって記述してあります。 (つまり、翻訳対象の言語の数だけファイルが存在します。)

  4. 存在する *.po ファイルを一つ一つ読み込んで、 GettextMessageCatalog というオブジェクトを生成します。
  5. 2.〜4.を対象となるプロダクトがなくなるまで繰り返し実行します。

zopeサーバ起動時に読み込まれた .poファイルの一覧は以下の手順で確認できます。 まず、zopeサーバの管理画面を表示し、Control_Panel/TranslationService を選択します。

Select translation service

すると、以下のように読み込んだ.poファイルの一覧が表示されます。

List of placeless translation service

また、各アイテムをクリックすると、その.poファイル(を読み込んだGettext Message Catalog)の情報が表示されます。内容としては対応する言語、プロダクト、翻訳者の情報などが表示されています。

View plone-ja.po

このように、各種プロダクトの国際化用.poファイルが読み込まれていることが確認できます。

ページ表示時[view]

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>

上記のソースの domainmsgid の組によって、PTSが.poファイルから翻訳後の文字列(msgstr)を取得して置換処理を行います。 msgid が指定されていない場合は、タグに囲まれている文字列がそのまま msgid として使用されます。(上記の例では some messagemsgid となります。)

国際化の手順

国際化対応していないプロダクトを、PTSを使用して国際化するために必要な作業について説明します。

目次

プロダクトのPTS対応[ptstaiou]

自分が作成したプロダクトをPTSに対応させて国際化するためには、ページテンプレートやDTMLで作成したコードを、修正する必要があります。

コードを修正するためには、まずドメイン名 domain を決める必要があります。ドメイン名には一般的にプロダクトの名前をそのまま使うようです。

次に、国際化対応させたい部分を i18n:tranlate 等の記述を行い、対象となる msgid を指定します。 なお、msgid の名前の付け方としては、以下のガイドラインに従って接頭辞をつけることをおすすめします。 (Guidelines for translators より)

  • heading_ - ''タグに使用します。
  • description_ - 説明用のテキストに使用します。
  • legend_ - <legend> タグに使用します。
  • label_ - フィールドのラベルと入力時のラベルに使用します。 つまり <label><a> タグです。
  • help_ - 入力フォームに対するヘルプテキストに使用します。
  • box_ - portletの中のコンテンツに使用します。
  • listingheader_ - テーブルのヘッダです。
  • date_ - 日付/時刻関連のデータです。(例 "Yesterday", "Last week")
  • text_ - どのカテゴリーにも属さないメッセージ。たいていは <p> タグで囲まれます。
  • batch_ - 置換文字列が入る場合に使用します。(例 "全 Z 文書中 X から Y 番目を表示しています。")

翻訳テンプレートファイルを作成[pot]

プロダクトのPTS対応が終わったら、次に.poファイルを作るための雛形となる Portable Object Template(.pot)ファイルの作成を行ないます。 .potファイルのフォーマットは .po ファイルと同じですが、 翻訳した文字列(msgstr)が全て空の状態になっています。

PTSの動作上.potファイルは必ずしも作成する必要はありません。 しかし、自分が作成したプロダクトを公開して、他の言語圏の人に.poファイルを作ってもらうためには、.potファイルを作成する方がよりよいと思います。

PTSに付属する資料によると、.potファイルの作成にはいくつかの方法があるようです。

手作業[byhand]

何もない状態からエディタ等を使用して、プロダクト用の .potファイルを作成します。msgidmsgstr を手作業で書き込んでいきます。

i18ndudeを使用[i18ndude]

プロダクトの表示部分が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を使用[usepts]

上記のどの手段も使えない場合には、PTSによって .pot ファイルを作成することができます。

その作業は以下の手順で行ないます。

  1. 対象となるプロダクトの 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
    

  2. 次に、zopeサーバを再起動し、english.po ファイルを読み込ませます。PTSが english.po を読み込む時にエラーメッセージが出力されていないことを確認します。
  3. zopeサーバが再起動したら、対象となるプロダクトの追加・編集等の操作を行ないます。 すると、PTSはi18nの対象となっている部分を変換しようとして、メッセージが存在しない場合にはその内容を english.missing に出力します。 (つまり、全画面を表示すれば全ての項目が出力されます。)
  4. 全ての出力が終了したら、english.poenglish.missing を結合して、MyProduct.pot ファイルを作成します。
  5. 最後に、english.poenglish.missing ファイルを削除します。

翻訳ファイルを作成[po]

.potファイル(翻訳テンプレートファイル)を元に、翻訳を行なった.poファイルを作成します。

通常は、*.pot というファイル('*' にはプロダクト名が入る)が存在するはずなので、そのファイルを *-ja.po という名前でコピーして編集します。 編集の内容は翻訳した文字列(msgstr)を埋めていくことになります。

編集方法の詳細については プロダクトの日本語化 を参照してください。

翻訳ファイルをインストール[install]

作成した.poファイル(おそらく *-ja.po というファイル名になっていると思います。)を対象となるプロダクトの i18n ディレクトリに配置します。

その後、zopeサーバを再起動し、PTSに.poファイルを読み込ませます。

.poファイルが正しく記述できていれば、PTSによる変換が行なわれ日本語等で表示されるようになります。

プロダクトの日本語化手順

目次

  • 元となるファイルを決める[orig]
  • 文字コードと改行コード[code]
  • 先頭部分を編集[header]
  • 翻訳メッセージをひたすら入力[msgstr]
  • plone向けのpoファイル編集[plone-po]

元となるファイルを決める[orig]

プロダクトを日本語化するためには、まず プロダクト名-ja.po ファイルを作成する元となるファイルを決める必要があります。

どのファイルを元にするかの判断ですが、msgidが一番多いもの が一番安心かも知れません。

この元となるファイルはプロダクトにもよりますが、たいていは プロダクト名.pot という名前のテンプレートファイルがあるので、そのファイルを プロダクト名-ja.po にコピーします。(ファイル名の付け方に決まりはなく、便宜上このような名前の付け方になっています。)

また、プロダクト名.pot というファイルが存在せず、他の言語の プロダクト-言語.po というファイルが存在する場合は、そのファイルを プロダクト名-ja.po にコピーします。

文字コードと改行コード[code]

作成する プロダクト名-ja.po ファイルの文字コードは UTF-8N(先頭にBOM(Byte Order Mark)のないUTF-8らしいです)、改行コードは LF とします。

他の文字コード、改行コードでも大丈夫な気もしますが、とりあえず plone-ja.po のファイル形式に合わせておきます。

先頭部分を編集[header]

準備が出来たので、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"

ここで、先頭部分の意味について記述します。

  • 1-6行目: ここはコメント部分ですが、慣習として過去に翻訳した人のリストを入れるようです。
  • 9行目: このpoファイルが対応するプロダクトの名前です。(変更しません)
  • 10行目: potファイルが作成された日です。(変更しません)
  • 11行目: このpoファイルの編集した日です。編集終了後に入れましょう。
  • 12行目: このpoファイルを最後に編集した人(自分)の名前を入れます。 メールアドレスは '@' を [at] みたいにした方がいいかも知れません。
  • 13行目: poファイルを翻訳したチームの名前を入れます。チームがない場合は12行目と同じ内容を入れておけばよいと思います。
  • 15行目: 文字コード等の指定です。文字コードは utf-8 にします。
  • 18行目: 言語のコードを指定します。日本語なので ja を入力します。
  • 19行目: 言語名を指定します。'日本語' または Japanese などを入力します。
  • 20行目: なんの指定かよくわかりませんが utf-8 と指定します。
  • 21行目: このpoファイルの関連する範囲(Domain)です。(変更しません)
  • 22行目: WebブラウザのAccept Languageの指定かな?と思われます。 ja-jp のみ指定します。

翻訳メッセージをひたすら入力[msgstr]

あとはひたすら、poファイル中に存在する msgid に対応する msgstr を入力していきます。基本的な翻訳の流れはこんな感じになると思います。

  1. msgstr に対応する翻訳文を入力をしてpoファイルを保存します。
  2. ZMIで対応する Control_Panel/TranslationService にアクセスします。対応するGetText Message Catalogを開いて Reload this catalog ボタンをクリックします。
  3. するとpoファイルの中身がZopeサーバに再読み込みされます。
  4. 翻訳文が表示されるべきページを表示して、翻訳結果を確認します。
  5. 全部の翻訳が終わるまで 1. に戻ります。

翻訳を行なう際には、poファイルの中身を見ているだけでは、なかなか適切な訳語というのはわからないと思います。 実際にプロダクトを動作させて、どの部分にどのメッセージが出るか、翻訳したメッセージを表示させてニュアンスがおかしくないか、などチェックしながら翻訳をすすめることになると思います。

また、仮にどこにmsgstrで設定した文字列が出力されるかをチェックするために、英語のメッセージの前に (J) などをつけるとわかりやすいかも知れません。

あとは、他の言語ではどのように翻訳しているかなども参考になる場合があると思います。

plone向けのpoファイル編集[plone-po]

Plone用のプロダクトの場合は、プロダクト名-plone.pot というファイルも i18n ディレクトリに存在する場合があります。

この翻訳ファイルはPlone側で表示する「アイテムの名前」や「アイテムの説明」「編集後のメッセージ」などを翻訳するために使用します。

よくあるPlone側で出力するメッセージとしては、下記のようなものがあると思います。

  • アイテム名 → 日本語のアイテム名
  • (アイテム名) has been created. → (アイテム名)が作成されました
  • (アイテム名) changes save. → (アイテム名)の変更が保存されました
  • Edit (アイテム名) → (アイテム名)を編集

pootle セットアップ

目次

インストール[install]

まず最初に、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 とすることでヘルプが表示されます。

設定ファイル[prefs]

実際に PootleServer を動かす前に、設定ファイルを編集します。 設定ファイルには以下の二つがあります。

  • pootle.prefs 立ち上げる Pootle サーバ全体に対する設定ファイルです。
  • users.prefs Pootle を利用するユーザに関する設定ファイルです。

このうち主に pootle.prefs を編集する必要があります。

具体的な編集の箇所としては、以下の部分になると思います。

  • title, description サイトの名前や説明などを指定します。
  • defaultlanguage デフォルトの言語を英語以外にしたい場合は指定します。
  • fromaddress ユーザ登録するときの From となるメールアドレスを指定します。
  • smtpserver ユーザ登録するときのメールを送るためのサーバを指定します。
  • projects 翻訳を行うプロジェクトの情報を指定します。
  • languages 利用可能な言語を指定します。

ちなみに私が使っている設定ファイルから重要な部分を抜粋するとこんな感じです。:

    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'

apache の proxy 経由でアクセス[proxy]

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 起動[server]

さて、ここまできたら PootleServer を起動します。

ここではバックグラウンドで実行、ポート番号を 8180 に変更、ログファイルを出力、また標準出力をファイルに書き出すようにして起動しています。

# PootleServer -B -p8180 -o/var/log/pootle.log > /var/log/pootle.out 2>&1

po ファイルを配置[pofiles]

しかしこれだけでは翻訳を行うことはできません。

設定ファイルに指定したプロジェクト用の po ファイルを配置する必要があります。

po ファイルは po/プロジェクト/言語 というディレクトリを作成して、そこに配置しなければなりません。 例えば plone-ja.po というファイルは po/plone/ja というディレクトリに配置することによって初めて翻訳できるようになります。

実際に http://pootle.takanory.net/ にアクセスして、試しに翻訳してみてください。 なお、翻訳を行うためにはユーザの登録が必要です。

最初に各プロジェクトのページにアクセスしたときは、po ファイルの中身を解析して、どのくらい翻訳されているか調べたりするので少し表示に時間がかかります。気長に待ってあげてください。

関連サイト[site]

pootle に関連する(参考にした)サイトです。

pootle 使い方

目次

ユーザ登録[register]

まず最初に、翻訳を行えるようにするためにユーザ登録を行います。

  1. http://pootle.takanory.net/ にアクセスして、画面右側にある 登録 をクリックします。

    Click register link

  2. すると ユーザ登録画面 が表示されるので、ユーザ名、パスワードと 有効な メールアドレスを入力して、登録 ボタンをクリックします。

    Insert registration information

  3. ユーザ登録を完了するためのコードが書かれたメールが、先ほど入力したメールアドレス宛に届きます。

    Registration mail

  4. 画面右側にある 有効化 リンクをクリックして アカウント有効化画面 を表示し、先ほどのメールに書かれていた有効化コード(activation code)を入力して アカウントの有効化 ボタンをクリックします。

    Activate account

  5. 有効化に成功すると、自動的に ログイン画面 に遷移します。 ユーザ名とパスワードを入力して、ログインを実行します。

    Login to pootle

初期設定[setup]

ログインに成功すると、オプションを変更 というリンクが表示されます。 そこをクリックするとユーザごとの オプション設定画面 が表示されます。

とくに設定を行う必要はありませんが、自分が使うプロジェクトや言語を設定することがきでます。

Set user options

プロジェクトや言語を設定すると、 ユーザのホームページ に指定したプロジェクトや言語へのリンクが表示されるようになります。

User home page

ここまででユーザ登録と設定は終了です。 あとは、実際に po ファイルの中身を参照して翻訳を行います。