Skip to main content

Python Translation AI - Translate Python scripts or web pages on the fly to any human language

Project description

pytlai

Python Translation AI — Translate Python scripts or web pages on the fly to any human language.

Python 3.10+ License: MIT

Features

  • HTML Translation — Extract text nodes, skip code/scripts, reconstruct with lang/dir attributes
  • Python Translation — Translate docstrings and comments while preserving code structure
  • Context-Aware — Captures surrounding context to disambiguate words like "Run", "Post", "Save"
  • Smart Caching — Memory, Redis, or file-based caching to avoid re-translating identical content
  • Offline Mode — Export to JSON/YAML/PO files, ship with your project, no AI at runtime
  • 40+ Languages — Full support for major languages including RTL (Arabic, Hebrew, etc.)
  • Batch Processing — Deduplicate and batch API calls for efficiency

Installation

pip install pytlai

With optional dependencies:

pip install pytlai[redis]  # Redis cache support
pip install pytlai[yaml]   # YAML file support
pip install pytlai[all]    # All optional dependencies

Quick Start

Translate HTML

from pytlai import Pytlai
from pytlai.providers import OpenAIProvider

translator = Pytlai(
    target_lang="es_ES",
    provider=OpenAIProvider(),
)

result = translator.process("<h1>Hello World</h1><p>Welcome to our site.</p>")
print(result.content)
# <html lang="es-ES" dir="ltr"><h1>Hola Mundo</h1><p>Bienvenido a nuestro sitio.</p></html>

Translate Python Script

from pytlai import Pytlai
from pytlai.providers import OpenAIProvider

translator = Pytlai(
    target_lang="ja_JP",
    provider=OpenAIProvider(),
)

code = '''
def greet(name):
    """Return a greeting message."""
    # Build the greeting
    return f"Hello, {name}!"
'''

result = translator.process(code, content_type="python")
print(result.content)
# def greet(name):
#     """挨拶メッセージを返します。"""
#     # 挨拶を作成する
#     return f"Hello, {name}!"

Translate Files

# Auto-detects content type from extension
result = translator.process_file("app.py")
result = translator.process_file("index.html")

Command Line Interface

# Translate a file
pytlai translate index.html -l es_ES -o index_es.html

# Translate Python script
pytlai translate app.py -l fr_FR -o app_fr.py -t python

# Extract strings for translation
pytlai extract app.py -o strings.json

# Export to gettext PO format
pytlai export translations.json -o locale/es.po -f po

Offline Workflow

For projects that want to ship translations without runtime AI dependencies:

# 1. During development: translate and export
from pytlai import Pytlai
from pytlai.providers import OpenAIProvider
from pytlai.export import TranslationExporter

translator = Pytlai(target_lang="es_ES", provider=OpenAIProvider())
result = translator.process(content)

# Export translations
exporter = TranslationExporter()
exporter.export_from_cache(translator._cache, "locale/es_ES.json", target_lang="es_ES")
# 2. At runtime: use cached translations (no AI needed)
from pytlai import Pytlai
from pytlai.cache import FileCache

translator = Pytlai(
    target_lang="es_ES",
    cache=FileCache("locale/es_ES.json"),
    provider=None,  # No AI provider needed
)
result = translator.process(content)

Configuration

from pytlai import Pytlai, TranslationConfig, PythonOptions
from pytlai.providers import OpenAIProvider
from pytlai.cache import RedisCache

config = TranslationConfig(
    target_lang="fr_FR",
    source_lang="en",
    excluded_terms=["API", "SDK", "pytlai"],  # Never translate these
    context="Technical documentation for a Python library",
    python_options=PythonOptions(
        translate_docstrings=True,
        translate_comments=True,
        translate_strings=False,
    ),
)

translator = Pytlai(
    config=config,
    provider=OpenAIProvider(model="gpt-4o"),
    cache=RedisCache(url="redis://localhost:6379"),
)

Context-Aware Translation

Single words can translate differently depending on context. pytlai automatically captures surrounding information to help the AI choose the correct translation:

"Run" in <button class="execute-btn">  →  "Ejecutar" (execute)
"Run" in a sports article              →  "Correr" (physical running)

