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”是否尝试了正确的文件,是否可以解析它们等等。一切似乎都很好,它只识别任何东西,并且总是只返回已经找到的 msgids,对于 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 中的大部分输出都是由#{}in""字符串中的指令生成的,并且该构造似乎欺骗了 RubyParser 类。如果您"#{_('some text')}"在“普通”Ruby 文件中有类似的东西,也不会被识别。

我的解决方案是稍微改组一下 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 解析(文件,ary = [])
    haml = Haml::Engine.new(IO.readlines(file).join)
    代码 = haml.precompiled.split(/$/)
    提出“解析 Haml 文件:#{file}”
    RubyParser.parse_lines(文件,代码,ary)
  结尾

我在升级设置时遇到了自己的问题。

导轨 2.3.4
获取文本 2.0.4
火腿 2.2.8

从我收集到的信息来看,这主要是由于 HAML 2.2 引擎中的更改导致 gettext 的默认 RubyParser 无法解析它的输出。

我已经尝试了依赖于 ruby​​_parser 的 gem retoo-ruby_gettext_extractor (0.2.1),但没有成功。

这个 ruby​​_parser 有一个它自己的 RubyParser 类,并且与 Gettext 的 RubyParser 模块冲突。所以这里有一个经典案例,说明为什么我们应该命名我们的代码。-_-

在通过更改 gems 中 RubyParser 的名称来破解它之后,我可以使用 retoo 的 gettext_extractor/rubyparser gems 来解析模板文件。但是,解析器不适用于我的非拉丁模板文件。我的 HamlParser 类如下。任何人都可以尝试解决这个问题吗?一百万谢谢!

#haml_parser.rb
需要“红宝石”
需要'haml'
需要'gettext_rails/工具'
需要'ruby_gettext_extractor'

模块 HamlParser
  模块功能

  def 目标?(文件)
    File.extname(file) == '.haml'
  结尾

  def 解析(文件,ary = [])
    绕过=!File.basename(文件,
'.haml').match(/(vi|zh|zh_HK|id|th)$/).nil?
    提出“HamlParser:#{file}:bypass:#{bypass}”
    如果绕过则返回 ary

    haml = Haml::Engine.new(IO.readlines(file).join)
    结果 = 无
    开始
      #result = GetText::RubyParser.parse_lines(file,
haml.precompiled.split(/$/), ary)
      结果 = RubyGettextExtractor.parse_string(haml.precompiled, 文件,
阿里)
    救援异常 => e
      提出“错误:#{file}”
      提高e
    结尾
    结果
  结尾
结尾

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

ruby_gettext_extractor可能有助于修复 gettext 字符串提取。特别是当您使用 HAML 2.2 时,它改变了它的内部格式并完全破坏了 gettext 提取过程。

于 2009-10-15T08:37:14.173 回答