2

私は Rails 2.3.3 を使用しており、テンプレートには Haml 2.0.9 を使用し、翻訳には Gettext-Rails 2.0.4 を使用しています。Haml は魅力的に機能し、gettext も正常に機能します。

しかし、「rake updatepo」を使用すると、Gettext で Haml ファイルを解析できません。次のようなカスタム パーサーを作成しました。

# lib/haml_parser.rb
require 'gettext_rails/tools'
require 'haml'
# Haml gettext parser
module HamlParser
  module_function

  def target?(file)
    File.extname(file) == ".haml"
  end

  def parse(file, ary = [])
    haml = Haml::Engine.new(IO.readlines(file).join)
    code = haml.precompiled.split(/$/)
    GetText::RubyParser.parse_lines(file, code, ary)
  end
end

GetText::RGetText.add_parser(HamlParser)

私のRakefileは次のようになります:

# Rakefile
require(File.join(File.dirname(__FILE__), 'config', 'boot'))

require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

require 'tasks/rails'

desc "Create mo-files for L10n"
task :makemo do
  require 'gettext_rails/tools'
  GetText.create_mofiles(true)  #(true, "po", "locale")
end

desc "Update pot/po files to match new version."
task :updatepo do
  require 'gettext_rails/tools'
  require 'haml_parser'
  MY_APP_TEXT_DOMAIN = "APP" 
  MY_APP_VERSION     = "APP 1.1.0"
  GetText.update_pofiles(MY_APP_TEXT_DOMAIN, Dir.glob("{app,lib}/**/*.{rb,rhtml,html.erb,haml,html.haml,rjs}"),
                         MY_APP_VERSION)
end

これは、Haml ファイルを解析するための既知のアプローチに従います ( http://www.paulgillard.me.uk/2008/3/8/rails-haml-and-gettext )。

問題: Haml ファイルから MessageId が認識されません。Haml-Parser で「puts」を使用して、適切なファイルを試行したかどうか、それらを解析できるかどうかなどを確認しました。すべてがうまくいっているように見えました。何でも認識し、すでに見つかった msgid のみを常に返し、Haml ファイルの場合は空の配列を返しました。

奇妙なことに、コンソールにこれを入力すると、すべてが機能します。

$$ script/console
Loading development environment (Rails 2.3.3)
>> require 'gettext_rails/tools'
=> []
>> require 'haml'
=> []
>> file = "app/views/sessions/new.haml"
=> "app/views/sessions/new.haml"
>> haml = Haml::Engine.new(IO.readlines(file).join)
=> #<Haml::Engine:0x4254104 @tab_change=0, @block_opened=false, @inden [...]
>> code = haml.precompiled.split(/$/)
=> [" content_for :head do;", "\nhaml_temp =  stylesheet_link [...]
>> GetText::RubyParser.parse_lines(file, code, [])
=> [["Login", "app/views/sessions/new.haml:4"], [...]

ご覧のとおり、すべてがここで機能します (長いリターンは省きました)。私の Rake タスクでは、なぜこれが当てはまらないのか、ちょっとびっくりしています。

誰にもアイデアがありますか?あなたは本当に私を幸せなオタクにするでしょう!

ありがとう!

4

3 に答える 3

2

同じ問題が発生したばかりで、少しデバッグした後、原因を見つけました。Haml の出力のほとんどは、文字列内の命令によって生成され#{}""その構成体は RubyParser クラスをだますようです。「通常の」Ruby ファイルのようなものがあれば"#{_('some text')}"、これも認識されません。

私の解決策は、Haml でプリコンパイルされたコードを少しシャッフルして_()"#{}". 正規表現が 4 行目で行うことです。

  def parse(file, ary = [])
    haml = Haml::Engine.new(IO.readlines(file).join)
    code = haml.precompiled
    code = code.gsub(/(.*#\{(_hamlout.adjust_tabs\(\d+\);\s*)?haml_temp)\s*=\s*(_\(['"].+['"]\))/) { |m| "haml_temp = #{$3}; #{$1}" }
    code = code.split(/$/)
    GetText::RubyParser.parse_lines(file, code, ary)
  end

これにより、プロジェクトの約 80% のケースが修正されました。これで十分でした。残りの 20% は、次のように変更することで修正できる場合があります。

%tag= _('text')

の中へ:

%tag
  = _('text')

それでも解決しない場合は、次のトリックを使用できます。

- txt = _('text')
= txt

ただし、 ruby​​_gettext_extractor gem はまだ試していません。

于 2010-05-09T13:16:04.367 に答える
0

haml_parser.rb を変更して、パーサーがスタックする場所を確認してください。

  def parse(ファイル、ary = [])
    haml = Haml::Engine.new(IO.readlines(file).join)
    コード = haml.precompiled.split(/$/)
    puts "解析中の Haml ファイル: #{file}"
    RubyParser.parse_lines(ファイル、コード、配列)
  終わり

セットアップをアップグレードする際に、私自身の問題があります。

レール 2.3.4
gettext 2.0.4
ハムル2.2.8

私が収集したことによると、主にHAML 2.2エンジンの変更により、gettextのデフォルトのRubyParserで出力を解析できなくなったことが原因です。

ruby_parser に依存する宝石 retoo-ruby_gettext_extractor (0.2.1) を試しましたが、成功しませんでした。

この ruby​​_parser には独自の RubyParser クラスがあり、Gettext の RubyParser モジュールと競合します。コードに名前空間を付ける必要がある理由の古典的なケースを次に示します。-_-

gem の RubyParser の名前を変更して機能するようにハッキングした後、retoo の gettext_extractor/rubyparser gem を使用して、テンプレート ファイルを解析できるようにします。ただし、ラテン語以外のテンプレート ファイルではパーサーが機能しません。以下のように私の HamlParser クラス。誰でもこれを修正できますか?百万の感謝!

# Haml_parser.rb
「ルビジェム」が必要
「haml」が必要
「gettext_rails/tools」が必要です
「ruby_gettext_extractor」が必要です

モジュール HamlParser
  モジュール関数

  def target?(ファイル)
    File.extname(ファイル) == '.haml'
  終わり

  def parse(ファイル、ary = [])
    バイパス = ! File.basename(ファイル、
'.haml').match(/(vi|zh|zh_HK|id|th)$/).nil?
    puts "HamlParser:#{file}:bypass:#{bypass}"
    バイパスの場合は ary を返します

    haml = Haml::Engine.new(IO.readlines(file).join)
    結果=ゼロ
    始める
      #result = GetText::RubyParser.parse_lines(file,
haml.precompiled.split(/$/), ary)
      result = RubyGettextExtractor.parse_string(haml.precompiled, file,
アリ)
    レスキュー例外 => e
      puts "エラー:#{ファイル}"
      eを上げる
    終わり
    結果
  終わり
終わり

GetText::RGetText.add_parser(HamlParser)
于 2009-10-16T06:54:25.063 に答える
0

ruby_gettext_extractorは、gettext 文字列の抽出を修正するのに役立つ場合があります。特に、内部フォーマットが変更され、gettext 抽出プロセスが完全に壊れた HAML 2.2 を使用している場合。

于 2009-10-15T08:37:14.173 に答える