Ce guide s’adresse aux développeurs qui créent des expériences personnalisées pour la boutique en ligne. Pour modifier simplement les couleurs et les textes, consultez le guide du modèle par défaut.

Pour les marchands qui souhaitent maîtriser toute la structure HTML ou créer une page de fidélité entièrement personnalisée, JeriCommerce propose des modèles de section Liquid autonomes qui chargent le moteur de la page de fidélité directement depuis le CDN.

Vous souhaitez éviter la configuration manuelle ? La skill IA loyalty-template-creator peut générer un modèle .liquid complet et personnalisé qui reprend le style visuel de votre boutique. Fournissez-lui une URL de référence : elle analyse les couleurs, les polices, la mise en page et les ressources pour produire un modèle prêt à l’emploi, basé sur le même moteur CDN que celui décrit ci-dessous.

Installez-la avec : npx skills add jericommerce/skills --skill loyalty-template-creator

Source : github.com/JeriCommerce/skills


Quand utiliser le mode CDN

  • Le marchand souhaite une mise en page entièrement personnalisée, au-delà des possibilités offertes par les paramètres de l’éditeur de thème.
  • L’équipe de développement préfère gérer directement le HTML dans le code du thème.
  • Vous devez intégrer la page de fidélité à un modèle de page existant, aux côtés d’autres sections.

Étapes de configuration

1

Obtenir le modèle

JeriCommerce fournit deux modèles CDN prêts à l’emploi. Copiez celui qui répond le mieux à vos besoins :

  • Modèle visuel (templates/visual.liquid) : version complète avec une section d’accueil et un bouton d’action, des étapes expliquant le fonctionnement, des lignes de gains avec des icônes SVG propres à chaque réseau, des cartes de niveaux et un squelette de chargement. Son apparence est identique à celle du bloc de thème.
  • Modèle minimal (templates/minimal.liquid) : présentation compacte en liste, avec un titre, les gains sous forme de liste simple et les niveaux présentés en lignes. Le CSS est intégré, sans feuille de style externe nécessaire.

Vous pouvez les obtenir dans l’administration JeriCommerce sous Loyalty Page > Get template code, ou les copier directement depuis les fichiers du dépôt.

2

Ajouter le modèle à votre thème

  1. Accédez à Shopify Admin > Online Store > Themes > Edit code.
  2. Dans le répertoire sections/, cliquez sur Add a new section.
  3. Donnez-lui un nom (par exemple, jeri-loyalty) et collez le code du modèle.
3

Créer un modèle de page

Créez un modèle de page JSON qui fait référence à votre section :

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

Vous pouvez aussi ajouter la section à un modèle de page existant depuis l’éditeur de thème : Customize > Add section.

4

Créer la page

Accédez à Shopify Admin > Pages > Add page et sélectionnez le modèle « loyalty ».


Fonctionnement du mode CDN

Les modèles CDN chargent le même JavaScript que le bloc d’extension d’application de thème, regroupé, minifié et toujours à jour :

<!-- 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" />

Le moteur détecte automatiquement le domaine de la boutique depuis l’attribut data-shop de l’élément racine, ou utilise window.Shopify.shop en dernier recours.


Système de modèles : liaison des données

Le moteur de modèles utilise deux systèmes pour relier les données de l’API à votre HTML.

1. Interpolation de variables : {varName}

Insérez des expressions {varName} n’importe où dans le contenu textuel de votre HTML. Le moteur JS parcourt tous les nœuds textuels et les remplace par les données de l’API.

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

Dans les modèles répétitifs (niveaux, gains), les variables sont limitées aux données du modèle. La syntaxe utilise des accolades simples {key}, sans conflit avec Liquid ({{ }}), les littéraux de gabarit JS (${ }) ou le CSS.

Des variables globales (comme {programName} et {currencySymbol}) fonctionnent aussi dans tous les nœuds textuels du modèle, y compris en dehors des modèles répétitifs. Consultez la section Variables globales du modèle ci-dessous pour obtenir la liste complète.

2. Attributs de données : data-jeri

Ils servent aux opérations non textuelles qui ne peuvent pas être exprimées par interpolation :

