class GetText::Tools::MsgMerge::Merger

@private

Constants

POT_DATE_EXTRACT_RE

Merge the reference with the definition: take the #. and

#: comments from the reference, take the # comments from

the definition, take the msgstr from the definition. Add this merged entry to the output message list.

POT_DATE_RE

Public Class Methods

new(reference, definition, config) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 83
def initialize(reference, definition, config)
  @reference = reference
  @definition = definition
  @translated_entries = @definition.reject do |entry|
    entry.msgstr.nil?
  end
  @fuzzy_entry_finder = FuzzyEntryFinder.new(@translated_entries)
  @config = config
end

Public Instance Methods

merge() click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 93
def merge
  result = GetText::PO.new

  @reference.each do |entry|
    id = [entry.msgctxt, entry.msgid]
    result[*id] = merge_definition(entry)
  end

  add_obsolete_entry(result) if @config.output_obsolete_entries?
  result
end

Private Instance Methods

add_obsolete_entry(result) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 177
def add_obsolete_entry(result)
  obsolete_entry = generate_obsolete_entry(result)
  return if obsolete_entry.nil?

  result[:last] = obsolete_entry
end
extract_obsolete_entries(result) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 198
def extract_obsolete_entries(result)
  @definition.find_all do |entry|
    if entry.obsolete?
      true
    elsif entry.msgstr.nil?
      false
    else
      id = [entry.msgctxt, entry.msgid]
      not result.has_key?(*id)
    end
  end
end
find_by_msgid(entries, msgid) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 161
def find_by_msgid(entries, msgid)
  same_msgid_entries = entries.find_all do |entry|
    entry.msgid == msgid
  end
  same_msgid_entries = same_msgid_entries.sort_by do |entry|
    entry.msgctxt
  end
  same_msgid_entries.first
end
generate_obsolete_entry(result) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 184
def generate_obsolete_entry(result)
  obsolete_entries = extract_obsolete_entries(result)
  obsolete_comments = obsolete_entries.collect do |entry|
    entry.to_s
  end

  return nil if obsolete_comments.empty?

  obsolete_entry = POEntry.new(:normal)
  obsolete_entry.msgid = :last
  obsolete_entry.comment = obsolete_comments.join("\n")
  obsolete_entry
end
merge_definition(entry) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 106
def merge_definition(entry)
  msgid = entry.msgid
  msgctxt = entry.msgctxt
  id = [msgctxt, msgid]

  if @definition.has_key?(*id)
    return merge_entry(entry, @definition[*id])
  end

  return entry unless @config.enable_fuzzy_matching?

  if msgctxt.nil?
    same_msgid_entry = find_by_msgid(@translated_entries, msgid)
    if same_msgid_entry and same_msgid_entry.msgctxt
      return merge_fuzzy_entry(entry, same_msgid_entry)
    end
  end

  fuzzy_entry = @fuzzy_entry_finder.find(msgid, msgctxt)
  if fuzzy_entry
    return merge_fuzzy_entry(entry, fuzzy_entry)
  end

  entry
end
merge_entry(reference_entry, definition_entry) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 132
def merge_entry(reference_entry, definition_entry)
  if definition_entry.header?
    return merge_header(reference_entry, definition_entry)
  end

  entry = reference_entry
  entry.translator_comment = definition_entry.translator_comment
  entry.previous = nil

  if definition_entry.fuzzy? or
      definition_entry.msgid_plural != reference_entry.msgid_plural
    entry.flags << "fuzzy" unless entry.fuzzy?
  end

  entry.msgstr = definition_entry.msgstr
  entry
end
merge_fuzzy_entry(entry, fuzzy_entry) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 171
def merge_fuzzy_entry(entry, fuzzy_entry)
  merged_entry = merge_entry(entry, fuzzy_entry)
  merged_entry.flags << "fuzzy" unless merged_entry.fuzzy?
  merged_entry
end
merge_header(new_header, old_header) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 150
def merge_header(new_header, old_header)
  header = old_header
  if POT_DATE_EXTRACT_RE =~ new_header.msgstr
    create_date = $1
    pot_creation_date = "POT-Creation-Date: #{create_date}"
    header.msgstr = header.msgstr.gsub(POT_DATE_RE, pot_creation_date)
  end
  header.flags = []
  header
end