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 idioma.
Status da tradução
Veja o painel de tradução para o progresso atual em todos os idiomas.
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ídas de máquina não supervisionadas não são aceitas. 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 inconveniência.
Estrutura de arquivos
Os catálogos de tradução ficam em packages/admin/src/locales/:
packages/admin/src/locales/
├── en/
│ └── messages.po # English (source)
├── de/
│ └── messages.po # German
└── ...
Cada arquivo .po contém pares msgid/msgstr. O msgid é o texto fonte em inglês; o msgstr é sua tradução. Um msgstr vazio significa “ainda não traduzido” — Lingui usará o inglês como fallback em tempo de execução.
Traduzindo strings
-
Verifique o painel de tradução para ver o que precisa de trabalho. Verifique PRs abertas para evitar duplicar esforços.
-
Faça fork do repositório e crie um branch:
git checkout -b i18n/de -
Abra o arquivo PO do seu idioma (por exemplo,
packages/admin/src/locales/de/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 "Mit Passkey anmelden" -
Teste suas traduções (veja abaixo).
-
Abra um PR mirando
main. Formato do título:i18n(de): add/update German translations.
O que traduzir
- O valor
msgstrpara cada entrada.
O que NÃO traduzir
- Valores
msgid— são chaves de busca. - Marcadores de interpolação como
{error},{email},{label}— mantenha-os exatamente como estão. - Tags estilo XML como
<0>,</0>— estas envolvem elementos interativos (links, botões). Mantenha as tags e traduza o texto entre elas. - Comentários começando com
#:— são referências de origem adicionadas pelo Lingui.
Interpolação e tags
Algumas strings contêm marcadores e tags:
msgid "Authentication error: {error}"
msgstr "Authentifizierungsfehler: {error}"
msgid "Don't have an account? <0>Sign up</0>"
msgstr "Noch kein Konto? <0>Registrieren</0>"
msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Falls ein Konto für <0>{email}</0> existiert, haben wir einen Anmeldelink gesendet."
Os marcadores ({error}, {email}) são substituídos por valores dinâmicos em tempo de execução. As tags (<0>...</0>) envolvem componentes React. Ambos devem aparecer em sua tradução exatamente como aparecem na origem — mesmos nomes, mesma aninhamento.
Testando suas traduções
-
Compile e execute a demo:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Troque o idioma na página de Configurações da administração e verifique se suas traduções parecem corretas no contexto.
Idioma pseudo
EmDash vem com um idioma pseudo que transforma todas as strings envolvidas em sósias acentuadas — "Dashboard" se torna "Ðàšĥƀöàřð", e assim por diante. Qualquer string que apareça em inglês normal enquanto o idioma pseudo está ativo está faltando um wrapper t\…“ ou está vindo de fora do catálogo.
Para ativá-lo, adicione o seguinte ao seu arquivo .env no diretório de demo:
EMDASH_PSEUDO_LOCALE=1
Em seguida, reinicie o servidor de desenvolvimento. O idioma 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 seu idioma ainda não tem um arquivo PO:
-
Adicione o idioma a
packages/admin/src/locales/locales.ts:export const LOCALES: LocaleDefinition[] = [ { code: "en", label: "English", enabled: true }, { code: "de", label: "Deutsch", enabled: true }, // ... { code: "ja", label: "日本語", enabled: false }, // add yours ];Esta é a única fonte da verdade —
lingui.config.ts,lunaria.config.tse o runtime de administração derivam suas listas de idiomas deste arquivo. Definaenabled: falsea menos que suas traduções tenham 100% de cobertura — um mantenedor o habilitará uma vez que a tradução atinja cobertura suficiente. -
Execute a extração para gerar o arquivo PO vazio:
pnpm run locale:extractIsso cria
packages/admin/src/locales/{your-locale}/messages.pocom todas as strings prontas para traduzir. -
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 é 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 idioma. Se você traduzir “collection” como “Sammlung” em um lugar, não mude para “Kollektion” em outro lugar. Se 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 frases excessivamente formais ou excessivamente casuais.
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 detecta — registro errado, frases não 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 consciência de restrições de layout ou contexto de UI.
- Divulgue o uso de IA na descrição do seu PR.
- PRs com traduções de máquina não supervisionadas serão fechadas.
Traduções parciais
Traduções parciais são bem-vindas. Você não precisa traduzir cada string em um PR — qualquer progresso ajuda. Strings não traduzidas usarão o inglês como fallback em tempo de execução.