La CLI y la API de localización de Lingo.dev admiten dos enfoques para la localización de emails: traducir archivos de plantilla en tiempo de compilación para desplegar plantillas por idioma, o traducir el contenido en tiempo de ejecución antes del envío. Ambos pasan por un motor de localización configurado, con reglas de glosario, voz de marca y selección de modelo aplicadas automáticamente.
Elige tu enfoque#
| Enfoque | Ideal para | Cómo funciona |
|---|---|---|
| Tiempo de compilación (CLI) | Archivos de plantilla - cadenas JSON de React Email | Traduce los archivos de tu repositorio y despliega plantillas por idioma |
| Tiempo de ejecución (API) | Contenido dinámico, plantillas renderizadas por el ESP | Llama a la API de localización antes del envío y pasa el contenido traducido a tu proveedor de email |
¿Qué enfoque elegir?
Si el contenido traducible de tus emails está en tu repositorio como archivos de recursos, usa el enfoque en tiempo de compilación. Si el contenido de tus emails se genera dinámicamente o está almacenado en tu proveedor de servicios de correo electrónico, usa el enfoque en tiempo de ejecución.
Requisitos previos#
Cada traducción pasa por un motor de localización: la configuración que determina qué modelo de LLM, glosario, voz de marca y reglas se aplican. Crea uno en el panel de Lingo.dev y, después, instala y autentica la CLI:
npm install -g @lingo.dev/cli
lingo loginLa CLI requiere Node 22+. En CI, configura LINGO_API_KEY en lugar de ejecutar lingo login.
Localización en tiempo de compilación#
La CLI traduce el contenido de tus emails a partir de archivos de recursos JSON. Extrae el texto traducible a JSON, indica a la CLI dónde está y obtén archivos por idioma junto a los originales.
Las plantillas de react-email son componentes de React que se renderizan como HTML. Extrae las cadenas traducibles a archivos de recursos JSON con una librería de i18n como react-i18next y luego traduce los archivos JSON con la CLI.
Ejecuta lingo init para generar la configuración y lingo link para vincular tu organización y tu motor. El .lingo/config.json resultante tendrá este aspecto:
{
"orgId": "org_abc123",
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocales": ["es", "fr", "de", "ja"],
"files": [{ "pattern": "emails/locales/en.json" }]
}El idioma va en la ruta: la CLI sustituye el idioma de origen del patrón por cada idioma de destino, así que emails/locales/en.json genera emails/locales/es.json, emails/locales/fr.json, etc. Sube .lingo/config.json a tu repositorio.
En la primera ejecución, traduce todos los idiomas; en las siguientes, solo lo que haya cambiado:
lingo push --backfill-missing # first run / new locale
lingo push # delta on later runsEn tiempo de renderizado, pasa el idioma a tu componente de email y carga el archivo JSON correspondiente. La función render() de react-email genera HTML específico por idioma listo para enviar.
Para recuperar en cualquier momento los resultados de la última ejecución de push, usa lingo pull. Para comprobar que las traducciones están al día sin escribir cambios (por ejemplo, en CI), usa lingo check.
Localización en tiempo de ejecución#
Cuando el contenido del email es dinámico —notificaciones personalizadas, resúmenes de contenido generado por usuarios o copy de marketing almacenado en un CMS—, tradúcelo en tiempo de ejecución antes de enviarlo. Esto sigue el patrón descrito en la guía de la API de traducción.
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),
});
}Buenas prácticas#
| Área | Recomendación |
|---|---|
| Asuntos | Mantenlos por debajo de 50 caracteres. Usa un glosario para evitar que los nombres de marca se traduzcan. |
| Texto de vista previa | Tradúcelo por separado del cuerpo: los clientes de email lo muestran de forma independiente. |
| Voz de marca | Configura el tono por idioma en el motor de localización. Los emails de marketing en japonés necesitan un registro distinto que en alemán. |
| Idiomas RTL | Prueba el resultado renderizado en clientes de email para árabe, hebreo y persa. La gestión de dir="rtl" en HTML varía según el cliente. |
| Bloqueo de claves | Usa claves bloqueadas para URL, nombres de producto e identificadores legales que no deban traducirse. |
