class I18n::Tasks::Translators::DeeplTranslator

Constants

BATCH_SIZE

max allowed texts per request

SPECIFIC_TARGETS

those languages must be specified with their sub-kind e.g en-us

Public Class Methods

new(*) click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 12
def initialize(*)
  begin
    require 'deepl'
  rescue LoadError
    raise ::I18n::Tasks::CommandError, "Add gem 'deepl-rb' to your Gemfile to use this command"
  end
  super
  configure_api_key!
end

Protected Instance Methods

no_results_error_message() click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 73
def no_results_error_message
  I18n.t('i18n_tasks.deepl_translate.errors.no_results')
end
options_for_html() click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 48
def options_for_html
  { tag_handling: 'xml' }
end
options_for_plain() click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 52
def options_for_plain
  { preserve_formatting: true, tag_handling: 'xml', html_escape: true }
end
options_for_translate_values(**options) click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 42
def options_for_translate_values(**options)
  extra_options = @i18n_tasks.translation_config[:deepl_options]&.symbolize_keys || {}

  extra_options.merge({ ignore_tags: %w[i18n] }).merge(options)
end
replace_interpolations(value) click to toggle source

@param [String] value @return [String] ‘hello, %{name}’ => ‘hello, <i18n>%{name}</i18n>’

# File lib/i18n/tasks/translators/deepl_translator.rb, line 58
def replace_interpolations(value)
  value.gsub(INTERPOLATION_KEY_RE, '<i18n>\0</i18n>')
end
restore_interpolations(untranslated, translated) click to toggle source

@param [String] untranslated @param [String] translated @return [String] ‘hello, <i18n>%{name}</i18n>’ => ‘hello, %{name}’

# File lib/i18n/tasks/translators/deepl_translator.rb, line 65
def restore_interpolations(untranslated, translated)
  return translated if untranslated !~ INTERPOLATION_KEY_RE

  translated.gsub(%r{</?i18n>}, '')
rescue StandardError => e
  raise_interpolation_error(untranslated, translated, e)
end
translate_values(list, from:, to:, **options) click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 24
def translate_values(list, from:, to:, **options)
  results = []
  list.each_slice(BATCH_SIZE) do |parts|
    res = DeepL.translate(
      parts,
      to_deepl_source_locale(from),
      to_deepl_target_locale(to),
      options_with_glossary(options, from, to)
    )
    if res.is_a?(DeepL::Resources::Text)
      results << res.text
    else
      results += res.map(&:text)
    end
  end
  results
end

Private Instance Methods

all_ready_glossaries() click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 114
def all_ready_glossaries
  @all_ready_glossaries ||= DeepL.glossaries.list
end
configure_api_key!() click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 96
def configure_api_key!
  api_key = @i18n_tasks.translation_config[:deepl_api_key]
  host = @i18n_tasks.translation_config[:deepl_host]
  version = @i18n_tasks.translation_config[:deepl_version]
  fail ::I18n::Tasks::CommandError, I18n.t('i18n_tasks.deepl_translate.errors.no_api_key') if api_key.blank?

  DeepL.configure do |config|
    config.auth_key = api_key
    config.host = host unless host.blank?
    config.version = version unless version.blank?
  end
end
find_glossary(from, to) click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 118
def find_glossary(from, to)
  config_glossary_ids = @i18n_tasks.translation_config[:deepl_glossary_ids]
  return unless config_glossary_ids

  all_ready_glossaries.find do |glossary|
    glossary.ready \
      && glossary.source_lang == from \
      && glossary.target_lang == to \
      && config_glossary_ids.include?(glossary.id)
  end
end
options_with_glossary(options, from, to) click to toggle source
# File lib/i18n/tasks/translators/deepl_translator.rb, line 109
def options_with_glossary(options, from, to)
  glossary = find_glossary(from, to)
  glossary ? { glossary_id: glossary.id }.merge(options) : options
end
to_deepl_source_locale(locale) click to toggle source

Convert ‘es-ES’ to ‘ES’, en-us to EN

# File lib/i18n/tasks/translators/deepl_translator.rb, line 80
def to_deepl_source_locale(locale)
  locale.to_s.split('-', 2).first.upcase
end
to_deepl_target_locale(locale) click to toggle source

Convert ‘es-ES’ to ‘ES’ but warn about locales requiring a specific variant

# File lib/i18n/tasks/translators/deepl_translator.rb, line 85
def to_deepl_target_locale(locale)
  loc, sub = locale.to_s.split('-')
  if SPECIFIC_TARGETS.include?(loc)
    # Must see how the deepl api evolves, so this could be an error in the future
    warn_deprecated I18n.t('i18n_tasks.deepl_translate.errors.specific_target_missing') unless sub
    locale.to_s.upcase
  else
    loc.upcase
  end
end