Esta guía está dirigida a desarrolladores que crean experiencias personalizadas para la tienda. Si solo quiere ajustar colores y textos, consulte la guía de la plantilla predeterminada.

Para los comercios que necesitan controlar por completo el diseño HTML o crear una página de fidelización totalmente personalizada, JeriCommerce ofrece plantillas de sección Liquid independientes que cargan el motor de la página directamente desde el CDN.

¿Quiere omitir la configuración manual? La skill de IA loyalty-template-creator puede generar una plantilla .liquid personalizada completa que coincida con el estilo visual de su tienda. Proporcione una URL de referencia y analizará los colores, las fuentes, el diseño y los recursos para crear una plantilla lista para usar basada en el mismo motor CDN que se describe a continuación.

Instálela con: npx skills add jericommerce/skills --skill loyalty-template-creator

Fuente: github.com/JeriCommerce/skills


Cuándo usar el modo CDN

Use el modo CDN cuando:

  • El comerciante necesita un diseño totalmente personalizado que supere las opciones del editor del tema.
  • El equipo de desarrollo prefiere gestionar el HTML directamente en el código del tema.
  • La página de fidelización debe integrarse en una plantilla existente junto con otras secciones.

Pasos de configuración

1

Obtener la plantilla

JeriCommerce ofrece dos plantillas CDN listas para usar. Copie la que mejor se adapte a sus necesidades:

  • Plantilla visual (templates/visual.liquid): completa, con sección principal y CTA, pasos que explican el funcionamiento, filas para obtener puntos con iconos SVG por red, tarjetas de nivel y una estructura de carga. Tiene el mismo aspecto que el bloque del tema.
  • Plantilla minimalista (templates/minimal.liquid): diseño compacto en forma de lista, con un título, las formas de obtener puntos en una lista sencilla y los niveles en filas. Usa CSS integrado y no requiere una hoja de estilos externa.

Puede obtenerlas desde el panel de administración de JeriCommerce, en Loyalty Page > Get template code, o copiarlas directamente de los archivos del repositorio.

2

Añadir al tema

  1. Vaya a Shopify Admin > Online Store > Themes > Edit code.
  2. En el directorio sections/, haga clic en Add a new section.
  3. Asígnele un nombre (por ejemplo, jeri-loyalty) y pegue el código de la plantilla.
3

Crear una plantilla de página

Cree una plantilla de página JSON que haga referencia a su sección:

{
  "sections": {
    "loyalty": {
      "type": "jeri-loyalty"
    }
  },
  "order": ["loyalty"]
}

Como alternativa, añada la sección a una plantilla de página existente desde el editor del tema: Customize > Add section.

4

Crear la página

Vaya a Shopify Admin > Pages > Add page y seleccione la plantilla "loyalty".


Cómo funciona el modo CDN

Las plantillas CDN cargan el mismo JavaScript que impulsa el bloque de la extensión de la aplicación del tema. Está empaquetado, minificado y siempre actualizado:

<!-- Always the latest version -->
<script src="https://cdn.jericommerce.com/shopify/loyalty-page.js" defer></script>
<link rel="stylesheet" href="https://cdn.jericommerce.com/shopify/loyalty-page.css" />

El motor detecta automáticamente el dominio de la tienda mediante el atributo data-shop del elemento raíz. Si no está disponible, usa window.Shopify.shop.


Sistema de plantillas: cómo funciona la vinculación de datos

El motor de plantillas ofrece dos métodos para vincular los datos de la API con el HTML.

1. Interpolación de variables: {varName}

Escriba marcadores {varName} en cualquier parte del texto HTML. El motor JS recorre todos los nodos de texto y los sustituye por datos de la API.

<h3>{tier.name}</h3>
<span>{tier.requiredPoints}</span>
<span>{earning.points}</span>

En las plantillas repetidas (niveles y formas de obtener puntos), las variables corresponden a los datos de cada elemento. La sintaxis con una sola llave a cada lado, {key}, no entra en conflicto con Liquid ({{ }}), los literales de plantilla JS (${ }) ni CSS.

