Αν εχετε δουλεψει με το ενσωματωμενο 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 κ.ο.κ. Τα ερωτηματα παραμενουν γρηγορα γιατι ολα ειναι στον ιδιο πινακα. Η διεπαφη διαχειρισης εμφανιζει ολες τις γλωσσες διπλα-διπλα.
- Πλεονεκτηματα: Χωρις JOINs, γρηγορα ερωτηματα, διαφανης προσβαση μεσω περιγραφεων πεδιων, ωριμο οικοσυστημα
- Μειονεκτηματα: Αλλαγες σχηματος για καθε νεα γλωσσα, ευρυτεροι πινακες
django-parler
Δημιουργει εναν ξεχωριστο πινακα μεταφρασεων για καθε μοντελο. Ο αρχικος πινακας παραμενει καθαρος, και οι μεταφρασεις αποθηκευονται σε εναν συσχετισμενο πινακα συνδεδεμενο μεσω ξενου κλειδιου.
- Πλεονεκτηματα: Καθαρο σχημα, ευκολη προσθηκη γλωσσων χωρις migrations
- Μειονεκτηματα: Απαιτει JOINs για μεταφρασμενο περιεχομενο, ελαφρως πιο πολυπλοκα μοτιβα ερωτηματων
django-translations
Χρησιμοποιει εναν ενιαιο πινακα μεταφρασεων με γενικο ξενο κλειδι που δειχνει πισω σε οποιοδηποτε μοντελο. Ολες οι μεταφρασεις για ολα τα μοντελα πανε σε εναν πινακα.
- Πλεονεκτηματα: Ελαχιστες αλλαγες σχηματος, λειτουργει με οποιοδηποτε μοντελο
- Μειονεκτηματα: Τα ερωτηματα γενικου ξενου κλειδιου μπορει να ειναι αργα, λιγοτερο διαφανες API
Χειροκινητο πεδιο JSON
Μπορειτε να αποθηκευσετε μεταφρασεις σε ενα JSONField:
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- Πλεονεκτηματα: Χωρις επιπλεον εξαρτησεις, ευελικτο
- Μειονεκτηματα: Χωρις ενσωματωση ORM, χωρις υποστηριξη διαχειρισης, ολα χειροκινητα
Ποιο πρεπει να χρησιμοποιησετε;
Για τα περισσοτερα εργα, το 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.
-
Ανακαλυψη. Το TranslateBot ρωτα το μητρωο του django-modeltranslation για να βρει ολα τα καταχωρημενα μοντελα και τα μεταφρασιμα πεδια τους.
-
Ανιχνευση πηγης. Για καθε εγγραφη, διαβαζει το περιεχομενο πηγης. Ελεγχει πρωτα το βασικο πεδιο (π.χ.
name), και στη συνεχεια υποχωρει στο πρωτο συμπληρωμενο πεδιο ειδικο για τη γλωσσα (π.χ.name_en). Εγγραφες χωρις περιεχομενο πηγης παραλειπονται. -
Ομαδοποιηση. Οι εγγραφες ομαδοποιουνται σε παρτιδες και αποστελλονται στον παροχο AI. Αυτο διατηρει τις κλησεις API αποδοτικες και αποφευγει την υπερβαση οριων ρυθμου.
-
Μεταφραση. Καθε παρτιδα μεταφραζεται χρησιμοποιωντας το διαμορφωμενο μοντελο AI. Μπορειτε να χρησιμοποιησετε οποιονδηποτε παροχο LLM που υποστηριζεται απο το LiteLLM (OpenAI, Anthropic, Google, Azure, και πολλους αλλους) η DeepL.
-
Ατομικες εγγραφες. Ολες οι ενημερωσεις βασης δεδομενων για μια συνεδρια μεταφρασης τυλιγονται σε μια μονη συναλλαγη. Αν κατι παει στραβα, οπως ενα σφαλμα 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 και πηγαινετε σε οποιοδηποτε προιον. Θα δειτε τα πεδια μεταφρασης συμπληρωμενα:
- Name [de]: Ultraleichte Trail-Laufschuhe
- Description [de]: Diese leichten Trail-Laufschuhe bieten hervorragenden Grip...
- Short description [de]: Leicht, schnell und griffig auf jedem Untergrund.
Επαναλαβετε για καθε γλωσσα-στοχο:
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 ειτε απο τη βαση δεδομενων, ειναι μεταφρασμενο.
Επομενα βηματα
- Διαβαστε την πληρη αναφορα εντολων για ολες τις διαθεσιμες επιλογες
- Ρυθμιστε την ενσωματωση CI για αυτοματο ελεγχο ελλειπουσων μεταφρασεων
- Εξερευνηστε τα υποστηριζομενα μοντελα AI για να βρειτε την καλυτερη ισορροπια ποιοτητας και κοστους για το εργο σας