Εχεις φτιαξει μια εφαρμογη Django. Λειτουργει, οι χρηστες εγγραφονται, και τωρα θελεις να φτασεις σε ανθρωπους που δεν μιλανε Αγγλικα. Το προβλημα ειναι προφανες τη στιγμη που το κοιτας: το framework διεθνοποιησης του Django ειναι εξαιρετικο στην εξαγωγη μεταφρασιμων string, αλλα δεν κανει απολυτως τιποτα για να συμπληρωσει τις μεταφρασεις. Αυτο το κομματι ειναι δικο σου.
Αν εισαι solo developer η ομαδα δυο ατομων, το χασμα μεταξυ του makemessages και μιας πληρως μεταφρασμενης εφαρμογης μπορει να φαινεται τεραστιο. Θα περασω απο τις ρεαλιστικες επιλογες, θα εξηγησω γιατι οι περισσοτερες αποτυγχανουν για μικρες ομαδες, και θα δειξω ενα workflow που μετατρεπει τη μεταφραση απο εργασια πολλων εβδομαδων σε εντολη δυο λεπτων.
Οι παραδοσιακες επιλογες (και γιατι πονανε)
Επιλογη 1: Αντιγραφη-επικολληση απο το Google Translate
Η πιο συνηθισμενη πρωτη προσπαθεια. Ανοιγεις το αρχειο .po, αντιγραφεις καθε msgid στο Google Translate, επικολλας το αποτελεσμα ως msgstr, και επαναλαμβανεις. Για καθε string. Σε καθε γλωσσα.
Μια τυπικη εφαρμογη Django εχει 200-500 μεταφρασιμα string. Αν μεταφραζεις σε πεντε γλωσσες, αυτοι ειναι 1.000-2.500 κυκλοι αντιγραφης-επικολλησης. Ακομα κι αν ο καθενας παιρνει μονο 30 δευτερολεπτα, κοιτας 8-20 ωρες ανιαρης δουλειας. Και αυτο πριν διορθωσεις τα σφαλματα μορφοποιησης, τα χαλασμενα placeholder, και την ασυνεπη ορολογια που αναποφευκτα εισχωρουν.
Χειροτερα, πρεπει να το κανεις ξανα στο επομενο sprint οταν προσθεσεις νεα string.
Επιλογη 2: Επαγγελματιες μεταφραστες
Η επαγγελματικη μεταφραση κοστιζει συνηθως $0,10 εως $0,25 ανα λεξη. Μια εφαρμογη Django με 500 string με μεσο ορο 8 λεξεις η καθεμια ανερχεται σε περιπου 4.000 λεξεις. Στα $0,15/λεξη, αυτο ειναι $600 ανα γλωσσα, η $3.000 για πεντε γλωσσες.
Για ενα startup με χρηματοδοτηση VC, αυτο ειναι σφαλμα στρογγυλοποιησης. Για εναν solo developer που χρεωνει $9/μηνα ανα χρηστη, μπορει να φαει ολα τα εσοδα σου για το τριμηνο.
Επιλογη 3: Fiverr και αγορες ελευθερων επαγγελματιων
Μπορεις να βρεις μεταφραστες στο Fiverr για $20-50 ανα γλωσσα. Μερικοι ειναι πραγματικα ικανοι. Πολλοι απλα επικολλουν το κειμενο σου στο Google Translate και σου χρεωνουν γι' αυτο. Καταληγεις με την ιδια ποιοτητα οπως στην Επιλογη 1, συν εναν επιπλεον γυρο επικοινωνιας και μια εβδομαδα αναμονης.
Επιλογη 4: Crowdin, Transifex η Weblate
Αυτες οι πλατφορμες ειναι ισχυρες, αλλα σχεδιαστηκαν για εργα με αφιερωμενες ομαδες μεταφρασης. Το κοστος εγκαταστασης (συγχρονισμος αποθετηριων, διαμορφωση μνημης μεταφρασης, διαχειριση προσβασης συνεισφεροντων) ειναι υπερβολικο οταν εισαι ο μονος ανθρωπος στο εργο. Οι μηνιαιες συνδρομες ξεκινουν απο $30-150/μηνα για τις επι πληρωμη βαθμιδες, και ακομα και οι δωρεαν βαθμιδες απαιτουν να συντηρεις ακομα μια ενσωματωση τριτων.
Επιλογη 5: Επικολλησε τα ολα στο ChatGPT
Αυτο στην πραγματικοτητα λειτουργει εκπληκτικα καλα ως προς την ποιοτητα. Επικολλας τα περιεχομενα του αρχειου .po στο ChatGPT η στο Claude, ζητας μεταφρασεις, και παιρνεις λογικα αποτελεσματα. Το προβλημα ειναι οτι δεν κλιμακωνεται. Πρεπει να εξαγεις χειροκινητα τα αμεταφραστα string, να μορφοποιησεις το prompt, να αναλυσεις την απαντηση πισω σε μορφη .po, και να διαχειριστεις το batching οταν υπερβαινεις τα ορια context. Λειτουργει μια φορα. Καταρρεει ως επαναλαμβανομενο workflow.
Η προσεγγιση αυτοματοποιησης
Τι θα γινοτανε αν ολο το βημα μεταφρασης ηταν μια μονο εντολη; Αυτη ειναι η ιδεα πισω απο το TranslateBot, μια εντολη διαχειρισης Django ανοιχτου κωδικα που διαβαζει τα αρχεια .po σου, στελνει τα αμεταφραστα string σε εναν παροχο 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 ως αφιερωμενο backend μεταφρασης.
Βημα 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 βρισκει ολα τα αμεταφραστα string σε ολα τα αρχεια .po σου, τα μεταφραζει σε παρτιδες, και γραφει τα αποτελεσματα πισω. Μονο οι κενες εγγραφες μεταφραζονται εξ ορισμου, οποτε η εκτελεση της εντολης ξανα μετα την προσθηκη νεων string μεταφραζει μονο τα νεα.
Πως φαινεται στην πραξη
Ακολουθει ενα ρεαλιστικο sprint workflow για εναν solo developer που υποστηριζει πεντε γλωσσες:
Δευτερα: Χτιζεις ενα νεο χαρακτηριστικο. Προσθετεις μερικα νεα μεταφρασιμα string χρησιμοποιωντας 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."))
Πριν το commit: Εκτελεις τρεις εντολες:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
Η εντολη translate ανιχνευει τις νεες αμεταφραστες εγγραφες και μεταφραζει μονο εκεινες. Αν προσθεσες 5 νεα string και υποστηριζεις 5 γλωσσες, κανει 25 μεταφρασεις σε μια μονο κληση API. Ολη η διαδικασια διαρκει λιγοτερο απο ενα λεπτο.
Κανεις commit τον κωδικα, τα template, και τα ενημερωμενα αρχεια .po/.mo μαζι. Οι μεταφρασεις ειναι μερος της κανονικης ροης αναπτυξης σου, οχι ξεχωριστο εργο.
Προεπισκοπηση πριν το commit
Αν θελεις να δεις τις μεταφρασεις πριν γραφτουν στο δισκο, χρησιμοποιησε τη λειτουργια dry-run:
python manage.py translate --dry-run
Αυτο εκτυπωνει καθε μεταφραση στο terminal χωρις να τροποποιει κανενα αρχειο.
Η συγκριση κοστους
Εδω η αυτοματοποιηση γινεται δυσκολο να αμφισβητηθει.
| Προσεγγιση | 500 string, 5 γλωσσες | Χρονος | Επαναλαμβανομενο κοστος |
|---|---|---|---|
| Χειροκινητη αντιγραφη-επικολληση | Δωρεαν | ~40 ωρες | ~8 ωρες/sprint |
| Επαγγελματιες μεταφραστες | ~$3.000 | 1-2 εβδομαδες | ~$600/sprint |
| Μεταφραστες Fiverr | ~$100-250 | 3-7 ημερες | ~$50/sprint |
| Crowdin/Transifex | $30-150/μηνα | Εγκατασταση: ωρες | Συνεχες |
| TranslateBot + GPT-4o-mini | ~$0,05 | ~2 λεπτα | ~$0,01/sprint |
| TranslateBot + DeepL Free | $0 | ~2 λεπτα | $0 |
Μια μικρη εως μεσαιου μεγεθους εφαρμογη Django με περιπου 500 μεταφρασιμα string κοστιζει συνηθως λιγοτερο απο $0,01 ανα γλωσσα με gpt-4o-mini. Για τα περισσοτερα solo εργα, η δωρεαν βαθμιδα του DeepL (500.000 χαρακτηρες/μηνα) καλυπτει τα παντα χωρις κοστος.
Για να ειμαστε σαφεις: οι μεταφρασεις AI δεν ειναι τελειες. Ουτε οι φθηνες ανθρωπινες μεταφρασεις. Η διαφορα ειναι οτι οι μεταφρασεις AI δεν κοστιζουν σχεδον τιποτα, φτανουν αμεσα, και μπορουν να εκτελεστουν ξανα οποτε θελεις.
Ενσωματωση CI: Μην στελνεις ποτε αμεταφραστα string
Ενα απο τα πιο χρησιμα μοτιβα που εχω βρει ως solo developer ειναι η προσθηκη ελεγχου μεταφρασης στο 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
Αν προσθεσεις ενα νεο tag {% trans %} σε ενα template και ξεχασεις να εκτελεσεις 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 γλωσσες απο την πρωτη μερα. Διαλεξε αυτες οπου εχεις τους περισσοτερους χρηστες η τη μεγαλυτερη αγορα. Γερμανικα, Γαλλικα και Ισπανικα καλυπτουν πολυ εδαφος για τις ευρωπαικες αγορες.
Ζητησε απο φυσικους ομιλητες να ελεγξουν τα κρισιμα string. Οι μεταφρασεις AI ειναι αρκετα καλες για τα περισσοτερα κειμενα UI, αλλα ο τιτλος της σελιδας προορισμου και η ροη onboarding αξιζουν ενα ανθρωπινο ματι. Ζητησε απο εναν φιλο, εναν χρηστη, η καποιον σε ενα forum κοινοτητας να αφιερωσει 10 λεπτα στον ελεγχο των πιο ορατων string.
Χρησιμοποιησε dry-run πριν την αντικατασταση. Αν χρειαστει ποτε να μεταφρασεις ξανα τα παντα (για παραδειγμα, μετα την ενημερωση του TRANSLATING.md με καλυτερες κατευθυντηριες γραμμες ορολογιας), κανε πρωτα προεπισκοπηση των αλλαγων:
python manage.py translate --overwrite --dry-run
Κρατα το TRANSLATING.md στον ελεγχο εκδοσεων. Ειναι μερος της διαμορφωσης μεταφρασης του εργου σου. Οταν ενημερωνεις την ορολογια η τις κατευθυντηριες γραμμες τονου, η επομενη εκτελεση translate θα αντικατοπτρισει αυτες τις αλλαγες για οποιαδηποτε νεα string.
Μεταφρασε ανα εφαρμογη οταν χρειαζεται. Αν αλλαξες string μονο σε μια εφαρμογη, μπορεις να περιορισεις το ευρος της μεταφρασης:
python manage.py translate --app billing
Απο εβδομαδες σε λεπτα
Το framework διεθνοποιησης του Django ειναι ενα απο τα καλυτερα σε οποιοδηποτε web framework. Τα εργαλεια για makemessages, τους φακελους locale, και compilemessages ειναι ωριμα και αξιοπιστα. Το μονο κομματι που ελειπε ηταν το ιδιο το βημα μεταφρασης. Αυτο ηταν το ακριβο, αργο κομματι.
Με το TranslateBot, το workflow γινεται:
- Γραψε κωδικα με
gettext()και{% trans %}οπως κανονικα - Εκτελεσε
makemessagesγια να εξαγεις τα string - Εκτελεσε
translateγια να συμπληρωσεις τις μεταφρασεις - Εκτελεσε
compilemessagesγια να μεταγλωττισεις - Κανε commit τα παντα μαζι
Για εναν solo developer, αυτο σημαινει οτι η τοπικοποιηση δεν ειναι πλεον ενα εργο που σχεδιαζεις για "καποτε". Ειναι κατι που μπορεις να κανεις σημερα, στον χρονο που χρειαζεται για να φτιαξεις ενα φλιτζανι καφε.
Το TranslateBot ειναι ανοιχτου κωδικα και διαθεσιμο στο PyPI και στο GitHub. Εγκαταστησε το, εκτελεσε την εντολη, και δες την εφαρμογη σου σε μια νεα γλωσσα μεσα σε λιγα λεπτα.