También hay variables globales, como {programName} y {currencySymbol}, que funcionan en cualquier nodo de texto de la plantilla, no solo en las plantillas repetidas. Consulte la lista completa en la sección Variables globales de plantilla.

2. Atributos de datos: data-jeri

Se usan para operaciones que no son de texto y que no se pueden expresar mediante interpolación:

Atributo Propósito Ejemplo
data-jeri="name" en <template> Define una plantilla para filas repetidas <template data-jeri="tiers">
data-jeri="name" en el contenedor Recibe como elementos secundarios las filas clonadas de la plantilla <div data-jeri="tiers">
data-jeri="key" en <img> Establece el atributo src (se oculta si está vacío) <img data-jeri="earning.iconUrl">
data-jeri-hide-if="value" Oculta el elemento si el dato coincide con el valor indicado data-jeri-hide-if="1"
data-jeri-html="key" Inserta contenido HTML sin procesar <p data-jeri-html="tier.content">
data-jeri-group="name" Agrupa el contenedor y lo oculta cuando está vacío data-jeri-group="purchases"

Referencia rápida: cuándo usar cada método

Necesidad Uso
Mostrar texto o números {varName} en el contenido de texto
Combinar variables con texto personalizado Earn {earning.points} with {earning.title}
Establecer la fuente de imagen data-jeri="key" en <img>
Ocultar según el valor data-jeri-hide-if
Insertar contenido HTML enriquecido data-jeri-html="key"
Definir una fila repetida <template data-jeri="name"> + <div data-jeri="name">

Variables globales de plantilla

Estas siete variables globales se pueden usar en cualquier nodo de texto dentro de #jeri-loyalty-page-root. Escríbalas con la sintaxis {variableName} y el motor las sustituirá automáticamente por los datos de configuración del programa.

Variable Tipo Descripción Ejemplo
{programName} cadena Nombre del programa de fidelización "My Rewards"
{currencySymbol} cadena Símbolo de moneda, determinado mediante Intl.NumberFormat "$", "€", "£"
{currencyCode} cadena Código de moneda ISO "USD", "EUR", "GBP"
{balanceName} cadena Nombre plural de los puntos "Points", "Stars"
{singularBalanceName} cadena Nombre singular de los puntos "Point", "Star"
{tierBalanceName} cadena Nombre plural de los puntos de nivel "Points"
{singularTierBalanceName} cadena Nombre singular de los puntos de nivel "Point"

Ejemplo de uso

<h1>Welcome to {programName}!</h1>
<p>Earn {balanceName} with every {currencySymbol} you spend</p>
<p>Prices are in {currencyCode}</p>

Las variables globales funcionan junto con las variables de ámbito ({earning.*}, {tier.*}). En las plantillas repetidas se resuelven ambos tipos.

La variable {currencySymbol} usa el Intl.NumberFormat nativo del navegador para determinar el símbolo adecuado según el código de moneda del programa. Así, el símbolo se adapta a la moneda real del programa: $ para USD, € para EUR, £ para GBP, etc.

Nota de migración: Se ha eliminado la variable {hero.programName}. Use {programName} en su lugar. Esta variable funciona en toda la plantilla, no solo en la sección principal.


Campos de datos disponibles

Campos de formas de ganar (earning.*)

Se usa dentro de la plantilla <template data-jeri="earning-row">.

Campo Tipo Descripción
earning.type cadena Tipo de flujo: purchase, social, referral, profile, verify, wallet, scan, link
earning.title cadena Título legible de la regla para ganar puntos
earning.description cadena Descripción detallada de cómo ganar puntos
earning.points cadena Visualización compacta de puntos: +100 para un valor fijo, 10% para una tasa < 1, x2 para un factor >= 1
earning.iconUrl cadena URL del icono (se establece mediante data-jeri en <img>; queda vacía si no hay icono)

Campos de nivel (tier.*)

Se usa dentro de la plantilla <template data-jeri="tiers">.

