A interface de administração do EmDash é traduzível usando Lingui para extração de mensagens e Lunaria para rastreamento do progresso de tradução. Todas as traduções ficam em arquivos PO (gettext) — um por locale.
Status da tradução
Consulte o painel de tradução para o progresso atual em todos os locales.
Quem pode traduzir
Toda tradução deve ser supervisionada por um falante nativo ou fluente. Traduções geradas por IA são aceitas, mas apenas quando um falante fluente revisa cada string e a visualiza no painel de administração em execução antes de enviar. Saída de máquina não supervisionada não é aceita. Veja Traduções assistidas por IA e Testando suas traduções abaixo.
Deixar uma string sem tradução é melhor do que traduzi-la incorretamente. Uma tradução errada engana os usuários; o fallback em inglês apenas os incomoda.
Estrutura de arquivos
Os catálogos de tradução ficam em packages/admin/src/locales/:
packages/admin/src/locales/
├── en/
│ └── messages.po # Inglês (fonte)
├── de/
│ └── messages.po # Alemão
└── ...
Cada arquivo .po contém pares msgid/msgstr. O msgid é o texto fonte em inglês; o msgstr é a sua tradução. Um msgstr vazio significa “ainda não traduzido” — o Lingui recorrerá ao inglês em tempo de execução.
Traduzindo strings
-
Consulte o painel de tradução para ver o que precisa de trabalho. Verifique os PRs abertos para evitar duplicação de esforço.
-
Faça fork do repositório e crie um branch:
git checkout -b i18n/pt -
Abra o arquivo PO do seu locale (ex.,
packages/admin/src/locales/pt/messages.po). -
Preencha as traduções. Cada entrada se parece com isto:
#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr ""Preencha o
msgstr:#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr "Entrar com Passkey" -
Teste suas traduções (veja abaixo).
-
Abra um PR direcionado ao
main. Formato do título:i18n(pt): add/update Portuguese translations.
O que traduzir
- O valor
msgstrde cada entrada.
O que NÃO traduzir
- Valores
msgid— são chaves de busca. - Placeholders de interpolação como
{error},{email},{label}— mantenha-os exatamente como estão. - Tags estilo XML como
<0>,</0>— envolvem elementos interativos (links, botões). Mantenha as tags e traduza o texto entre elas. - Comentários que começam com
#:— são referências de origem adicionadas pelo Lingui.
Interpolação e tags
Algumas strings contêm placeholders e tags:
msgid "Authentication error: {error}"
msgstr "Erro de autenticação: {error}"
msgid "Don't have an account? <0>Sign up</0>"
msgstr "Não tem uma conta? <0>Cadastre-se</0>"
msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Se existir uma conta para <0>{email}</0>, enviamos um link de login."
Placeholders ({error}, {email}) são substituídos por valores dinâmicos em tempo de execução. Tags (<0>...</0>) envolvem componentes React. Ambos devem aparecer na sua tradução exatamente como aparecem na fonte — mesmos nomes, mesma aninhamento.
Testando suas traduções
-
Compile e execute a demo:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Mude o locale na página de Configurações do admin e verifique se suas traduções aparecem corretas no contexto.
Locale pseudo
O EmDash inclui um locale pseudo que distorce todas as strings envolvidas em imitações acentuadas — "Dashboard" se torna "Ðàšĥƀöàřð", e assim por diante. Qualquer string que apareça em inglês normal enquanto o locale pseudo está ativo não tem um wrapper t\…“ ou vem de fora do catálogo.
Para habilitá-lo, adicione o seguinte ao seu arquivo .env no diretório da demo:
EMDASH_PSEUDO_LOCALE=1
Depois reinicie o servidor de desenvolvimento. O locale pseudo aparece como Pseudo no seletor de idioma na página de login e nas Configurações. Mude para ele para identificar strings não envolvidas rapidamente.
Adicionando um novo idioma
Se o seu idioma ainda não tem um arquivo PO:
-
Adicione o locale a
packages/admin/src/locales/locales.ts:export const LOCALES: LocaleDefinition[] = [ { code: "en", label: "English", enabled: true }, { code: "de", label: "Deutsch", enabled: true }, // ... { code: "vi", label: "Tiếng Việt", enabled: false }, // adicione o seu ];Esta é a única fonte da verdade —
lingui.config.ts,lunaria.config.tse o runtime do admin derivam todas as suas listas de locale deste arquivo. Definaenabled: falseenquanto a tradução estiver em andamento. Um mantenedor habilita o locale quando ele tiver cobertura suficiente para uso na interface de administração. -
Execute a extração para gerar o arquivo PO vazio:
pnpm run locale:extractIsso cria
packages/admin/src/locales/{seu-locale}/messages.pocom todas as strings prontas para tradução. -
Traduza e teste seguindo os passos acima.
Padrões de tradução
Precisão
As traduções devem representar fielmente o texto fonte em inglês no nível de um falante nativo. Não adicione, remova ou reinterprete o significado. Se uma string fonte for ambígua, verifique o comentário #: para a localização do arquivo fonte — leia o código do componente para entender o contexto.
Consistência
Use terminologia consistente dentro do seu locale. Se você traduzir “collection” como “coleção” em um lugar, não mude para “acervo” em outro. Se o seu idioma já tem traduções, leia o arquivo PO existente antes de começar para corresponder à terminologia estabelecida.
Tom
A interface de administração usa um tom direto e profissional. Combine isso no seu idioma — evite linguagem excessivamente formal ou excessivamente casual.
Traduções assistidas por IA
Você pode gerar traduções com ferramentas de IA, incluindo uma primeira passagem completa, mas um falante fluente deve supervisionar o resultado:
- Um falante fluente deve revisar cada string. Ferramentas de IA cometem erros sutis que apenas um falante fluente percebe — registro incorreto, frases pouco naturais, termos técnicos incorretos.
- Um falante fluente deve visualizar as traduções na interface de administração em execução. Ferramentas de IA não têm conhecimento das restrições de layout ou do contexto da UI.
- Divulgue o uso de IA na descrição do seu PR.
- PRs com traduções de máquina não supervisionadas serão fechados.
Traduções parciais
Traduções parciais são bem-vindas. Você não precisa traduzir cada string em um único PR — qualquer progresso ajuda. Strings não traduzidas recorrerão ao inglês em tempo de execução.