Ai construit o aplicatie Django. Functioneaza, utilizatorii se inregistreaza, si acum vrei sa ajungi la oameni care nu vorbesc engleza. Problema este evidenta in momentul in care te uiti: framework-ul de internationalizare al Django este excelent la extragerea string-urilor traductibile, dar nu face absolut nimic pentru a completa traducerile. Aceasta parte iti revine tie.
Daca esti un dezvoltator solo sau o echipa de doua persoane, distanta dintre makemessages si o aplicatie complet tradusa poate parea enorma. Voi parcurge optiunile realiste, voi explica de ce majoritatea nu functioneaza pentru echipe mici si voi arata un flux de lucru care transforma traducerea dintr-o sarcina de mai multe saptamani intr-o comanda de doua minute.
Optiunile traditionale (si de ce dor)
Optiunea 1: Copiaza-lipeste din Google Translate
Cea mai comuna prima incercare. Deschizi fisierul .po, copiezi fiecare msgid in Google Translate, lipesti rezultatul inapoi ca msgstr si repeti. Pentru fiecare string. In fiecare limba.
O aplicatie Django tipica are 200-500 de string-uri traductibile. Daca traduci in cinci limbi, asta inseamna 1.000-2.500 de cicluri de copiere-lipire. Chiar daca fiecare dureaza doar 30 de secunde, te uiti la 8-20 de ore de munca plicticoasa. Si asta inainte sa repari erorile de formatare, placeholder-urile defecte si terminologia inconsecventa care se strecoara inevitabil.
Mai rau, trebuie sa o faci din nou in sprint-ul urmator cand adaugi string-uri noi.
Optiunea 2: Traducatori profesionisti
Traducerea profesionala costa de obicei intre $0,10 si $0,25 per cuvant. O aplicatie Django cu 500 de string-uri cu o medie de 8 cuvinte fiecare inseamna aproximativ 4.000 de cuvinte. La $0,15/cuvant, asta inseamna $600 per limba sau $3.000 pentru cinci limbi.
Pentru un startup finantat de VC, aceasta este o eroare de rotunjire. Pentru un dezvoltator solo care percepe $9/luna per utilizator, poate sa-ti manance intregul venit pentru trimestru.
Optiunea 3: Fiverr si piete de freelancing
Poti gasi traducatori pe Fiverr cu $20-50 per limba. Unii sunt cu adevarat priceputi. Multi pur si simplu lipesc textul tau in Google Translate si te taxeaza pentru privilegiu. Ajungi cu aceeasi calitate ca in Optiunea 1, plus o runda suplimentara de comunicare si o saptamana de asteptare.
Optiunea 4: Crowdin, Transifex sau Weblate
Aceste platforme sunt puternice, dar sunt concepute pentru proiecte cu echipe de traducere dedicate. Efortul de configurare (sincronizarea depozitelor, configurarea memoriei de traducere, gestionarea accesului contributorilor) este exagerat cand esti singura persoana in proiect. Abonamentele lunare incep de la $30-150/luna pentru nivelurile platite, si chiar si nivelurile gratuite necesita sa mentii inca o integrare de la terti.
Optiunea 5: Lipeste totul in ChatGPT
Aceasta functioneaza de fapt surprinzator de bine din punct de vedere al calitatii. Lipesti continutul fisierului .po in ChatGPT sau Claude, ceri traduceri si primesti rezultate rezonabile. Problema este ca nu scaleaza. Trebuie sa extragi manual string-urile netraduse, sa formatezi prompt-ul, sa parsezi raspunsul inapoi in formatul .po si sa gestionezi batch-urile cand depasesti limitele de context. Functioneaza o data. Se destrama ca flux de lucru repetabil.
Abordarea automatizarii
Ce-ar fi daca intregul pas de traducere ar fi o singura comanda? Aceasta este ideea din spatele TranslateBot, o comanda de management Django open-source care citeste fisierele tale .po, trimite string-urile netraduse catre un furnizor AI si scrie traducerile inapoi in formatul corect.
Iata cum se configureaza.
Pasul 1: Instaleaza TranslateBot
uv add --dev translatebot-django
Sau cu pip:
pip install translatebot-django
Adauga-l in aplicatiile instalate:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
Pasul 2: Configureaza furnizorul AI
Adauga doua setari:
# settings.py
import os
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"
TranslateBot functioneaza cu OpenAI, Anthropic Claude, Google Gemini si peste 100 de alte modele prin LiteLLM. De asemenea, suporta DeepL ca backend de traducere dedicat.
Pasul 3: Creeaza un TRANSLATING.md (optional dar recomandat)
Un fisier TRANSLATING.md in radacina proiectului tau ofera contextul AI despre aplicatia ta. Aceasta este ceea ce separa traducerea automata generica de traducerile care se potrivesc cu adevarat produsului tau:
# 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
Acest fisier este trimis impreuna cu fiecare cerere de traducere, astfel incat AI-ul foloseste constant tonul si terminologia corecte.
Pasul 4: Tradu
python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages
Trei comenzi. Atat. TranslateBot gaseste toate string-urile netraduse din toate fisierele tale .po, le traduce in loturi si scrie rezultatele inapoi. Implicit, doar intrarile goale sunt traduse, asa ca rularea comenzii din nou dupa adaugarea de string-uri noi traduce doar pe cele noi.
Cum arata in practica
Iata un flux de lucru de sprint realist pentru un dezvoltator solo care suporta cinci limbi:
Luni: Construiesti o functionalitate noua. Adaugi cateva string-uri traductibile noi folosind gettext() si {% trans %} pe parcurs.
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."))
Inainte de commit: Rulezi trei comenzi:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
Comanda translate detecteaza intrarile noi netraduse si traduce doar pe acelea. Daca ai adaugat 5 string-uri noi si suporti 5 limbi, face 25 de traduceri intr-un singur apel API. Intregul proces dureaza sub un minut.
Faci commit la cod, template-uri si fisierele .po/.mo actualizate impreuna. Traducerile fac parte din fluxul tau normal de dezvoltare, nu un proiect separat.
Previzualizeaza inainte de commit
Daca vrei sa vezi traducerile inainte sa fie scrise pe disc, foloseste modul dry-run:
python manage.py translate --dry-run
Aceasta afiseaza fiecare traducere in terminal fara sa modifice vreun fisier.
Comparatia costurilor
Aici automatizarea devine greu de contestat.
| Abordare | 500 string-uri, 5 limbi | Timp | Cost recurent |
|---|---|---|---|
| Copiere-lipire manuala | Gratis | ~40 ore | ~8 ore/sprint |
| Traducatori profesionisti | ~$3.000 | 1-2 saptamani | ~$600/sprint |
| Traducatori Fiverr | ~$100-250 | 3-7 zile | ~$50/sprint |
| Crowdin/Transifex | $30-150/luna | Configurare: ore | Continuu |
| TranslateBot + GPT-4o-mini | ~$0,05 | ~2 minute | ~$0,01/sprint |
| TranslateBot + DeepL Free | $0 | ~2 minute | $0 |
O aplicatie Django mica spre medie cu aproximativ 500 de string-uri traductibile costa de obicei sub $0,01 per limba cu gpt-4o-mini. Pentru majoritatea proiectelor solo, nivelul gratuit DeepL (500.000 caractere/luna) acopera totul fara costuri.
Sa fim clari: traducerile AI nu sunt perfecte. Nici traducerile umane ieftine. Diferenta este ca traducerile AI nu costa aproape nimic, vin instant si pot fi rerulate oricand doresti.
Integrare CI: Nu livra niciodata string-uri netraduse
Unul dintre cele mai utile pattern-uri pe care le-am gasit ca dezvoltator solo este adaugarea unei verificari de traducere in CI. TranslateBot include o comanda check_translations care esueaza daca vreun fisier .po are intrari netraduse sau fuzzy:
# .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
Daca adaugi un tag {% trans %} nou intr-un template si uiti sa rulezi translate, CI il va prinde:
locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed
Aceasta transforma traducerile din ceva ce trebuie sa-ti amintesti in ceva ce nu poti uita.
Sfaturi practice
Incepe cu doua sau trei limbi. Nu trebuie sa lansezi in 15 limbi din prima zi. Alege limbile unde ai cei mai multi utilizatori sau cea mai mare piata adresabila. Germana, franceza si spaniola acopera mult teren pentru pietele europene.
Cere vorbitorilor nativi sa revizuiasca string-urile critice. Traducerile AI sunt suficient de bune pentru majoritatea textului UI, dar titlul paginii tale de destinatie si fluxul de onboarding merita un ochi uman. Roaga un prieten, un utilizator sau pe cineva dintr-un forum de comunitate sa petreaca 10 minute revizuind cele mai vizibile string-uri.
Foloseste dry-run inainte de suprascrie. Daca trebuie vreodata sa retraduci totul (de exemplu, dupa actualizarea TRANSLATING.md cu linii directoare mai bune de terminologie), previzualizeaza mai intai modificarile:
python manage.py translate --overwrite --dry-run
Pastreaza TRANSLATING.md in controlul versiunilor. Este parte din configuratia de traducere a proiectului tau. Cand actualizezi terminologia sau liniile directoare de ton, urmatoarea rulare translate va reflecta acele modificari pentru orice string-uri noi.
Tradu per aplicatie cand este necesar. Daca ai schimbat string-uri doar intr-o singura aplicatie, poti limita scopul traducerii:
python manage.py translate --app billing
De la saptamani la minute
Framework-ul de internationalizare al Django este unul dintre cele mai bune din orice framework web. Instrumentele pentru makemessages, directoarele locale si compilemessages sunt mature si fiabile. Singura piesa care lipsea era pasul de traducere in sine. Acesta obisnuia sa fie partea scumpa si lenta.
Cu TranslateBot, fluxul de lucru devine:
- Scrie cod cu
gettext()si{% trans %}ca de obicei - Ruleaza
makemessagespentru a extrage string-urile - Ruleaza
translatepentru a completa traducerile - Ruleaza
compilemessagespentru a compila - Fa commit la totul impreuna
Pentru un dezvoltator solo, aceasta inseamna ca localizarea nu mai este un proiect pe care il planifici pentru "candva". Este ceva ce poti face astazi, in timpul necesar pentru a face o ceasca de cafea.
TranslateBot este open source si disponibil pe PyPI si GitHub. Instaleaza-l, ruleaza comanda si vezi-ti aplicatia intr-o limba noua in cateva minute.