Class: BetterTranslate::DirectTranslator

Inherits:
Object
  • Object
show all
Defined in:
lib/better_translate/direct_translator.rb

Overview

Direct text translator for non-YAML workflows

Provides convenience methods for translating individual strings or batches without requiring YAML files. Useful for runtime translation needs.

Examples:

Basic usage

config = Configuration.new
config.provider = :chatgpt
config.openai_key = ENV['OPENAI_API_KEY']
config.source_language = "en"

translator = DirectTranslator.new(config)
result = translator.translate("Hello", to: "it", language_name: "Italian")
#=> "Ciao"

Batch translation

results = translator.translate_batch(
  ["Hello", "Goodbye"],
  to: "it",
  language_name: "Italian"
)
#=> ["Ciao", "Arrivederci"]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ DirectTranslator

Initialize direct translator

Examples:

translator = DirectTranslator.new(config)

Parameters:

  • config (Configuration)

    Configuration object (must be valid)

Raises:



39
40
41
42
43
44
45
# File 'lib/better_translate/direct_translator.rb', line 39

def initialize(config)
  @config = config
  # Validate provider is configured (minimal validation for DirectTranslator)
  raise ConfigurationError, "Provider must be configured" unless config.provider

  @provider = ProviderFactory.create(config.provider, config)
end

Instance Attribute Details

#configConfiguration (readonly)

Returns Configuration object.

Returns:



29
30
31
# File 'lib/better_translate/direct_translator.rb', line 29

def config
  @config
end

Instance Method Details

#translate(text, to:, language_name:) ⇒ String

Translate a single text string

Examples:

translator.translate("Hello", to: "it", language_name: "Italian")
#=> "Ciao"

Parameters:

  • text (String)

    Text to translate

  • to (String, Symbol)

    Target language code (e.g., "it", :it)

  • language_name (String)

    Full language name (e.g., "Italian")

Returns:

  • (String)

    Translated text

Raises:



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/better_translate/direct_translator.rb', line 61

def translate(text, to:, language_name:)
  Validator.validate_text!(text)
  target_lang_code = to.to_s
  Validator.validate_language_code!(target_lang_code)

  @provider.translate_text(text, target_lang_code, language_name)
rescue ValidationError
  raise # Re-raise validation errors without wrapping
rescue ApiError, StandardError => e
  raise TranslationError.new(
    "Failed to translate text: #{e.message}",
    context: { text: text, target_lang: target_lang_code, original_error: e }
  )
end

#translate_batch(texts, to:, language_name:, skip_errors: false) ⇒ Array<String, nil>

Translate multiple text strings

Examples:

translator.translate_batch(
  ["Hello", "Goodbye"],
  to: "it",
  language_name: "Italian"
)
#=> ["Ciao", "Arrivederci"]

With error handling

translator.translate_batch(
  ["Hello", "Goodbye"],
  to: "it",
  language_name: "Italian",
  skip_errors: true
)
#=> ["Ciao", nil] # If second translation fails

Parameters:

  • texts (Array<String>)

    Array of texts to translate

  • to (String, Symbol)

    Target language code

  • language_name (String)

    Full language name

  • skip_errors (Boolean) (defaults to: false)

    Continue on error, returning nil for failed translations (default: false)

Returns:

  • (Array<String, nil>)

    Array of translated texts (nil for errors if skip_errors: true)

Raises:

  • (ArgumentError)

    if texts is not an Array

  • (ValidationError)

    if any text is invalid

  • (TranslationError)

    if translation fails (unless skip_errors: true)



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/better_translate/direct_translator.rb', line 105

def translate_batch(texts, to:, language_name:, skip_errors: false)
  raise ArgumentError, "texts must be an Array" unless texts.is_a?(Array)

  return [] if texts.empty?

  # Validate all texts first
  texts.each { |text| Validator.validate_text!(text) }

  target_lang_code = to.to_s
  Validator.validate_language_code!(target_lang_code)

  # Translate each text
  texts.map do |text|
    @provider.translate_text(text, target_lang_code, language_name)
  rescue ApiError, StandardError => e
    unless skip_errors
      raise TranslationError.new(
        "Failed to translate text: #{e.message}",
        context: { text: text, target_lang: target_lang_code, original_error: e }
      )
    end

    nil
  end
end