Ir al contenido

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

  1. Ve a Configuración de datos > Catálogos y crea un catálogo (o múltiples catálogos para el Método 3).
  2. Agrega campos y elementos según la estructura que elegiste. Consulta Crear un catálogo.
  3. (Opcional) Crea una selección de catálogo para filtrar elementos; por ejemplo, por category que 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>

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

  1. Usa Vista previa como usuario con perfiles de usuario que tengan diferentes valores de ${language}.
  2. Confirma que el texto alternativo aparezca cuando el idioma falte o no sea compatible, incluyendo localizaciones parciales (por ejemplo, un nombre sin precio).
  3. 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.
New Stuff!