Назад до блогу

Як перекладати вміст бази даних Django за допомогою AI

2026-02-18 8 хв читання
Як перекладати вміст бази даних Django за допомогою AI

Якщо ви працювали з вбудованим фреймворком інтернаціоналізації (i18n) Django, ви знаєте, що він добре обробляє статичні рядки. Обгортання тексту в gettext() або використання тегу шаблону {% trans %} витягує рядки у файли .po, які заповнюють перекладачі. Система перевірена часом і чудово працює для коду та шаблонів.

Але що робити з контентом, який зберігається у вашій базі даних?

Назви продуктів, заголовки статей, описи категорій, відповіді на FAQ, контент, створений користувачами. Нічого з цього немає у вашому вихідному коді. Команда makemessages Django ніколи не знайде це, і файли .po тут не допоможуть. Якщо ваш додаток надає динамічний контент користувачам кількома мовами, вам потрібна інша стратегія.

Ось як це зробити: використовуйте django-modeltranslation для додавання перекладних полів до ваших моделей, а потім автоматизуйте переклад за допомогою AI, використовуючи TranslateBot.

Пакети для перекладу бази даних Django

Кілька сторонніх пакетів вирішують проблему перекладу бази даних, кожен з різною архітектурою.

django-modeltranslation

Додає мовні колонки безпосередньо до існуючих таблиць. Поле title стає title_en, title_de, title_fr тощо. Запити залишаються швидкими, оскільки все знаходиться в одній таблиці. Інтерфейс адміністратора показує всі мови поруч.

django-parler

Створює окрему таблицю перекладів для кожної моделі. Оригінальна таблиця залишається чистою, а переклади зберігаються у пов'язаній таблиці, з'єднаній зовнішнім ключем.

django-translations

Використовує єдину таблицю перекладів із загальним зовнішнім ключем, що вказує на будь-яку модель. Усі переклади для всіх моделей потрапляють в одну таблицю.

Ручне поле JSON

Ви можете зберігати переклади в JSONField:

class Product(models.Model):
    name_translations = models.JSONField(default=dict)
    # {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}

Який обрати?

Для більшості проектів django-modeltranslation -- найкращий вибір. Це найзріліший пакет, має найкращу інтеграцію з адміністратором Django і зберігає всі дані в одній таблиці для швидких запитів. Компроміс (ширші таблиці та міграція для кожної нової мови) є прийнятним для переважної більшості додатків. Решта цього посібника використовує django-modeltranslation.

Налаштування django-modeltranslation крок за кроком

Крок 1: Встановіть пакет

TranslateBot включає django-modeltranslation як необов'язкову залежність. Встановіть обидва одразу:

pip install translatebot-django[modeltranslation]

Або якщо ви використовуєте uv:

uv add --dev translatebot-django[modeltranslation]

Крок 2: Налаштуйте параметри Django

Дві речі важливі в settings.py: порядок додатків та список мов.

# settings.py

INSTALLED_APPS = [
    'modeltranslation',          # Must be BEFORE django.contrib.admin
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Your apps
    'shop',
    'translatebot_django',
]

LANGUAGE_CODE = 'en'

LANGUAGES = [
    ('en', 'English'),
    ('de', 'German'),
    ('fr', 'French'),
    ('nl', 'Dutch'),
]

Додаток modeltranslation повинен бути перед django.contrib.admin, щоб він міг пропатчити класи адміністратора для відображення полів перекладу.

Крок 3: Зареєструйте моделі для перекладу

Створіть файл translation.py у кожному додатку, що має моделі для перекладу. Для додатку інтернет-магазину:

# shop/translation.py

from modeltranslation.translator import register, TranslationOptions
from .models import Product, Category


@register(Product)
class ProductTranslationOptions(TranslationOptions):
    fields = ('name', 'description', 'short_description')


@register(Category)
class CategoryTranslationOptions(TranslationOptions):
    fields = ('name', 'description')

Включайте лише поля, що містять текст, зрозумілий людині. Не реєструйте поля на кшталт slug, price або sku.

Крок 4: Створіть та виконайте міграції

python manage.py makemigrations
python manage.py migrate

Після цього таблиця shop_product матиме нові колонки:

Column Type
name varchar(200)
name_en varchar(200)
name_de varchar(200)
name_fr varchar(200)
name_nl varchar(200)
description text
description_en text
description_de text
description_fr text
description_nl text
short_description text
short_description_en text
short_description_de text
short_description_fr text
short_description_nl text

Кожна мова, визначена в LANGUAGES, отримує власну колонку для кожного зареєстрованого поля.

Проблема: Порожні поля перекладу

Тепер у вас є схема, але кожна колонка _de, _fr та _nl порожня. Якщо у вас 500 продуктів із 3 перекладними полями та 3 цільовими мовами, це 4 500 порожніх полів, які чекають на заповнення.

Перекладати цей контент вручну нереалістично. Навіть із професійним перекладацьким сервісом вам потрібно експортувати дані, надіслати їх, дочекатися доставки та імпортувати результати назад. Для невеликої команди або розробника-одинака це зазвичай означає, що функціонал ніколи не виходить у світ.

Тут і з'являється TranslateBot.

Автоматизація перекладів за допомогою TranslateBot

Команда управління translate в TranslateBot може заповнити всі порожні поля за допомогою AI. Спочатку налаштуйте свій API-ключ:

# settings.py

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"  # Fast and cost-effective

Потім перекладіть усі зареєстровані моделі на цільову мову:

python manage.py translate --target-lang de --models

Ця єдина команда знаходить кожну модель, зареєстровану в django-modeltranslation, визначає поля, порожні для цільової мови, та заповнює їх перекладами, згенерованими AI.

Переклад конкретних моделей

Якщо ви хочете перекласти лише продукти, а не категорії:

