LocalizaciónInternacionalizaciónTraducción con IA

Localización de correos electrónicos: cómo traducir campañas en los principales ESP

Cada plataforma de email gestiona los idiomas de forma distinta. Algunas traducen por ti, otras te ofrecen espacios vacíos para cada idioma y una te obliga a escribir condicionales a mano. Aquí explicamos qué hacen realmente Braze, Customer.io, Klaviyo, Mailchimp, Iterable y Brevo, y cómo traducir el texto sin romper el código Liquid.

Mariia Ivakhnenko
Mariia Ivakhnenko28 min de lectura
En esta página

Dirijo el marketing de ciclo de vida, así que he pasado gran parte de mi vida frente a editores de campañas, y la localización de correos electrónicos era lo que siempre terminaba subestimando. Traducir una landing page es un trabajo con una forma definida. Traducir una campaña de email es una tarea distinta en cada herramienta que manejas, porque cada plataforma ha decidido por su cuenta qué es, en realidad, un "idioma".

Algunas plataformas traducen el texto por ti. Otras te dan espacios vacíos para cada idioma y esperan que los rellenes. Una espera que escribas lógica de ramificación dentro del cuerpo del mensaje. Y en todas acecha el mismo peligro: el texto está lleno de sintaxis de plantilla que debe volver de la traducción intacta, carácter por carácter, o el envío fallará.

Esta guía explica qué hace realmente cada una de las plataformas principales, cómo extraer e importar el texto, y qué partes del trabajo son iguales en todas partes.

Tres formas en que una plataforma de email gestiona los idiomas

Antes de entrar en el detalle de cada plataforma, conviene saber con cuál de las tres arquitecturas estás tratando. Esta determina todo tu flujo de trabajo y, por lo general, no es algo que puedas cambiar.

ArquitecturaLo que te ofrece la plataformaLo que tú aportasPlataformas
Traduce por tiTraducción automática dentro del editor y variantes por idioma generadas a partir de la versión predeterminadaRevisión, correcciones y una lista de términos que no se deben traducirKlaviyo, Customer.io, Brevo
Te ofrece espacios para cada idiomaContenido etiquetado, estructura de variantes y un proceso de ida y vuelta por CSV o APILas propias traduccionesBraze, Iterable
No te ofrece nadaEtiquetas de combinación y condicionalesTodo, escrito como lógica de ramificación en el cuerpo del mensajeMailchimp

La fila intermedia es donde se sitúan la mayoría de los programas multilingües de gran envergadura, y es a la que más tiempo dedica esta guía, ya que el momento en que «la plataforma te ofrece una cuadrícula vacía de idiomas» es precisamente cuando debe existir un flujo de trabajo de traducción.

Localización de correos electrónicos en Braze

Braze emplea el modelo de etiquetado y relleno, y cuenta con la sintaxis más característica de todas. Cada fragmento traducible de un correo se debe envolver en una etiqueta de Liquid con un ID:

{% translation greeting %}Hello!{% endtranslation %}

El formato general es {% translation tu_id_aquí %}texto predeterminado{% endtranslation %}, y los ID deben ser únicos dentro de cada mensaje. El editor ofrece un atajo de teclado para envolver una selección (Cmd+Alt+L en macOS, Ctrl+Alt+L en Windows). Braze no traduce nada por sí solo: las traducciones se proporcionan subiendo un archivo CSV o mediante la API de traducciones, que en el momento de escribir estas líneas se encuentra en fase de acceso anticipado.

Los límites documentados cobran importancia en cuanto una campaña se pone en marcha de verdad:

LímiteValor
Etiquetas de traducción por mensaje200
Caracteres por texto predeterminado2.000
Traducciones por idioma409.600 bytes (unos 409,6 KB)
Configuraciones regionales por espacio de trabajo200

No se admiten etiquetas de traducción anidadas. La configuración regional proviene del perfil de usuario, configurado en Settings → Localization Settings, ya sea a partir de los atributos predeterminados language y country o de un atributo personalizado; si se aplican ambos, el atributo personalizado tiene prioridad.

Conviene conocer dos particularidades de Braze antes de empezar:

