Traduzindo o EmDash

Nesta página

A interface de administração do EmDash é traduzível: usa o Lingui para extrair as mensagens e o Lunaria para acompanhar o progresso das traduções. Todas as traduções ficam em arquivos PO (gettext), um por idioma.

Status da tradução

Consulte o painel de traduções para ver o progresso atual de 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 somente quando um falante fluente revisa cada string e a visualiza no painel de administração em execução antes de enviar. Saídas automáticas sem supervisão 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 errado. Uma tradução errada induz os usuários ao erro; 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    # English (source)
├── de/
│   └── messages.po    # German
└── ...

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

  1. Confira o painel de traduções para ver o que precisa de trabalho. Verifique os PRs abertos para evitar trabalho duplicado.

  2. Faça um fork do repositório e crie uma branch:

    git checkout -b i18n/de
  3. Abra o arquivo PO do seu idioma (por exemplo, packages/admin/src/locales/de/messages.po).

  4. Preencha as traduções. Cada entrada tem esta aparência:

    #: 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"
  5. Teste suas traduções (veja abaixo).

  6. Abra um PR direcionado a main. Formato do título: i18n(de): add/update German translations.

    Limite o PR ao arquivo PO, a um changeset e aos arquivos de idioma descritos em Adicionando um novo idioma. A automação comenta em um PR de tradução que altere qualquer outra coisa.

O que traduzir

  • O valor msgstr de cada entrada.

O que NÃO traduzir

  • Os valores msgid: eles são chaves de busca.
  • Os placeholders de interpolação como {error}, {email}, {label}: mantenha-os exatamente como estão.
  • As tags no estilo XML como <0>, </0>: elas envolvem elementos interativos (links, botões). Mantenha as tags e traduza o texto entre elas.
  • Os comentários que começam com #:: são referências ao código-fonte adicionadas pelo Lingui.

Interpolação e tags

Algumas strings contêm placeholders 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 placeholders ({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 na sua tradução exatamente como aparecem no texto-fonte: mesmos nomes, mesmo aninhamento.

Testando suas traduções

  1. Compile e execute a demo:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. Troque o idioma na página de Configurações do administrador e verifique se suas traduções ficam corretas no contexto.

Locale pseudo

O EmDash inclui um locale pseudo que transforma todas as strings envolvidas em sósias acentuados: "Dashboard" vira "Ðàšĥƀöàřð", e assim por diante. Qualquer string que apareça em inglês normal enquanto o locale pseudo está ativo ou não tem o wrapper t\…“ ou vem de fora do catálogo.

Para ativá-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 da página de login e em Configurações. Mude para ele para identificar rapidamente as strings não envolvidas.

Adicionando um novo idioma

Se o seu idioma ainda não tem um arquivo PO:

  1. Adicione o locale a packages/admin/src/locales/locales.ts:

    export const LOCALES: LocaleDefinition[] = [
      { code: "en", label: "English", enabled: true },
      // ...
      {
        code: "vi",
        label: "Tiếng Việt",
        enabled: false,
        dateLocale: () => import("react-day-picker/locale/vi").then((m) => m.vi),
      },
    ];

    dateLocale carrega a localização do calendário e do formato de data para o seu idioma. Escolha o arquivo mais próximo em react-day-picker/locale, como pt para pt-PT, e use a exportação nomeada nesse arquivo. Omita-o somente se o seu idioma usar o calendário do inglês dos EUA.

    Esta é a única fonte de verdade: lingui.config.ts, lunaria.config.ts e o runtime do administrador derivam suas listas de locales deste arquivo. Defina enabled: false enquanto a tradução estiver em andamento. Um mantenedor habilita o locale quando ele tiver cobertura suficiente para uso na interface de administração.

  2. Execute a extração para gerar o arquivo PO vazio:

    pnpm run locale:extract

    Isso cria packages/admin/src/locales/{your-locale}/messages.po com todas as strings prontas para tradução.

  3. Traduza e teste seguindo as etapas 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 nem reinterprete o significado. Se uma string de origem for ambígua, consulte o comentário #: com a localização do arquivo-fonte e 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. Se o seu idioma já tem traduções, leia o arquivo PO existente antes de começar para seguir a terminologia estabelecida.

Tom

A interface de administração usa um tom direto e profissional. Acompanhe isso no seu idioma: evite formulações excessivamente formais ou excessivamente informais.

Traduções assistidas por IA

Você pode gerar traduções com ferramentas de IA, inclusive uma primeira passagem completa, mas um falante fluente precisa supervisionar o resultado:

  • Um falante fluente deve revisar cada string. As ferramentas de IA cometem erros sutis que só um falante fluente percebe: registro errado, formulações pouco naturais, termos técnicos incorretos.
  • Um falante fluente deve visualizar as traduções na interface de administração em execução. As ferramentas de IA não conhecem as restrições de layout nem o contexto da interface.
  • Informe o uso de IA na descrição do seu PR.
  • PRs com traduções automáticas sem supervisão serão fechados.

Traduções parciais

Traduções parciais são bem-vindas. Você não precisa traduzir todas as strings em um único PR: qualquer progresso ajuda. As strings não traduzidas recorrerão ao inglês em tempo de execução.