A CLI e a API de localização do Lingo.dev oferecem duas abordagens para localização de e-mails: traduzir arquivos de template no build para publicar templates por idioma, ou traduzir o conteúdo em tempo de execução antes do envio. Em ambos os casos, tudo passa por um engine de localização configurado, com regras de glossário, voz da marca e seleção de modelo aplicadas automaticamente.
Escolha sua abordagem#
| Abordagem | Ideal para | Como funciona |
|---|---|---|
| Build-time (CLI) | Arquivos de template — strings JSON do react-email | Traduza os arquivos no seu repositório e faça o deploy de templates por idioma |
| Runtime (API) | Conteúdo dinâmico, templates renderizados pelo ESP | Chame a API de localização antes do envio e passe o conteúdo traduzido para seu provedor de e-mail |
Qual abordagem escolher?
Se o conteúdo traduzível dos seus e-mails estiver no repositório como arquivos de recurso, use a abordagem em tempo de build. Se o conteúdo do e-mail for gerado dinamicamente ou armazenado no seu provedor de serviço de e-mail, use a abordagem em tempo de execução.
Pré-requisitos#
Cada tradução passa por um engine de localização — a configuração que define qual modelo de LLM, glossário, voz da marca e regras serão aplicados. Crie um no painel da Lingo.dev e, em seguida, 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 e-mail a partir de arquivos de recurso JSON. Extraia o conteúdo traduzível para JSON, aponte a CLI para ele e gere arquivos por idioma ao lado dos arquivos de origem.
Os templates react-email são componentes React que renderizam em HTML. Extraia as strings traduzíveis para arquivos de recurso JSON usando uma biblioteca de i18n como react-i18next e, depois, traduza os arquivos JSON com a CLI.
Execute lingo init para gerar a configuração e lingo link para vincular sua organização e seu engine. O .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 fica no caminho: a CLI substitui o idioma de origem no padrão por cada idioma de destino, então emails/locales/en.json gera emails/locales/es.json, emails/locales/fr.json e assim por diante. Faça commit de .lingo/config.json no seu repositório.
Na primeira execução, traduza todos os idiomas. Nas próximas, traduza apenas o que mudou:
lingo push --backfill-missing # first run / new locale
lingo push # delta on later runsNa hora da renderização, passe o idioma para o componente de e-mail e carregue o arquivo JSON correspondente. A função react-email render() gera HTML específico por idioma, pronto para envio.
Para recuperar os resultados da última execução de push a qualquer momento, use lingo pull. Para verificar se as traduções estão atualizadas sem gravar alterações (por exemplo, em CI), use lingo check.
Localização em runtime#
Quando o conteúdo do e-mail é dinâmico — como notificações personalizadas, resumos de conteúdo gerado por usuários ou texto de marketing armazenado em um CMS — traduza tudo em tempo de execução antes do envio. Isso 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 |
|---|---|
| Assunto | Mantenha abaixo de 50 caracteres. Use um glossário para evitar a tradução de nomes de marca. |
| Texto de prévia | Traduza separadamente do corpo do e-mail — os clientes de e-mail exibem esse texto de forma independente. |
| Voz da marca | Configure o tom por idioma no engine de localização. E-mails de marketing em japonês exigem um registro diferente dos em alemão. |
| Idiomas RTL | Teste a saída renderizada em clientes de e-mail para árabe, hebraico e persa. O tratamento de HTML dir="rtl" varia entre clientes. |
| Bloqueio de chaves | Use chaves bloqueadas para URLs, nomes de produtos e identificadores legais que não devem ser traduzidos. |
