Adds a parser to the default parser list.
@param (see add_parser) @return [void]
@see add_parser
# File lib/gettext/tools/xgettext.rb, line 41 def add_parser(parser) @@default_parsers.unshift(parser) end
# File lib/gettext/tools/xgettext.rb, line 31 def run(*arguments) new.run(*arguments) end
The parser object requires to have target?(path) and parse(path) method.
@example How to add your parser
require "gettext/tools/xgettext" class FooParser def target?(path) File.extname(path) == ".foo" # *.foo file only. end def parse(path) po_messages = [] # Simple message message = PoMessage.new(:normal) message.msgid = "hello" message.sources = ["foo.rb:200", "bar.rb:300"] message.add_comment("Comment for the message") po_messages << message # Plural message message = PoMessage.new(:plural) message.msgid = "An apple" message.msgid_plural = "Apples" message.sources = ["foo.rb:200", "bar.rb:300"] po_messages << message # Simple message with the message context message = PoMessage.new(:msgctxt) message.msgctxt = "context" message.msgid = "hello" message.sources = ["foo.rb:200", "bar.rb:300"] po_messages << message # Plural message with the message context. message = PoMessage.new(:msgctxt_plural) message.msgctxt = "context" message.msgid = "An apple" message.msgid_plural = "Apples" message.sources = ["foo.rb:200", "bar.rb:300"] po_messages << message return po_messages end end GetText::XGetText.add_parser(FooParser.new)
@param [#target?, parse] parser
It parses target file and extracts translate target messages from the target file. If there are multiple target files, parser.parse is called multiple times.
@return [void]
# File lib/gettext/tools/xgettext.rb, line 128 def add_parser(parser) @parsers.unshift(parser) end
# File lib/gettext/tools/xgettext.rb, line 349 def encode(string) if string.respond_to?(:encode) string.encode(@output_encoding) else string # don't support end end
# File lib/gettext/tools/xgettext.rb, line 286 def now Time.now end
# File lib/gettext/tools/xgettext.rb, line 290 def parse_path(path, po_messages) @parsers.each do |parser| next unless parser.target?(path) extracted_po_messages = parser.parse(path) extracted_po_messages.each do |po_message| if po_message.kind_of?(Array) po_message = PoMessage.new_from_ary(po_message) end if po_message.msgid.empty? warn _("Warning: The empty \"\" msgid is reserved by " + "gettext. So gettext(\"\") doesn't returns " + "empty string but the header entry in po file.") # TODO: add pommesage.source to the pot header as below: # # SOME DESCRIPTIVE TITLE. # # Copyright (C) YEAR THE COPYRIGHT HOLDER # # This file is distributed under the same license as the PACKAGE package. # # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # # # #: test/test_gettext.rb:65 # #, fuzzy # "#: test/test_gettext.rb:65" line is added. next end if @output.is_a?(String) base_path = Pathname.new(@output).dirname.expand_path po_message.sources = po_message.sources.collect do |source| path, line, = source.split(/:(\d+)\z/, 2) absolute_path = Pathname.new(path).expand_path begin path = absolute_path.relative_path_from(base_path).to_s rescue ArgumentError raise # Should we ignore it? end "#{path}:#{line}" end end # Save the previous target if po_messages.empty? existing = nil else message = po_messages.find {|t| t == po_message} existing = po_messages.index(message) end if existing po_message = po_messages[existing].merge(po_message) po_messages[existing] = po_message else po_messages << po_message end end break end end