zope.i18n の設定をするまで

なんか色々ハマったのでメモ。

やりたいこと

今作っている Web アプリで zope.pagetemplate を使おうとしているわけです。
で、時代はインターナショナルという事で i18n とか考えたい、と思うわけです。

zope.pagetemplate なので zope.i18n を使うわけなのですが、ここらへんが結構めんどくさいしドキュメントないしで泣けるのでメモっておくわけです。

基本的に http://collective-docs.takanory.net/i18n/localization.html を見ながらセットアップするといいよ。
あと How to internationalize your application も参考になるはず。

configure.zcml を書く

configure.zcml を書きます (ここではパッケージ直下)

pkg
 +- __init__.py
 +- configure.zcml

みたいな感じ。

で中身は

<!--*- mode:xml -*-->
<configure xmlns="http://namespaces.zope.org/zope"
           xmlns:i18n="http://namespaces.zope.org/i18n">
  <include package="zope.i18n" file="configure.zcml" />
  <include package="zope.i18n" file="meta.zcml" />
  <i18n:registerTranslations directory="locales" />
</configure>

こんなの。

i18n:registerTranslations の directory で指定した場所に pot とかが作られます。
gettext のキーワードとコンテンツとかですね。

で、パスはこの zcml からの相対で渡せるので、そのまま locales とすると zcml があるディレクトリに locales が掘られます。

buildout

buildout.cfg にこんなのを追加します。

[buildout]
parts = ... i18n

[i18n]
recipe = z3c.recipe.i18n:i18n
zcml = ${buildout:directory}/${buildout:pkgname}/configure.zcml
domain = trolle
output = ${buildout:directory}/${buildout:pkgname}/locales

そしておもむろに

$ bin/buildout

します。

すると bin の下にいくつかファイルができます。

$ ls bin/i18n*
bin/i18ncompile  bin/i18nextract  bin/i18nmergeall  bin/i18nstats

ここで bin/i18nextract を実行すると locales ディレクトリが作られるようです。

あとのコマンドはこれから先使うようですが、まだまだわからないのでそのうち。