poファイルにメッセージを抽出するためのパーサを独自に追加する

ruby-gettext-howto-poparser

Ruby-GetText-1.8.0からpoファイルのmsgidを抽出するためのパーサを独自に追加できるようになりました。ここでは、そのパーサの書き方、使い方を紹介します。

パーサを書く

パーサモジュールを宣言し、target?, parseという2つのメソッドを実装します。最後に、そのパーサをGetText::RGetTextに登録します。

require 'gettext/rgettext'
module TestParser
  module_function
  # 与えられたファイルがこのパーサで処理すべきかどうか
  # を判断します。処理する場合はtrue、そうでなければfalseを返します。
  def target?(file)
    File.extname(file) == '.glade'
  end
  # 実際のパース結果を返します。
  # fileにはパースするファイル名が入ります。
  # aryは過去の解析結果が入ってくるので、これに結果を追加していきます。
  # そのmsgidがユニークになるかどうかはこのメソッド内でチェックする必要が
  # あります。要は配列に足す前に、aryにすでにそのmsgidがあるかどうかを
  # チェックしてください。
  # 戻り値は、[["msgid1", "file1:line1", "file2:line2",...],
  #           ["msgid2", "file3:line3",...]]
  # という形式です。
  def parse(file, ary)
    # ここがメインとなるロジックです。複雑になるかもしれませんね。
    ary << ["aaa", "foo.rb:200"]
    ary << ["bbb", "bar.rb:300", "baz.rb:400"]
    ary # aryを返します。
  end
end
# パーサの登録
GetText::RGetText.add_parser(TestParser)

上記をtestparser.rbという名前で保存します。

使ってみる

rgettextと一緒に使う

まずはrgettextと一緒に使ってみましょう。

$ rgettext -rtestparser targetfiles1.rb targetfiles2.rb ....
-o foo.pot

Rakeと一緒に使う

Rakeと一緒に使うのも簡単です。require 'testparser'をupdatepoタスクの中で行うだけ。

desc "Update pot/po files."
task :updatepo do
  require 'gettext/utils'   #testparser.rbの内部で呼び出してもいいかも。
  require 'testparser'
  GetText.update_pofiles("myapp", Dir.glob("app/**/*.{rb,rhtml}"), "myapp 0.0.1")
end

ChangeLog

  • 2006-12-19 初版作成 - Masao
更新日時:2007/07/12 02:22:22
キーワード:
参照:[Ruby-GetText-Package]