2009-08-05 71 views
2

我在Rails 2.3.3上,并且使用Haml 2.0.9来为我的模板和Gettext-Rails 2.0.4进行翻译。 Haml像魅力一样工作,gettext也像它应该那样工作。Gettext和Haml on Rails/rake updatepo非常奇怪的问题破坏

但是我不能在使用“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) 

我的Rake文件看起来是这样的:

# 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)。

问题:没有MessageIds从我的Haml文件中识别。如果它试过正确的文件,可以解析它们等,我会在Haml-Parser中检查“puts”。一切似乎都很好,它只是识别任何东西,并且总是只返回已发现的msgids,Haml文件则返回一个空的Array。

奇怪的:当我在控制台中输入这个,一切正常:

$$ 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 Task中不是这种情况。

任何人有想法?你真的会让我成为一个快乐的书呆子!

谢谢!

+0

有关这方面的消息吗?我甚至没有使用新的Haml 2.2手动解析! – ujh 2009-10-15 08:10:37

回答

0

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

0

尝试修改您的haml_parser.rb以查看解析器卡住的位置。

 
    def parse(file, ary = []) 
    haml = Haml::Engine.new(IO.readlines(file).join) 
    code = haml.precompiled.split(/$/) 
    puts "Parsing Haml File: #{file}" 
    RubyParser.parse_lines(file, code, ary) 
    end 

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

 
Rails 2.3.4 
gettext 2.0.4 
haml 2.2.8 

从我搜集这主要是由于在HAML 2.2 引擎,使得它是由gettext的默认 RubyParser输出无法解析的变化。

我曾尝试宝石 retoo-ruby_gettext_extractor(0.2.1) 上 ruby​​_parser 取决于没有成功。

这个ruby_parser有一个它自己的RubyParser类,与Gettext的RubyParser模块 冲突。所以这里是我们为什么应该使用 命名空间的经典案例。 -_-

黑客则通过以 宝石改变RubyParser的名字下班后,我可以让它工作解析EN模板文件,使用retoo的 gettext_extractor/ruby​​parser宝石。但是,解析器不能在我的非拉丁模板文件中使用 。我的HamlParser类如下。任何人都可以 有一个去解决这个问题?万分感谢!

 
# haml_parser.rb 
require 'rubygems' 
require 'haml' 
require 'gettext_rails/tools' 
require 'ruby_gettext_extractor' 

module HamlParser 
    module_function 

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

    def parse(file, ary = []) 
    bypass = ! File.basename(file, 
'.haml').match(/(vi|zh|zh_HK|id|th)$/).nil? 
    puts "HamlParser:#{file}:bypass:#{bypass}" 
    return ary if bypass 

    haml = Haml::Engine.new(IO.readlines(file).join) 
    result = nil 
    begin 
     #result = GetText::RubyParser.parse_lines(file, 
haml.precompiled.split(/$/), ary) 
     result = RubyGettextExtractor.parse_string(haml.precompiled, file, 
ary) 
    rescue Exception => e 
     puts "Error:#{file}" 
     raise e 
    end 
    result 
    end 
end 

GetText::RGetText.add_parser(HamlParser) 
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。