Campo Tipo Descripción
tier.name cadena Nombre del nivel (por ejemplo, «Gold» o «VIP»)
tier.content cadena Descripción o beneficios del nivel. Puede incluir HTML; use data-jeri-html="tier.content"
tier.image cadena URL de la imagen del nivel (se establece mediante data-jeri en <img>)
tier.requiredPoints cadena Puntos necesarios (por ejemplo, "1,000 tier points"). Usa tierBalanceName en singular o plural
tier.factor cadena Factor de puntos (por ejemplo, "2"). Se oculta automáticamente cuando es "1" mediante data-jeri-hide-if
tier.id cadena ID interno del nivel

Elemento raíz obligatorio

Todas las plantillas personalizadas deben incluir este elemento raíz con los atributos obligatorios:

<div
  id="jeri-loyalty-page-root"
  class="jeri-loyalty-page jeri-loyalty-page--loading"
  data-shop="{{ shop.permanent_domain }}"
  data-icon-base="https://cdn.jericommerce.com/shopify/"
  data-locale="{{ request.locale.iso_code }}"
>
  <!-- Your custom HTML here -->
</div>
Atributo Obligatorio Propósito
id="jeri-loyalty-page-root" Sí Punto de entrada para JavaScript; el motor busca este ID
class="jeri-loyalty-page" Sí Ámbito CSS y variables CSS
data-shop Sí Dominio de la tienda para las llamadas a la API
data-icon-base Recomendado Prefijo URL de los iconos para ganar puntos
data-locale Recomendado Idioma de la tienda para i18n (usa "en" como alternativa)

La clase jeri-loyalty-page--loading muestra una estructura de carga y oculta el contenido hasta que se cargan los datos. JavaScript la elimina después de obtenerlos.

La hoja de estilos CSS debe cargarse antes del contenido HTML (dentro del elemento raíz) para evitar que aparezca contenido sin estilos durante la primera carga.


Reglas de las plantillas

Siga estas seis reglas para crear plantillas personalizadas:

  1. Mantenga id="jeri-loyalty-page-root" en el elemento raíz. JavaScript lo necesita para inicializarse.
  2. Mantenga class="jeri-loyalty-page" en el elemento raíz. Aquí se definen las variables CSS.
  3. Mantenga el atributo data-shop. Es obligatorio para las llamadas a la API.
  4. Mantenga los pares de plantilla y contenedor. Cada <template data-jeri="X"> necesita un <div data-jeri="X"> correspondiente como elemento hermano.
  5. Use {varName} en cualquier nodo de texto. El motor sustituye todos los marcadores que reconoce.
  6. Use data-jeri-html="key" para insertar contenido HTML. Con {var}, el contenido se escaparía como texto.

Estructura de la plantilla predeterminada

Sección principal

<section class="jeri-loyalty-page__hero">
  <h1 class="jeri-loyalty-page__hero-title">Our Loyalty Program</h1>
  <p class="jeri-loyalty-page__hero-subtitle">Join our loyalty program...</p>

  <!-- CTA adapts to login state via Liquid -->
  <div class="jeri-loyalty-page__hero-cta">
    {% if customer %}
      {% if block.settings.cta_action == 'widget_rewards' %}
        <a href="#jeri=loyalty/rewards" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
          {{ block.settings.logged_in_cta_label | default: 'See rewards' }}
        </a>
      {% else %}
        <a href="{{ block.settings.logged_in_cta_url | default: '/account' }}" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
          {{ block.settings.logged_in_cta_label | default: 'See rewards' }}
        </a>
      {% endif %}
    {% else %}
      <a href="{{ block.settings.guest_cta_url | default: '/account/login' }}" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
        {{ 'loyalty_page.hero_cta' | t }}
      </a>
    {% endif %}
  </div>
</section>

Sección de niveles

