Gestionar contenido localizado con catálogos de Braze
Almacena cadenas localizadas y URL en catálogos para que cada usuario reciba el texto en su idioma desde una única Campaign o Canvas, sin variantes separadas por idioma.
Acerca de este ejemplo
PantsLabyrinth, un minorista de ropa ficticio, vende sus productos en Norteamérica y Europa. Los nombres de productos, los precios y las imágenes principales varían según el idioma, pero el equipo de marketing quiere una única plantilla de correo electrónico o push que se personalice en el momento del envío.
Este ejemplo cubre tres patrones de catálogo que leen el ${language} atributo estándar del usuario (recopilado por el SDK a partir de la configuración regional del dispositivo):
- Campos de objeto JSON: todas las configuraciones regionales en una fila por artículo
- Columnas planas por idioma:
header_en,header_fr, y así sucesivamente - Catálogo separado por idioma: nombre de catálogo dinámico como
pantslabyrinth-promo-en
Usa catálogos cuando el contenido localizado sea datos estructurados (productos, promociones, URL de imágenes). Para texto libre de mensajes en correo electrónico o push, prefiere los mensajes en varios idiomas cuando tus canales los admitan. Para comparar patrones de localización de forma más amplia, consulta Gestión de traducciones.
Consideraciones
- Los ejemplos son ilustrativos. Confirma el uso de mayúsculas/minúsculas y el formato de
${language}en tu base de usuarios antes de nombrar claves o sufijos de catálogo. - Para los métodos 1 y 2, si
${language}está en blanco o no coincide con una clave o campo de catálogo, la salida localizada puede estar vacía; verifica cada campo de forma independiente y recurre a un valor predeterminado (por ejemplo, inglés). - Para el método 3, incluye en una lista de permitidos los códigos de idioma admitidos antes de construir el nombre del catálogo; un catálogo faltante cancela el mensaje.
- Los objetos JSON en catálogos se pueden crear o actualizar a través de la API o la ingesta de datos en la nube (CDI) para catálogos, no mediante carga de archivos CSV.
- El método 2 admite mantenimiento por CSV, pero multiplica las columnas a medida que crecen los idiomas. Los archivos CSV admiten hasta 1000 columnas.
- El método 3 requiere un catálogo para cada código de idioma que llegue a la etiqueta
catalog_items. Si el catálogo no existe, Braze cancela el mensaje. Un ID de elemento faltante en un catálogo existente devuelve un arreglo de elementos vacío. - Las etiquetas de Liquid de catálogo no se pueden usar de forma recursiva.
- Las selecciones de catálogo admiten hasta 10 filtros y devuelven hasta 50 elementos; valida los filtros contra el esquema de tu catálogo.
- Revisa los niveles de almacenamiento de catálogos si mantienes fuentes de productos multilocales de gran tamaño.
Configuración
Paso 1: Elige una estructura de catálogo
Elige una estructura de catálogo usando la guía de esta tabla.
| Método | Mejor cuando | Compensación |
|---|---|---|
| Campos de objeto JSON | Tamaño de catálogo mediano; una fila por elemento; actualizaciones a través de API o CDI | Agregar un idioma actualiza cada elemento a través de API; no hay CSV para campos JSON |
| Campos planos por idioma | Pocos idiomas y campos; equipos no técnicos usan CSV | Cada nuevo idioma agrega columnas; la nomenclatura de campos debe mantenerse consistente |
| Catálogo por idioma | Fuentes grandes por localización o propietarios de localización separados; CSV por idioma | Cada código de idioma en la lista de permitidos necesita un catálogo; los catálogos faltantes abortan el envío |
Paso 2: Crea el catálogo y los elementos
- Ve a Configuración de datos > Catálogos y crea un catálogo (o múltiples catálogos para el Método 3).
- Agrega campos y elementos según la estructura que elegiste. Consulta Crear un catálogo.
- (Opcional) Crea una selección de catálogo para filtrar elementos; por ejemplo, por
categoryque coincida con un atributo personalizado del usuario.
Elemento de ejemplo en el catálogo PantsLabyrinth_Product_Copy:
| Elemento | Valor |
|---|---|
id |
trail-runner-001 |
name |
{"EN":"Trail Runner","FR":"Chaussure de trail","DE":"Trailrunner"} |
category |
footwear |
url |
https://pantslabyrinth.shop/products/trail-runner-001 |
price |
{"EN":"$120 USD","FR":"112 EUR","DE":"112 EUR"} |
Elemento de ejemplo en el catálogo PantsLabyrinth_Promo_Copy:
| Elemento | Valor |
|---|---|
id |
spring-sale |
header_en |
Spring trail sale |
header_fr |
Soldes de printemps |
body_en |
Save on trail runners this week. |
body_fr |
Économisez sur les chaussures de trail cette semaine. |
cta_text_en |
Shop now |
cta_text_fr |
Acheter |
img_src_en |
https://cdn.pantslabyrinth.shop/en/spring.jpg |
img_src_fr |
https://cdn.pantslabyrinth.shop/fr/spring.jpg |
Crea un catálogo por idioma con los mismos campos. Por ejemplo, repite el mismo id y campos en pantslabyrinth-promo-fr y pantslabyrinth-promo-de con valores localizados.
Elemento de ejemplo en pantslabyrinth-promo-en:
| Elemento | Valor |
|---|---|
id |
spring-sale |
header |
Spring trail sale |
body |
Save on trail runners this week. |
cta_text |
Shop now |
img_src |
https://cdn.pantslabyrinth.shop/en/spring.jpg |
Paso 3: Agrega Liquid a tu mensaje
Selecciona el patrón de Liquid que coincida con la estructura de catálogo que elegiste en el paso 1.
Almacena todas las localizaciones en campos de objeto JSON en una sola fila de catálogo, luego usa el filtro property_accessor para leer las claves name y price que coincidan con ${language} (normalizado a mayúsculas). Verifica cada campo de forma independiente y usa EN como alternativa cuando ese campo esté vacío, de modo que una localización con nombre pero sin precio aún obtenga un precio en inglés.
{% catalog_items PantsLabyrinth_Product_Copy trail-runner-001 %}
{% assign lang = ${language} | upcase %}
{% assign localized_name = items[0].name | property_accessor: lang %}
{% assign localized_price = items[0].price | property_accessor: lang %}
{% if localized_name == blank %}
{% assign localized_name = items[0].name | property_accessor: 'EN' %}
{% endif %}
{% if localized_price == blank %}
{% assign localized_price = items[0].price | property_accessor: 'EN' %}
{% endif %}
Product: {{ localized_name }}
Price: {{ localized_price }}
Consulta Filtro de acceso a propiedades.
Construye nombres de campo dinámicos a partir de ${language} (normalizado a minúsculas), luego lee esos campos del elemento con búsqueda por corchetes. Por ejemplo, items[0][header_field] lee el encabezado para el idioma resuelto. Verifica cada campo de forma independiente y usa la columna en inglés como alternativa cuando ese campo esté vacío, de modo que una localización con encabezado pero sin cuerpo aún obtenga el texto del cuerpo en inglés.
{% catalog_items PantsLabyrinth_Promo_Copy spring-sale %}
{% assign lang = ${language} | downcase %}
{% assign header_field = 'header_' | append: lang %}
{% assign body_field = 'body_' | append: lang %}
{% assign cta_field = 'cta_text_' | append: lang %}
{% assign img_field = 'img_src_' | append: lang %}
{% assign header_val = items[0][header_field] %}
{% assign body_val = items[0][body_field] %}
{% assign cta_val = items[0][cta_field] %}
{% assign img_val = items[0][img_field] %}
{% if header_val == blank %}
{% assign header_val = items[0].header_en %}
{% endif %}
{% if body_val == blank %}
{% assign body_val = items[0].body_en %}
{% endif %}
{% if cta_val == blank %}
{% assign cta_val = items[0].cta_text_en %}
{% endif %}
{% if img_val == blank %}
{% assign img_val = items[0].img_src_en %}
{% endif %}
<img src="{{ img_val }}" alt="" />
<h2>{{ header_val }}</h2>
<p>{{ body_val }}</p>
<a href="#">{{ cta_val }}</a>