Attribut Rôle Exemple
data-jeri="name" sur <template> Définit un modèle de ligne répétitive <template data-jeri="tiers">
data-jeri="name" sur un conteneur Reçoit les lignes clonées du modèle <div data-jeri="tiers">
data-jeri="key" sur <img> Définit l’attribut src (masque l’image si la valeur est vide) <img data-jeri="earning.iconUrl">
data-jeri-hide-if="value" Masque l’élément lorsque la donnée correspond à la valeur data-jeri-hide-if="1"
data-jeri-html="key" Insère du contenu HTML brut <p data-jeri-html="tier.content">
data-jeri-group="name" Conteneur de groupe (masqué lorsqu’il est vide) data-jeri-group="purchases"

Référence rapide : quelle syntaxe utiliser

Besoin Syntaxe
Afficher du texte ou des nombres {varName} dans le contenu textuel
Combiner des variables avec du texte personnalisé Earn {earning.points} with {earning.title}
Définir la source d’une image data-jeri="key" sur <img>
Masquer selon une valeur data-jeri-hide-if
Insérer du contenu HTML enrichi data-jeri-html="key"
Définir une ligne répétitive <template data-jeri="name"> + <div data-jeri="name">

Variables globales du modèle

Ces 7 variables globales peuvent être utilisées dans n’importe quel nœud textuel à l’intérieur de #jeri-loyalty-page-root. Écrivez-les avec la syntaxe {variableName} : le moteur les remplace automatiquement par les données de configuration du programme.

Variable Type Description Exemple
{programName} string Nom du programme de fidélité « Mes récompenses »
{currencySymbol} string Symbole monétaire, déterminé via Intl.NumberFormat "$", "€", "£"
{currencyCode} string Code ISO de la devise "USD", "EUR", "GBP"
{balanceName} string Nom des points au pluriel « Points », « Étoiles »
{singularBalanceName} string Nom des points au singulier « Point », « Étoile »
{tierBalanceName} string Nom des points de niveau au pluriel « Points »
{singularTierBalanceName} string Nom des points de niveau au singulier « Point »

Exemple d’utilisation

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

Les variables globales fonctionnent avec les variables limitées au modèle ({earning.*}, {tier.*}). Dans les modèles répétitifs, les deux types de variables sont résolus.

La variable {currencySymbol} utilise la fonction native Intl.NumberFormat du navigateur pour déterminer le symbole correspondant au code de devise du programme. Le symbole s’adapte donc à la devise réelle du programme : $ pour USD, € pour EUR, £ pour GBP, etc.

Note de migration : la variable {hero.programName} a été supprimée. Utilisez {programName} à la place : elle fonctionne partout dans le modèle, pas uniquement dans la section d’accueil.


Champs de données disponibles

Champs des gains (earning.*)

À utiliser dans le modèle <template data-jeri="earning-row">.

Champ Type Description
earning.type string Type de flux : purchase, social, referral, profile, verify, wallet, scan, link
earning.title string Titre lisible de la règle de gain
earning.description string Description détaillée de la façon de gagner des points
earning.points string Affichage compact des points : +100 pour un montant fixe, 10% pour un taux < 1, x2 pour un facteur >= 1
earning.iconUrl string URL de l’icône (définie via data-jeri sur <img>, vide en l’absence d’icône)

Champs des niveaux (tier.*)

À utiliser dans le modèle <template data-jeri="tiers">.

Champ Type Description
tier.name string Nom du niveau (par exemple, « Or », « VIP »)
tier.content string Description et avantages du niveau ; peut contenir du HTML, utilisez data-jeri-html="tier.content"
tier.image string URL de l’image du niveau (définie via data-jeri sur <img>)
tier.requiredPoints string Points nécessaires (par exemple, « 1 000 points de niveau »). Utilise tierBalanceName au singulier ou au pluriel
tier.factor string Facteur de points (par exemple, « 2 »). Masqué automatiquement lorsque sa valeur est « 1 », via data-jeri-hide-if
tier.id string Identifiant interne du niveau

Élément racine obligatoire

Chaque modèle personnalisé doit inclure cet élément racine avec les attributs requis :

<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>
Attribut Obligatoire Rôle
id="jeri-loyalty-page-root" Oui Point d’entrée JS : le moteur recherche cet identifiant
class="jeri-loyalty-page" Oui Limitation de la portée CSS et variables CSS
data-shop Oui Domaine de la boutique pour les appels API
data-icon-base Recommandé Préfixe d’URL des icônes de gains
data-locale Recommandé Langue de la boutique pour l’internationalisation (utilise « en » par défaut)

La classe jeri-loyalty-page--loading affiche un squelette de chargement et masque le contenu jusqu’au chargement des données. Le JS la supprime une fois les données récupérées.

