Назад к блогу

Перевод Django для соло-разработчиков: от недель до минут

2026-02-11 7 мин чтения
Перевод Django для соло-разработчиков: от недель до минут

Вы создали приложение на Django. Оно работает, пользователи регистрируются, и теперь вы хотите охватить людей, которые не говорят по-английски. Проблема очевидна, стоит только взглянуть: фреймворк интернационализации Django отлично извлекает переводимые строки, но абсолютно ничего не делает для их заполнения. Эта часть — на вас.

Если вы разработчик-одиночка или команда из двух человек, разрыв между makemessages и полностью переведённым приложением может казаться огромным. Я разберу реалистичные варианты, объясню, почему большинство из них не подходят для маленьких команд, и покажу рабочий процесс, который превращает перевод из многонедельной рутины в двухминутную команду.

Традиционные варианты (и почему они причиняют боль)

Вариант 1: Копировать-вставить из Google Translate

Самая распространённая первая попытка. Вы открываете файл .po, копируете каждый msgid в Google Translate, вставляете результат обратно как msgstr и повторяете. Для каждой строки. На каждом языке.

Типичное приложение Django содержит 200-500 переводимых строк. Если вы переводите на пять языков, это 1 000-2 500 циклов копирования-вставки. Даже если каждый занимает всего 30 секунд, вы смотрите на 8-20 часов монотонной работы. И это ещё до исправления ошибок форматирования, сломанных плейсхолдеров и неизбежно возникающей непоследовательной терминологии.

Хуже того, это нужно делать заново в следующем спринте, когда вы добавите новые строки.

Вариант 2: Профессиональные переводчики

Профессиональный перевод обычно стоит от $0.10 до $0.25 за слово. Приложение Django с 500 строками, в среднем по 8 слов в каждой, — это примерно 4 000 слов. По $0.15/слово это $600 за язык, или $3 000 за пять языков.

Для стартапа с венчурным финансированием — это ошибка округления. Для разработчика-одиночки, берущего $9/месяц за пользователя, это может съесть весь доход за квартал.

Вариант 3: Fiverr и фриланс-площадки

На Fiverr можно найти переводчиков за $20-50 за язык. Некоторые действительно квалифицированы. Многие просто вставляют ваш текст в Google Translate и берут с вас деньги за это. В итоге вы получаете то же качество, что и в Варианте 1, плюс дополнительный раунд коммуникации и неделю ожидания.

Вариант 4: Crowdin, Transifex или Weblate

Эти платформы мощные, но они рассчитаны на проекты с выделенными командами переводчиков. Накладные расходы на настройку (синхронизация репозиториев, настройка памяти переводов, управление доступом контрибьюторов) избыточны, когда вы единственный человек в проекте. Месячные подписки начинаются от $30-150/месяц для платных тарифов, и даже бесплатные тарифы требуют поддержки ещё одной сторонней интеграции.

Вариант 5: Вставить всё в ChatGPT

По качеству это работает на удивление хорошо. Вы вставляете содержимое файла .po в ChatGPT или Claude, просите перевод и получаете разумные результаты. Проблема в том, что это не масштабируется. Нужно вручную извлекать непереведённые строки, форматировать промпт, парсить ответ обратно в формат .po и обрабатывать пакетирование при превышении лимитов контекста. Это работает один раз. Как воспроизводимый рабочий процесс — ломается.

Автоматизированный подход

Что если весь шаг перевода — это одна команда? Такова идея TranslateBot — управляющей команды Django с открытым исходным кодом, которая читает ваши файлы .po, отправляет непереведённые строки провайдеру ИИ и записывает переводы обратно в правильном формате.

Вот как его настроить.

Шаг 1: Установить TranslateBot

uv add --dev translatebot-django

Или через pip:

pip install translatebot-django

Добавьте его в установленные приложения:

# settings.py
INSTALLED_APPS = [
    # ...
    'translatebot_django',
]

Шаг 2: Настройте провайдера ИИ

Добавьте две настройки:

# settings.py
import os

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"

TranslateBot работает с OpenAI, Anthropic Claude, Google Gemini и более чем 100 другими моделями через LiteLLM. Также поддерживается DeepL как выделенный бэкенд для перевода.

Шаг 3: Создайте TRANSLATING.md (необязательно, но рекомендуется)

Файл TRANSLATING.md в корне вашего проекта даёт ИИ контекст о вашем приложении. Именно это отличает общий машинный перевод от переводов, которые действительно подходят вашему продукту:

# Translation Context

## About This Project
A personal finance tracker for freelancers. Users track invoices,
expenses, and tax obligations.

## Tone
- Friendly and informal
- Use "du" in German, "tu" in French
- Keep financial terms precise

## Terminology
- "invoice" = "Rechnung" (German), "facture" (French)
- "dashboard" = keep as English loanword in all languages
- "freelancer" = keep as English loanword in German

Этот файл отправляется с каждым запросом на перевод, поэтому ИИ последовательно использует правильный тон и терминологию.

Шаг 4: Перевести

python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages

Три команды. Вот и всё. TranslateBot находит все непереведённые строки во всех ваших файлах .po, переводит их пакетами и записывает результаты. По умолчанию переводятся только пустые записи, поэтому повторный запуск команды после добавления новых строк переводит только новые.

Как это выглядит на практике

