@private
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.
# File lib/gettext/tools/msgmerge.rb, line 82 def initialize(reference, definition, config) @reference = reference @definition = definition @translated_entries = @definition.reject do |entry| entry.msgstr.nil? end @config = config end
# File lib/gettext/tools/msgmerge.rb, line 91 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
# File lib/gettext/tools/msgmerge.rb, line 208 def add_obsolete_entry(result) obsolete_entry = generate_obsolete_entry(result) return if obsolete_entry.nil? result[:last] = obsolete_entry end
# File lib/gettext/tools/msgmerge.rb, line 229 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
# File lib/gettext/tools/msgmerge.rb, line 159 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
# File lib/gettext/tools/msgmerge.rb, line 177 def find_fuzzy_entry(definition, msgid, msgctxt) return nil if msgid == :last min_distance_entry = nil min_distance = MAX_FUZZY_DISTANCE same_msgctxt_entries = definition.find_all do |entry| entry.msgctxt == msgctxt and not entry.msgid == :last end same_msgctxt_entries.each do |entry| distance = normalize_distance(entry.msgid, msgid) next if distance.nil? if min_distance > distance min_distance = distance min_distance_entry = entry end end min_distance_entry end
# File lib/gettext/tools/msgmerge.rb, line 215 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
# File lib/gettext/tools/msgmerge.rb, line 104 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 = find_fuzzy_entry(@translated_entries, msgid, msgctxt) if fuzzy_entry return merge_fuzzy_entry(entry, fuzzy_entry) end entry end
# File lib/gettext/tools/msgmerge.rb, line 130 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" end entry.msgstr = definition_entry.msgstr entry end
# File lib/gettext/tools/msgmerge.rb, line 169 def merge_fuzzy_entry(entry, fuzzy_entry) merged_entry = merge_entry(entry, fuzzy_entry) merged_entry.flags << "fuzzy" merged_entry end
# File lib/gettext/tools/msgmerge.rb, line 148 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
# File lib/gettext/tools/msgmerge.rb, line 198 def normalize_distance(source, destination) n_characters_difference = (source.size - destination.size).abs return nil if n_characters_difference > MAX_N_CHARACTERS_DIFFERENCE max_size = [source.size, destination.size].max return 0.0 if max_size.zero? Text::Levenshtein.distance(source, destination) / max_size.to_f end