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 archivos en 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 de enviar y pasa el contenido traducido a tu proveedor de email |
¿Qué enfoque elegir?
Si el contenido traducible de tu email vive en tu repositorio como archivos de recursos, usa el enfoque en tiempo de compilación. Si el contenido de tu email se genera dinámicamente o está almacenado en tu proveedor de servicios de email, usa el enfoque en tiempo de ejecución.
Requisitos previos#
Cada traducción pasa por un motor de localización: la configuración que define qué modelo de LLM, glosario, voz de marca y reglas se aplican. Crea uno en el panel de Lingo.dev y luego instala y autentica el CLI:
npm install -g @lingo.dev/cli
lingo loginEl CLI requiere Node 22+. En CI, configura LINGO_API_KEY en lugar de ejecutar lingo login.
Localización en tiempo de compilación#
El CLI traduce el contenido del email a partir de archivos de recursos JSON. Extrae tu contenido traducible a JSON, apunta el CLI a esos archivos y obtén archivos por idioma junto a tu archivo fuente.
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 motor. El archivo .lingo/config.json resultante se ve así:
{
"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: el CLI reemplaza el idioma de origen en el patrón por cada idioma de destino, así que emails/locales/en.json genera emails/locales/es.json, emails/locales/fr.json, etc. Haz commit de .lingo/config.json en tu repositorio.
En la primera ejecución, traduce todos los idiomas; después, traduce solo lo que cambió:
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 para cada idioma, listo para enviar.
Para recuperar en cualquier momento los resultados de la última ejecución de push, usa lingo pull. Para verificar que las traducciones estén actualizadas 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 requieren un registro distinto al alemán. |
| Idiomas RTL | Prueba la salida renderizada en clientes de email para árabe, hebreo y persa. El manejo de dir="rtl" en HTML varía según el cliente. |
| Bloqueo de claves | Usa claves bloqueadas para URLs, nombres de productos e identificadores legales que no deben traducirse. |