Вот реалистичный спринтовый рабочий процесс для разработчика-одиночки, поддерживающего пять языков:

Понедельник: Вы разрабатываете новую функцию. В процессе добавляете несколько новых переводимых строк, используя gettext() и {% trans %}.

from django.utils.translation import gettext_lazy as _

class InvoiceView(View):
    def post(self, request):
        # New string added during development
        messages.success(request, _("Invoice sent successfully."))

Перед коммитом: Вы запускаете три команды:

python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages

Команда translate обнаруживает новые непереведённые записи и переводит только их. Если вы добавили 5 новых строк и поддерживаете 5 языков, она выполняет 25 переводов за один вызов API. Весь процесс занимает меньше минуты.

Вы коммитите код, шаблоны и обновлённые файлы .po/.mo вместе. Переводы — часть вашего обычного процесса разработки, а не отдельный проект.

Предварительный просмотр перед коммитом

Если вы хотите увидеть переводы до их записи на диск, используйте режим пробного запуска:

python manage.py translate --dry-run

Это выводит каждый перевод в терминал, не модифицируя никакие файлы.

Сравнение стоимости

Вот где автоматизация становится неоспоримой.

Подход 500 строк, 5 языков Время Повторяющиеся затраты
Ручное копирование-вставка Бесплатно ~40 часов ~8 часов/спринт
Профессиональные переводчики ~$3 000 1-2 недели ~$600/спринт
Переводчики с Fiverr ~$100-250 3-7 дней ~$50/спринт
Crowdin/Transifex $30-150/мес Настройка: часы Постоянно
TranslateBot + GPT-4o-mini ~$0.05 ~2 минуты ~$0.01/спринт
TranslateBot + DeepL Free $0 ~2 минуты $0

Небольшое или среднее приложение Django с примерно 500 переводимыми строками обычно стоит менее $0.01 за язык при использовании gpt-4o-mini. Для большинства сольных проектов бесплатный тариф DeepL (500 000 символов/месяц) покрывает всё при нулевых затратах.

Уточним: переводы ИИ не идеальны. Бюджетные человеческие переводы тоже не идеальны. Разница в том, что переводы ИИ практически ничего не стоят, приходят мгновенно и могут быть перезапущены в любое время.

Интеграция с CI: никогда не отправляйте непереведённые строки

Один из самых полезных паттернов, который я нашёл как разработчик-одиночка, — это добавление проверки переводов в CI. TranslateBot включает команду check_translations, которая завершается ошибкой, если в любом файле .po есть непереведённые или нечёткие записи:

# .github/workflows/ci.yml
jobs:
  translations:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
      - run: uv python install
      - run: uv sync --frozen
      - name: Install gettext
        run: sudo apt-get update && sudo apt-get install -y --no-install-recommends gettext
      - name: Check translations
        run: uv run python manage.py check_translations --makemessages

Если вы добавите новый тег {% trans %} в шаблон и забудете запустить translate, CI это поймает:

locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed

Это превращает переводы из того, что нужно помнить делать, в то, что невозможно забыть.

Практические советы

Начните с двух-трёх языков. Не нужно запускаться на 15 языках в первый день. Выберите те, где у вас больше всего пользователей или самый большой целевой рынок. Немецкий, французский и испанский покрывают большую часть европейских рынков.

Попросите носителей языка проверить критичные строки. Переводы ИИ достаточно хороши для большинства текстов интерфейса, но заголовок вашей посадочной страницы и поток онбординга заслуживают человеческого взгляда. Попросите друга, пользователя или кого-то на форуме сообщества потратить 10 минут на проверку самых заметных строк.

Используйте пробный запуск перед перезаписью. Если вам когда-нибудь понадобится перевести всё заново (например, после обновления TRANSLATING.md с улучшенными рекомендациями по терминологии), сначала просмотрите изменения:

python manage.py translate --overwrite --dry-run

Держите TRANSLATING.md под контролем версий. Это часть конфигурации перевода вашего проекта. Когда вы обновите рекомендации по терминологии или тону, следующий запуск translate отразит эти изменения для любых новых строк.

Переводите по приложениям при необходимости. Если вы изменили строки только в одном приложении, можно ограничить область перевода:

python manage.py translate --app billing

От недель к минутам

Фреймворк интернационализации Django — один из лучших среди всех веб-фреймворков. Инструменты для makemessages, директорий локалей и compilemessages зрелые и надёжные. Единственной недостающей частью был сам шаг перевода. Это была дорогая и медленная часть.

С TranslateBot рабочий процесс становится таким:

  1. Пишите код с gettext() и {% trans %} как обычно
  2. Запустите makemessages для извлечения строк
  3. Запустите translate для заполнения переводов
  4. Запустите compilemessages для компиляции
  5. Закоммитьте всё вместе

Для разработчика-одиночки это означает, что локализация больше не проект, который вы планируете на «когда-нибудь». Это то, что вы можете сделать сегодня, за время, которое нужно для приготовления чашки кофе.

TranslateBot — проект с открытым исходным кодом, доступный на PyPI и GitHub. Установите его, запустите команду и увидьте своё приложение на новом языке за считанные минуты.

Прекратите редактировать .po файлы вручную

TranslateBot автоматизирует переводы Django с помощью ИИ. Одна команда, все ваши языки, копейки за перевод.