<template data-jeri="tiers">
  <div class="jeri-tier-card">
    <div class="jeri-tier-card__body">
      <div class="jeri-tier-card__top">
        <h3 class="jeri-tier-card__name">{tier.name}</h3>
        <span class="jeri-tier-card__factor" data-jeri="tier.factor" data-jeri-hide-if="1">
          {tier.factor}x
        </span>
      </div>
      <div class="jeri-tier-card__meta">
        <span class="jeri-tier-card__points">{tier.requiredPoints}</span>
      </div>
      <p class="jeri-tier-card__content" data-jeri-html="tier.content"></p>
    </div>
  </div>
</template>

<!-- Container: cloned cards are appended here -->
<div data-jeri="tiers" class="jeri-tier-grid"></div>

Sección de formas de ganar

<!-- Purchase earnings group -->
<div class="jeri-earning-group" data-jeri-group="purchases">
  <h3 class="jeri-earning-group__title">Purchases</h3>
  <div class="jeri-earning-list" data-jeri="earnings-purchases"></div>
</div>

<!-- Action earnings group -->
<div class="jeri-earning-group" data-jeri-group="actions">
  <h3 class="jeri-earning-group__title">Actions</h3>
  <div class="jeri-earning-list" data-jeri="earnings-actions"></div>
</div>

<!-- Shared template for both groups -->
<template data-jeri="earning-row">
  <div class="jeri-earning-row">
    <img class="jeri-earning-row__icon" data-jeri="earning.iconUrl" alt="" width="48" height="48" loading="lazy" />
    <div class="jeri-earning-row__content">
      <h3 class="jeri-earning-row__title">{earning.title}</h3>
      <p class="jeri-earning-row__description">{earning.description}</p>
    </div>
    <span class="jeri-earning-row__points">{earning.points}</span>
  </div>
</template>

Ejemplo completo de plantilla personalizada

Aquí tiene una plantilla personalizada mínima y completa que puede usar como punto de partida:

<!-- CDN Scripts -->
<script src="https://cdn.jericommerce.com/shopify/loyalty-page.js" defer></script>
<link rel="stylesheet" href="https://cdn.jericommerce.com/shopify/loyalty-page.css" />

<div
  id="jeri-loyalty-page-root"
  class="jeri-loyalty-page jeri-loyalty-page--loading"
  data-shop="{{ shop.permanent_domain }}"
  data-icon-base="https://cdn.jericommerce.com/shopify/"
  data-locale="{{ request.locale.iso_code }}"
>

  <!-- Hero -->
  <section class="jeri-loyalty-page__hero">
    <h1 class="jeri-loyalty-page__hero-title">Our Loyalty Program</h1>
    <p class="jeri-loyalty-page__hero-subtitle">Join and start earning rewards today.</p>
    <div class="jeri-loyalty-page__hero-cta">
      {% if customer %}
        <a href="/account" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
          See rewards
        </a>
      {% else %}
        <a href="/account/login" class="jeri-loyalty-page__cta-button jeri-loyalty-page__cta-button--primary">
          Join now
        </a>
      {% endif %}
    </div>
  </section>

  <!-- Tiers -->
  <template data-jeri="tiers">
    <div>
      <h3>{tier.name}</h3>
      <p>{tier.requiredPoints}</p>
      <span data-jeri="tier.factor" data-jeri-hide-if="1">
        Factor: {tier.factor}x
      </span>
      <div data-jeri-html="tier.content"></div>
    </div>
  </template>
  <div data-jeri="tiers"></div>

  <!-- Earnings -->
  <template data-jeri="earning-row">
    <div>
      <img data-jeri="earning.iconUrl" alt="" width="32" height="32" />
      <strong>{earning.title}</strong>
      <span>{earning.points}</span>
      <p>{earning.description}</p>
    </div>
  </template>
  <div data-jeri-group="purchases">
    <h3>Purchases</h3>
    <div data-jeri="earnings-purchases"></div>
  </div>
  <div data-jeri-group="actions">
    <h3>Actions</h3>
    <div data-jeri="earnings-actions"></div>
  </div>

  <!-- Loading skeleton -->
  <div class="jeri-loyalty-page__skeleton">
    <div class="jeri-loyalty-page__skeleton-hero"></div>
  </div>

</div>

Plantilla visual y minimalista

