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
レビュアブルマインドは、この機能を利用して国際化しています。