"Post" in a blog interface             →  "Publicar" (publish)
"Post" in mail context                 →  "Correo" (postal mail)

"Save" in a file dialog                →  "Guardar" (save file)
"Save" in a banking app                →  "Ahorrar" (save money)

Context captured automatically:

Content Context Information
HTML Parent tag, CSS classes, sibling text, ancestor path
Python docstring Function/class name, parameters, return type
Python comment Surrounding code lines

This happens automatically — no configuration needed.

Supported Languages

Tier 1 (High Quality): English, German, Spanish, French, Italian, Japanese, Portuguese, Chinese (Simplified/Traditional)

Tier 2 (Good Quality): Arabic, Bengali, Czech, Danish, Greek, Finnish, Hebrew, Hindi, Hungarian, Indonesian, Korean, Dutch, Norwegian, Polish, Romanian, Russian, Swedish, Thai, Turkish, Ukrainian, Vietnamese

Tier 3 (Functional): Bulgarian, Catalan, Persian, Croatian, Lithuanian, Latvian, Malay, Slovak, Slovenian, Serbian, Swahili, Filipino, Urdu

Environment Variables

Variable Description Default
OPENAI_API_KEY OpenAI API key -
OPENAI_MODEL Model to use gpt-4o-mini
OPENAI_BASE_URL Custom API base URL -
REDIS_URL Redis connection string redis://localhost:6379

API Reference

Pytlai

The main translator class.

Pytlai(
    target_lang: str,              # Target language code (e.g., "es_ES")
    provider: AIProvider = None,   # AI provider (OpenAIProvider, etc.)
    cache: TranslationCache = None, # Cache backend (InMemoryCache, RedisCache, FileCache)
    config: TranslationConfig = None, # Full configuration object
    source_lang: str = "en",       # Source language code
    excluded_terms: list[str] = None, # Terms to never translate
    context: str = None,           # Context for AI translations
)

Methods:

  • process(content, content_type=None)ProcessedContent — Translate content
  • process_file(path, content_type=None)ProcessedContent — Translate a file
  • translate_text(text)str — Translate a single string

ProcessedContent

Result of translation.

ProcessedContent(
    content: str,          # Translated content
    translated_count: int, # Number of newly translated items
    cached_count: int,     # Number of cache hits
    total_nodes: int,      # Total translatable nodes found
)

TextNode

Internal representation of a translatable text (for advanced usage).

TextNode(
    id: str,               # Unique identifier
    text: str,             # Original text content
    hash: str,             # SHA-256 hash for caching
    node_type: str,        # "html_text", "docstring", "comment", etc.
    context: str,          # Surrounding context for disambiguation
    metadata: dict,        # Additional info (line number, parent tag, etc.)
)

The context field is automatically populated with surrounding information:

  • HTML: "in <button class='primary'> | with: Cancel | inside: form > div"
  • Python: "docstring for function 'save_file' | parameters: path, data"

Contributing

Contributions are welcome! Please read our contributing guidelines and submit pull requests.

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytlai-0.1.1.tar.gz (46.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytlai-0.1.1-py3-none-any.whl (43.6 kB view details)

Uploaded Python 3

File details

Details for the file pytlai-0.1.1.tar.gz.

File metadata

  • Download URL: pytlai-0.1.1.tar.gz
  • Upload date:
  • Size: 46.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytlai-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7bc3477feab2a8a47bc92b917965bcaae4beec0dbc34e98f2f05203016650458
MD5 d7bfaf46efd7f53b446599cd69a11fb7
BLAKE2b-256 a6497a985ca75c9ce2406e3d6a22e26f03deecdef3e7af56f99e4e5028ae3023

See more details on using hashes here.

File details

Details for the file pytlai-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: pytlai-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 43.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytlai-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f1664441976964bc74b34a3524efa6a1ea6f024bbc60ba2a5ad9d0a345b8e3ce
MD5 d27b6784d46cc91dbb8bd6ac970b222b
BLAKE2b-256 35693313f1204ce5e425761156ef169a68a1de8202d320c6744d7f80a1c13a91

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page