Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-09-27Galaxy

Galaxy を国際化して日本語メッセージを表示できるようにする(1)

|  Galaxy を国際化して日本語メッセージを表示できるようにする(1) - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  Galaxy を国際化して日本語メッセージを表示できるようにする(1) - KazusaAPI開発日誌  Galaxy を国際化して日本語メッセージを表示できるようにする(1) - KazusaAPI開発日誌 のブックマークコメント

Genome Informatics 2008 @ Wellcome Trust Genome Campus, Hinxton, UK - 研究開発創作日誌 で聞いた no title が便利そうだったので、日本語化して周囲に普及できるようにしてみる。

screenshot

Galaxy はゲノミクスのための Web アプリケーションで、データの取得、選択、計算処理、可視化クリックだけで可能。そして、ステップ毎のデータセットは保存され、ヒストリとして参照可能。ヒストリから処理ステップを選択して、ワークフローを作成することができる。ヒストリは、他のユーザと共有することができる。

It is designed to help two communities that often have difficulty communicating:

1. Experimental biologists: "I really have no time to program but I want to do whole-genome analyses to find targets for experimental validation".

2. Computational biologists: "I develop algorithms but have no time to develop interfaces".

no title

このように、実験生物学者と計算機生物学者のちょっとかゆいところをカバーするのが Galaxy のポジション

Galaxy を国際化する方針

Galaxy は PythonWSGI によるウェブアプリで、テンプレートとしては MakoCheetah を利用している。作業としては、次のようなことをする必要がある。

  1. テンプレートファイルへの gettext の _() メソッドの埋め込み
  2. メッセージの取り出し、pot、po、mo ファイルの作成
  3. それぞれの評価コンテクストgettext のメソッドが利用できるようにする
  4. ブラウザAccept-Language の対応
  5. urlパラメータ(例えば lang=en)の対応

ここでは、とにかく表示することを目的として、まず 1,2,3 をおこなう。


_() メソッドの埋め込み

対象ファイルのうち、.makoMako テンプレートファイル、.tmpl が Cheetah テンプレートファイルCheetah は遷移途中での表示などにつかわれているよう。

templates/admin_main.mako
templates/base.mako
templates/base_panels.mako
templates/dataset/edit_attributes.mako
templates/dataset/errors.tmpl
templates/dataset/validation.tmpl
templates/form.mako
templates/history/list.mako
templates/history/list_as_xml.mako
templates/history/options.mako
templates/history/rename.mako
templates/history/share.mako
templates/message.mako
templates/root/history.mako
templates/root/history_as_xml.mako
templates/root/history_common.mako
templates/root/history_item.mako
templates/root/index.mako
templates/root/masthead.mako
templates/root/tool_menu.mako
templates/tool_executed.tmpl
templates/tool_form.tmpl
templates/user/index.mako
templates/workflow/build_from_current_history.mako
templates/workflow/editor.mako
templates/workflow/editor_generic_form.mako
templates/workflow/editor_tool_form.mako
templates/workflow/index.mako
templates/workflow/rename.mako
templates/workflow/run.mako
templates/workflow/run_complete.mako
templates/workflow/share.mako

埋め込みかたは、

${_('Account settings')}

のようになる。${} で変数展開されるらしい。

作業記録として、足取りを記録してみる。

Python gettext での実装

国際化用のファイルの配置。

po/ginga.pot
po/ja/ginga.po
locale/ja/LC_MESSAGES/ginga.mo

pot の作成。GNU gettextコマンドを利用。

$ mkdir po
$ xgettext -L Python -p po -d ginga templates/user/index.mako 

po/ginga.po ができました。

$ mkdir po/ja
$ cp po/ginga.po po/ja/

po/ja/ginga.po の編集文字コードの変更。

Content-Type: text/plain; charset=UTF-8\n"

mo の作成。

$ msgfmt -o locale/ja/LC_MESSAGES/ginga.mo po/ja/ginga.po  

とりあえず表示してみるので、各テンプレートファイル環境変数設定とgettextの設定を追加する。

