# dj-translatemessages [![](https://img.shields.io/pypi/v/dj-translatemessages)](https://pypi.org/project/dj-translatemessages) [![](https://img.shields.io/codecov/c/github/efe/dj-translatemessages)](https://app.codecov.io/github/efe/dj-translatemessages) [![](https://img.shields.io/github/check-runs/efe/dj-translatemessages/main)](https://github.com/efe/dj-translatemessages/actions?query=branch%3Amain) [![](https://img.shields.io/github/license/efe/dj-translatemessages)](https://github.com/efe/dj-translatemessages/blob/main/LICENSE) ![](https://img.shields.io/pypi/frameworkversions/django/dj-translatemessages) > LLM-powered Django translations ✨ > Formerly published as `yesglot`. A Django app that autofills missing translations in `.po` files using an LLM, while respecting [ICU](https://unicode-org.github.io/icu/) format placeholders and source references. Project story: [The birth of yesglot.com](https://efe.me/posts/2026-05-14-the-birth-of-yesglot-com/) explains the background behind `yesglot` and the rename to `dj-translatemessages`. ## Why dj-translatemessages? - 🧠 LLM-powered: works with [100+ LLM models](https://models.litellm.ai/) through LiteLLM’s unified API - 🔒 Placeholder-safe: keeps {name}, {{handlebars}}, URLs, and emails intact - 📦 Django-native: one management command: python manage.py translatemessages - 🧮 Cost-aware: prints per-file and total cost (via LiteLLM) - 🧱 Token-safe batching: automatically splits work to avoid context overflows ## 🚀Quick Start ### Installation ```bash pip install dj-translatemessages ``` Version `2.0.0` renames the Django app to `dj_translatemessages`. If you're upgrading from `yesglot`, update `INSTALLED_APPS` and imports accordingly. Migration steps: [docs/migration_guideline.md](docs/migration_guideline.md). Add `dj_translatemessages` to your Django settings: ```python INSTALLED_APPS = [ # ... "dj_translatemessages", ] ``` ## Configuration Set the model from [100+ LLM models](https://models.litellm.ai/) and API key in your Django settings: ```python DJ_TRANSLATEMESSAGES_LLM_MODEL = "openai/gpt-4o-mini" DJ_TRANSLATEMESSAGES_API_KEY = "sk-..." ``` ## Usage A typical workflow with Django translations: 1. Extract messages into .po files (creates entries with empty msgstr): ``` python manage.py makemessages -all ``` 2. Autofill missing translations with `dj-translatemessages`: ``` python manage.py translatemessages ``` Example output: ``` ▶ Translation run started. Using translation model: openai/gpt-4o-mini • Language: French [fr] - Scanning: locale/fr/LC_MESSAGES/django.po Missing entries: 12. Translating… Filled 12 entries in 3.21s • Cost: $0.0123 ============================================================ Done in 3.76s • Files: 1 • Missing found: 12 • Filled: 12 • Total cost: $0.0123 ``` 3. Compile translations into .mo files (so Django can use them at runtime): ``` python manage.py compilemessages ``` ## Advanced Usage Optional parameters, - `DJ_TRANSLATEMESSAGES_SAFETY_MARGIN`: 1000 (default) - `DJ_TRANSLATEMESSAGES_PER_ITEM_OUTPUT`: 100 (default) - `DJ_TRANSLATEMESSAGES_LLM_MODEL_TEMPERATURE`: 0 (default) ### System Prompt It is preconfigured, though you may override it to tailor the behavior of your translation. - `DJ_TRANSLATEMESSAGES_SYSTEM_PROMPT_FUNCTION`: for example, `"myproject.myapp.utils.get_system_prompt"` - `DJ_TRANSLATEMESSAGES_SYSTEM_PROMPT`: string Default: > You are a professional translator. Translate into the target language. > - Keep placeholders like {name} / {{handlebars}} unchanged. > - Keep URLs and emails unchanged. > - Return ONLY a JSON array of strings in the same order. ### Preamble Template It’s already configured, but you can override it to adjust how your translation behaves. - `DJ_TRANSLATEMESSAGES_PREAMBLE_TEMPLATE_FUNCTION`: for example, `"myproject.myapp.utils.get_preamble"` - `DJ_TRANSLATEMESSAGES_PREAMBLE_TEMPLATE`: string Default: > Translate these items into {language}. Return ONLY a JSON array: # License Mozilla Public License Version 2.0 ![dj-translatemessages Logo](assets/logo.png)