Plantilla visual: ideal para marcas que buscan una página de fidelización cuidada y orientada al marketing, con una sección principal, pasos explicativos, filas para obtener puntos con iconos SVG, tarjetas de nivel y una estructura de carga completa.

Plantilla minimalista: ideal para tiendas que prefieren un enfoque claro y basado en datos, con una lista compacta y CSS integrado. No depende de hojas de estilos externas, aparte de la del motor JS.

Ambas plantillas usan el mismo motor JS y el mismo sistema de vinculación de datos. Solo cambia la estructura HTML y el diseño visual. Puede empezar con cualquiera y personalizarla libremente.


Sistema de iconos

Los iconos de las filas para ganar puntos son archivos SVG cuyo nombre corresponde al tipo. La URL del icono se forma concatenando data-icon-base + nombre + .svg.

Archivo de icono Se usa para
purchase.svg Flujos para obtener puntos por compras
facebook.svg Seguir en Facebook
instagram.svg Seguir en Instagram
tiktok.svg Seguir en TikTok
x.svg Seguir en X
youtube.svg Seguir en YouTube
referral.svg Recomendar a un amigo
profile.svg Completar el perfil
wallet.svg Instalar el pase en Wallet
scan.svg Escanear en la tienda
verify.svg Verificar la cuenta
link.svg Visitar el enlace

En el modo CDN, la URL base de los iconos está fijada en https://cdn.jericommerce.com/shopify/. Si falta data-icon-base o el icono no existe, el elemento <img> se oculta automáticamente.


Formato de visualización de puntos

El campo earning.points usa un formato compacto según la forma de ganar puntos:

Tipo de forma de ganar Formato Ejemplo
Compra (tasa < 1) Porcentaje de devolución 10%
Compra (tasa >= 1) Factor x2
Todos los demás (social, recomendación, perfil, etc.) Puntos fijos +100

En las recomendaciones, la insignia solo muestra los puntos de quien recomienda. La recompensa de la persona invitada se indica en la descripción.

La descripción de los puntos por compra inserta dinámicamente el símbolo de moneda del programa. Por ejemplo, para USD puede mostrar «Gana x3 puntos por cada $ gastado» y para EUR, «Gana x3 puntos por cada € gastado». El navegador determina la moneda a partir de la configuración del programa mediante Intl.NumberFormat.


Resolución de los nombres de Wallet

La configuración del programa proporciona cuatro propiedades de nombre:

Nombre Uso Ejemplo
balanceName / singularBalanceName Descripciones y títulos de formas de ganar "points" / "point"
tierBalanceName / singularTierBalanceName Puntos de nivel necesarios "tier points" / "tier point"

Se obtienen de program.configurations.wallet (configuración base). La forma singular o plural se aplica automáticamente según la cantidad: 1 usa el singular y cualquier otro valor usa el plural.

Estos cuatro nombres también están disponibles como variables globales de plantilla: {balanceName}, {singularBalanceName}, {tierBalanceName} y {singularTierBalanceName}. Puede usarlas directamente en cualquier nodo de texto.


Ajustes del editor del tema

Ajuste Tipo Valor predeterminado Descripción
Enable Loyalty Page Casilla true Mostrar u ocultar todo el bloque
Hero Title Texto "Our Loyalty Program" Encabezado principal
Hero Subtitle Área de texto "Join our loyalty..." Descripción debajo del encabezado
Guest CTA URL URL /account/login Destino para visitantes
Logged-in CTA Action Selección account account = ir a la página de cuenta, widget_rewards = abrir el widget de recompensas
Logged-in CTA Label Texto "See rewards" Texto del botón para clientes con sesión iniciada
Logged-in CTA URL URL /account URL cuando la acción es "Go to account page"
Show How It Works Casilla true Mostrar u ocultar la sección de tres pasos
Show Earning Rules Casilla true Mostrar u ocultar la sección de formas de ganar
Show VIP Tiers Casilla true Mostrar u ocultar la sección de niveles
Primary Color Color #0f0f0f Botones, acentos e insignias
Primary Contrast Color #fcfcfc Texto sobre fondos principales
Secondary Color Color #f5f5f5 Fondos de tarjetas
Text Color Color #0f0f0f Encabezados y texto principal
Muted Color Color #888888 Subtítulos y descripciones
Custom CSS Área de texto Sin valor Reglas CSS adicionales

