GetTextへの自動対応

これは、Amrita2の最も重要な機能と言えるかもしれません。Amrita2では、ほとんど自動的にテンプレートを国際化することができます。

Gettext用のフィルターがあってこれを組み込むと、テンプレート内の文字列に対して、自動的に_()を呼び出す処理を行います。

require "amrita2/template"
require "amrita2/gettext"
include Amrita2

tmpl_text =  <<-END
<<html<
  <<body<
    <<h1 :title |Attr[:title, :body]>>
    <<p <
      Amrita2 is a html template libraly for Ruby.
END

tmpl = Amrita2::Template.new(tmpl_text) do |e, src, filters|
  filters << Amrita2::Filters::GetTextFilter.new
end

tmpl.set_trace(STDOUT)
tmpl.text_domain = 'test'
puts tmpl.render_with(:title=>{:title=>"hello world", :body=>"hello world" })

このサンプルから出力されたコンパイル済みソースを抜粋すると、次のようになっています。

__stream__.concat("<html><body>")
__stream__.concat(XXTitleInstance.render_with($_.amrita_value("title"), __binding__))
__stream__.concat("<p>")
__stream__.concat(_("Amrita2 is a html template libraly for Ruby.") % $_)
__stream__.concat("</p></body></html>")

"Amrita2 is a ..."という文字列が、_()呼び出し後に出力されています。全ての文字列に対して自動的にこの処理が組み込まれます。

Rails用のブリッジでは、自動的にこのフィルターを組み込んでいますので、Rails上では、何もしないで国際化対応になります。

次のRakeタスクを実行すると、テンプレート上の全ての静的な文字列を国際化対象の文字列としてpoファイルを生成します。

task :updatepo do
  $: << 'vendor/plugins/amrita2/lib'
  require 'gettext/utils'
  require 'amrita2/gettext'
  require 'amrita2/macro'

  GetText.update_pofiles("rmind", 
                         Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml,a2html,a2}"),
                         "rmind 1.0.0" 
                         )
end

レビュアブルマインドは、この機能を利用して国際化しています。