Powrót do bloga

Jak tłumaczyć zawartość bazy danych Django za pomocą AI

2026-02-18 8 min czytania
Jak tłumaczyć zawartość bazy danych Django za pomocą AI

Jesli pracowales z wbudowanym frameworkiem internacjonalizacji (i18n) Django, wiesz, ze dobrze radzi sobie ze statycznymi lancuchami znakow. Owijanie tekstu w gettext() lub uzywanie tagu szablonu {% trans %} wyodrebnia lancuchy do plikow .po, ktore wypelniaja tlumacze. System jest sprawdzony w boju i swietnie dziala dla kodu i szablonow.

Ale co z trescia przechowywana w bazie danych?

Nazwy produktow, tytuly artykulow, opisy kategorii, odpowiedzi na FAQ, tresci generowane przez uzytkownikow. Nic z tego nie znajduje sie w kodzie zrodlowym. Polecenie makemessages Django nigdy tego nie znajdzie, a pliki .po nie pomoga. Jesli Twoja aplikacja serwuje dynamiczna tresc uzytkownikom w wielu jezykach, potrzebujesz innej strategii.

Oto jak to zrobic: uzyj django-modeltranslation, aby dodac tlumaczalne pola do swoich modeli, a nastepnie zautomatyzuj tlumaczenie za pomoca AI przy uzyciu TranslateBot.

Pakiety do tlumaczenia bazy danych Django

Kilka pakietow firm trzecich rozwiazuje problem tlumaczenia bazy danych, kazdy z inna architektura.

django-modeltranslation

Dodaje kolumny specyficzne dla jezyka bezposrednio do istniejacych tabel. Pole title staje sie title_en, title_de, title_fr itd. Zapytania pozostaja szybkie, poniewaz wszystko jest w tej samej tabeli. Interfejs admina pokazuje wszystkie jezyki obok siebie.

django-parler

Tworzy osobna tabele tlumaczen dla kazdego modelu. Oryginalna tabela pozostaje czysta, a tlumaczenia sa przechowywane w powiazanej tabeli polaczonej kluczem obcym.

django-translations

Uzywa pojedynczej tabeli tlumaczen z generycznym kluczem obcym wskazujacym na dowolny model. Wszystkie tlumaczenia dla wszystkich modeli trafiaja do jednej tabeli.

Reczne pole JSON

Mozesz przechowywac tlumaczenia w JSONField:

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

Ktory wybrac?

Dla wiekszosci projektow django-modeltranslation to najlepszy wybor. To najbardziej dojrzaly pakiet, ma najlepsza integracje z adminem Django i przechowuje wszystkie dane w tej samej tabeli dla szybkich zapytan. Kompromis (szersze tabele i migracja dla kazdego nowego jezyka) jest do ogarniecia dla zdecydowanej wiekszosci aplikacji. Reszta tego poradnika uzywa django-modeltranslation.

Konfiguracja django-modeltranslation krok po kroku

Krok 1: Zainstaluj pakiet

TranslateBot dolacza django-modeltranslation jako opcjonalna zaleznosc. Zainstaluj oba naraz:

pip install translatebot-django[modeltranslation]

Lub jesli uzywasz uv:

uv add --dev translatebot-django[modeltranslation]

Krok 2: Skonfiguruj ustawienia Django

Dwie rzeczy sa wazne w settings.py: kolejnosc aplikacji i lista jezykow.

# 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'),
]

Aplikacja modeltranslation musi byc przed django.contrib.admin, aby mogla zalatac klasy admina w celu wyswietlania pol tlumaczen.

Krok 3: Zarejestruj modele do tlumaczenia

Utworz plik translation.py w kazdej aplikacji, ktora ma tlumaczalne modele. Dla aplikacji sklepu e-commerce:

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

Dolaczaj tylko pola zawierajace tekst czytelny dla czlowieka. Nie rejestruj pol takich jak slug, price czy sku.

Krok 4: Utworz i uruchom migracje

python manage.py makemigrations
python manage.py migrate

Po tym tabela shop_product ma nowe kolumny:

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

Kazdy jezyk zdefiniowany w LANGUAGES dostaje wlasna kolumne dla kazdego zarejestrowanego pola.

Problem: Puste pola tlumaczen

Masz juz schemat, ale kazda kolumna _de, _fr i _nl jest pusta. Jesli masz 500 produktow z 3 tlumaczalnymi polami i 3 jezykami docelowymi, to 4500 pustych pol czekajacych na wypelnienie.

Reczne tlumaczenie tej tresci nie jest realistyczne. Nawet korzystajac z profesjonalnej uslugi tlumaczeniowej, musisz wyeksportowac dane, wyslac je, czekac na dostawe i zaimportowac wyniki z powrotem. Dla malego zespolu lub samodzielnego programisty oznacza to zwykle, ze funkcja nigdy nie zostaje wydana.

Tu wlasnie wkracza TranslateBot.

Automatyzacja tlumaczen za pomoca TranslateBot

Polecenie zarzadzania translate TranslateBot moze wypelnic wszystkie puste pola za pomoca AI. Najpierw skonfiguruj klucz API:

# settings.py

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

Nastepnie przetlumacz wszystkie zarejestrowane modele na jezyk docelowy:

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

To pojedyncze polecenie znajduje kazdy model zarejestrowany w django-modeltranslation, identyfikuje pola puste dla jezyka docelowego i wypelnia je tlumaczeniami wygenerowanymi przez AI.

