Ви створили Django-додаток. Він працює, користувачі реєструються, і тепер ви хочете охопити людей, які не говорять англійською. Проблема очевидна з першого погляду: фреймворк інтернаціоналізації Django чудово витягує рядки для перекладу, але абсолютно нічого не робить для заповнення перекладів. Ця частина лежить на вас.
Якщо ви розробник-одинак або команда з двох осіб, розрив між makemessages і повністю перекладеним додатком може здаватися величезним. Я розгляну реалістичні варіанти, поясню, чому більшість з них не працює для малих команд, і покажу робочий процес, який перетворює переклад з багатотижневого завдання на двохвилинну команду.
Традиційні варіанти (і чому вони болючі)
Варіант 1: Копіювати-вставити з Google Translate
Найпоширеніша перша спроба. Ви відкриваєте файл .po, копіюєте кожен msgid у Google Translate, вставляєте результат як msgstr і повторюєте. Для кожного рядка. Для кожної мови.
Типовий Django-додаток має 200-500 рядків для перекладу. Якщо ви перекладаєте на п'ять мов, це 1000-2500 циклів копіювання-вставки. Навіть якщо кожен займає лише 30 секунд, це 8-20 годин нудної роботи. І це до того, як ви виправите помилки форматування, зламані placeholder та непослідовну термінологію, які неминуче з'являються.
Гірше того, вам доведеться зробити це знову наступного спринту, коли додасте нові рядки.
Варіант 2: Професійні перекладачі
Професійний переклад зазвичай коштує від $0.10 до $0.25 за слово. Django-додаток з 500 рядками по 8 слів у середньому — це приблизно 4000 слів. При $0.15/слово це $600 за мову, або $3000 за п'ять мов.
Для стартапу з венчурним фінансуванням це похибка округлення. Для розробника-одинака, який бере $9/місяць з користувача, це може з'їсти весь дохід за квартал.
Варіант 3: Fiverr і фріланс-платформи
Ви можете знайти перекладачів на Fiverr за $20-50 за мову. Деякі справді кваліфіковані. Багато просто вставляють ваш текст у Google Translate і беруть з вас за цю привілею. Ви отримуєте ту саму якість, що й у Варіанті 1, плюс додатковий раунд комунікації та тиждень очікування.
Варіант 4: Crowdin, Transifex або Weblate
Ці платформи потужні, але вони розроблені для проєктів з виділеними командами перекладачів. Накладні витрати на налаштування (синхронізація репозиторіїв, конфігурація пам'яті перекладів, управління доступом учасників) є надмірними, коли ви єдина людина в проєкті. Щомісячні підписки починаються від $30-150/місяць для платних планів, і навіть безкоштовні плани вимагають підтримки ще однієї сторонньої інтеграції.
Варіант 5: Вставити все в ChatGPT
Це насправді працює напрочуд добре з точки зору якості. Ви вставляєте вміст файлу .po в ChatGPT або Claude, просите переклади та отримуєте прийнятні результати. Проблема в тому, що це не масштабується. Вам потрібно вручну витягувати неперекладені рядки, форматувати промпт, парсити відповідь назад у формат .po та обробляти пакетування при перевищенні лімітів контексту. Працює один раз. Руйнується як повторюваний робочий процес.
Підхід автоматизації
А що, якби весь крок перекладу був однією командою? Це ідея TranslateBot — команди управління Django з відкритим кодом, яка читає ваші файли .po, надсилає неперекладені рядки до провайдера AI та записує переклади назад у правильному форматі.
Ось як це налаштувати.
Крок 1: Встановіть TranslateBot
uv add --dev translatebot-django
Або з pip:
pip install translatebot-django
Додайте до встановлених додатків:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
Крок 2: Налаштуйте провайдера AI
Додайте два налаштування:
# 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 у корені вашого проєкту дає AI контекст про ваш додаток. Це те, що відрізняє загальний машинний переклад від перекладів, які дійсно підходять вашому продукту:
# 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
Цей файл надсилається разом з кожним запитом на переклад, тому AI послідовно використовує правильний тон і термінологію.
Крок 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 разом. Переклади є частиною вашого звичайного процесу розробки, а не окремим проєктом.
Попередній перегляд перед комітом
Якщо ви хочете побачити переклади до їх запису на диск, використовуйте режим dry-run:
python manage.py translate --dry-run
Це виводить кожен переклад у термінал без модифікації жодного файлу.
Порівняння витрат
Ось де автоматизацію стає важко заперечити.
| Підхід | 500 рядків, 5 мов | Час | Повторювані витрати |
|---|---|---|---|
| Ручне копіювання-вставка | Безкоштовно | ~40 годин | ~8 год./спринт |
| Професійні перекладачі | ~$3000 | 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 символів/місяць) покриває все без витрат.
Для ясності: AI-переклади не ідеальні. Дешеві людські переклади теж. Різниця в тому, що AI-переклади майже нічого не коштують, приходять миттєво і можуть бути перезапущені в будь-який час.
Інтеграція з 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 мовах з першого дня. Виберіть ті, де у вас найбільше користувачів або найбільший адресний ринок. Німецька, французька та іспанська покривають значну частину європейських ринків.
Попросіть носіїв мови переглянути критичні рядки. AI-переклади достатньо хороші для більшості тексту UI, але заголовок вашої цільової сторінки та процес онбордингу заслуговують на людський погляд. Попросіть друга, користувача або когось на форумі спільноти витратити 10 хвилин на перегляд найбільш помітних рядків.
Використовуйте dry-run перед перезаписом. Якщо вам коли-небудь потрібно перекласти все заново (наприклад, після оновлення TRANSLATING.md з кращими рекомендаціями щодо термінології), спочатку перегляньте зміни:
python manage.py translate --overwrite --dry-run
Зберігайте TRANSLATING.md у системі контролю версій. Це частина конфігурації перекладу вашого проєкту. Коли ви оновлюєте термінологію або рекомендації щодо тону, наступний запуск translate відобразить ці зміни для будь-яких нових рядків.
Перекладайте по додатках за потреби. Якщо ви змінили рядки лише в одному додатку, ви можете обмежити область перекладу:
python manage.py translate --app billing
Від тижнів до хвилин
Фреймворк інтернаціоналізації Django є одним з найкращих серед усіх веб-фреймворків. Інструменти для makemessages, каталоги locale та compilemessages є зрілими та надійними. Єдиний елемент, якого не вистачало — це сам крок перекладу. Раніше це була дорога та повільна частина.
З TranslateBot робочий процес стає таким:
- Пишіть код з
gettext()та{% trans %}як зазвичай - Запустіть
makemessagesдля витягування рядків - Запустіть
translateдля заповнення перекладів - Запустіть
compilemessagesдля компіляції - Закомітьте все разом
Для розробника-одинака це означає, що локалізація більше не є проєктом, який ви плануєте на "колись". Це те, що ви можете зробити сьогодні, за час, потрібний для приготування чашки кави.
TranslateBot має відкритий код і доступний на PyPI та GitHub. Встановіть його, запустіть команду та побачте свій додаток новою мовою за лічені хвилини.