La feuille de style CSS doit être chargée avant le contenu HTML (à l’intérieur de l’élément racine) pour éviter l’apparition temporaire de contenu sans mise en forme au premier chargement.


Règles des modèles

Les 6 règles à respecter pour les modèles personnalisés :

  1. Conservez id="jeri-loyalty-page-root" sur l’élément racine : le JS en a besoin pour s’initialiser.
  2. Conservez class="jeri-loyalty-page" sur la racine : les variables CSS y sont définies.
  3. Conservez data-shop, indispensable aux appels API.
  4. Conservez les paires modèle/conteneur : un <template data-jeri="X"> doit avoir un <div data-jeri="X"> correspondant au même niveau.
  5. Utilisez librement {varName} dans les nœuds textuels : le moteur remplace toutes les expressions qu’il reconnaît.
  6. Utilisez data-jeri-html="key" pour le contenu HTML (et non {var}, dont les caractères seraient échappés).

Structure du modèle par défaut

Section d’accueil

<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>

Section des niveaux

<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>

Section des gains

<!-- 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>

Exemple complet de modèle personnalisé

Voici un modèle personnalisé minimal complet à utiliser comme point de départ :

<!-- 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>

Modèle visuel ou minimal

Modèle visuel : adapté aux marques qui souhaitent une page de fidélité soignée, orientée marketing, avec une section d’accueil, des étapes expliquant le fonctionnement, des lignes de gains avec icônes SVG, des cartes de niveaux et un squelette de chargement complet.

Modèle minimal : adapté aux boutiques qui préfèrent une présentation épurée centrée sur les données, avec une liste compacte, du CSS intégré et aucune dépendance à une feuille de style externe, en complément du moteur JS.

Les deux modèles utilisent le même moteur JS et le même système de liaison des données. Seules la structure HTML et la présentation visuelle diffèrent. Vous pouvez partir de l’un ou de l’autre et le personnaliser librement.


Système d’icônes

Les icônes des lignes de gains sont des fichiers SVG nommés selon leur type. L’URL d’une icône est calculée ainsi : data-icon-base + nom + .svg.

Fichier d’icône Utilisation
purchase.svg Flux de gains liés aux achats
facebook.svg S’abonner sur Facebook
instagram.svg S’abonner sur Instagram
tiktok.svg S’abonner sur TikTok
x.svg S’abonner sur X
youtube.svg S’abonner sur YouTube
referral.svg Parrainer un ami
profile.svg Compléter son profil
wallet.svg Installer la carte Wallet
scan.svg Effectuer un scan en magasin
verify.svg Vérifier son compte
link.svg Consulter un lien

En mode CDN, l’URL de base des icônes est définie dans le code sur https://cdn.jericommerce.com/shopify/. Si data-icon-base est absent ou si une icône n’existe pas, l’élément <img> est automatiquement masqué.


Format d’affichage des points

Le champ earning.points utilise un format compact selon le type de gain :

Type de gain Format Exemple
Achat (taux < 1) Pourcentage reversé 10%
Achat (taux >= 1) Facteur x2
Tous les autres (réseaux sociaux, parrainage, profil, etc.) Points fixes +100

Pour le parrainage, seuls les points du parrain figurent dans le badge. La récompense de l’ami est mentionnée dans la description.

La description des gains liés aux achats utilise dynamiquement le symbole de la devise réelle du programme (par exemple, « Gagnez x3 points par $ dépensé » pour USD, ou « Gagnez x3 points par € dépensé » pour EUR). La devise est déterminée à partir de la configuration du programme avec Intl.NumberFormat du navigateur.


Résolution des noms du Wallet

Quatre propriétés de nommage sont récupérées dans la configuration du programme :

Nom Utilisation Exemple
balanceName / singularBalanceName Descriptions et titres des gains « points » / « point »
tierBalanceName / singularTierBalanceName Points requis pour les niveaux « points de niveau » / « point de niveau »

Ces propriétés sont lues depuis program.configurations.wallet (configuration de base). Le singulier ou le pluriel est appliqué automatiquement selon le montant (1 = singulier, sinon pluriel).

Ces quatre noms sont également disponibles comme variables globales du modèle : {balanceName}, {singularBalanceName}, {tierBalanceName} et {singularTierBalanceName}. Vous pouvez donc les utiliser directement dans n’importe quel nœud textuel.


Paramètres de l’éditeur de thème

