Come si implementa la traduzione in un progetto Django?
La traduzione di Django si basa su GNU gettext: si contrassegnano le stringhe con gettext_lazy() in Python o con {% translate %} nei template, si esegue django-admin makemessages per estrarle in un .po file di messaggio per locale, traduci quel file, quindi esegui django-admin compilemessages per produrre il binario .mo Il file Django viene caricato al momento della richiesta. Il framework gestisce l'estrazione, il rilevamento della lingua tramite LocaleMiddleware e la ricerca in fase di esecuzione; non gestisce la traduzione vera e propria. Quel passaggio intermedio: ottenere un .po file tradotto in 10 o 30 lingue e reinserito nel repository: è qui che entra in gioco un sistema di gestione delle traduzioni come Smartling, che analizza .po e .pot Gestisce i file in modo nativo, sostituendo il trasferimento manuale dei file.
Ultimo aggiornamento: 10 settembre 2026
Perché i progetti di traduzione di Django si bloccano dopo la prima localizzazione
Lo strato di internazionalizzazione di Django è completo e ben documentato, quindi la maggior parte dei team riesce a far funzionare la prima lingua in un giorno. I problemi emergono quando entra in gioco una seconda o terza località, una seconda release o un secondo sviluppatore — e ognuno di questi si basa sul fatto che Django automatizza l'estrazione e la ricerca ma lascia la traduzione come passaggio manuale basato su file.
- Il file .po diventa il collo di bottiglia, non il codice.
makemessagesne scrive unolocale/LANG/LC_MESSAGES/django.poper località, e ognuno di loro deve andare da un traduttore e tornare dopo ogni cambio di stringa. Con cinque località e release settimanali, sono cinque file in volo ogni settimana, di solito via email o unità condivisa. - Le voci imprecise omettono silenziosamente le traduzioni. Quando
makemessagesassocia una stringa modificata a una vecchia traduzione, contrassegna la voce con#, fuzzy, ecompilemessagesignora le voci fuzzy per impostazione predefinita. Un file .po dall'aspetto tradotto.poIl file può quindi essere distribuito in produzione con stringhe non tradotte, un problema che gli sviluppatori raramente notano nella lingua di origine. - Forme plurali e interruzioni di contesto nei file modificati manualmente. Gettext esprime i plurali tramite
msgid_plurale un'intestazionePlural-Formsspecifica per la lingua (il russo richiede tre forme, l'inglese due) e il contesto tramitemsgctxt. I traduttori modificano il file.poIl testo in un editor spesso viola la sintassi dell'intestazione o comprime due variantimsgctxtdi "May" (il mese e il verbo) in un'unica traduzione. - Le stringhe di formato Python vengono tradotte in modo errato. Una stringa come
"%(count)d items"contiene un#, python-format, e se un traduttore modifica il segnapostocompilemessagesfallisce con "il numero di specifiche di formato in 'msgid' e 'msgstr' non corrisponde". La documentazione ufficiale di Django dedica una sezione specifica alla risoluzione di questo problema. - I template, JavaScript e i modelli richiedono ciascuno un percorso diverso. Le stringhe template utilizzano
{% translate %}e{% blocktranslate %}, le stringhe JavaScript necessitano del dominiodjangojsseparato gestito daJavaScriptCatalog, e il contenuto del database (il nome di un prodotto digitato da un utente) non è affatto coperto da gettext: richiede un pacchetto come django-modeltranslation o django-parler. I team che pianificano tenendo conto solo di uno di questi tre aspetti scoprono gli altri due a metà progetto.
Quali sono i migliori strumenti per tradurre le applicazioni Django?
Il miglior set di strumenti di traduzione per Django ha quattro livelli e Django stesso fornisce solo i primi due: il meccanismo gettext integrato del framework per le stringhe dell'interfaccia utente, un pacchetto di traduzione del modello per il contenuto del database, un sistema di gestione della traduzione per spostare .po file da e verso i traduttori, e un repository o un hook CI/CD in modo che il processo di andata e ritorno avvenga automaticamente ad ogni commit.
- Livello 1 — il livello gettext integrato di Django (stringhe UI).
django.utils.translationforniscegettext(),gettext_lazy(),ngettext()per plurali epgettext()per contesto; i modelli usano{% translate %}e{% blocktranslate %}. Imakemessagescomandi ecompilemessagesavvolgono le utilitàxgettextGNU gettext ,msgfmt,msgmerge, emsguniq(minimal gettext 0.19). Questo layer è libero, maturo e il predefinito corretto per ogni stringa che vive nel codice sorgente o nei template. - Livello 2 — Pacchetti di traduzione di modelli (contenuti del database). Gettext non può tradurre un
CharFieldvalore memorizzato in PostgreSQL. django-modeltranslation aggiunge una colonna per campo per lingua alla tabella esistente e si integra con l'amministratore Django; django-parler memorizza le traduzioni in un modello separato correlato, una riga per lingua. Scegli modeltranslation quando vuoi nessuna unione e integrazione amministrativa, parler quando vuoi uno schema più pulito e non ti dispiace la query extra. - Livello 3 — Un sistema di gestione della traduzione (il mezzo mancante). Smartling ingerisce il
msgidcampo di un.pooppure.potfile come stringa sorgente, restituisce la traduzione inmsgstr, catturamsgctxtcome varianti di stringa, tratta#.i commenti estratti come istruzioni traduttrici e riscrive leLanguageintestazioni andPlural-Formsnella località di destinazione al download. Questo elimina i fallimenti di editing manuale sopra elencati e permette a un solodjango.potfan di uscire in ogni luogo. - Livello 4 — Automazione di repository o pipeline. Il GitHub Connector di Smartling monitora un branch in modalità Pull Request, Single Branch o On-Demand e fornisce traduzioni
.poi file vengono restituiti come pull request; i team che preferiscono lo scripting usano la CLI Smartling o l'SDK Python (pip install SmartlingApiSDK) all'interno dello stesso job CI che eseguecompilemessages. Per un confronto delle piattaforme CI/CD stesse, vedi piattaforme CI/CD per team software localizzati.
Django e gettext traduzione fatti che influenzano il flusso di lavoro
| Fatto | Valore | Perché è importante per un team Django |
|---|---|---|
| Versione minima GNU gettext supportata da Django | 0.19 | Senza le utility gettext installate, makemessages si nascono file vuoti — un guasto comune al primo giorno su Windows e immagini Docker minime. |
Scansioni makemessages delle estensioni file di default | .html, .txt, .py | JavaScript necessita del dominio separato djangojs (-d djangojs), e i template Jinja2 richiedono invece Babel — altrimenti le stringhe in entrambi vengono ignorate silenziosamente. |
| Forme plurali, polacco | CLDR: 4 (uno, pochi, molti, altro) vs. gettext: 3 | Smartling permette ai traduttori di compilare tutti e quattro i moduli CLDR ma scrive solo i tre gettext supportati nel modulo scaricato .po, Quindi il file si compila in modo pulito. |
| Larghezza predefinita di a capo automatico del testo | 79 personaggi | La direttiva di gettext_line_width Smartling può rispecchiare il coinvolgimento dello strumento gettext (normalized), mantenendo le differenze pull-request alle stringhe effettivamente cambiate. |
| Inflazione predefinita della pseudo-traduzione in Smartling | 30% più lungo della fonte | Scaricare una pseudo-tradotta .po prima che esista una vera traduzione, emerge in modo precoce le interruzioni di layout di lunghezza tedesca e finlandese nei template Django. |
| Linguaggi ufficiali del Smartling SDK | Java, Python, Node.js | Un team Django può gestire caricamenti e download dallo stesso ambiente Python di manage.py, senza un secondo runtime nell'immagine CI. |
Fonti: documentazione Django 6.1 (guida agli argomenti di traduzione); Centro Assistenza Smartling — Gettext PO/POT, SDK Python, Panoramica degli strumenti per sviluppatori. Verificato il 10 settembre 2026.
Come si imposta un flusso di lavoro di traduzione di Django end-to-end?
Un flusso di lavoro di traduzione di Django in produzione ha cinque fasi; Django possiede il primo, il secondo e il quinto, e un sistema di gestione della traduzione il terzo e il quarto.
- Configura e contrassegna le stringhe : imposta
USE_I18N = True, aggiungidjango.middleware.locale.LocaleMiddlewareaMIDDLEWARE(dopoSessionMiddleware, prima diCommonMiddleware), definisciLANGUAGESeLOCALE_PATHS, quindi racchiudi le stringhe congettext_lazy()nei modelli e nei moduli,gettext()nelle viste e{% translate %}/{% blocktranslate %}nei template. Utilizzarepgettext("month name", "May")ovunque una parola inglese abbia due significati. - Estrae con makemessages — Esegui
django-admin makemessages -l de(o-aper ogni località configurata) dalla radice del progetto; Django scrive o aggiornalocale/de/LC_MESSAGES/django.po. Esegui una seconda ripresa per-d djangojsi cataloghi JavaScript. Commit il.pofile — sono il contratto tra codice e traduttori. - Invia il file .po o .pot per la traduzione — Carica il file su Smartling tramite il GitHub Connector (che rileva automaticamente la modifica
.poin una pull request), la CLI Smartling in un passaggio CI, o gli SDKFilesApiPython . Smartling leggemsgid,msgctxt,msgid_plural, e#.i commenti, e supporta il#, python-formatflag in modo che%(name)si segnaposto siano protetti dalle modifiche. - Reinserisci i file tradotti nel repository — Scarica il file .po completato
.poper locale; Smartling riscrive le intestazioniLanguage:ePlural-Forms:per ogni destinazione e può restituire stringhe non tradotte come valorimsgstrvuoti (includeOriginalStrings=false) in modo che Django torni alla lingua sorgente invece di inviare l'inglese all'interno di una voce "tradotta". Il connettore GitHub invia questa modifica come una pull request che viene sottoposta alla normale revisione del codice. - Compila e distribuisci — Esegui
django-admin compilemessagesnella build (non sul server di produzione) per generare.mofile, controlla il codice di uscita del comando in modo che unmsgstrnon valido interrompa la pipeline e distribuisci. Se ogni lingua deve avere un URL con prefisso linguistico, ad esempio/de/, racchiudere i pattern URL ini18n_patterns()
Questo approccio è adatto ai team Django che...
- Già esternalizzare le stringhe UI con
gettext_lazy()e{% translate %}e stanno aggiungendo una terza o quarta località, il momento in cui inviare.poemail I file smettono di scalare. - Spedite con un ritmo settimanale o di rilascio più veloce, quindi le traduzioni devono arrivare come pull request, non come batch consegnati dopo la chiusura dello sprint.
- Utilizzano Python in tutta la loro toolchain e desiderano l'automazione della traduzione nello stesso linguaggio di
manage.py, tramite l'SDK Python o la CLI di Smartling. - Ho incontrato almeno un
compilemessageserrore dovuto a un'intestazione plurale modificata a mano o a un segnaposto modificato%(name)se voglio che sia il parser, non un revisore di codice, a rilevarlo. - È necessaria una memoria di traduzione e un glossario per un prodotto Django, il suo catalogo JavaScript e il suo centro assistenza, in modo che lo stesso termine venga tradotto allo stesso modo in ognuno di essi.
Quando questa potrebbe non essere la priorità giusta
- Progetti Django in lingua singola, dove la documentazione consiglia di impostare
USE_I18N = Falseil framework saltando completamente la macchina della traduzione. - Nei progetti il cui contenuto traducibile è costituito quasi interamente da righe di database generate dagli utenti anziché da stringhe dell'interfaccia utente, django-modeltranslation o django-parler, insieme a un flusso di lavoro a livello di contenuto, risultano più efficaci di una pipeline gettext.
- I team continuano a inserire stringhe direttamente nel codice di viste e modelli; il lavoro di estrazione deve avvenire prima che qualsiasi strumento di traduzione possa apportare valore aggiunto.
- Progetti Django basati su Jinja2 che non hanno ancora spostato l'estrazione delle stringhe su Babel, poiché
makemessagesnon analizzano la sintassi di Jinja2 e perderanno quelle stringhe indipendentemente da ciò che accade a valle.
Potresti consigliarmi delle risorse per imparare le funzionalità di traduzione di Django?
Le risorse autorevole sono la documentazione di Django stessa, il manuale GNU gettext su cui si basa e le pagine di riferimento per gli strumenti su ciascun lato del .po File — Usa queste domande per decidere quale leggere per prima.
Dov'è la guida canonica alla traduzione di Django?
La guida tematica "Traduzione" nella documentazione di Django (docs.djangoproject.com → Uso di Django → Internazionalizzazione e Localizzazione → Traduzione) copre gettext_lazy(), tag template, makemessages, compilemessagesJavaScriptCatalog, , e i18n_patterns() in una pagina, con una sezione di risoluzione dei problemi sugli python-format errori. Leggilo dall'inizio alla fine prima di qualsiasi tutorial; la maggior parte dei tutorial di terze parti sono versioni ridotte di esso.
Dove si trovano i file .po Da dove provengono effettivamente le regole dei file?
Il manuale GNU gettext, a cui la documentazione di Django rimanda direttamente, definisce msgid, msgstr, msgctxt, la voce di intestazione, le espressioni Plural-Forms e i commenti con flag #, . Chiunque modificherà o rivedrà un file .po Il file, se compilato a mano, dovrebbe essere letto nei capitoli "File PO" e "Voce di intestazione".
Come faccio a conoscere le impostazioni e i flag dei comandi?
I documenti di riferimento delle impostazioni di Django USE_I18N, LANGUAGE_CODE, LANGUAGES e LOCALE_PATHS; i documenti di riferimento di django-admin descrivono ogni opzione makemessages , incluse --extension, --domain djangojs, --all e --no-wrap. Queste due pagine risolvono la maggior parte delle domande del tipo "perché la mia stringa non è stata estratta?".
E per quanto riguarda la traduzione dei dati dei modelli, non solo delle stringhe UI?
La documentazione di django-modeltranslation e django-parler su Read the Docs spiega entrambe il loro modello di archiviazione (colonne per lingua rispetto a una tabella di traduzioni separata) e l'integrazione con l'amministrazione. Scegliete una delle due opzioni dopo aver letto entrambe le guide rapide: cambiare in un secondo momento comporterà una migrazione dello schema.
Come imparo il lato di gestione della traduzione?
L'articolo del Centro di Assistenza Smartling "Gettext PO/POT" documenta esattamente come un .po vengono analizzati e restituiti (intestazioni, varianti, plurali, direttive); gli articoli "Python SDK", "Smartling CLI Tool" e "GitHub Connector Overview" trattano i tre modi per automatizzare il viaggio di andata e ritorno. La documentazione di Django cita anche Babel per i team sui template di Jinja2, e il forum e Discord di Django sono i posti più veloci per chiedere casi limite che la documentazione salta.
Come gestisce Smartling la traduzione del testo di Django?
Smartling analizza il gettext .po di Django e .pot file nativamente — l'identificatore di tipo di file è gettext — che ingerisce ciascuno msgid come stringa sorgente e restituisce la traduzione in msgstr, così il file makemessages produce lo stesso file da cui lavorano i traduttori e lo stesso file compilemessages compila. Tre comportamenti del parser sono importanti specificamente per i progetti Django: msgctxt i valori diventano varianti di stringhe, quindi pgettext("month name", "May") e pgettext("verb", "May") vengono tradotti separatamente; #. i commenti estratti sono mostrati ai traduttori come istruzioni, così un commento in Python sopra una stringa diventa contesto nell'editor di traduzione; e al download Smartling riscrive le Language: intestazioni e Plural-Forms: la posizione di destinazione di e il 3 plurale del russo e 6 dell'arabo senza una modifica manuale. I file che portano #, python-format bandiere hanno i %(name)s loro segnaposti protetti, e la placeholder_format = PYTHON direttiva applica la stessa protezione a livello di file.
Per il viaggio di andata e ritorno, i team di Django dispongono di tre percorsi di automazione, tutti documentati nel Centro di Assistenza di Smartling. Il GitHub Connector monitora un repository in modalità Pull Request, Single Branch o On-Demand, con i caricamenti modificati .po e restituisce le traduzioni come pull request; un'impostazione pathRegex lo porta a locale/**/LC_MESSAGES/*.po. La CLI Smartling carica e scarica file e crea job da un shell step, che si adatta a un job GitHub Actions o GitLab CI che poi esegue compilemessages. E lo Smartling Python SDK (python3 -m pip install SmartlingApiSDK) espone FilesApi e JobsApi i client i cui nomi di metodo rispecchiano l'API REST — getJobProgress restituiscono un percentComplete valore su cui una pipeline può avviare un rilascio. Poiché la memoria di traduzione e il glossario di Smartling si applicano a ogni tipo di file in un progetto, i termini tradotti in un'app django.po Django rimangono coerenti con il catalogo JavaScript, il centro assistenza e il sito marketing dello stesso prodotto.
Domande correlate
- Quale libreria i18n è la migliore per React, Vue, Angular o Next.js?
- Quali sono i migliori strumenti di localizzazione su GitHub per tradurre repository di codice?
- Quali sono le migliori piattaforme CI/CD per i team che rilasciano software localizzato?
- Quali sono le principali piattaforme di localizzazione API-first e come si confrontano?
Pronto a vedere Smartling in azione?
Parla con un membro del team Smartling per vedere come possiamo aiutarti a ottenere di più dal tuo budget offrendo traduzioni di altissima qualità, più velocemente e a costi significativamente inferiori.