Traduza mensagens completas
com t-strings do Python¶
O gettext-tstrings liga as t-strings do Python 3.14+ a catálogos gettext
padrão e ao ferramental do Babel. Os valores e a formatação ficam no código da
aplicação; quem traduz trabalha com mensagens completas e marcadores {name}
simples:
import gettext
from gettext_tstrings import Translator
_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}")) # with a Japanese catalog: こんにちは Ada
O catálogo contém Hello {name}. Uma tradução pode mover ou repetir {name}.
Se ela remover, renomear ou reformatar o marcador, a validação do catálogo
relata o erro. Se uma entrada inválida ainda assim chegar à produção, a
biblioteca registra um aviso e renderiza a mensagem de origem, em vez de
derrubar a aplicação.
Comece o tutorial de cinco minutos Compare as alternativas
Alfa · Python 3.14+ · catálogos PO/MO padrão · sem dependências de execução de terceiros
Este site pratica o que documenta: cada edição de idioma —
navegação, rótulos e o relatório de build com plurais — é renderizada de
catálogos PO pelo
próprio gettext-tstrings.
Isto serve para você?¶
Serve hoje quando sua aplicação roda em Python 3.14 ou mais recente; você já usa gettext e Babel, ou quer adotar o fluxo PO/MO dessas ferramentas; e você quer a sintaxe de t-strings com marcadores nomeados que são verificados antes de serem renderizados.
Ainda não serve quando você precisa do Python 3.13 ou anterior; você exige uma API Python estável — isto é um alfa, e a especificação é a parte que já se acomodou; ou quase todo o seu texto traduzível vive em uma linguagem de template, e não no código Python.
Já tem catálogos? Eles continuam funcionando. _("Hello {name}").format(name=name)
e tr(t"Hello {name}") produzem o mesmo msgid, então as traduções existentes
sobrevivem à troca — a Migração percorre a mudança inteira.
O que o catálogo pode dizer¶
Uma tradução não pode mudar a estrutura da mensagem que traduz. Essa é toda
a promessa, e o resto deste site decorre dela. Uma tradução pode reordenar ou
repetir {name}, e pode reescrever todas as outras palavras ao redor. Ela não
pode remover o marcador, inventar um novo, atravessá-lo para alcançar seus
objetos nem acrescentar formatação própria.
A biblioteca verifica isso na entrada — quando os catálogos são compilados — e de novo na renderização, que é a diferença entre um erro encontrado na revisão e um erro encontrado por quem usa a aplicação.
Nunca usou gettext? O fluxo inteiro em quatro frases
gettext é a forma padrão de traduzir software, em Python e muito além
dele. Seu código marca as mensagens traduzíveis; um extrator as coleta em
um arquivo de template (.pot); quem traduz — em geral, não é quem
programa — preenche um arquivo de catálogo (.po) por idioma, que é
compilado em um .mo binário carregado pela aplicação em tempo de
execução. O nome convencional da função de tradução é _, então
_(t"Hello {name}") se lê como "traduza esta mensagem". O
tutorial percorre o caminho inteiro — marcar, extrair,
traduzir, compilar, executar — em cerca de cinco minutos.
O problema que resolve¶
Uma f-string já foi interpolada quando chega a uma biblioteca —
f"Hello {name}" virou "Hello Ada", e traduzir os fragmentos ao redor de um
valor quebra a gramática da maioria dos idiomas. Uma t-string (PEP 750)
mantém separados o texto estático, os valores avaliados, as expressões de
origem, as conversões e as especificações de formato — exatamente a separação
que um catálogo de mensagens precisa.
O que isso muda, em relação a %(name)s, .format() e
strings $.
Nada em gettext ou no Babel diz como uma t-string vira uma mensagem, no entanto. Esta biblioteca faz essa escolha, registra-a como especificação versionada e inclui a suíte de conformidade que a verifica.
As regras de projeto¶
- Traduzir mensagens completas, nunca fragmentos de frase.
- Aceitar somente nomes de variável simples, como
{name}. - Manter
!re:.2fsob controle da aplicação e fora do catálogo. - Permitir que traduções reordenem e repitam marcadores conhecidos, sem deixá-las alcançar atributos ou acrescentar formatação.
- Reutilizar arquivos POT, PO e MO comuns, e as ferramentas que já os leem.
E a lista correspondente do que ela deliberadamente não faz: não localiza números, moedas ou datas — formate esses valores antes, com o Babel; não escapa a saída renderizada para HTML, para um shell ou para um terminal; e não consegue julgar se uma tradução está correta, apenas se os marcadores dela estão intactos.
Instalação¶
Requer Python 3.14 ou mais recente. A renderização não tem dependências:
usa o gettext da biblioteca padrão e nada mais.
A extração e a validação de catálogos passam pelo Babel, então instale esse
extra onde o pybabel for executado, que costuma ser um ambiente de
desenvolvimento ou de CI, e não uma imagem de produção:
Próximos passos¶
Comece aqui — sem pressupor experiência com gettext:
- Tutorial — de um diretório vazio a uma tradução japonesa funcionando em cinco passos, cada comando mostrado com sua saída.
- Por que t-strings — a mesma mensagem escrita de quatro
formas, e o que
%(name)s,.format()e strings$entregam ao catálogo.
Use na prática — as referências de trabalho:
- Guia — a API de execução: qual ponto de entrada usar, plurais, idioma por requisição, strings adiadas e o que acontece quando um catálogo está errado.
- Extração — a referência do
pybabel: configuração, nomes de função personalizados e como as ferramentas existentes validam esses catálogos de graça. - Em produção — o ciclo como uma equipe o executa: o ciclo de atualização, entradas fuzzy, portões de CI, plataformas de tradução e o envio para produção.
- Migração — adotar isto em um projeto que já tem catálogos, um ponto de chamada por vez.
- Para quem traduz — uma única página para entregar a
quem edita os arquivos
.po.
Entenda a fundo — da história à implementação:
- Contexto — por que esta biblioteca existe: trinta anos de gettext, duas PEPs e a discussão na biblioteca padrão que se encerrou sem resposta.
- Armadilhas — o que traduzir este site para trinta e cinco idiomas realmente quebrou, e que metade disso uma ferramenta consegue pegar.
- Como funciona — do objeto template da PEP 750 à string renderizada, e os caches que tornam a verificação barata.
Referência — os contratos:
- API — tudo que o pacote exporta, em uma página.
- Especificação — a convenção t-string ↔ msgid como contrato estável e versionado, com uma suíte de conformidade legível por máquinas.
Estado¶
| Versão do pacote | 0.1.0a8 |
| Estabilidade da API | alfa — a API Python ainda pode mudar |
| Especificação | v1, com uma suíte de conformidade |
| Python | 3.14 e mais recentes; testado em 3.14, 3.14t (free-threaded) e 3.15 |
| Babel | 2.18 ou mais recente, e apenas onde o pybabel roda |
| Dependências de execução | nenhuma — o gettext da biblioteca padrão |
| Formato de catálogo | POT, PO e MO comuns |
| Mudanças | CHANGELOG |
Um alfa. O contrato é pequeno de propósito e a especificação é a parte estável dele; a API Python ainda pode mudar. Antes de uma versão estável, isto precisa de casos de idioma mais amplos, acompanhamento contínuo de desempenho, revisão de API por quem usa gettext e Babel a sério e testes de compatibilidade em todas as versões suportadas de Python e do Babel.
Issues e pull requests são bem-vindos — um alfa é exatamente o momento em que ainda vale a pena discutir a interface.
Participe¶
- Escolha uma good first issue para uma contribuição bem delimitada.
- Faça perguntas de uso nas Q&A Discussions.
- Leve fluxos gettext de produção e ideias de API para as Ideas Discussions.
- Leia o guia de contribuição antes de abrir um pull request.