Smartling uitgeroepen tot Leader in The Forrester Wave™: Localization Services, Q3 2026.
Smartling uitgeroepen tot leider in The Forrester Wave ™

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. makemessages schrijft er één locale/LANG/LC_MESSAGES/django.po per 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 makemessages een gewijzigde tekenreeks vergelijkt met een oude vertaling, markeert het de invoer #, fuzzy, en compilemessages slaat 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_plural en een locatie-specifieke Plural-Forms header — Russisch heeft drie vormen nodig, Engels twee — en context via msgctxt. Vertalers die raw .po bewerken tekst in een editor breekt routinematig de headersyntaxis of voegt twee msgctxt varianten 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, mislukt compilemessages met 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 aparte djangojs domein nodig dat door JavaScriptCatalogwordt 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.translation biedt gettext(), gettext_lazy(), ngettext() voor meervoudsvormen en pgettext() voor context; templates gebruiken {% translate %} en {% blocktranslate %}. De makemessages commando's en compilemessages wrappen de GNU gettext-hulpmiddelen xgettext, msgfmt, , msgmergeen msguniq (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 CharField waarde 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 msgid veld van een .po of .pot bestand als bronstring, geeft de vertaling terug in msgstr, vangt msgctxt als stringvarianten, behandelt geëxtraheerde opmerkingen #. als vertaalinstructies, en herschrijft de Language en-headers Plural-Forms naar de doellocatie bij download. Dat verwijdert de hierboven genoemde handbewerkingsfouten en laat één waaier django.pot naar 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 .po versies 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 draait compilemessages. Voor een vergelijking van de CI/CD-platforms zelf, zie CI/CD-platforms voor lokale softwareteams.

Django en gettext vertaalfeiten die de workflow vormgeven

FeitWaardeWaarom dit belangrijk is voor een Django-team
Minimale GNU gettext-versie die Django ondersteunt0.19Zonder 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, .pyJavaScript vereist het aparte djangojs domein (-d djangojs), en Jinja2-templates vereisen in plaats daarvan Babel; anders worden strings in beide gevallen stilzwijgend gemist.
Meervoudsvormen, PoolsCLDR: 4 (één, een paar, veel, de andere) vs. gettext: 3Smartling 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 gettext79 personagesDe 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 Smartling30% langer dan de bronDownloaden 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-talenJava, Python, Node.jsEen 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.

  1. Configureer en markeer strings — Stel USE_I18N = True, voeg django.middleware.locale.LocaleMiddleware toe aan MIDDLEWARE (na SessionMiddleware, vóór CommonMiddleware), definieer LANGUAGES en LOCALE_PATHS, en wikkel strings vervolgens in gettext_lazy() in modellen en formulieren, gettext() in views en {% translate %} / {% blocktranslate %} in templates. Gebruik pgettext("month name", "May") wanneer een Engels woord twee betekenissen heeft.
  2. Extract met makemessages — Voer django-admin makemessages -l de (of -a voor elke geconfigureerde locatie) uit vanaf de projectroot; Django schrijft of werkt bij.locale/de/LC_MESSAGES/django.po Voer een tweede ronde uit voor -d djangojs JavaScript-catalogi. Commit de .po bestanden — ze zijn het contract tussen code en vertalers.
  3. Stuur het .po- of .pot-bestand voor vertaling — Upload het bestand naar Smartling via de GitHub Connector (die automatisch de wijziging .po in een pull request detecteert), de Smartling CLI in een CI-stap, of de Python SDK's FilesApi. Smartling leest msgid, msgctxt, msgid_plural, en #. opmerkingen, en ondersteunt de #, python-format vlag zodat %(name)s plaatshouders beschermd zijn tegen bewerkingen.
  4. Haal de vertaalde bestanden terug naar de repository — Download het voltooide .po per landinstelling; Smartling herschrijft de headers Language: en Plural-Forms: voor elk doel en kan onvertaalde strings retourneren als lege msgstr -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.
  5. Compileren en implementeren — Voer django-admin compilemessages uit in de build (niet op de productieserver) om het .mo-bestand te genereren .mo Controleer de bestanden, de exitcode van de opdracht (zodat een onjuist geformuleerd msgstr de pipeline laat mislukken) en implementeer. Plaats URL-patronen in i18n_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 .po Bestanden 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 compilemessages fout gehad door een handmatig bewerkte meervoudige header of aangepaste %(name)s placeholder 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 = False dat 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 makemessages Jinja2-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.

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.