Πίσω στο blog

Πώς να Μεταφράσετε Περιεχόμενο Βάσης Δεδομένων Django με AI

2026-02-18 9 λεπτά ανάγνωσης
Πώς να Μεταφράσετε Περιεχόμενο Βάσης Δεδομένων Django με AI

Αν εχετε δουλεψει με το ενσωματωμενο framework διεθνοποιησης (i18n) του Django, ξερετε οτι χειριζεται καλα τα στατικα strings. Η αναδιπλωση κειμενου σε gettext() η η χρηση του template tag {% trans %} εξαγει τα strings σε αρχεια .po, τα οποια συμπληρωνουν οι μεταφραστες. Το συστημα ειναι δοκιμασμενο στη μαχη και λειτουργει αριστα για κωδικα και templates.

Αλλα τι γινεται με το περιεχομενο που ειναι αποθηκευμενο στη βαση δεδομενων σας;

Ονοματα προιοντων, τιτλοι αρθρων, περιγραφες κατηγοριων, απαντησεις 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, και κρατα ολα τα δεδομενα στον ιδιο πινακα για γρηγορα ερωτηματα. Ο συμβιβασμος (ευρυτεροι πινακες και ενα migration ανα νεα γλωσσα) ειναι διαχειρισιμος για τη συντριπτικη πλειονοτητα των εφαρμογων. Το υπολοιπο αυτου του οδηγου χρησιμοποιει το 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: Δημιουργια και εκτελεση migrations

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), και στη συνεχεια υποχωρει στο πρωτο συμπληρωμενο πεδιο ειδικο για τη γλωσσα (π.χ. 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')

Εκτελεση migrations

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

Επαληθευση στο admin

Ανοιξτε το admin του 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 για πληρη καλυψη. Μεταφραστε τοσο τα strings κωδικα οσο και το περιεχομενο βασης δεδομενων:

# 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

Με αυτον τον τροπο καθε string που βλεπουν οι χρηστες σας, ειτε προερχεται απο template ειτε απο τη βαση δεδομενων, ειναι μεταφρασμενο.

Επομενα βηματα

Σταματήστε να επεξεργάζεστε αρχεία .po χειροκίνητα

Το TranslateBot αυτοματοποιεί τις μεταφράσεις Django με AI. Μία εντολή, όλες οι γλώσσες σας, λίγα λεπτά ανά μετάφραση.