python manage.py translate --target-lang de --models Product

Або кілька конкретних моделей:

python manage.py translate --target-lang de --models Product Category

Попередній перегляд із dry run

Завжди переглядайте результат перед записом у базу даних:

python manage.py translate --target-lang de --models --dry-run

Це показує точно, що буде перекладено, без зміни жодних записів.

Повторний переклад існуючого контенту

За замовчуванням TranslateBot пропускає поля, які вже мають переклад. Щоб перезаписати існуючі переклади (наприклад, після покращення моделі AI або додавання контексту):

python manage.py translate --target-lang de --models --overwrite

Переклад усіх мов одразу

Якщо ви не вказуєте --target-lang і маєте LANGUAGES, визначений у налаштуваннях, TranslateBot перекладає на всі налаштовані мови:

python manage.py translate --models

Як працює конвеєр перекладу

Ось що відбувається при виконанні команди translate.

  1. Виявлення. TranslateBot запитує реєстр django-modeltranslation, щоб знайти всі зареєстровані моделі та їх перекладні поля.

  2. Визначення джерела. Для кожного запису зчитується вихідний контент. Спочатку перевіряється базове поле (наприклад, name), потім відбувається fallback до першого заповненого мовного поля (наприклад, name_en). Записи без вихідного контенту пропускаються.

  3. Пакетна обробка. Записи групуються в пакети та надсилаються до провайдера AI. Це забезпечує ефективність API-викликів та запобігає перевищенню лімітів швидкості.

  4. Переклад. Кожен пакет перекладається за допомогою налаштованої моделі AI. Ви можете використовувати будь-якого провайдера LLM, підтримуваного LiteLLM (OpenAI, Anthropic, Google, Azure та багато інших) або DeepL.

  5. Атомарний запис. Усі оновлення бази даних для сесії перекладу обгорнуті в одну транзакцію. Якщо щось піде не так, наприклад помилка API або порушення обмеження бази даних, жодні часткові дані не зберігаються. Все або нічого.

Повний приклад робочого процесу

Ось повний приклад від визначення моделі до перекладеного контенту з використанням моделі Product для електронної комерції.

Визначення моделі

# shop/models.py

from django.db import models


class Product(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    short_description = models.CharField(max_length=500, blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    sku = models.CharField(max_length=50, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

Реєстрація для перекладу

# shop/translation.py

from modeltranslation.translator import register, TranslationOptions
from .models import Product


@register(Product)
class ProductTranslationOptions(TranslationOptions):
    fields = ('name', 'description', 'short_description')

Виконання міграцій

python manage.py makemigrations shop
python manage.py migrate

Додавання контексту перекладу (необов'язково)

Створіть файл TRANSLATING.md у корені проекту, щоб надати AI контекст про предметну область ваших продуктів:

# Translation Context

## About This Project
E-commerce store for outdoor sports equipment.

## Terminology
- "trail runners" refers to trail running shoes, not people
- Keep brand names (Nike, Salomon, Arc'teryx) untranslated
- "Gore-Tex" is a brand name, do not translate

## Tone
- Use informal "du" form in German
- Product descriptions should sound enthusiastic but not exaggerated

Переклад

# Preview first
python manage.py translate --target-lang de --models Product --dry-run

# Apply translations
python manage.py translate --target-lang de --models Product

Вивід:

Translating Product model fields to German (de)...
Found 142 products with untranslated fields
Translating batch 1/15...
Translating batch 2/15...
...
Translating batch 15/15...
Successfully translated 142 products

Перевірка в адміністраторі

Відкрийте адміністратор Django та перейдіть до будь-якого продукту. Ви побачите заповнені поля перекладу:

Повторіть для кожної цільової мови:

python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product

Або перекладіть усі мови одразу:

python manage.py translate --models Product

Найкращі практики

Зробіть резервну копію бази даних перед запуском масових перекладів на продакшені. TranslateBot використовує атомарні транзакції, тому невдалий запуск не залишить часткових даних. Але наявність резервної копії дає вам можливість відкотити зміни, якщо якість перекладу не відповідає очікуванням.

# PostgreSQL example
pg_dump mydb > backup_before_translation.sql

Спочатку використовуйте dry run. Завжди запускайте з --dry-run перед застосуванням перекладів до нової моделі або мови. Перегляньте вивід, щоб переконатися, що вихідний контент визначається правильно, а переклади виглядають розумно.

Перекладайте по одній моделі для великих баз даних. Це полегшує перегляд результатів та повторний запуск конкретних моделей за потреби.

python manage.py translate --target-lang de --models Product
python manage.py translate --target-lang de --models Category
python manage.py translate --target-lang de --models Article

Додайте контекст перекладу. Файл TRANSLATING.md із термінологією, специфічною для домену, та рекомендаціями щодо тону значно покращує якість перекладу. Це особливо важливо для спеціалізованих галузей, таких як медицина, юриспруденція або технічні продукти.

Тримайте мову джерела заповненою. TranslateBot читає з базового поля або поля мови джерела. Переконайтеся, що ваш процес введення даних завжди заповнює мову джерела. Порожні поля джерела означають порожні переклади.

Поєднайте з перекладом PO-файлів для повного покриття. Перекладіть як рядки коду, так і контент бази даних:

# Static strings in code and templates
python manage.py makemessages -l de -l fr -l nl
python manage.py translate
python manage.py compilemessages

# Dynamic content in the database
python manage.py translate --models

Таким чином кожен рядок, який бачать ваші користувачі, чи то з шаблону, чи з бази даних, буде перекладений.

Наступні кроки

Припиніть редагувати .po файли вручну

TranslateBot автоматизує переклади Django за допомогою ШІ. Одна команда, всі ваші мови, копійки за переклад.