Hai costruito un'app Django. Funziona, gli utenti si registrano, e ora vuoi raggiungere persone che non parlano inglese. Il problema e' evidente appena lo guardi: il framework di internazionalizzazione di Django e' eccellente nell'estrarre le stringhe traducibili, ma non fa assolutamente nulla per inserire le traduzioni. Quella parte tocca a te.
Se sei uno sviluppatore singolo o un team di due persone, il divario tra makemessages e un'app completamente tradotta puo' sembrare enorme. Passero' in rassegna le opzioni realistiche, spieghero' perche' la maggior parte non funziona per team piccoli, e mostrero' un flusso di lavoro che trasforma la traduzione da un lavoro di settimane in un comando di due minuti.
Le Opzioni Tradizionali (e Perche' Fanno Male)
Opzione 1: Copia-Incolla da Google Translate
Il primo tentativo piu' comune. Apri il tuo file .po, copi ogni msgid in Google Translate, incolli il risultato come msgstr, e ripeti. Per ogni stringa. In ogni lingua.
Un'app Django tipica ha 200-500 stringhe traducibili. Se stai traducendo in cinque lingue, sono 1.000-2.500 cicli di copia-incolla. Anche se ognuno richiede solo 30 secondi, stai guardando 8-20 ore di lavoro noioso. E questo prima di correggere errori di formattazione, placeholder rotti e terminologia incoerente che inevitabilmente si insinuano.
Peggio ancora, devi rifarlo nel prossimo sprint quando aggiungi nuove stringhe.
Opzione 2: Traduttori Professionisti
La traduzione professionale costa tipicamente da $0,10 a $0,25 per parola. Un'app Django con 500 stringhe con una media di 8 parole ciascuna equivale a circa 4.000 parole. A $0,15/parola, sono $600 per lingua, o $3.000 per cinque lingue.
Per una startup finanziata da venture capital, e' un errore di arrotondamento. Per uno sviluppatore singolo che fa pagare $9/mese per utente, puo' mangiarsi l'intero fatturato del trimestre.
Opzione 3: Fiverr e Marketplace di Freelance
Puoi trovare traduttori su Fiverr per $20-50 per lingua. Alcuni sono genuinamente abili. Molti stanno semplicemente incollando il tuo testo in Google Translate e facendoti pagare per il privilegio. Finisci con la stessa qualita' dell'Opzione 1, piu' un giro extra di comunicazione e una settimana di attesa.
Opzione 4: Crowdin, Transifex o Weblate
Queste piattaforme sono potenti, ma sono progettate per progetti con team di traduzione dedicati. L'overhead di configurazione (sincronizzare repository, configurare la memoria di traduzione, gestire gli accessi dei contributori) e' eccessivo quando sei l'unica persona nel progetto. Gli abbonamenti mensili partono da $30-150/mese per i piani a pagamento, e anche i piani gratuiti richiedono di mantenere un'altra integrazione di terze parti.
Opzione 5: Incollare Tutto in ChatGPT
Questo in realta' funziona sorprendentemente bene per la qualita'. Incolli il contenuto del tuo file .po in ChatGPT o Claude, chiedi le traduzioni e ottieni risultati ragionevoli. Il problema e' che non scala. Devi estrarre manualmente le stringhe non tradotte, formattare il prompt, analizzare la risposta nel formato .po, e gestire il batching quando superi i limiti di contesto. Funziona una volta. Si rompe come flusso di lavoro ripetibile.
L'Approccio dell'Automazione
E se l'intero passaggio di traduzione fosse un singolo comando? Questa e' l'idea dietro TranslateBot, un comando di gestione Django open source che legge i tuoi file .po, invia le stringhe non tradotte a un provider AI, e scrive le traduzioni nel formato corretto.
Ecco come configurarlo.
Passo 1: Installare TranslateBot
uv add --dev translatebot-django
Oppure con pip:
pip install translatebot-django
Aggiungilo alle tue app installate:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
Passo 2: Configura il Tuo Provider AI
Aggiungi due impostazioni:
# settings.py
import os
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"
TranslateBot funziona con OpenAI, Anthropic Claude, Google Gemini e oltre 100 altri modelli tramite LiteLLM. Supporta anche DeepL come backend di traduzione dedicato.
Passo 3: Crea un TRANSLATING.md (Opzionale ma Consigliato)
Un file TRANSLATING.md nella root del tuo progetto fornisce all'AI il contesto sulla tua applicazione. Questo e' cio' che separa la traduzione automatica generica dalle traduzioni che si adattano veramente al tuo prodotto:
# 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
Questo file viene inviato con ogni richiesta di traduzione, cosi' l'AI usa coerentemente il tono e la terminologia corretti.
Passo 4: Traduci
python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages
Tre comandi. Tutto qui. TranslateBot trova tutte le stringhe non tradotte in tutti i tuoi file .po, le traduce in batch, e scrive i risultati. Per impostazione predefinita vengono tradotte solo le voci vuote, quindi eseguire il comando di nuovo dopo aver aggiunto nuove stringhe traduce solo quelle nuove.
Come Appare nella Pratica
Ecco un flusso di lavoro sprint realistico per uno sviluppatore singolo che supporta cinque lingue:
Lunedi': Costruisci una nuova funzionalita'. Aggiungi alcune nuove stringhe traducibili usando gettext() e {% trans %} durante lo sviluppo.
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."))
Prima del commit: Esegui tre comandi:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
Il comando translate rileva le nuove voci non tradotte e traduce solo quelle. Se hai aggiunto 5 nuove stringhe e supporti 5 lingue, esegue 25 traduzioni in una singola chiamata API. L'intero processo richiede meno di un minuto.
Fai il commit del tuo codice, template e file .po/.mo aggiornati insieme. Le traduzioni sono parte del tuo normale flusso di sviluppo, non un progetto separato.
Anteprima Prima del Commit
Se vuoi vedere le traduzioni prima che vengano scritte su disco, usa la modalita' dry-run:
python manage.py translate --dry-run
Questo stampa ogni traduzione nel terminale senza modificare alcun file.
Il Confronto dei Costi
Ecco dove l'automazione diventa difficile da contestare.
| Approccio | 500 stringhe, 5 lingue | Tempo | Costo ricorrente |
|---|---|---|---|
| Copia-incolla manuale | Gratuito | ~40 ore | ~8 ore/sprint |
| Traduttori professionisti | ~$3.000 | 1-2 settimane | ~$600/sprint |
| Traduttori Fiverr | ~$100-250 | 3-7 giorni | ~$50/sprint |
| Crowdin/Transifex | $30-150/mese | Setup: ore | Continuo |
| TranslateBot + GPT-4o-mini | ~$0,05 | ~2 minuti | ~$0,01/sprint |
| TranslateBot + DeepL Free | $0 | ~2 minuti | $0 |
Un'app Django di dimensioni piccole-medie con circa 500 stringhe traducibili costa tipicamente meno di $0,01 per lingua con gpt-4o-mini. Per la maggior parte dei progetti individuali, il piano gratuito di DeepL (500.000 caratteri/mese) copre tutto a costo zero.
Per essere chiari: le traduzioni AI non sono perfette. Neanche le traduzioni umane economiche lo sono. La differenza e' che le traduzioni AI non costano quasi nulla, arrivano istantaneamente e possono essere rieseguite quando vuoi.
Integrazione CI: Non Spedire Mai Stringhe Non Tradotte
Uno dei pattern piu' utili che ho trovato come sviluppatore singolo e' aggiungere un controllo delle traduzioni al CI. TranslateBot include un comando check_translations che fallisce se qualsiasi file .po ha voci non tradotte o 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
Se aggiungi un nuovo tag {% trans %} in un template e dimentichi di eseguire translate, il CI lo catturera':
locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed
Questo trasforma le traduzioni da qualcosa che devi ricordarti di fare a qualcosa che non puoi dimenticare.
Consigli Pratici
Inizia con due o tre lingue. Non devi lanciare in 15 lingue il primo giorno. Scegli quelle dove hai piu' utenti o il mercato piu' grande. Tedesco, francese e spagnolo coprono molto terreno per i mercati europei.
Fai revisionare le stringhe critiche da madrelingua. Le traduzioni AI sono abbastanza buone per la maggior parte dei testi UI, ma il titolo della tua landing page e il flusso di onboarding meritano un occhio umano. Chiedi a un amico, un utente o qualcuno in un forum della community di dedicare 10 minuti alla revisione delle stringhe piu' visibili.
Usa dry-run prima di sovrascrivere. Se hai bisogno di ritradurre tutto (ad esempio, dopo aver aggiornato il tuo TRANSLATING.md con linee guida terminologiche migliori), visualizza prima le modifiche:
python manage.py translate --overwrite --dry-run
Mantieni TRANSLATING.md nel controllo di versione. Fa parte della configurazione di traduzione del tuo progetto. Quando aggiorni le linee guida di terminologia o tono, la prossima esecuzione di translate riflettera' quei cambiamenti per qualsiasi nuova stringa.
Traduci per app quando necessario. Se hai modificato stringhe in una sola app, puoi limitare l'ambito della traduzione:
python manage.py translate --app billing
Da Settimane a Minuti
Il framework di internazionalizzazione di Django e' uno dei migliori in qualsiasi framework web. Gli strumenti per makemessages, le directory locale e compilemessages sono maturi e affidabili. L'unico pezzo mancante era il passaggio di traduzione stesso. Quello era la parte costosa e lenta.
Con TranslateBot, il flusso di lavoro diventa:
- Scrivi codice con
gettext()e{% trans %}come al solito - Esegui
makemessagesper estrarre le stringhe - Esegui
translateper inserire le traduzioni - Esegui
compilemessagesper compilare - Fai il commit di tutto insieme
Per uno sviluppatore singolo, questo significa che la localizzazione non e' piu' un progetto che pianifichi per "un giorno". E' qualcosa che puoi fare oggi, nel tempo che ci vuole per preparare una tazza di caffe'.
TranslateBot e' open source e disponibile su PyPI e GitHub. Installalo, esegui il comando e vedi la tua app in una nuova lingua in pochi minuti.