Envolver una URL rompe el seguimiento de clics a menos que la parte envuelta termine en ? o &. Braze documenta la solución alternativa directamente:

<a href="https://{% translation id_1 %}example.com{% endtranslation %}?">Shop Now</a>

No abras el CSV de traducción en Excel. La propia documentación de Braze recomienda evitarlo debido a los problemas de visualización con caracteres ajenos al inglés. Esta es la forma más común en la que un proceso de localización de Braze se corrompe sin que nadie se dé cuenta, y el motivo es Excel, no Braze: Excel intenta adivinar la codificación del CSV y se equivoca.

Los Bloques de contenido de Braze pueden incluir sus propias traducciones, lo que permite localizar un pie de página compartido una sola vez en lugar de hacerlo en cada campaña. Se referencian como {{content_blocks.${tu_bloque}}}; los bloques insertados mediante Liquid permanecen vinculados y se actualizan automáticamente, mientras que los que se añaden desde el menú desplegable del editor no. Si un bloque no tiene traducción para una configuración regional determinada, se muestra en su idioma original en lugar de generar un error.

Si prefieres crear bifurcaciones en lugar de usar etiquetas, Braze también permite seguir la vía manual:

{% if ${language} == 'en' %}
English content
{% elsif ${language} == 'es' %}
Spanish content
{% else %}
Fallback content
{% endif %}

Ten en cuenta que, dentro de una etiqueta Liquid, el atributo aparece a secas como ${language}, mientras que en el cuerpo del mensaje se escribe entre llaves: {{${language}}}. Braze recomienda incluir siempre la rama {% else %}, ya que algunos usuarios no tienen un idioma configurado, utilizan un idioma no admitido o usan un dispositivo en el que no se puede detectar el idioma.

Documentación: Localización en Braze

Localización de correos electrónicos en Customer.io

Customer.io ha adoptado el enfoque opuesto: la localización es nativa, reside en el editor de mensajes y cuenta con un botón de autotraducción por IA. El mensaje se crea en un idioma predeterminado y se añaden variantes de idioma sin necesidad de bifurcar la campaña. Funciona en correos electrónicos, SMS, WhatsApp, notificaciones push y mensajes in-app.

El nombre del atributo de idioma lo eliges tú. En Workspace Settings → Language settings, le indicas a Customer.io qué atributo de perfil contiene el idioma; puede ser language, locale o el que ya utilice tu CRM. Los valores deben ser un código de dos letras (en) o un par de idioma y región separados por un guion (en-US). No se distingue entre mayúsculas y minúsculas, por lo que tanto es-MX como es-mx funcionan, pero el guion es obligatorio.

La autotraducción abarca el cuerpo del mensaje, los asuntos y el preencabezado. Lo que no incluye es esta lista que conviene tener siempre a la vista:

  • Imágenes, aunque sí traduce el texto alternativo
  • Diseños de correo en los editores de texto enriquecido y de código
  • Texto estático de Liquid, valores de atributos y valores de filtros
  • Snippets
  • Texto de componentes personalizados, a menos que desvincules el componente primero

Ese tercer punto merece un ejemplo, ya que es el más traicionero. La propia documentación de localización de Customer.io utiliza esta línea:

Bonjour {{ customer.first_name | default:"ami" }}

La palabra ami es el valor de reserva que se muestra a quienes no tienen un nombre de pila registrado. Es texto real que ve el destinatario y está dentro de un filtro de Liquid que la autotraducción no toca. Si lanzas eso ante una audiencia alemana, a una parte de tus destinatarios se les saludará como ami. Cada cadena de reserva en cada filtro default: debe traducirse a mano para cada variante, y nada en la interfaz te lo recordará.

Otros dos límites a tener en cuenta: las traducciones no se actualizan automáticamente al cambiar la plantilla predeterminada, y los tests A/B con traducciones funcionan en envíos puntuales, pero no en difusiones activadas por API ni en automatizaciones.

Los snippets merecen una mención aparte. Son el mecanismo de contenido reutilizable ({{snippets.your_snippet}}, de 16 KB cada uno por defecto) y la autotraducción los ignora. La recomendación de Customer.io es incluir los condicionales dentro del propio snippet:

{% if customer.language == 'fr' %}
  Se désabonner
{% elsif customer.language == 'de' %}
  Abmelden
{% else %}
  Unsubscribe
{% endif %}

Así pues, un programa de Customer.io suele acabar consistiendo en variantes nativas para el cuerpo de los mensajes y condicionales mantenidos a mano dentro de cada snippet compartido. Conviene saberlo antes de dar por hecho que el botón de IA lo abarca todo.

Documentación: Localización en Customer.io

Localización de correos electrónicos en Klaviyo

La función de Klaviyo se llama Smart Translations y traduce automáticamente el contenido de los mensajes a más de 60 idiomas desde el editor de campañas o flujos. Se activa en Settings → Account → Translation mediante el interruptor «Translate messages». Requiere una cuenta de pago y no está disponible en la versión de prueba gratuita.

Lo que Klaviyo especifica en su documentación como traducible automáticamente es una lista concreta: bloques de texto, etiquetas y texto alternativo. Las líneas de asunto no están en esa lista, así que confírmalo en tu cuenta antes de dar por hecho que una campaña está totalmente cubierta.

La resolución de idioma utiliza por defecto el Locale del perfil, y recurre a Country o Language si estos son los campos que están configurados. Klaviyo acepta códigos BCP-47 (en-GB, es-ES) y también valores de texto sin formato como English o French.

Hay dos detalles que hacen que trabajar con Klaviyo sea muy cómodo. El primero es la lista de términos no traducibles: nombres de marca, de productos y cualquier término que no quieras que el modelo toque, definidos una sola vez a nivel de cuenta. La mayoría de las plataformas no tienen un equivalente, y es lo que marca la diferencia entre que el nombre de tu producto se mantenga intacto en diez idiomas o que acabe convertido en diez palabras distintas.

El segundo es el menú de ajustes manuales por elemento. En cualquier elemento traducido, aparecen las opciones Re-translate, Match source, Edit e Ignore, y puedes cambiar de idioma con las flechas de la parte superior del editor. Esto hace que la revisión consista en repasar los elementos marcados en lugar de tener que volver a leerlo todo de arriba abajo.

Klaviyo también admite un flujo de ida y vuelta mediante CSV, que es justo lo que necesitas si trabajas con traductores o herramientas externas. En Translate → el menú de acciones encontrarás Export CSV, ya sea en formato Smartling o Simple. Las columnas son block_id (el identificador único de cada cadena traducible), source (el texto original) y una columna por idioma identificada con su código. Las reglas son estrictas y lógicas: no edites ni elimines los valores de block_id, no añadas filas y no modifiques los valores de source.

Algo que suele sorprender a quienes vienen de Braze o Customer.io es que Klaviyo no es Liquid. Utiliza la sintaxis de plantillas de Django.

{% if person|lookup:'Loyalty Points' > 150 %}
Hey VIP! You've always got free shipping & free returns
{% elif person|lookup:'Loyalty Points' > 0 %}
You have {{ person|lookup:'Loyalty Points' }} points, and you just need 150 to become a VIP!
{% else %}
Have you heard about our VIP program? Join today on our website to start earning rewards.
{% endif %}

Las etiquetas se parecen tanto a las de Liquid que es fácil confundirse, y luego detalles como elif frente a elsif te arruinan la tarde. La personalización con un valor de reserva se escribe como {{ first_name|default:'friend' }}.

Documentación: Klaviyo Smart Translations · Sintaxis de Django

Localización de correos electrónicos en Mailchimp

Mailchimp no tiene una función nativa para campañas multilingües. Lo que ofrece son etiquetas de combinación condicionales, y el método documentado consiste en incluir todos los idiomas en un mismo correo y dejar que los condicionales seleccionen el correcto.

*|IF:MC_LANGUAGE=es|*
Spanish content here.
*|ELSEIF:MC_LANGUAGE=de|*
German content here.
*|ELSE:|*
Display English content for everyone else.
*|END:IF|*