Integración con el widget

El CTA "See rewards", cuando cta_action tiene el valor widget_rewards, usa #jeri=loyalty/rewards como destino. Si el widget de JeriCommerce está activo en la página, al hacer clic en el enlace se abre su panel de recompensas. Esto significa que:

  • La página de fidelización explica el programa y muestra información pública.
  • El widget gestiona las recompensas, las transacciones y la cuenta de cada cliente con sesión iniciada.
  • Ambos funcionan de forma independiente y se complementan mediante el patrón de URL #jeri=.

Visibilidad condicional

La página oculta elementos automáticamente según la configuración del programa:

Elemento Condición
Sección VIP Tiers Se oculta si el programa no tiene niveles.
Sección Ways to Earn Se oculta si el programa no tiene flujos de participación activos.
Grupo Purchases Se oculta si no hay flujos de compra.
Grupo Actions Se oculta si no hay flujos de acciones.

Variables CSS

Variables para comerciantes

La plantilla Liquid establece estos valores en :root según los ajustes de color del editor del tema:

Variable Valor predeterminado Definido por
--jeri-loyalty-primary #0f0f0f Ajuste Primary Color
--jeri-loyalty-primary-contrast #fcfcfc Ajuste Primary Contrast
--jeri-loyalty-secondary #f5f5f5 Ajuste Secondary Color
--jeri-loyalty-text #0f0f0f Ajuste Text Color
--jeri-loyalty-muted #888888 Ajuste Muted Color

Variables internas

Estas resuelven las variables del comercio y añaden tokens estructurales y de diseño. Puede sobrescribirlas en Custom CSS para ajustar detalles específicos:

Variable Valor predeterminado Propósito
--jlp-primary var(--jeri-loyalty-primary, #0f0f0f) Color principal
--jlp-primary-contrast var(--jeri-loyalty-primary-contrast, #fcfcfc) Texto sobre el color principal
--jlp-text var(--jeri-loyalty-text, #0f0f0f) Color del texto principal
--jlp-muted var(--jeri-loyalty-muted, #888888) Color del texto secundario
--jlp-font var(--font-body-family, system stack) Familia tipográfica
--jlp-border-radius 16px Radio de las esquinas de las tarjetas
--jlp-space 16px Unidad de espaciado
--jlp-border-color #e8e8e8 Color del borde de tarjetas y listas
--jlp-card-bg #fcfcfc Color de fondo de las tarjetas
--jlp-divider #f0f0f0 Color del separador entre filas
--jlp-skeleton-bg #f5f5f5 Color de la estructura de carga
--jlp-icon-size 48px Tamaño del icono de la fila de puntos
--jlp-max-width 1200px Anchura máxima del contenido

Ejemplo: cambiar el espaciado

.jeri-loyalty-page {
  --jlp-space: 12px;
  --jlp-border-radius: 8px;
}

Ejemplo: tema oscuro

.jeri-loyalty-page {
  --jlp-card-bg: #1a1a1a;
  --jlp-border-color: #333;
  --jlp-divider: #2a2a2a;
  --jlp-skeleton-bg: #222;
}

Referencia de clases CSS

Diseño

Clase Elemento
.jeri-loyalty-page Contenedor raíz
.jeri-loyalty-page--loading Estado de carga (muestra la estructura de carga y oculta el contenido)
.jeri-loyalty-page__hero Sección principal
.jeri-loyalty-page__section Sección de contenido
.jeri-loyalty-page__section-title Encabezado de sección
.jeri-loyalty-page__skeleton Contenedor de la estructura de carga

Sección principal

Clase Elemento
.jeri-loyalty-page__hero-title Encabezado principal
.jeri-loyalty-page__hero-subtitle Descripción principal
.jeri-loyalty-page__hero-cta Contenedor del botón CTA
.jeri-loyalty-page__cta-button Estilo base del botón CTA
.jeri-loyalty-page__cta-button--primary Variante CTA principal

Cómo funciona

Clase Elemento
.jeri-loyalty-page__steps Cuadrícula de pasos (3 columnas)
.jeri-loyalty-page__step Paso individual
.jeri-loyalty-page__step-number Círculo con número
.jeri-loyalty-page__step-title Encabezado del paso
.jeri-loyalty-page__step-text Descripción del paso

Formas de ganar

Clase Elemento
.jeri-earning-group Contenedor de grupo (Purchases/Actions)
.jeri-earning-group__title Encabezado del grupo
.jeri-earning-list Contenedor de lista con borde
.jeri-earning-row Fila individual para ganar puntos
.jeri-earning-row__icon Icono de la fila (<img>)
.jeri-earning-row__content Contenedor de texto de la fila
.jeri-earning-row__title Título de la fila
.jeri-earning-row__description Descripción de la fila
.jeri-earning-row__points Visualización de puntos

Niveles

Clase Elemento
.jeri-tier-grid Contenedor flexible de tarjetas de nivel
.jeri-tier-card Tarjeta individual de nivel
.jeri-tier-card__body Contenido de la tarjeta
.jeri-tier-card__top Fila con nombre y factor
.jeri-tier-card__name Nombre del nivel
.jeri-tier-card__factor Insignia del factor (se oculta si es 1x)
.jeri-tier-card__content Descripción (se representa como HTML)
.jeri-tier-card__points Puntos necesarios

Internacionalización (i18n)

La página de fidelización admite varios idiomas según el idioma actual de la tienda:

  • Inglés (en), predeterminado
  • Español (es)
  • Francés (fr)
  • Alemán (de)
  • Italiano (it)

Los idiomas no compatibles usan inglés automáticamente.

Cómo funciona

La internacionalización tiene dos capas:

  • Textos de Liquid (renderizados en el servidor): usan el filtro de Shopify {{ 'key' | t }} con archivos JSON de idioma en locales/. Traducen texto estático como "Purchases", "Actions", los pasos de "How It Works" y el botón CTA para visitantes.
  • Textos de TypeScript (renderizados en el cliente): usan la utilidad compartida i18n.ts y archivos de idioma .ts incluidos en el código JS. Traducen los títulos y las descripciones dinámicos de las formas de obtener puntos.

Detección del idioma

El idioma de la tienda se pasa a JavaScript mediante el atributo data-locale del elemento raíz:

<div id="jeri-loyalty-page-root" data-locale="{{ request.locale.iso_code }}" ...>
</div>

Añadir un idioma

  1. Cree theme-extensions/loyalty-page/locales/{lang}.ts (copie en.ts y traduzca su contenido)
  2. Cree theme-extensions/loyalty-page/locales/{lang}.json (copie en.default.json y traduzca su contenido)
  3. Importe el nuevo idioma en loyalty-page.ts y añádalo a initFromSession(locale, { en, es, fr, de, it, {lang} })
  4. Ejecute npm run build:theme-extensions para volver a compilar

Archivos de traducción

Archivo Propósito
locales/en.ts Traducciones al inglés de textos JS (incluidas en JS)
locales/es.ts Traducciones al español de textos JS (incluidas en JS)
locales/fr.ts Traducciones al francés de textos JS (incluidas en JS)
locales/de.ts Traducciones al alemán de textos JS (incluidas en JS)
locales/it.ts Traducciones al italiano de textos JS (incluidas en JS)
locales/en.default.json Traducciones al inglés de textos Liquid (se copian a locales/)
locales/es.json Traducciones al español de textos Liquid (se copian a locales/)
locales/fr.json Traducciones al francés de textos Liquid (se copian a locales/)
locales/de.json Traducciones al alemán de textos Liquid (se copian a locales/)
locales/it.json Traducciones al italiano de textos Liquid (se copian a locales/)