Paramètre Type Valeur par défaut Description
Enable Loyalty Page Case à cocher true Afficher ou masquer le bloc entier
Hero Title Texte "Our Loyalty Program" Titre principal
Hero Subtitle Zone de texte "Join our loyalty..." Description sous le titre
Guest CTA URL URL /account/login Destination des visiteurs non connectés
Logged-in CTA Action Liste de sélection account account = accéder à la page du compte, widget_rewards = ouvrir le widget des récompenses
Logged-in CTA Label Texte "See rewards" Texte du bouton affiché aux clients connectés
Logged-in CTA URL URL /account URL lorsque l’action choisie est "Go to account page"
Show How It Works Case à cocher true Afficher ou masquer la section en 3 étapes
Show Earning Rules Case à cocher true Afficher ou masquer la section des gains
Show VIP Tiers Case à cocher true Afficher ou masquer la section des niveaux
Primary Color Couleur #0f0f0f Boutons, accents et badges
Primary Contrast Couleur #fcfcfc Texte sur les arrière-plans de couleur principale
Secondary Color Couleur #f5f5f5 Arrière-plan des cartes
Text Color Couleur #0f0f0f Titres et corps du texte
Muted Color Couleur #888888 Sous-titres et descriptions
Custom CSS Zone de texte Aucune Règles CSS supplémentaires à appliquer

Intégration du widget

Le bouton d’action "See rewards" (lorsque cta_action vaut widget_rewards) utilise #jeri=loyalty/rewards comme cible de lien. Si le widget JeriCommerce est actif sur la page, un clic sur ce lien ouvre son panneau de récompenses. Ainsi :

  • La page de fidélité explique le programme (informations publiques).
  • Le widget gère les récompenses, les transactions et le compte (après authentification).
  • Les deux fonctionnent indépendamment, mais se complètent grâce au format d’URL #jeri=.

Visibilité conditionnelle

La page masque automatiquement certains éléments selon la configuration du programme :

Élément Condition
Section VIP Tiers Masquée lorsque le programme ne comporte aucun niveau
Section Ways to Earn Masquée lorsque le programme ne comporte aucun flux d’engagement actif
Groupe Purchases Masqué lorsqu’aucun flux de type achat n’existe
Groupe Actions Masqué lorsqu’aucun flux de type action n’existe

Variables CSS

Variables configurables par le marchand

Le modèle Liquid définit ces variables sur :root à partir des paramètres de couleur de l’éditeur de thème :

Variable Valeur par défaut Définie par
--jeri-loyalty-primary #0f0f0f Paramètre Primary Color
--jeri-loyalty-primary-contrast #fcfcfc Paramètre Primary Contrast
--jeri-loyalty-secondary #f5f5f5 Paramètre Secondary Color
--jeri-loyalty-text #0f0f0f Paramètre Text Color
--jeri-loyalty-muted #888888 Paramètre Muted Color

Variables internes

Ces variables reprennent celles du marchand et ajoutent des valeurs pour la mise en page et la structure. Redéfinissez-les dans Custom CSS pour un contrôle plus précis :