*|MC_LANGUAGE|* contiene el código de idioma del contacto y *|MC_LANGUAGE_LABEL|* el nombre descriptivo. Mailchimp intenta detectar el idioma a través del navegador del suscriptor; también puedes definirlo para cada contacto en perfil → Settings → Language, o de forma masiva al importar. Ten en cuenta que *|END:IF|* cierra tanto los bloques IF como los IFNOT.

Ese único límite suele ser el que inclina la balanza. Un correo localizado con el asunto en el idioma equivocado pierde la apertura antes siquiera de que el texto importe, por lo que la mayoría de los equipos que gestionan más de dos idiomas en Mailchimp acaban creando campañas independientes por idioma de todos modos; llegado ese punto, el método de las etiquetas de combinación condicionales no les ha servido de nada. Conviene saberlo en la fase de planificación y no después de haber montado la plantilla.

Documentación: Traducir contenido en Mailchimp

Localización de correos electrónicos en Iterable

Iterable cuenta con una función de locales propiamente dicha, y su documentación es sorprendentemente franca sobre lo que esto implica y lo que no:

Los locales no traducen el contenido.

La plataforma ofrece la estructura para las variantes y tú aportas las traducciones. A cambio, todas las variantes comparten un único templateId, de modo que las métricas se mantienen unificadas en lugar de fragmentarse en diez plantillas distintas. Para cualquiera que haya intentado generar informes de una campaña dividida en versiones por idioma, solo esa ventaja ya justifica la configuración.

El campo debe llamarse exactamente locale. Iterable deja claro que si lo llamas languagePreference o cualquier otra cosa, no podrá asociar a los usuarios con las variantes. Los nombres de los locales siguen los estándares ISO-639 e ISO-3166 (fr-CA, fr-FR), se admiten códigos de tres letras y los locales no se pueden renombrar tras su creación, así que decide tu convención de nomenclatura antes de crear veinte. Si el locale está en blanco, se aplica la localización por defecto; si no hay coincidencia, el proceso se rige por un ajuste a nivel de proyecto que permite elegir entre omitir el envío o enviar la versión predeterminada.

Iterable también desaconseja explícitamente hacerlo por cuenta propia:

Aunque Iterable es una plataforma flexible y es posible crear contenido en varios idiomas mediante Handlebars o Catalog, estas no se consideran buenas prácticas de localización.

El sistema de plantillas es Handlebars y los nombres de los campos distinguen entre mayúsculas y minúsculas. Hay una peculiaridad en el editor WYSIWYG que puede darte problemas: los condicionales deben ir envueltos en comentarios HTML o, de lo contrario, el editor los estropeará.

