class GetText::Tools::XGetText

Public Class Methods

add_parser(parser) click to toggle source

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
run(*arguments) click to toggle source
# File lib/gettext/tools/xgettext.rb, line 31
def run(*arguments)
  new.run(*arguments)
end

Public Instance Methods

add_parser(parser) click to toggle source

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

Private Instance Methods

encode(string) click to toggle source
# 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
now() click to toggle source
# File lib/gettext/tools/xgettext.rb, line 286
def now
  Time.now
end
parse_path(path, po_messages) click to toggle source
# 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