lib/i18n/tasks/translators/base_translator.rb in i18n-tasks-1.0.12 vs lib/i18n/tasks/translators/base_translator.rb in i18n-tasks-1.0.13
- old
+ new
@@ -1,10 +1,11 @@
# frozen_string_literal: true
module I18n::Tasks
module Translators
class BaseTranslator
+ include ::I18n::Tasks::Logging
# @param [I18n::Tasks::BaseTask] i18n_tasks
def initialize(i18n_tasks)
@i18n_tasks = i18n_tasks
end
@@ -29,65 +30,69 @@
key_pos = list.each_with_index.inject({}) { |idx, ((k, _v), i)| idx.update(k => i) }
# copy reference keys as is, instead of translating
reference_key_vals = list.select { |_k, v| v.is_a? Symbol } || []
list -= reference_key_vals
result = list.group_by { |k_v| @i18n_tasks.html_key? k_v[0], opts[:from] }.map do |is_html, list_slice|
- fetch_translations list_slice, opts.merge(is_html ? options_for_html : options_for_plain)
+ fetch_translations(list_slice, opts.merge(is_html ? options_for_html : options_for_plain))
end.reduce(:+) || []
result.concat(reference_key_vals)
result.sort! { |a, b| key_pos[a[0]] <=> key_pos[b[0]] }
result
end
# @param [Array<[String, Object]>] list of key-value pairs
# @return [Array<[String, Object]>] translated list
def fetch_translations(list, opts)
- from_values(list, translate_values(to_values(list), **options_for_translate_values(**opts))).tap do |result|
+ options = options_for_translate_values(**opts)
+ from_values(list, translate_values(to_values(list, options), **options), options).tap do |result|
fail CommandError, no_results_error_message if result.blank?
end
end
# @param [Array<[String, Object]>] list of key-value pairs
# @return [Array<String>] values for translation extracted from list
- def to_values(list)
- list.map { |l| dump_value l[1] }.flatten.compact
+ def to_values(list, opts)
+ list.map { |l| dump_value(l[1], opts) }.flatten.compact
end
# @param [Array<[String, Object]>] list
# @param [Array<String>] translated_values
# @return [Array<[String, Object]>] translated key-value pairs
- def from_values(list, translated_values)
+ def from_values(list, translated_values, opts)
keys = list.map(&:first)
untranslated_values = list.map(&:last)
- keys.zip parse_value(untranslated_values, translated_values.to_enum)
+ keys.zip parse_value(untranslated_values, translated_values.to_enum, opts)
end
# Prepare value for translation.
# @return [String, Array<String, nil>, nil] value for Google Translate or nil for non-string values
- def dump_value(value)
+ def dump_value(value, opts)
case value
when Array
# dump recursively
- value.map { |v| dump_value v }
+ value.map { |v| dump_value(v, opts) }
when String
+ value = CGI.escapeHTML(value) if opts[:html_escape]
replace_interpolations value unless value.empty?
end
end
# Parse translated value from the each_translated enumerator
# @param [Object] untranslated
# @param [Enumerator] each_translated
# @return [Object] final translated value
- def parse_value(untranslated, each_translated)
+ def parse_value(untranslated, each_translated, opts)
case untranslated
when Array
# implode array
- untranslated.map { |from| parse_value(from, each_translated) }
+ untranslated.map { |from| parse_value(from, each_translated, opts) }
when String
if untranslated.empty?
untranslated
else
- restore_interpolations untranslated, each_translated.next
+ value = each_translated.next
+ value = CGI.unescapeHTML(value) if opts[:html_escape]
+ restore_interpolations(untranslated, value)
end
else
untranslated
end
end