A CLI e a API de localização do Lingo.dev suportam dois modelos para a localização de emails: traduzir ficheiros de template no momento do build para publicar templates por idioma, ou traduzir conteúdo em runtime antes do envio. Em ambos os casos, tudo passa por um motor de localização configurado, com regras de glossário, voz da marca e seleção de modelo aplicadas automaticamente.
Escolha a abordagem certa#
| Abordagem | Mais indicado para | Como funciona |
|---|---|---|
| Build-time (CLI) | Ficheiros de template — strings JSON do react-email | Traduza os ficheiros no seu repositório e faça deploy de templates por idioma |
| Runtime (API) | Conteúdo dinâmico, templates processados pelo ESP | Chame a API de localização antes do envio e passe o conteúdo traduzido ao seu fornecedor de email |
Que abordagem deve escolher?
Se o texto traduzível dos seus emails estiver no repositório sob a forma de ficheiros de recursos, use a abordagem em tempo de compilação. Se o conteúdo do email for gerado dinamicamente ou armazenado no seu fornecedor de serviços de email, use a abordagem em tempo de execução.
Pré-requisitos#
Cada tradução passa por um motor de localização — a configuração que define que modelo de LLM, glossário, voz da marca e regras se aplicam. Crie um no painel da Lingo.dev e, depois, instale e autentique a CLI:
npm install -g @lingo.dev/cli
lingo loginA CLI requer Node 22+. Em CI, defina LINGO_API_KEY em vez de executar lingo login.
Localização em build-time#
A CLI traduz conteúdo de email a partir de ficheiros de recursos JSON. Extraia o texto traduzível para JSON, aponte a CLI para esse ficheiro e obtenha ficheiros por idioma lado a lado com o ficheiro de origem.
Os templates react-email são componentes React que geram HTML. Extraia as strings traduzíveis para ficheiros de recursos JSON com uma biblioteca de i18n como react-i18next e, depois, traduza os ficheiros JSON com a CLI.
Execute lingo init para gerar a configuração e lingo link para associar a sua organização e o motor. O ficheiro .lingo/config.json resultante fica assim:
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [{ "pattern": "emails/locales/en.json" }]
}O idioma faz parte do caminho: a CLI substitui o idioma de origem no padrão por cada idioma de destino, por isso emails/locales/en.json produz emails/locales/es.json, emails/locales/fr.json e assim sucessivamente. Faça commit de .lingo/config.json no seu repositório.
Na primeira execução, traduza todos os idiomas; nas seguintes, traduza apenas o que mudou:
lingo push --backfill-missing # first run / new locale
lingo push # delta on later runsNo momento da renderização, passe o idioma ao seu componente de email e carregue o ficheiro JSON correspondente. A função react-email render() gera HTML específico para cada idioma, pronto a enviar.
Para obter os resultados da última execução de push em qualquer altura, use lingo pull. Para verificar se as traduções estão atualizadas sem escrever alterações (por exemplo, em CI), use lingo check.
Localização em runtime#
Quando o conteúdo do email é dinâmico — notificações personalizadas, resumos de conteúdo gerado pelo utilizador ou copy de marketing armazenada num CMS — traduza-o em runtime antes do envio. Isto segue o padrão descrito no guia da API de Tradução.
async function sendLocalizedEmail(userId, templateId, content) {
const user = await db.users.findById(userId);
const response = await fetch("https://api.lingo.dev/process/localize", {
method: "POST",
headers: {
"X-API-Key": process.env.LINGODOTDEV_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
engineId: "eng_abc123",
sourceLocale: "en",
targetLocale: user.locale,
data: {
subject: content.subject,
preheader: content.preheader,
body: content.body,
},
}),
});
const { data } = await response.json();
await emailProvider.send({
to: user.email,
subject: data.subject,
html: renderTemplate(templateId, data),
});
}Boas práticas#
| Área | Recomendação |
|---|---|
| Assuntos | Mantenha-os abaixo dos 50 caracteres. Use um glossário para evitar a tradução de nomes de marca. |
| Texto de pré-visualização | Traduza-o separadamente do corpo — os clientes de email apresentam-no de forma independente. |
| Voz da marca | Configure o tom por idioma no motor de localização. Emails de marketing em japonês exigem um registo diferente dos emails em alemão. |
| Idiomas RTL | Teste o resultado renderizado em clientes de email para árabe, hebraico e persa. O tratamento de HTML dir="rtl" varia de cliente para cliente. |
| Bloqueio de chaves | Use chaves bloqueadas para URLs, nomes de produtos e identificadores legais que não devem ser traduzidos. |