<!--{{#if activeUser}}-->
    <div>Hi active user!</div>
<!--{{else}}-->
    <div>Hi inactive user</div>
<!--{{/if}}-->

Para el flujo de ida y vuelta, GET /api/templates/email/get extrae el contenido de la plantilla para los traductores.

Documentación: Iterable en varios idiomas

Localización de correos electrónicos en Brevo

Brevo se sitúa entre las plataformas que traducen por ti y es el competidor más directo de Mailchimp en esta función específica. Basta con crear una única campaña que se adapte al idioma o al código de país del contacto y hacer clic en Añadir idiomas; Brevo duplicará la campaña por cada idioma para que puedas traducirla, ya sea manualmente o con Aura, su asistente de IA.

Lo que puedes variar por idioma es más amplio que en la mayoría de los casos: el nombre del remitente, la línea de asunto, el texto de vista previa y el propio diseño del correo, además de la dirección de respuesta, el seguimiento de Google Analytics y una página de baja personalizada. La línea de asunto es el aspecto más destacable, ya que es precisamente lo que Mailchimp no permite hacer.

Las limitaciones documentadas son las siguientes: no admite traducciones basadas en archivos (por lo que no existe un flujo de ida y vuelta mediante CSV, lo que descarta a Brevo si trabajas con un proveedor de traducción externo), no funciona con campañas de test A/B y las secciones guardadas requieren una versión por idioma. Los contactos cuyo atributo de idioma no coincida con ninguno de los configurados recibirán la versión predeterminada.

Documentación: Campañas multilingües en Brevo

Liquid, Handlebars y etiquetas de combinación: lo que debe permanecer intacto

Independientemente de la plataforma que utilices, la fase de traducción tiene un requisito indispensable. El texto contiene sintaxis de plantillas y cada carácter debe devolverse exactamente igual a como se entregó. Traducir un {% endif %} hará que el envío falle.

Así es la sintaxis en las distintas plataformas incluidas en esta guía:

PlataformaLenguajePersonalizaciónCondicional
BrazeLiquid{{${first_name}}}{% if %} / {% elsif %} / {% else %} / {% endif %}
Customer.ioLiquid{{customer.first_name}}{% if %} / {% elsif %} / {% else %} / {% endif %}
KlaviyoDjango{{ first_name }}{% if %} / {% elif %} / {% else %} / {% endif %}
MailchimpEtiquetas de combinación*|FNAME|**|IF:X|* / *|ELSEIF:X|* / *|ELSE:|* / *|END:IF|*
IterableHandlebars{{firstName}}{{#if}} / {{else}} / {{/if}}
BrevoLenguaje de plantillas de Brevo{{ contact.FIRSTNAME }}{% if %} / {% else %} / {% endif %}

Tres tipos de fallos explican casi todo lo que sale mal en este proceso.

El modelo traduce el token. Recibes {{ prénom }} o {% si %} de vuelta, y el envío falla o muestra el texto literal. Cualquier herramienta que se precie enmascara los tokens antes de que el texto llegue al modelo y los restaura después, para que el modelo nunca los vea como palabras.

El modelo mueve el token. El orden de las palabras cambia legítimamente entre idiomas, por lo que un token debería moverse. El problema surge cuando se desplaza a la cláusula equivocada, o cuando un {% if %} y su {% endif %} terminan en un orden distinto. La posición importa; la solución consiste en comprobar que el conjunto de tokens de salida coincida con el de entrada y volver a procesar el bloque si no es así.

La cantidad de tokens cambia. Perder un token es lo más peligroso, porque el correo se sigue enviando, pero sin un nombre o una rama condicional. Por eso, contar los tokens es más importante que simplemente revisar a ojo.

Y la regla que rige los tres casos es esta: las ramas condicionales son cadenas independientes. En esta línea hay dos fragmentos de texto independientes, y un traductor o modelo al que se le entregue todo como una masa informe hará un peor trabajo en ambos que si recibiera cada fragmento por separado y con su contexto:

{% if ${loyalty_tier} == 'gold' %}Gold members get an extra 10%.{% else %}Join Gold for an extra 10%.{% endif %}

Los correos HTML y las tablas de cadenas son tareas distintas

Hay una bifurcación en este camino que determina todo el planteamiento, y la gente suele descubrirla cuando ya va por la mitad.

Parte del contenido de los correos es un documento: una plantilla HTML, un correo renderizado, algo con una estructura y un flujo que se lee de arriba abajo. Lo ideal es que se traduzca como prosa continua, ya que el titular y el cuerpo que lo acompaña forman un todo; un traductor que puede ver ambos elementos tomará mejores decisiones que uno que solo ve las partes por separado.

Otro tipo de contenido de los correos es una tabla de cadenas: una lista con claves en la que cada fila es independiente. cta_``button, subject_line, footer_unsub. Estos elementos incluyen metadatos que importan más que la propia prosa: una clave que nunca debe cambiar, una nota de contexto y, a menudo, un límite de caracteres, ya que un asunto demasiado largo se corta en la bandeja de entrada.

Los CSV de Braze y Klaviyo, y todos los formatos de archivo de localización del mundo del software (gettext PO, XLIFF), son tablas de cadenas. Tus plantillas HTML son documentos. Si tratas una tabla de cadenas como un documento, perderás las claves; si tratas un documento como una tabla de cadenas, la prosa acabará desmenuzada en fragmentos inconexos.

Por eso diseñamos el soporte para archivos de cadenas en Transept como un flujo independiente, en lugar de integrarlo en la importación de documentos. Un CSV con el contenido de los correos se muestra como una cuadrícula con columnas para la clave, el origen y la traducción; el límite de caracteres se visualiza mediante un contador en tiempo real y cada fila incluye su propia nota de contexto.

La cuadrícula de cadenas de Transept muestra el CSV de una campaña de correo importada. En ella se aprecian las filas de subject_line, preheader, hero_headline, hero_body, cta_button, loyalty_line, shipping_note y footer_unsub, con la etiqueta de personalización de Braze y un condicional de Liquid preservados en la columna de origen, las traducciones al alemán a la derecha y contadores de caracteres como 46/90 y 8/18 bajo cada una.

Lo fundamental es que el archivo sale con la misma estructura con la que llegó. Exportas el archivo original ya traducido, con las claves y las columnas en el lugar donde la plataforma las espera, en lugar de generar un archivo que luego tengas que reajustar a mano.

Lo que descubrimos al integrar el soporte para correos electrónicos en Transept

Lanzamos la importación de archivos de cadenas precisamente para este flujo de trabajo, y el proceso reveló detalles que no he visto documentados en ninguna parte. Estos son nuestros propios hallazgos, extraídos de nuestro código y de nuestras pruebas de ejecución.

"50% off" es, técnicamente, una conversión de printf

Las cadenas de software suelen usar marcadores de posición de printf: %s, %d, %1$s. Si se enmascaran antes de la traducción, la expresión regular más lógica aceptará el conjunto completo de indicadores de printf, que incluye el indicador de espacio (% d imprime un espacio antes de los números positivos). Es sintaxis de printf válida y aceptarla es defendible.

También es un desastre para los textos de marketing. Si se acepta el indicador de espacio, 50% off contiene una coincidencia: % o se interpreta como una conversión octal con indicador de espacio. Lo mismo ocurre con 100% organic. Y con Up to 70% off, que es la estructura más común en los correos promocionales.

Lo probamos de ambas formas:

EntradaPatrón estrictoCon el indicador de espacio
50% de descuento en tu primer pedidosin coincidencia% o
100% algodón orgánicosin coincidencia% o
Hola %s, has ahorrado un %d%%%s, %d, %%%s, %d, %%

Enmascarar % o convierte la línea del descuento en un marcador de posición y le entrega al modelo una frase mutilada. Rechazamos el indicador de espacio deliberadamente y no perdemos nada: ninguna tabla de cadenas real lo utiliza.

La etiqueta de personalización de Braze tiene tres llaves de cierre

Dimos con este mientras escribíamos esta guía, lo cual es un buen argumento a favor de escribir guías.

La sintaxis de Braze es {{${first_name}}}. Cuenten las llaves de cierre: la del propio atributo }, y luego las dos que cierran la etiqueta de salida de Liquid. Tres seguidas.

Casi todos los tokenizadores de Liquid realizan un escaneo no codicioso hasta el primer }}. Al toparse con {{${first_name}}}, la etiqueta se cierra una llave antes de lo debido: se captura {{${first_name}} y queda una } suelta en el texto traducible. El token parece procesado, pero esa llave huérfana se envía al modelo como prosa y vuelve desplazada, duplicada o desaparecida.

{{${first_name}}}, your spring sale starts now

  non-greedy scan  →  token: {{${first_name}}     leftover: "}, your spring sale starts now"
  brace-aware scan →  token: {{${first_name}}}    leftover: ", your spring sale starts now"

Al nuestro le pasó lo primero. Lo detectamos, lo corregimos para permitir un nivel de anidamiento dentro del token e incorporamos la sintaxis exacta de Braze a nuestra batería de pruebas. Si mantienes tus propias herramientas de correo, pruébalas específicamente con {{${attribute}}}, ya que el formato simple {{ attribute }} funciona perfectamente y oculta el error por completo.

Las comillas en los marcadores de posición rompen las respuestas JSON

Cuando se envía un lote de cadenas a un modelo y se restringe la respuesta a JSON, una " sin escapar dentro de una cadena de respuesta cierra la cadena antes de tiempo y se pierde el resto del lote. Nos ocurrió con marcadores de posición que contenían atributos entre comillas, y lo reprodujimos en aproximadamente el 58 % de las ejecuciones con un modelo.

La solución no consiste en dar mejores instrucciones de escape en el prompt. Se trata de eliminar las comillas del formato de transferencia para que el error sea imposible: el modelo solo ve marcadores de posición sin comillas y la forma canónica entrecomillada se restaura después. Pedirle a un modelo que no rompa el JSON funciona la mayoría de las veces, lo cual es el peor perfil de fiabilidad posible, porque los fallos pasarán desapercibidos.

Las entradas «fuzzy» son una señal, no una traducción

Si tus cadenas provienen de archivos PO de gettext, las entradas llevan un indicador fuzzy que significa «esto se ha emparejado automáticamente; un humano no lo ha confirmado». Tratar las entradas «fuzzy» como traducciones terminadas supone importar un montón de conjeturas como trabajo aprobado.

Las excluimos de la carga inicial, las traducimos desde cero y eliminamos el indicador «fuzzy» al exportar los resultados, ya que para entonces la entrada ha sido revisada y el indicador ya no es válido.

Mejores prácticas para localizar campañas de correo electrónico

Los hábitos que distinguen un programa fluido de uno tortuoso, ordenados aproximadamente según los quebraderos de cabeza que ahorran.

Define tus códigos de configuración regional una sola vez, a nivel de perfil. Ya sean de dos letras o con variante regional, mantén la coherencia en todas partes. La mayoría de los incidentes en los que «la traducción no aparece» se deben a un perfil nl-BE que se encuentra con un mensaje en nl.

Escribe el contexto de cada cadena antes de enviarla a ninguna parte. Un traductor que ve Shop the sale en una hoja de cálculo no tiene forma de saber si es un botón, un encabezado o un enlace, ni que solo dispone de dieciocho caracteres de espacio. Todas las plataformas que ofrecen un campo de contexto o descripción te están pidiendo precisamente lo que más mejora la calidad del resultado, y casi nadie lo rellena.

Respeta los límites de caracteres como una restricción de primer orden. El alemán suele ocupar entre 1,5 y 2 veces más espacio que el inglés. Una CTA que cabe en inglés se desbordará, y una línea de asunto que encaja se cortará a mitad de palabra en la bandeja de entrada. Incluye el límite junto con la cadena para que quien la traduzca pueda ver el contador.

Mantén una lista de términos no traducibles. Nombres de productos, términos de marca, nombres de funciones. Klaviyo lo integra de serie; en otras plataformas, se gestiona desde el glosario. En cualquier caso, regístrala antes de la primera ejecución, no después de haber encontrado el nombre de tu producto en seis variantes distintas.

Traduce los textos alternativos. Cada filtro default:, cada rama {% else %} y cada «Hola» que aparece cuando falta el nombre. Estas son las cadenas que nunca se ven en la vista previa, por lo que nunca se revisan, y terminan enviándose a los destinatarios de los que menos información tienes.

Reutiliza tus decisiones en los distintos envíos. El contenido de las campañas se repite constantemente: el mismo pie de página, el mismo mensaje de baja, el mismo enfoque estacional cada año. Una memoria de traducción permite definir «Shop the sale» una sola vez y que se mantenga en todas las campañas posteriores, en lugar de que el texto acabe derivando en tres variantes porque en tres ejecuciones distintas se tomaron decisiones diferentes.

Realiza envíos de prueba en todos los idiomas antes del envío real. Renderiza la plantilla real con un perfil real para cada configuración regional. Los condicionales que parecen correctos en el editor fallan de formas que solo se manifiestan al renderizar; este es el paso que permite detectar un texto alternativo sin traducir o una rama con errores cuando todavía no cuesta nada.

Preguntas frecuentes

¿Qué es la localización de correos electrónicos?

La localización de correos electrónicos es el proceso de adaptar una campaña a otro idioma y mercado: el contenido, la línea de asunto y el preencabezado, los textos alternativos de personalización y las convenciones de formato de la región de destino. Se diferencia de la traducción convencional en que un correo electrónico incluye sintaxis de plantilla (etiquetas de combinación o condicionales de Liquid y Handlebars) que debe permanecer intacta, además de restricciones como la longitud de la línea de asunto, que la traducción debe respetar estrictamente.

¿Qué plataformas de correo electrónico traducen campañas automáticamente?

Klaviyo (Smart Translations, más de 60 idiomas), Customer.io (traducción automática por IA en correos electrónicos, SMS, WhatsApp, notificaciones push y mensajes in-app) y Brevo (a través de su asistente Aura) generan traducciones dentro del editor. Braze e Iterable proporcionan la estructura para las configuraciones regionales, pero esperan que el usuario suministre las traducciones. Mailchimp no dispone de una función nativa para campañas multilingües y se basa en etiquetas de combinación condicionales.

¿Puedo traducir una línea de asunto de Mailchimp?

No. La documentación de Mailchimp indica que no es posible traducir la línea de asunto, ya que las etiquetas de combinación condicionales no funcionan en el campo del asunto. Para enviar líneas de asunto localizadas a través de Mailchimp, se necesita una campaña por idioma, segmentada según el campo de idioma del contacto.

¿Cómo evito que la traducción rompa mis etiquetas de Liquid?

Enmascara los tokens antes de que el texto llegue al modelo de traducción para que nunca los interprete como palabras; después, restáuralos y verifica que el conjunto de tokens en la salida coincida con el de la entrada antes de aceptar el resultado. Traducir cada rama condicional como una cadena independiente, en lugar de entregar toda la línea {% if %}...{% endif %} como un único bloque, también mejora la calidad, ya que cada rama se traduce como la oración independiente que es.

¿Cuál es la diferencia entre un correo electrónico HTML y una tabla de cadenas?

Un correo electrónico HTML es un documento: prosa cohesionada con estructura, cuya traducción conviene realizar de forma integral para que el contexto fluya entre el titular y el cuerpo. Una tabla de cadenas es una lista con claves en la que cada fila es independiente y contiene una clave que no debe cambiar nunca, generalmente una nota de contexto y, a menudo, un límite de caracteres. Las exportaciones CSV de Braze y Klaviyo, los archivos PO de gettext y XLIFF son tablas de cadenas. Ambos formatos requieren un tratamiento distinto: tratar una tabla de cadenas como un documento conlleva la pérdida de las claves, mientras que tratar un documento como una tabla de cadenas fragmenta la prosa.

¿Debería usar la exportación CSV o la API de la plataforma para las traducciones?

El CSV es la opción práctica cuando la traducción la realiza una persona o un proveedor externo, y es el método que documentan Braze y Klaviyo. La integración vía API es mejor cuando el proceso se repite de forma programada o el volumen es tan alto que la gestión manual de archivos se convierte en un cuello de botella. Braze ofrece una API de traducciones (en acceso anticipado al momento de escribir esto) e Iterable expone el contenido de las plantillas a través de GET /api/templates/email/get. Brevo no admite ninguna de las dos: no cuenta con traducción basada en archivos, por lo que las campañas deben traducirse en la interfaz.

¿Cuántos idiomas admite una única campaña de correo electrónico?

Depende de la plataforma. Braze permite hasta 200 configuraciones regionales por espacio de trabajo y 200 etiquetas de traducción por mensaje. Klaviyo abarca más de 60 idiomas a través de Smart Translations. Customer.io admite varios cientos de códigos de idioma y de idioma-región. En la práctica, la limitación rara vez es el tope de la plataforma; el verdadero reto es cuántos idiomas se pueden mantener revisados y al día a medida que el texto original cambia.

El autor

Mariia Ivakhnenko

Cofundadora de Transept. Tres títulos en Lengua y Literatura Inglesa —Kyiv, Ostrava y un año en Salzburg— y nativa ucraniana que vive la mayor parte de su vida literaria en inglés. Llegó a la IA como ingeniera de prompts, y luego pasó al marketing de producto y ciclo de vida. Escribe historias de semificción sobre personas reales y sigue dándole vueltas a la pregunta de qué se pierde entre los idiomas.