https://github.com/efe/dj-translatemessages
LLM-powered Django translations ✨ Just call me "python manage.py translatemessages"
https://github.com/efe/dj-translatemessages
django i18n translation
Last synced: about 1 month ago
JSON representation
LLM-powered Django translations ✨ Just call me "python manage.py translatemessages"
- Host: GitHub
- URL: https://github.com/efe/dj-translatemessages
- Owner: efe
- License: mpl-2.0
- Created: 2025-08-21T00:16:12.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2026-05-14T18:24:00.000Z (2 months ago)
- Last Synced: 2026-05-14T20:30:26.853Z (2 months ago)
- Topics: django, i18n, translation
- Language: Python
- Homepage: https://pypi.org/project/yesglot/
- Size: 79.1 KB
- Stars: 101
- Watchers: 0
- Forks: 3
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# dj-translatemessages
[](https://pypi.org/project/dj-translatemessages) [](https://app.codecov.io/github/efe/dj-translatemessages) [](https://github.com/efe/dj-translatemessages/actions?query=branch%3Amain) [](https://github.com/efe/dj-translatemessages/blob/main/LICENSE) 
> 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