Tlumaczenie konkretnych modeli

Jesli chcesz przetlumaczyc tylko produkty, a nie kategorie:

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

Lub kilka konkretnych modeli:

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

Podglad za pomoca dry run

Zawsze sprawdz podglad przed zapisem do bazy danych:

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

To pokazuje dokladnie, co zostanie przetlumaczone, bez modyfikowania jakichkolwiek rekordow.

Ponowne tlumaczenie istniejacej tresci

Domyslnie TranslateBot pomija pola, ktore juz maja tlumaczenie. Aby nadpisac istniejace tlumaczenia (na przyklad po ulepszeniu modelu AI lub dodaniu kontekstu):

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

Tlumaczenie wszystkich jezykow naraz

Jesli pominiesz --target-lang i masz zdefiniowane LANGUAGES w ustawieniach, TranslateBot tlumaczy na wszystkie skonfigurowane jezyki:

python manage.py translate --models

Jak dziala pipeline tlumaczenia

Oto co sie dzieje po uruchomieniu polecenia translate.

  1. Odkrywanie. TranslateBot odpytuje rejestr django-modeltranslation, aby znalezc wszystkie zarejestrowane modele i ich tlumaczalne pola.

  2. Wykrywanie zrodla. Dla kazdego rekordu odczytuje tresc zrodlowa. Najpierw sprawdza pole bazowe (np. name), a nastepnie cofa sie do pierwszego wypelnionego pola specyficznego dla jezyka (np. name_en). Rekordy bez tresci zrodlowej sa pomijane.

  3. Grupowanie w partie. Rekordy sa grupowane w partie i wysylane do dostawcy AI. Dzieki temu wywolania API sa wydajne i nie przekraczaja limitow szybkosci.

  4. Tlumaczenie. Kazda partia jest tlumaczona za pomoca skonfigurowanego modelu AI. Mozesz uzyc dowolnego dostawcy LLM wspieranego przez LiteLLM (OpenAI, Anthropic, Google, Azure i wielu innych) lub DeepL.

  5. Atomowe zapisy. Wszystkie aktualizacje bazy danych dla sesji tlumaczenia sa opakowane w pojedyncza transakcje. Jesli cos pojdzie nie tak, jak blad API lub naruszenie ograniczenia bazy danych, zadne czesciowe dane nie zostana zapisane. Wszystko albo nic.

Kompletny przyklad workflow

Oto pelny przyklad od definicji modelu do przetlumaczonej tresci, z uzyciem modelu Product w e-commerce.

Zdefiniuj model

# 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

Zarejestruj do tlumaczenia

# shop/translation.py

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


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

Uruchom migracje

python manage.py makemigrations shop
python manage.py migrate

Dodaj kontekst tlumaczenia (opcjonalnie)

Utworz plik TRANSLATING.md w katalogu glownym projektu, aby dac AI kontekst dotyczacy domeny Twoich produktow:

# 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

Przetlumacz

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

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

Wynik:

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

Zweryfikuj w adminie

Otworz admina Django i przejdz do dowolnego produktu. Zobaczysz wypelnione pola tlumaczen:

Powtorz dla kazdego jezyka docelowego:

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

Lub przetlumacz wszystkie jezyki naraz:

python manage.py translate --models Product

Najlepsze praktyki

Zrob kopie zapasowa bazy danych przed uruchomieniem masowych tlumaczen na produkcji. TranslateBot uzywa transakcji atomowych, wiec nieudane uruchomienie nie pozostawi czesciowych danych. Ale posiadanie kopii zapasowej daje mozliwosc cofniecia zmian, jesli jakosc tlumaczenia nie spelni oczekiwan.

# PostgreSQL example
pg_dump mydb > backup_before_translation.sql

Najpierw uzyj dry run. Zawsze uruchamiaj z --dry-run przed zastosowaniem tlumaczen do nowego modelu lub jezyka. Przejrzyj wynik, aby upewnic sie, ze tresc zrodlowa jest prawidlowo wykrywana, a tlumaczenia wygladaja rozsadnie.

Tlumacz jeden model na raz w przypadku duzych baz danych. Ulatwia to przegladanie wynikow i ponowne uruchamianie konkretnych modeli w razie potrzeby.

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

Dodaj kontekst tlumaczenia. Plik TRANSLATING.md z terminologia specyficzna dla domeny i wytycznymi dotyczacymi tonu znaczaco poprawia jakosc tlumaczenia. Jest to szczegolnie wazne dla specjalistycznych dziedzin, takich jak medycyna, prawo czy produkty techniczne.

Utrzymuj wypelniony jezyk zrodlowy. TranslateBot czyta z pola bazowego lub pola jezyka zrodlowego. Upewnij sie, ze Twoj workflow wprowadzania danych zawsze wypelnia jezyk zrodlowy. Puste pola zrodlowe oznaczaja puste tlumaczenia.

Polacz z tlumaczeniem plikow PO dla pelnego pokrycia. Przetlumacz zarowno lancuchy w kodzie, jak i tresc bazy danych:

# 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

W ten sposob kazdy lancuch, ktory widza Twoi uzytkownicy, czy to z szablonu, czy z bazy danych, jest przetlumaczony.

Nastepne kroki

Przestań ręcznie edytować pliki .po

TranslateBot automatyzuje tłumaczenia Django za pomocą AI. Jedno polecenie, wszystkie języki, grosze za tłumaczenie.