Variable Valeur par défaut Rôle
--jlp-primary var(--jeri-loyalty-primary, #0f0f0f) Couleur principale
--jlp-primary-contrast var(--jeri-loyalty-primary-contrast, #fcfcfc) Texte sur la couleur principale
--jlp-text var(--jeri-loyalty-text, #0f0f0f) Couleur du corps du texte
--jlp-muted var(--jeri-loyalty-muted, #888888) Couleur du texte secondaire
--jlp-font var(--font-body-family, system stack) Famille de polices
--jlp-border-radius 16px Rayon des coins des cartes
--jlp-space 16px Unité d’espacement de base
--jlp-border-color #e8e8e8 Couleur des bordures des cartes et listes
--jlp-card-bg #fcfcfc Couleur d’arrière-plan des cartes
--jlp-divider #f0f0f0 Couleur des séparateurs de lignes
--jlp-skeleton-bg #f5f5f5 Couleur du squelette de chargement
--jlp-icon-size 48px Taille des icônes des lignes de gains
--jlp-max-width 1200px Largeur maximale de la page

Exemple : modifier les espacements

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

Exemple : thème sombre

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

Référence des classes CSS

Mise en page

Classe Élément
.jeri-loyalty-page Conteneur racine
.jeri-loyalty-page--loading État de chargement (affiche le squelette et masque le contenu)
.jeri-loyalty-page__hero Section d’accueil
.jeri-loyalty-page__section Section de contenu
.jeri-loyalty-page__section-title Titre de section
.jeri-loyalty-page__skeleton Conteneur du squelette de chargement

Accueil

Classe Élément
.jeri-loyalty-page__hero-title Titre de la section d’accueil
.jeri-loyalty-page__hero-subtitle Description de la section d’accueil
.jeri-loyalty-page__hero-cta Conteneur du bouton d’action
.jeri-loyalty-page__cta-button Style de base du bouton d’action
.jeri-loyalty-page__cta-button--primary Variante principale du bouton d’action

Fonctionnement

Classe Élément
.jeri-loyalty-page__steps Grille des étapes (3 colonnes)
.jeri-loyalty-page__step Étape individuelle
.jeri-loyalty-page__step-number Cercle contenant le numéro
.jeri-loyalty-page__step-title Titre de l’étape
.jeri-loyalty-page__step-text Description de l’étape

Gains

Classe Élément
.jeri-earning-group Conteneur de groupe (Purchases/Actions)
.jeri-earning-group__title Titre du groupe
.jeri-earning-list Conteneur de liste avec bordure
.jeri-earning-row Ligne de gain individuelle
.jeri-earning-row__icon Icône de la ligne (<img>)
.jeri-earning-row__content Conteneur du texte de la ligne
.jeri-earning-row__title Titre de la ligne
.jeri-earning-row__description Description de la ligne
.jeri-earning-row__points Affichage des points

Niveaux

Classe Élément
.jeri-tier-grid Conteneur flex des cartes de niveaux
.jeri-tier-card Carte de niveau individuelle
.jeri-tier-card__body Corps de la carte
.jeri-tier-card__top Ligne du nom et du facteur
.jeri-tier-card__name Nom du niveau
.jeri-tier-card__factor Badge du facteur (masqué à 1x)
.jeri-tier-card__content Description (affichée en HTML)
.jeri-tier-card__points Points requis

Internationalisation (i18n)

La page de fidélité prend en charge plusieurs langues selon la langue actuelle de la boutique :

  • Anglais (en), par défaut
  • Espagnol (es)
  • Français (fr)
  • Allemand (de)
  • Italien (it)

Les langues non prises en charge utilisent automatiquement l’anglais.

Fonctionnement

L’internationalisation comporte deux couches :

  • Textes côté Liquid (rendus sur le serveur) : utilisent le filtre Shopify {{ 'key' | t }} avec des fichiers JSON de langue dans locales/. Ils traduisent les textes statiques, comme « Purchases », « Actions », les étapes « How It Works » et le bouton d’action des visiteurs non connectés.
  • Textes côté TypeScript (rendus dans le navigateur) : utilisent l’utilitaire partagé i18n.ts avec des fichiers .ts de langue inclus dans le JS. Ils traduisent les titres et descriptions dynamiques des flux de gains.

Détection de la langue

La langue de la boutique est transmise au JavaScript via l’attribut data-locale de l’élément racine :

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

Ajouter une langue

  1. Créez theme-extensions/loyalty-page/locales/{lang}.ts (copiez en.ts et traduisez-le).
  2. Créez theme-extensions/loyalty-page/locales/{lang}.json (copiez en.default.json et traduisez-le).
  3. Importez la nouvelle langue dans loyalty-page.ts et ajoutez-la à initFromSession(locale, { en, es, fr, de, it, {lang} }).
  4. Exécutez npm run build:theme-extensions pour reconstruire les fichiers.

Fichiers de traduction

Fichier Rôle
locales/en.ts Traductions anglaises des textes côté JS (incluses dans le JS)
locales/es.ts Traductions espagnoles des textes côté JS (incluses dans le JS)
locales/fr.ts Traductions françaises des textes côté JS (incluses dans le JS)
locales/de.ts Traductions allemandes des textes côté JS (incluses dans le JS)
locales/it.ts Traductions italiennes des textes côté JS (incluses dans le JS)
locales/en.default.json Traductions anglaises des textes côté Liquid (copiées dans le répertoire locales/ de sortie)
locales/es.json Traductions espagnoles des textes côté Liquid (copiées dans le répertoire locales/ de sortie)
locales/fr.json Traductions françaises des textes côté Liquid (copiées dans le répertoire locales/ de sortie)
locales/de.json Traductions allemandes des textes côté Liquid (copiées dans le répertoire locales/ de sortie)
locales/it.json Traductions italiennes des textes côté Liquid (copiées dans le répertoire locales/ de sortie)