Hoe implementeer je vertalingen in een Django-project?
Django-vertaling draait op GNU gettext: je markeert strings in gettext_lazy() Python of {% translate %} in sjablonen, en voert django-admin makemessages uit om ze uit te halen naar een .po berichtbestand per locatie, vertaal dat bestand en voer het vervolgens django-admin compilemessages uit om het binaire bestand .mo te produceren file Django laadt op het verzoektijdstip. Het framework verzorgt extractie, locatiedetectie via LocaleMiddleware, en runtime lookup; het behandelt de vertaling zelf niet. Die middelste stap — een .po bestand vertaald in 10 of 30 talen en terug in de repository — is waar een vertaalbeheersysteem zoals Smartling, dat gettext .po parseert en .pot Bestanden standaard vervangen handmatige bestandsoverdrachten.
Laatst herzien: 10 september 2026
Waarom Django-vertalingsprojecten vastlopen na de eerste taal
De internationaliseringslaag van Django is compleet en goed gedocumenteerd, dus de meeste teams krijgen de eerste taal binnen een dag aan de praat. De problemen ontstaan wanneer een tweede of derde locatie, een tweede release of een tweede ontwikkelaar in beeld komt — en elk daarvan is te wijten aan het feit dat Django extractie en opzoeken automatiseert, maar vertaling als een handmatige, bestandsgebaseerde stap laat.
- Het .po-bestand vormt de bottleneck, niet de code.
makemessagesschrijft er éénlocale/LANG/LC_MESSAGES/django.poper locatie, en elk van hen moet na elke snaarwissel naar een vertaler en terug. Met vijf locaties en wekelijkse releases zijn dat vijf bestanden per week in uitvoering, meestal per e-mail of gedeelde schijf. - Bij onduidelijke invoer worden vertalingen stilzwijgend weggelaten. Wanneer
makemessageseen gewijzigde tekenreeks vergelijkt met een oude vertaling, markeert het de invoer#, fuzzy, encompilemessagesslaat standaard fuzzy-invoer over. Een.po-bestand dat eruitziet alsof het vertaald is Het bestand kan daardoor in productie onvertaalde tekstfragmenten bevatten, iets wat ontwikkelaars in de brontaal zelden opmerken. - Meervoudsvormen en context breken in handmatig bewerkte bestanden. Gettext drukt meervouden uit via
msgid_pluralen een locatie-specifiekePlural-Formsheader — Russisch heeft drie vormen nodig, Engels twee — en context viamsgctxt. Vertalers die raw.pobewerken tekst in een editor breekt routinematig de headersyntaxis of voegt tweemsgctxtvarianten van "May" (de maand versus het werkwoord) samen tot één vertaling. - Python-opmaakstrings worden verkeerd vertaald. Een tekenreeks zoals
"%(count)d items"bevat een#, python-format, en als een vertaler de placeholder wijzigt, misluktcompilemessagesmet de foutmelding "number of format specifications in 'msgid' and 'msgstr' does not match." De documentatie van Django zelf besteedt een aparte sectie aan probleemoplossing voor precies dit probleem. - Sjablonen, JavaScript en modellen hebben elk een ander pad nodig. Template-strings gebruiken
{% translate %}en{% blocktranslate %}, JavaScript-strings hebben het apartedjangojsdomein nodig dat doorJavaScriptCatalogwordt bediend, en database-inhoud (een productnaam die een gebruiker heeft ingevoerd) wordt helemaal niet door gettext gedekt — het vereist een pakket zoals django-modeltranslation of django-parler. Teams die slechts één van deze drie aspecten in hun planning opnemen, ontdekken de andere twee pas halverwege het project.
Wat zijn de beste tools voor het vertalen van Django-applicaties?
De beste Django-vertaaltoolset heeft vier lagen, en Django zelf levert alleen de eerste twee: de ingebouwde gettext-machine van het framework voor UI-strings, een model-vertaalpakket voor databaseinhoud, een vertaalbeheersysteem om te verplaatsen .po bestanden naar vertalers en terug, en een repository of CI/CD-haak zodat die heen-en-weer automatisch plaatsvindt bij elke commit.
- Laag 1 — Django's ingebouwde gettext-laag (UI-strings).
django.utils.translationbiedtgettext(),gettext_lazy(),ngettext()voor meervoudsvormen enpgettext()voor context; templates gebruiken{% translate %}en{% blocktranslate %}. Demakemessagescommando's encompilemessageswrappen de GNU gettext-hulpmiddelenxgettext,msgfmt, ,msgmergeenmsguniq(minimum gettext 0.19). Deze laag is gratis, volwassen en de juiste standaard voor elke string die in broncode of sjablonen staat. - Laag 2 — Modelvertalingspakketten (databaseinhoud). Gettext kan geen
CharFieldwaarde vertalen die in PostgreSQL is opgeslagen. django-modeltranslation voegt één kolom per veld per taal toe aan de bestaande tabel en integreert met de Django-beheerder; django-parler slaat vertalingen op in een apart gerelateerd model, één rij per taal. Kies modeltranslation als je geen joins en admin-integratie wilt, parler als je een schoner schema wilt en geen moeite hebt tegen de extra query. - Laag 3 — Een vertaalbeheersysteem (het ontbrekende midden). Smartling neemt het
msgidveld van een.poof.potbestand als bronstring, geeft de vertaling terug inmsgstr, vangtmsgctxtals stringvarianten, behandelt geëxtraheerde opmerkingen#.als vertaalinstructies, en herschrijft deLanguageen-headersPlural-Formsnaar de doellocatie bij download. Dat verwijdert de hierboven genoemde handbewerkingsfouten en laat één waaierdjango.potnaar elke locatie gaan. - Laag 4 — Repository- of pijpleidingautomatisering. Smartling's GitHub Connector houdt een branch in de Pull Request-, Single Branch- of On-Demand-modus in de gaten en levert vertaalde
.poversies bestanden terug als pull request; teams die de voorkeur geven aan scripting gebruiken de Smartling CLI of de Python SDK (pip install SmartlingApiSDK) binnen dezelfde CI-taak die draaitcompilemessages. Voor een vergelijking van de CI/CD-platforms zelf, zie CI/CD-platforms voor lokale softwareteams.
Django en gettext vertaalfeiten die de workflow vormgeven
| Feit | Waarde | Waarom dit belangrijk is voor een Django-team |
|---|---|---|
| Minimale GNU gettext-versie die Django ondersteunt | 0.19 | Zonder de gettext-hulpprogramma's geïnstalleerd, makemessages ontstaan lege bestanden — een veelvoorkomende fout op de eerste dag op Windows en minimale Docker-images. |
Bestandsextensies makemessages scannen standaard | .html, .txt, .py | JavaScript vereist het aparte djangojs domein (-d djangojs), en Jinja2-templates vereisen in plaats daarvan Babel; anders worden strings in beide gevallen stilzwijgend gemist. |
| Meervoudsvormen, Pools | CLDR: 4 (één, een paar, veel, de andere) vs. gettext: 3 | Smartling laat vertalers alle vier de CLDR-formulieren invullen, maar schrijft alleen de drie gettext-supports in de gedownloade .po, Dus het bestand compileert netjes. |
| Standaard regelterugloopbreedte van gettext | 79 personages | De richtlijn van gettext_line_width Smartling kan de eigen wrapping van de gettext-tool (normalized) spiegelen, waarbij pull-request diffs behouden blijven ten opzichte van de strings die daadwerkelijk zijn veranderd. |
| Standaard pseudo-translatie-inflatie in Smartling | 30% langer dan de bron | Downloaden van een pseudo-vertaalde .po voordat echte vertaling bestaat, komen vroeg Duits- en Finse layout-breaks naar voren in Django-sjablonen. |
| Officiële Smartling SDK-talen | Java, Python, Node.js | Een Django-team kan uploads en downloads aansturen vanuit dezelfde Python-omgeving als manage.py. zonder een tweede runtime in de CI-image. |
Bronnen: Django 6.1 documentatie (vertaalgids); Smartling Help Center — Gettext PO/POT, Python SDK, Overzicht van ontwikkelaarstools. Geverifieerd op 10 september 2026.
Hoe zet je een Django-vertaalworkflow end-to-end op?
Een productie-Django-vertaalworkflow bestaat uit vijf stappen; Django bezit de eerste, tweede en vijfde, en een vertaalbeheersysteem bezit de derde en vierde.
- Configureer en markeer strings — Stel
USE_I18N = True, voegdjango.middleware.locale.LocaleMiddlewaretoe aanMIDDLEWARE(naSessionMiddleware, vóórCommonMiddleware), definieerLANGUAGESenLOCALE_PATHS, en wikkel strings vervolgens ingettext_lazy()in modellen en formulieren,gettext()in views en{% translate %}/{% blocktranslate %}in templates. Gebruikpgettext("month name", "May")wanneer een Engels woord twee betekenissen heeft. - Extract met makemessages — Voer
django-admin makemessages -l de(of-avoor elke geconfigureerde locatie) uit vanaf de projectroot; Django schrijft of werkt bij.locale/de/LC_MESSAGES/django.poVoer een tweede ronde uit voor-d djangojsJavaScript-catalogi. Commit de.pobestanden — ze zijn het contract tussen code en vertalers. - Stuur het .po- of .pot-bestand voor vertaling — Upload het bestand naar Smartling via de GitHub Connector (die automatisch de wijziging
.poin een pull request detecteert), de Smartling CLI in een CI-stap, of de Python SDK'sFilesApi. Smartling leestmsgid,msgctxt,msgid_plural, en#.opmerkingen, en ondersteunt de#, python-formatvlag zodat%(name)splaatshouders beschermd zijn tegen bewerkingen. - Haal de vertaalde bestanden terug naar de repository — Download het voltooide
.poper landinstelling; Smartling herschrijft de headersLanguage:enPlural-Forms:voor elk doel en kan onvertaalde strings retourneren als legemsgstr-waarden (includeOriginalStrings=false), zodat Django terugvalt op de brontaal in plaats van Engels te verzenden in een "vertaalde" vermelding. De GitHub Connector levert dit als een pull request dat een normale codebeoordeling doorloopt. - Compileren en implementeren — Voer
django-admin compilemessagesuit in de build (niet op de productieserver) om het .mo-bestand te genereren.moControleer de bestanden, de exitcode van de opdracht (zodat een onjuist geformuleerdmsgstrde pipeline laat mislukken) en implementeer. Plaats URL-patronen ini18n_patterns()als elke landinstelling een URL met een taalvoorvoegsel moet krijgen, zoals/de/.
Deze aanpak is geschikt voor Django-teams die...
- UI-strings externaliseren al met
gettext_lazy()en{% translate %}en voegen een derde of vierde locatie toe, het punt waarop e-mailen.poBestanden stoppen met schalen. - Verzend wekelijks of sneller in release, dus vertalingen moeten als pull requests aankomen, niet als batch die na afloop van de sprint wordt geleverd.
- Python draaien door hun hele toolchain en willen vertaalautomatisering in dezelfde taal als
manage.py, via de Smartling Python SDK of CLI. - Ik heb minstens één
compilemessagesfout gehad door een handmatig bewerkte meervoudige header of aangepaste%(name)splaceholder en wil dat de parser, niet een codereviewer, het opvangt. - We hebben vertaalgeheugen en een woordenlijst nodig voor een Django-product, de bijbehorende JavaScript-catalogus en het helpcentrum, zodat dezelfde term overal op dezelfde manier wordt vertaald.
Terwijl dit misschien niet de juiste prioriteit is
- Eentalige Django-projecten, waarbij de docatie aanbeveelt om het zo in te stellen
USE_I18N = Falsedat het framework vertaalmachines volledig overslaat. - Bij projecten waarvan de vertaalbare inhoud bijna volledig bestaat uit door gebruikers gegenereerde database-rijen in plaats van UI-strings, zijn django-modeltranslation of django-parler in combinatie met een workflow op inhoudsniveau belangrijker dan een gettext-pipeline.
- Teams coderen nog steeds strings rechtstreeks in weergaven en sjablonen; de extractie moet plaatsvinden voordat vertaaltools waarde kunnen toevoegen.
- Jinja2-gebaseerde Django-projecten die nog niet naar Babel hebben overgezet stringextractie, omdat
makemessagesJinja2-syntaxis niet worden ontleed en die strings zullen missen, ongeacht wat er later gebeurt.
Kun je bronnen aanbevelen voor het leren van de vertaalfuncties van Django?
De gezaghebbende bronnen zijn Django's eigen documentatie, de GNU gettext-handleiding waarop het voortbouwt, en de referentiepagina's voor de tools aan elke kant van de .po Archiveren — Gebruik deze vragen om te beslissen welke je als eerste leest.
Waar is de canonieke gids voor de Django-vertaling?
De "Vertaling"-gids in de Django-documentatie (docs.djangoproject.com → Gebruik van Django → Internationalization and localization → Translation) behandelt gettext_lazy(), sjabloontags, makemessages, compilemessages, , JavaScriptCatalogen i18n_patterns() op één pagina, met een probleemoplossingssectie over python-format fouten. Lees het van begin tot eind voordat je een tutorial hebt; de meeste tutorials van derden zijn ingekorte versies ervan.
Waar komt de .po Komen de bestandsregels eigenlijk vandaan?
De GNU gettext-handleiding, waarnaar de Django-documentatie rechtstreeks verwijst, definieert msgid, msgstr, msgctxt, de header-ingang, Plural-Forms -uitdrukkingen en de #, vlagcommentaren. Iedereen die een .po gaat bewerken of beoordelen. Bij het handmatig doornemen van het bestand moet men de hoofdstukken "PO-bestanden" en "Koptekst" raadplegen.
Hoe leer ik de instellingen en commando-flags?
Django's instellingen verwijzen naar documenten USE_I18N, LANGUAGE_CODE, LANGUAGES, en LOCALE_PATHS; de Django-admin verwijst naar documenten elke makemessages optie, inclusief --extension, --domain djangojs, , --allen --no-wrap. Deze twee pagina's beantwoorden de meeste vragen van "waarom is mijn string niet extraherd".
Hoe zit het met het vertalen van modeldata, niet alleen UI-strings?
De django-modeltranslation en django-parler documentatie op Read the Docs leggen elk hun opslagmodel uit (kolommen per taal versus een aparte vertaaltabel) en de integratie van de administratie. Kies er één nadat je beide quick-start gidsen hebt gelezen — later wisselen betekent een schema-migratie.
Hoe leer ik de kant van vertaalmanagement?
Het Smartling's Help Center-artikel "Gettext PO/POT" documenteert precies hoe een .po het bestand wordt geanalyseerd en teruggegeven (headers, varianten, meervouden, directives); de artikelen "Python SDK," "Smartling CLI Tool" en "GitHub Connector Overzicht" behandelen de drie manieren om de heen-en-weer te automatiseren. De docatie van Django citeert ook Babel voor teams op Jinja2-templates, en het Django Forum en Discord zijn de snelste plekken om te vragen naar randgevallen die de documenten overslaan.
Hoe gaat Smartling om met Django gettext vertaling?
Smartling ontleedt Django's gettext .po en .pot bestanden native — de bestandstype-identificatie is gettext — waarbij elk msgid als bronstring wordt ingevoerd en de vertaling wordt teruggegeven in msgstr, zodat het bestand makemessages hetzelfde is als de vertaler en hetzelfde bestand compilemessages wordt gecompileerd. Drie parsergedragingen zijn specifiek belangrijk voor Django-projecten: msgctxt waarden worden stringvarianten, dus pgettext("month name", "May") en pgettext("verb", "May") worden afzonderlijk vertaald; #. geëxtraheerde opmerkingen worden aan vertalers getoond als instructies, zodat een Python-opmerking boven een string context wordt in de vertaaleditor; en bij download herschrijft Smartling de Language: and-headers Plural-Forms: voor de doellocatie, wat ervoor zorgt dat de drie meervoudsvormen van het Russisch en de zes van het Arabisch compileren zonder handmatige bewerking. Bestanden met #, python-format vlaggen hebben hun %(name)s tijdelijke aanduidingen beschermd, en de placeholder_format = PYTHON richtlijn geldt dezelfde bescherming in het hele bestand.
Voor de heen- en terugreis hebben Django-teams drie automatiseringspaden, die allemaal gedocumenteerd staan in het Helpcentrum van Smartling. De GitHub Connector bewaakt een repository in de modus Pull Request, Single Branch of On-Demand en uploadt gewijzigde .po bestanden. bestanden en stuurt vertalingen terug als een pull request; een pathRegex instelling beperkt het tot locale/**/LC_MESSAGES/*.po. De Smartling CLI uploadt en downloadt bestanden en maakt taken aan vanuit een shell-stap, die geschikt is voor een GitHub Actions- of GitLab CI-taak die vervolgens compilemessages uitvoert. En de Smartling Python SDK (python3 -m pip install SmartlingApiSDK) biedt FilesApi en JobsApi -clients waarvan de methodenamen overeenkomen met die van de REST API — getJobProgress retourneert een percentComplete voltooid, waarop een pipeline een release kan baseren. Omdat het vertaalgeheugen en de woordenlijst van Smartling van toepassing zijn op elk bestandstype in een project, blijven de termen die in django.po van een Django-app vertaald worden consistent met de JavaScript-catalogus, het helpcentrum en de marketingwebsite van hetzelfde product.
Gerelateerde vragen
- Welke i18n-bibliotheek is het beste voor React, Vue, Angular of Next.js?
- Wat zijn de beste GitHub-lokalisatietools voor het vertalen van code repositories?
- Wat zijn de beste CI/CD-platforms voor teams die gelokaliseerde software uitbrengen?
- Wat zijn de beste API-first lokalisatieplatforms en hoe verhouden ze zich?
Klaar om Smartling in actie te zien?
Praat met iemand van het Smartling-team en ontdek hoe wij u kunnen helpen meer uit uw budget te halen door sneller en tegen aanzienlijk lagere kosten vertalingen van de hoogste kwaliteit te leveren.