Como implementar a tradução em um projeto Django?
A tradução do Django é executada no GNU gettext: você marca as strings com gettext_lazy() em Python ou {% translate %} em templates, e executa django-admin makemessages para extraí-las em um arquivo .po Arquivo de mensagens por localidade, traduza esse arquivo e, em seguida, execute django-admin compilemessages para gerar o binário .mo O arquivo Django é carregado no momento da requisição. A estrutura lida com a extração, a detecção de localidade por meio do LocaleMiddleware e a pesquisa em tempo de execução; ela não lida com a tradução em si. Essa etapa intermediária — obter um .po O arquivo traduzido para 10 ou 30 idiomas e devolvido ao repositório é onde um sistema de gerenciamento de traduções como o Smartling, que analisa o arquivo gettext.po, entra em ação .po e .pot arquivos nativamente, substituindo a transferência manual de arquivos.
Última revisão: 10 de setembro de 2026
Por que os projetos de tradução do Django ficam paralisados após a primeira localização?
A camada de internacionalização do Django é completa e bem documentada, de modo que a maioria das equipes consegue configurar o primeiro idioma em um dia. Os problemas surgem quando um segundo ou terceiro idioma, uma segunda versão ou um segundo desenvolvedor entram em cena — e cada um deles se deve ao fato de o Django automatizar a extração e a pesquisa, mas deixar a tradução como uma etapa manual, baseada em arquivos.
- O gargalo passa a ser o arquivo .po, não o código.
makemessagesgrava umlocale/LANG/LC_MESSAGES/django.popara cada localidade, e cada um deles precisa ser enviado para um tradutor e retornar após cada alteração de string. Com cinco locais de publicação e lançamentos semanais, isso significa cinco arquivos em circulação toda semana, geralmente por e-mail ou unidade de rede compartilhada. - Entradas imprecisas descartam traduções silenciosamente. Quando
makemessagescompara uma string alterada com uma tradução antiga, ela marca a entrada#, fuzzy, ecompilemessagesignora entradas fuzzy por padrão. Um arquivo .po com aparência de traduzido.poPortanto, o arquivo pode ser distribuído com strings não traduzidas em produção, algo que os desenvolvedores raramente percebem no idioma original. - Formas plurais e quebra de contexto em arquivos editados manualmente. O Gettext expressa plurais através
msgid_plurale de um cabeçalhoPlural-Formsespecífico da localidade — o russo precisa de três formas, o inglês de duas — e o contexto atravésmsgctxt. Tradutores editando arquivos.pobrutos Em um editor de texto, é comum que a sintaxe do cabeçalho seja quebrada ou duas variantes de "May" (o mês versus o verbo)msgctxtcondensadas em uma única tradução. - As strings de formatação do Python são traduzidas incorretamente. Uma string como
"%(count)d items"contém um#, python-format, e se um tradutor alterar o marcador de posiçãocompilemessagesfalha com "número de especificações de formato em 'msgid' e 'msgstr' não corresponde". A própria documentação do Django dedica uma seção de solução de problemas exatamente a essa falha. - Templates, JavaScript e modelos exigem caminhos diferentes. As strings de modelo usam
{% translate %}e{% blocktranslate %}, as strings JavaScript precisam do domínio separadodjangojsservido peloJavaScriptCatalog, e o conteúdo do banco de dados (um nome de produto digitado por um usuário) não é coberto pelo gettext — ele precisa de um pacote como django-modeltranslation ou django-parler. As equipes que planejam apenas para um desses três aspectos descobrem os outros dois no meio do projeto.
Quais são as melhores ferramentas para traduzir aplicações Django?
O melhor conjunto de ferramentas de tradução para Django possui quatro camadas, e o próprio Django fornece apenas as duas primeiras: o mecanismo gettext integrado do framework para strings da interface do usuário, um pacote de tradução de modelos para conteúdo do banco de dados e um sistema de gerenciamento de traduções para mover arquivos .po Enviar e receber arquivos para os tradutores e um repositório ou gancho de CI/CD para que o processo de ida e volta ocorra automaticamente a cada commit.
- Camada 1 — Camada gettext integrada do Django (strings da interface do usuário).
django.utils.translationfornecegettext(),gettext_lazy(),ngettext()para plurais epgettext()para contexto; os modelos usam{% translate %}e{% blocktranslate %}. Os comandosmakemessagesecompilemessagesencapsulam os utilitários GNU gettextxgettext,msgfmt,msgmergeemsguniq(gettext mínimo 0.19). Essa camada é gratuita, madura e a opção padrão adequada para todas as strings presentes no código-fonte ou em modelos. - Camada 2 — Pacotes de tradução de modelos (conteúdo do banco de dados). O Gettext não consegue traduzir um valor
CharFieldarmazenado no PostgreSQL. O django-modeltranslation adiciona uma coluna por campo por idioma à tabela existente e se integra ao painel de administração do Django; o django-parler armazena as traduções em um modelo relacionado separado, uma linha por idioma. Escolha modeltranslation quando não quiser junções e tiver integração com o administrador, e parler quando quiser um esquema mais limpo e não se importar com a consulta extra. - Camada 3 — Um sistema de gerenciamento de traduções (o elo que faltava). O Smartling ingere o campo
msgidde um.poou.potO arquivo é usado como string de origem, retorna a tradução emmsgstr, capturamsgctxtcomo variantes de string,#.os comentários extraídos como instruções do tradutor e reescreve os cabeçalhosLanguageePlural-Formspara a localidade de destino no momento do download. Isso elimina as falhas de edição manual mencionadas acima e permite que um único arquivodjango.potseja distribuído para todas as localidades. - Camada 4 — Automação de repositório ou pipeline. O conector GitHub da Smartling monitora uma branch nos modos Pull Request, Single Branch ou On-Demand e entrega arquivos .po traduzidos
.poOs arquivos são enviados de volta como uma solicitação de pull; as equipes que preferem usar scripts utilizam a CLI do Smartling ou o SDK do Python (pip install SmartlingApiSDK) dentro do mesmo trabalho de CI que executacompilemessages. Para uma comparação das próprias plataformas de CI/CD, consulte Plataformas de CI/CD para equipes de software localizadas.
Fatos sobre a tradução entre Django e gettext que moldam o fluxo de trabalho
| Fato | Valor | Por que isso é importante para uma equipe Django? |
|---|---|---|
| Versão mínima do GNU gettext suportada pelo Django | 0.19 | Sem os utilitários gettext instalados, makemessages cria arquivos vazios — uma falha comum no primeiro dia em sistemas Windows e em imagens Docker mínimas. |
As extensões de arquivo fazem com que makemessages verifique por padrão. | .html, .txt, .py | O JavaScript precisa do domínio separado djangojs (-d djangojs), e os templates Jinja2 precisam do Babel — caso contrário, as strings em qualquer um deles são ignoradas silenciosamente. |
| Formas plurais, polonês | CLDR: 4 (um, poucos, muitos, outros) vs. gettext: 3 | O Smartling permite que os tradutores preencham todos os quatro formulários CLDR, mas grava apenas os três suportes gettext no arquivo .po baixado. Assim, o arquivo compila sem erros. |
| Largura padrão de quebra de linha do gettext | 79 caracteres | A diretiva gettext_line_width do Smartling pode espelhar o próprio mecanismo de quebra de linha (normalized) da ferramenta `gettext`, mantendo as diferenças entre solicitações de pull nas strings que realmente foram alteradas. |
| Inflação de pseudotradução padrão no Smartling | 30% mais longo que a fonte | Baixando um arquivo .po pseudo-traduzido Antes que exista uma tradução real, quebras de layout do tamanho de textos em alemão e finlandês aparecem precocemente nos templates do Django. |
| Idiomas oficiais do SDK da Smartling | Java, Python, Node.js | Uma equipe Django pode gerenciar uploads e downloads a partir do mesmo ambiente Python que manage.py. sem um segundo ambiente de execução na imagem de CI. |
Fontes: Documentação do Django 6.1 (Guia de tópicos de tradução); Central de Ajuda da Smartling — Gettext PO/POT, SDK Python, Visão geral das ferramentas de desenvolvedor. Verificado em 10 de setembro de 2026.
Como configurar um fluxo de trabalho de tradução Django de ponta a ponta?
Um fluxo de trabalho de tradução em produção com Django possui cinco etapas; o Django é responsável pela primeira, segunda e quinta, e um sistema de gerenciamento de traduções é responsável pela terceira e quarta.
- Configure e marque strings — Defina
USE_I18N = True, adicionedjango.middleware.locale.LocaleMiddlewareaoMIDDLEWARE(apósSessionMiddleware, antesCommonMiddleware), definaLANGUAGESeLOCALE_PATHSe, em seguida, envolva as strings comgettext_lazy()em modelos e formulários,gettext()em visualizações e{% translate %}/{% blocktranslate %}em templates. Usepgettext("month name", "May")sempre que uma palavra em inglês tiver dois significados. - Extrair com makemessages — Execute
django-admin makemessages -l de(ou-apara cada localidade configurada) a partir da raiz do projeto; o Django grava ou atualizalocale/de/LC_MESSAGES/django.po. Execute uma segunda passagem com-d djangojspara catálogos JavaScript. Confirme o.poOs arquivos — eles são o contrato entre o código e os tradutores. - Envie o arquivo .po ou .pot para tradução — Faça o upload do arquivo para o Smartling através do GitHub Connector (que detecta automaticamente o arquivo
.poalterado em um pull request), da CLI do Smartling em uma etapa de CI ou daFilesApido SDK do Python. O Smartling lê comentáriosmsgid,msgctxt,msgid_plurale#.e suporta a flag#, python-formatpara que os marcadores%(name)ssejam protegidos contra edições. - Trazer os arquivos traduzidos de volta para o repositório — Baixar o arquivo
.pocompleto. por localidade; o Smartling reescreve os cabeçalhosLanguage:ePlural-Forms:para cada destino e pode retornar strings não traduzidas como valoresmsgstrvazios (includeOriginalStrings=false), para que o Django recorra ao idioma de origem em vez de enviar o inglês dentro de uma entrada "traduzida". O conector do GitHub entrega isso como uma solicitação de pull request que passa pelo processo normal de revisão de código. - Compile e implante — Execute
django-admin compilemessagesno ambiente de build (não no servidor de produção) para gerar o arquivo.moOs arquivos são verificados, o código de saída do comando é verificado para garantir que umamsgstrmalformada interrompa o processo no pipeline e, em seguida, a implantação é realizada. Envolva os padrões de URL emi18n_patterns()se cada localidade deve receber uma URL com prefixo de idioma, como/de/.
Essa abordagem é adequada para equipes Django que...
- Já externalizamos strings da interface do usuário com
gettext_lazy()e{% translate %}e estamos adicionando um terceiro ou quarto idioma, o ponto em que o envio de e-mails para.poé realizado. O redimensionamento de arquivos é interrompido. - O lançamento deve ser feito semanalmente ou com maior frequência, portanto, as traduções precisam chegar como solicitações de pull request, e não como um lote entregue após o término do sprint.
- Executar Python em toda a cadeia de ferramentas e desejar automação de tradução na mesma linguagem que
manage.py, por meio do SDK Python ou da CLI da Smartling. - Já se deparou com pelo menos uma falha
compilemessagesdevido a um cabeçalho plural editado manualmente ou a um marcador%(name)salterado e deseja que o analisador sintático, e não um revisor de código, a detecte. - Preciso de uma memória de tradução e um glossário que funcionem em um produto Django, seu catálogo JavaScript e sua central de ajuda, para que o mesmo termo seja traduzido da mesma forma em cada um deles.
Quando isso pode não ser a prioridade correta.
- Projetos Django de idioma único, onde a documentação recomenda definir
USE_I18N = Falsepara que o framework ignore completamente os mecanismos de tradução. - Para projetos cujo conteúdo traduzível consiste quase inteiramente em linhas de banco de dados geradas pelo usuário, em vez de strings da interface do usuário, o django-modeltranslation ou o django-parler, juntamente com um fluxo de trabalho em nível de conteúdo, são mais importantes do que um pipeline gettext.
- As equipes ainda estão inserindo strings diretamente no código em visualizações e modelos; o trabalho de extração precisa ser feito antes que qualquer ferramenta de tradução agregue valor.
- Projetos Django baseados em Jinja2 que ainda não migraram a extração de strings para o Babel, visto que
makemessagesnão analisa a sintaxe Jinja2 e, portanto, não encontrará essas strings independentemente do que aconteça posteriormente.
Você pode recomendar recursos para aprender sobre as funcionalidades de tradução do Django?
As fontes oficiais são a própria documentação do Django, o manual do GNU gettext no qual ele se baseia e as páginas de referência das ferramentas em cada lado do arquivo .po Arquivo — use estas perguntas para decidir qual ler primeiro.
Onde posso encontrar o guia definitivo para tradução em Django?
O guia de tópicos "Tradução" na documentação do Django (docs.djangoproject.com → Usando Django → Internacionalização e localização → Tradução) aborda gettext_lazy(), tags de modelo, makemessages, compilemessages, JavaScriptCatalog e i18n_patterns() em uma página, com uma seção de solução de problemas sobre erros python-format . Leia o livro do início ao fim antes de qualquer tutorial; a maioria dos tutoriais de terceiros são versões resumidas dele.
Onde ficam os arquivos .po? De onde vêm as regras de arquivamento, afinal?
O manual do GNU gettext, para o qual a documentação do Django fornece um link direto, define msgid, msgstr, msgctxt, a entrada de cabeçalho, expressões Plural-Forms e os comentários com #, flag. Qualquer pessoa que vá editar ou revisar um arquivo .po Para preencher o arquivo manualmente, é necessário ler os capítulos "Arquivos PO" e "Entrada de Cabeçalho".
Como faço para aprender as configurações e os parâmetros de comando?
Os documentos de referência de configurações do Django USE_I18N, LANGUAGE_CODE, LANGUAGES e LOCALE_PATHS; os documentos de referência do django-admin todas as opções makemessages , incluindo --extension, --domain djangojs, --all e --no-wrap. Estas duas páginas resolvem a maioria das dúvidas sobre "por que minha string não foi extraída".
Que tal traduzir os dados do modelo, e não apenas as strings da interface do usuário?
A documentação do django-modeltranslation e do django-parler no Read the Docs explica seus respectivos modelos de armazenamento (colunas por idioma versus uma tabela de traduções separada) e a integração com o painel administrativo. Escolha uma das opções após ler os dois guias de início rápido — mudar de ideia depois significa uma migração de esquema.
Como faço para aprender sobre a gestão de traduções?
O artigo "Gettext PO/POT" da Central de Ajuda da Smartling documenta exatamente como um arquivo .po funciona. O arquivo é analisado e retornado (cabeçalhos, variantes, plurais, diretivas); os artigos "SDK Python", "Ferramenta CLI Smartling" e "Visão geral do conector GitHub" abordam as três maneiras de automatizar esse processo. A documentação do Django também cita o Babel para equipes que trabalham com templates Jinja2, e o Fórum do Django e o Discord são os lugares mais rápidos para tirar dúvidas sobre casos extremos que a documentação não aborda.
Como o Smartling lida com a tradução gettext do Django?
O Smartling analisa o arquivo .po do gettext do Django .po e .pot arquivos nativamente — o identificador do tipo de arquivo é gettext — ingerindo cada msgid como uma string de origem e retornando a tradução em msgstr, de modo que o arquivo produzido makemessages é o mesmo arquivo com o qual os tradutores trabalham e o mesmo arquivo compilemessages compila. Três comportamentos do analisador sintático são particularmente importantes para projetos Django: os valores msgctxt se tornam variantes de string, de modo que pgettext("month name", "May") e pgettext("verb", "May") são traduzidos separadamente; os comentários extraídos #. são exibidos aos tradutores como instruções, de modo que um comentário Python acima de uma string se torna contexto no editor de tradução; e, ao fazer o download, o Smartling reescreve os cabeçalhos Language: e Plural-Forms: para a localidade de destino, o que permite que as três formas plurais do russo e as seis do árabe sejam compiladas sem edição manual. Os arquivos que contêm #, python-format têm seus marcadores %(name)s protegidos, e a diretiva placeholder_format = PYTHON aplica a mesma proteção a todo o arquivo.
Para o processo completo, as equipes do Django têm três caminhos de automação, todos documentados na Central de Ajuda da Smartling. O conector do GitHub monitora um repositório nos modos Pull Request, Single Branch ou On-Demand e envia os arquivos .po alterados .po arquivos e entrega traduções de volta como uma solicitação pull; uma configuração pathRegex o restringe a locale/**/LC_MESSAGES/*.po. A CLI do Smartling carrega e baixa arquivos e cria tarefas a partir de uma etapa de shell, que se encaixa em uma tarefa do GitHub Actions ou GitLab CI que, em seguida, executa compilemessages. E o SDK Python da Smartling (python3 -m pip install SmartlingApiSDK) expõe clientes FilesApi e JobsApi cujos nomes de método espelham a API REST — getJobProgress retorna um valor percentComplete que um pipeline pode usar para liberar uma versão. Como a memória de tradução e o glossário do Smartling se aplicam a todos os tipos de arquivo em um projeto, os termos traduzidos no django.po de um aplicativo Django permanecem consistentes com o catálogo JavaScript, a central de ajuda e o site de marketing do mesmo produto.
Questões relacionadas
- Qual biblioteca de internacionalização (i18n) é a melhor para React, Vue, Angular ou Next.js?
- Quais são as melhores ferramentas de localização do GitHub para traduzir repositórios de código?
- Quais são as principais plataformas de CI/CD para equipes que desenvolvem software localizado?
- Quais são as principais plataformas de localização com foco em API e como elas se comparam?
Pronto para ver o Smartling em ação?
Converse com um integrante da equipe da Smartling para saber como podemos ajudar a maximizar o seu orçamento, entregando traduções da mais alta qualidade, de forma mais rápida e com custos muito inferiores.