Nasty.Translation.Translator (Nasty v0.3.0)

View Source

Cross-lingual translation using AST-based transformation.

Translates between English, Spanish, and Catalan by:

  1. Parsing source text to language-agnostic AST
  2. Transforming AST tokens and structure for target language
  3. Rendering AST in target language

This approach preserves syntactic structure and provides transparent, linguistically-motivated translations without neural models.

Supported Language Pairs

  • English ↔ Spanish (en ↔ es)
  • English ↔ Catalan (en ↔ ca)
  • Spanish ↔ Catalan (es ↔ ca)

Examples

# Simple translation
iex> Translator.translate("The cat sleeps", :en, :es)
{:ok, "El gato duerme"}

# Automatic source language detection
iex> Translator.translate("El gato duerme", :auto, :en)
{:ok, "The cat sleeps"}

# With AST inspection
iex> {:ok, doc} = English.parse("The red car")
iex> Translator.translate_document(doc, :es)
{:ok, %Document{language: :es, ...}}

Options

  • :preserve_structure - Keep original AST structure (default: true)
  • :handle_unknowns - Strategy for unknown words: :keep, :skip (default: :keep)
  • :debug - Return intermediate AST transformations (default: false)

Limitations

  • Lexicon-based: Unknown words are passed through untranslated
  • No context-based disambiguation (yet)
  • Idioms require explicit entries in lexicon
  • Gender assignment for English nouns uses defaults

Summary

Types

Language code

Translation options

Functions

Lists all supported language pairs.

Checks if a language pair is supported.

Translates text from source language to target language.

Translates an already-parsed document to target language.

Types

language()

@type language() :: :en | :es | :ca | :auto

Language code

options()

@type options() :: [
  preserve_structure: boolean(),
  handle_unknowns: :keep | :skip,
  debug: boolean()
]

Translation options

Functions

supported_pairs()

@spec supported_pairs() :: [{language(), language()}]

Lists all supported language pairs.

Examples

iex> Translator.supported_pairs()
[
  {:en, :es}, {:es, :en},
  {:en, :ca}, {:ca, :en},
  {:es, :ca}, {:ca, :es}
]

supports?(source, target)

@spec supports?(language(), language()) :: boolean()

Checks if a language pair is supported.

Examples

iex> Translator.supports?(:en, :es)
true

iex> Translator.supports?(:en, :fr)
false

translate(text, source_lang, target_lang, opts \\ [])

@spec translate(String.t(), language(), language(), options()) ::
  {:ok, String.t()} | {:error, term()}

Translates text from source language to target language.

Examples

iex> Translator.translate("The cat sleeps", :en, :es)
{:ok, "El gato duerme"}

iex> Translator.translate("Hola mundo", :es, :en)
{:ok, "Hello world"}

iex> Translator.translate("El gat dorm", :ca, :es)
{:ok, "El gato duerme"}

Options

  • :preserve_structure - Keep original AST structure (default: true)
  • :handle_unknowns - Strategy for unknown words: :keep, :skip (default: :keep)

translate_document(document, target_lang, opts \\ [])

@spec translate_document(Nasty.AST.Document.t(), language(), options()) ::
  {:ok, Nasty.AST.Document.t()} | {:error, term()}

Translates an already-parsed document to target language.

Useful when you want to inspect or modify the AST before/after translation.

Examples

iex> {:ok, doc} = English.parse("The cat sleeps")
iex> Translator.translate_document(doc, :es)
{:ok, %Document{language: :es, ...}}