An open API service indexing awesome lists of open source software.

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"

Awesome Lists containing this project

README

          

# 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)