<%
import os
os.environ['LANG'] = 'ja'
import gettext
gettext.install('ginga', '/Users/nakao/Applications/Galaxy/galaxy_dist/locale', unicode=1)
%>

テンプレートのcharsetをutf-8にしておく。

<meta http-equiv="Content-Type" content="text/html; charset=${_('iso-8859-1')}" />
としておいて、
>|po|
#:
msgid "iso-8859-1"
msgstr "utf-8"

というメッセージを作成しておく。

script/paster.py で実行時の文字設定を utf-8 にする。

sys.setdefaultencoding('utf_8')

表示の確認。

http://img.skitch.com/20081008-g9jangfjem8mnfjss2hmm8df3f.jpg

とりあえず日本語メッセージができた。


ここまでのまとめ
  1. とりあえず表示できた。
  2. Mako の文法を理解して pot を作成したい。
  3. Cheetah できてない。
  4. import gettext を一カ所だけに。
  5. lang=en をりかいできるように。

Babel での実装

Mako テンプレートからメッセージテンプレート(pot)ファイルを作成するパーザを Babel が提供しているのでこちらを利用してみる。

gettext でのテンプレートへの変更部分をとりけしてからすすめます。

eggs.ini に Babel のバージョンと配布場所を追加。

[eggs:noplatform]
...
Babel = 0.9.4
...
[source]
...
Babel = http://ftp.edgewall.com/pub/babel/Babel-0.9.4.zip

setup.sh を実行して、Babel を eggs に追加。

$ sh setup.sh
$ python scripts/scramble.py Babel

lib/galaxy/web/freamwork/__init__.py で babel を読み込む。

pkg_resources.require( "Babel" )
from babel.support import Translations
t = Translations.load('locale', ['ja'])
_ = t.gettext

lib/galaxy/web/framework/__init__.py の Mako テンプレートレンダリングコンテクストに _ を送り込む。

512     def fill_template_mako( self, filename, **kwargs ):
513         template = self.webapp.mako_template_lookup.get_template( filename )
514         data = dict( caller=self, t=self, trans=self, h=webhelpers, util=util, request=self.request, response=self.response, app=self.app)
515         data.update( self.template_context )
516         data.update( kwargs )
517         data.update( dict( _=t.gettext, n_=t.gettext, N_=t.ngettext )  )
518         return template.render( **data )

の 517 行目。

_ がたまになにかに書き換えられるので、n_ にもコピーしておく。要調査。

Mako テンプレートファイルの行頭に、_ メソッドを追加してとりあえずごまかす。

<% _=n_ %>

この追記をなくしてしまいたい。

.tmpl は Cheetah 評価コンテクストをおっかけていないので、ファイル行頭に追記して大胆に対処しておく。

<%
import pkg_resources
pkg_resources.require( "Babel" )
from babel.support import Translations
t = Translations.load('locale', ['ja'], 'ginga')
_ = t.gettext
%>

以上の実装で日本語メッセージの表示ができました。


ここまでのまとめ
  1. mako テンプレートコンテクストに _ を送り込むことがおおむねできた。
  2. mako テンプレートについては import が一カ所にできた。
  3. ただし、_ がたまに書き換えられる。理由はまだ追い込めていない。
  4. Cheetah 評価コンテクストの仕組みを追い込めていない。

まとめ

  1. Galaxy の国際化をすすめた。
  2. 日本語表示は可能になった。
  1. コントローラーの中のメッセージの対応をしていない。
  2. テンプレートの評価に国際化用のメソッドを透過的に送り込めていない。
  3. ブラウザ言語設定をみて表示を切り替えられない。
  4. lang=en を理解できていない。

この規模の Python プログラムを読んだのははじめてでしたが、ブラウザ上でのデバッグメッセージが秀逸だったので、おもったよりはすすみました。


参考サイト

nakao_mitsuterunakao_mitsuteru2008/10/15 23:46http://g6.kazusa.or.jp/ でひっそり公開。止まっているときもあるかも。

トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080927