2009-08-05 67 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。