Si el nombre de catálogo que pasas a catalog_items no existe, Braze aborta el mensaje. Agrega a la lista de permitidos los códigos de idioma compatibles antes de construir el nombre del catálogo. Un ID de elemento faltante en un catálogo existente devuelve un arreglo de elementos vacío; puedes usar el catálogo en inglés como alternativa solo en ese caso.
Agrega a la lista de permitidos los códigos de idioma que tengan catálogos correspondientes (aquí en, fr y de), asigna valores no compatibles o vacíos a en de forma predeterminada, y luego busca el elemento. Si el ID del elemento falta en ese catálogo, usa el catálogo en inglés como alternativa.
{% assign lang = ${language} | downcase %}
{% assign supported = 'en,fr,de' | split: ',' %}
{% if supported contains lang %}{% else %}{% assign lang = 'en' %}{% endif %}
{% assign theCatalog = 'pantslabyrinth-promo-' | append: lang %}
{% catalog_items {{ theCatalog }} spring-sale %}
{% if items[0] == blank %}
{% catalog_items pantslabyrinth-promo-en spring-sale %}
{% endif %}
<img src="{{ items[0].img_src }}" alt="" />
<h2>{{ items[0].header }}</h2>
<p>{{ items[0].body }}</p>
<a href="#">{{ items[0].cta_text }}</a>
Consulta Usar plantillas en nombres de catálogo y Abortar mensajes.
Selección de catálogo opcional por categoría
Filtra elementos antes de la personalización; por ejemplo, promociones de calzado para usuarios con preferred_category = footwear:
{% catalog_selection_items PantsLabyrinth_Product_Copy footwear_promos %}
{% for item in items %}
{{ item.name }}
{% endfor %}
Define la selección en el panel con filtros en tu columna category y atributos de usuario según sea necesario.
Paso 4: Vista previa y prueba
- Usa Vista previa como usuario con perfiles de usuario que tengan diferentes valores de
${language}. - Confirma que el texto alternativo aparezca cuando el idioma falte o no sea compatible, incluyendo localizaciones parciales (por ejemplo, un nombre sin precio).
- Para el Método 3, confirma que cada idioma en la lista de permitidos tenga un catálogo correspondiente, y que los códigos de idioma no compatibles se asignen a tu catálogo predeterminado sin abortar el envío.