Questa guida è rivolta agli sviluppatori che realizzano esperienze storefront personalizzate. Se vuoi solo modificare colori e testi, consulta invece la guida al modello predefinito.
Per i merchant che vogliono controllare completamente il layout HTML o creare una pagina loyalty personalizzata, JeriCommerce mette a disposizione modelli di sezione Liquid standalone che caricano il motore della loyalty page direttamente dal CDN.
Vuoi saltare la configurazione manuale? La skill AI loyalty-template-creator può generare un modello .liquid personalizzato completo, in linea con lo stile visivo del negozio. Fornisci un URL di riferimento: analizzerà colori, font, layout e risorse per creare un modello pronto all’uso basato sullo stesso motore CDN descritto di seguito.
Installala con: npx skills add jericommerce/skills --skill loyalty-template-creator
Source: github.com/JeriCommerce/skills
Quando usare la modalità CDN ¶
- Il merchant vuole un layout completamente personalizzato, oltre le possibilità offerte dalle impostazioni dell’editor del tema.
- Il team di sviluppo preferisce gestire direttamente l’HTML nel codice del tema.
- Vuoi integrare la loyalty page in un modello di pagina esistente insieme ad altre sezioni.
Procedura di configurazione ¶
Ottieni il modello
JeriCommerce fornisce due modelli CDN pronti all’uso. Copia quello più adatto alle tue esigenze:
- Modello visuale (
templates/visual.liquid) — Completo: hero con CTA, passaggi esplicativi, righe di accumulo con icone SVG per social network, schede dei livelli e scheletro di caricamento. Ha lo stesso aspetto del blocco tema. - Modello minimal (
templates/minimal.liquid) — Layout compatto a elenco: titolo, metodi di accumulo in un semplice elenco e livelli in righe. CSS inline, senza fogli di stile esterni.
Puoi scaricarli dall’admin JeriCommerce in Loyalty Page > Get template code oppure copiare direttamente i file dal repository.
Aggiungilo al tema
- Vai a Shopify Admin > Online Store > Themes > Edit code.
- Nella directory
sections/, fai clic su Add a new section. - Assegna un nome alla sezione (ad es.
jeri-loyalty) e incolla il codice del modello.
Crea un modello di pagina
Crea un modello di pagina JSON che faccia riferimento alla sezione:
{
"sections": {
"loyalty": {
"type": "jeri-loyalty"
}
},
"order": ["loyalty"]
}
In alternativa, aggiungi la sezione a un modello di pagina esistente dall’editor del tema: Customize > Add section.
Crea la pagina
Vai a Shopify Admin > Pages > Add page e seleziona il modello "loyalty".
Come funziona la modalità CDN ¶
I modelli CDN caricano lo stesso JavaScript che alimenta il blocco dell’estensione app del tema: è raggruppato, minificato e sempre aggiornato:
<!-- 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" />
Il motore rileva automaticamente il dominio del negozio dall’attributo data-shop dell’elemento radice oppure usa window.Shopify.shop come alternativa.
Sistema dei modelli: associazione dei dati ¶
Il motore dei modelli usa due sistemi per associare i dati API all’HTML.
1. Interpolazione delle variabili — {varName} ¶
Inserisci token {varName} in qualsiasi punto del testo HTML. Il motore JS scorre tutti i nodi di testo e li sostituisce con i dati API.
<h3>{tier.name}</h3>
<span>{tier.requiredPoints}</span>
<span>{earning.points}</span>
Nei modelli ripetuti (livelli, accumuli), le variabili fanno riferimento ai dati del modello. La sintassi usa parentesi graffe singole {key} e non entra in conflitto con Liquid ({{ }}), i template literal JS (${ }) o CSS.
Sono disponibili anche variabili globali (come {programName} e {currencySymbol}), utilizzabili in qualsiasi nodo di testo del modello, non solo in quelli ripetuti. Consulta la sezione Variabili globali del modello per l’elenco completo.
2. Attributi dei dati — data-jeri ¶
Si usano per operazioni non testuali che non si possono esprimere tramite interpolazione del testo:
| Attributo | Scopo | Esempio |
|---|---|---|
data-jeri="name" su <template> |
Definisce un modello per righe ripetute | <template data-jeri="tiers"> |
data-jeri="name" sul contenitore |
Riceve le righe duplicate dal modello | <div data-jeri="tiers"> |
data-jeri="key" su <img> |
Imposta l’attributo src (nasconde l’elemento se vuoto) |
<img data-jeri="earning.iconUrl"> |
data-jeri-hide-if="value" |
Nasconde l’elemento se i dati corrispondono al valore | data-jeri-hide-if="1" |
data-jeri-html="key" |
Inserisce contenuto HTML non elaborato | <p data-jeri-html="tier.content"> |
data-jeri-group="name" |
Contenitore di gruppo (nascosto se vuoto) | data-jeri-group="purchases" |
Riferimento rapido: quale usare ¶
| Esigenza | Usa |
|---|---|
| Mostrare testo o numeri | {varName} nel contenuto testuale |
| Combinare variabili e testo personalizzato | Earn {earning.points} with {earning.title} |
| Impostare la sorgente di un’immagine | data-jeri="key" su <img> |
| Nascondere in base a un valore | data-jeri-hide-if |
| Inserire contenuto HTML avanzato | data-jeri-html="key" |
| Definire una riga ripetuta | <template data-jeri="name"> + <div data-jeri="name"> |
Variabili globali del modello ¶
Puoi usare queste 7 variabili globali in qualsiasi nodo di testo dentro #jeri-loyalty-page-root. Scrivile con la sintassi {variableName}: il motore le sostituisce automaticamente con i dati della configurazione del programma.
| Variabile | Tipo | Descrizione | Esempio |
|---|---|---|---|
{programName} |
string | Nome del programma loyalty | "My Rewards" |
{currencySymbol} |
string | Simbolo della valuta, ricavato tramite Intl.NumberFormat |
"$", "€", "£" |
{currencyCode} |
string | Codice valuta ISO | "USD", "EUR", "GBP" |
{balanceName} |
string | Nome plurale dei punti | "Points", "Stars" |
{singularBalanceName} |
string | Nome singolare dei punti | "Point", "Star" |
{tierBalanceName} |
string | Nome plurale dei punti livello | "Points" |
{singularTierBalanceName} |
string | Nome singolare dei punti livello | "Point" |
Esempio d’uso ¶
<h1>Welcome to {programName}!</h1>
<p>Earn {balanceName} with every {currencySymbol} you spend</p>
<p>Prices are in {currencyCode}</p>
Le variabili globali funzionano insieme a quelle con ambito limitato ({earning.*}, {tier.*}). Nei modelli ripetuti vengono risolte entrambe.
La variabile {currencySymbol} usa Intl.NumberFormat del browser per determinare il simbolo corretto in base al codice valuta del programma. Il simbolo si adatta quindi alla valuta effettiva: $ per USD, € per EUR, £ per GBP e così via.
Nota sulla migrazione: la variabile {hero.programName} è stata rimossa. Usa {programName}: funziona in tutto il modello, non solo nella sezione hero.
Campi dati disponibili ¶
Campi di accumulo (earning.*) ¶
Da usare nel modello <template data-jeri="earning-row">.
| Campo | Tipo | Descrizione |
|---|---|---|
earning.type |
string | Tipo di flusso: purchase, social, referral, profile, verify, wallet, scan, link |
earning.title |
string | Titolo leggibile della regola di accumulo |
earning.description |
string | Descrizione dettagliata di come ottenere punti |
earning.points |
string | Visualizzazione compatta dei punti: +100 per punti fissi, 10% per tassi < 1, x2 per moltiplicatori >= 1 |
earning.iconUrl |
string | URL dell’icona (impostato tramite data-jeri su <img>, vuoto se manca) |
Campi dei livelli (tier.*) ¶
Da usare nel modello <template data-jeri="tiers">.
| Campo | Tipo | Descrizione |
|---|---|---|
tier.name |
string | Nome del livello (ad es. "Gold", "VIP") |
tier.content |
string | Descrizione o vantaggi del livello, può contenere HTML: usa data-jeri-html="tier.content" |
tier.image |
string | URL dell’immagine del livello (impostato tramite data-jeri su <img>) |
tier.requiredPoints |
string | Punti necessari (ad es. "1,000 tier points"). Usa tierBalanceName al singolare o plurale |
tier.factor |
string | Moltiplicatore dei punti (ad es. "2"). Si nasconde automaticamente quando vale "1" tramite data-jeri-hide-if |
tier.id |
string | ID interno del livello |
Elemento radice obbligatorio ¶
Ogni modello personalizzato deve includere questo elemento radice con gli attributi richiesti:
<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>
| Attributo | Obbligatorio | Scopo |
|---|---|---|
id="jeri-loyalty-page-root" |
Sì | Punto di ingresso JS: il motore cerca questo ID |
class="jeri-loyalty-page" |
Sì | Ambito CSS e variabili CSS |
data-shop |
Sì | Dominio del negozio per le chiamate API |
data-icon-base |
Consigliato | Prefisso URL per le icone di accumulo |
data-locale |
Consigliato | Lingua del negozio per i18n (ripiega su "en") |
La classe jeri-loyalty-page--loading mostra uno scheletro e nasconde i contenuti finché i dati non vengono caricati. JS la rimuove dopo aver recuperato i dati.
Il foglio di stile CSS deve essere caricato prima dei contenuti HTML (all’interno dell’elemento radice) per evitare che al primo caricamento appaiano brevemente senza stile.
Regole dei modelli ¶
Le 6 regole per i modelli personalizzati:
- Mantieni
id="jeri-loyalty-page-root"sull’elemento radice: serve a JS per inizializzarsi. - Mantieni
class="jeri-loyalty-page"sull’elemento radice: qui sono definite le variabili CSS. - Mantieni
data-shop: è obbligatorio per le chiamate API. - Mantieni le coppie modello/contenitore: a
<template data-jeri="X">deve corrispondere un<div data-jeri="X">fratello. - Usa
{varName}nei nodi di testo: il motore sostituisce tutti i token riconosciuti. - Usa
data-jeri-html="key"per i contenuti HTML, non{var}, che verrebbe sottoposto a escape.
Struttura del modello predefinito ¶
Sezione 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 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>
Sezione livelli ¶
<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>
Sezione accumuli ¶
<!-- 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>
Esempio completo di modello personalizzato ¶
Ecco un modello personalizzato minimal completo da usare come punto di partenza:
<!-- 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>
Modello visuale e modello minimal ¶
Modello visuale — Ideale per i brand che vogliono una loyalty page curata, in stile marketing, con sezione hero, passaggi esplicativi, righe di accumulo con icone SVG, schede dei livelli e scheletro di caricamento completo.
Modello minimal — Ideale per i negozi che preferiscono un approccio essenziale e basato sui dati, con elenchi compatti, CSS inline e senza dipendenze da fogli di stile esterni oltre al motore JS.
Entrambi i modelli usano lo stesso motore JS e lo stesso sistema di associazione dei dati. Cambiano solo la struttura HTML e il design visivo. Puoi partire da uno dei due e personalizzarlo liberamente.
Sistema delle icone ¶
Le icone delle righe di accumulo sono file SVG denominati in base al tipo. L’URL viene composto come data-icon-base + nome + .svg.
| File icona | Uso |
|---|---|
purchase.svg |
Flussi di accumulo per acquisti |
facebook.svg |
Segui su Facebook |
instagram.svg |
Segui su Instagram |
tiktok.svg |
Segui su TikTok |
x.svg |
Segui su X |
youtube.svg |
Segui su YouTube |
referral.svg |
Invita un amico |
profile.svg |
Completa il profilo |
wallet.svg |
Installa la wallet pass |
scan.svg |
Scansione in negozio |
verify.svg |
Verifica l’account |
link.svg |
Visita un link |
In modalità CDN, l’URL di base delle icone è fisso: https://cdn.jericommerce.com/shopify/. Se manca data-icon-base o un’icona non esiste, l’elemento <img> viene nascosto automaticamente.
Formato di visualizzazione dei punti ¶
Il campo earning.points usa un formato compatto in base al tipo di accumulo:
| Tipo di accumulo | Formato | Esempio |
|---|---|---|
| Acquisto (tasso < 1) | Rendimento percentuale | 10% |
| Acquisto (tasso >= 1) | Moltiplicatore | x2 |
| Tutti gli altri (social, referral, profilo e così via) | Punti fissi | +100 |
Per i referral, il badge mostra solo i punti di chi invita. Il premio dell’amico è indicato nella descrizione.
La descrizione dell’accumulo per acquisto usa dinamicamente il simbolo di valuta effettivo del programma (ad es. "Earn x3 Points per $ spent" per USD, "Earn x3 Points per € spent" per EUR). La valuta viene ricavata dalla configurazione del programma usando Intl.NumberFormat del browser.
Risoluzione dei nomi Wallet ¶
La configurazione del programma determina quattro proprietà dei nomi:
| Nome | Uso | Esempio |
|---|---|---|
balanceName / singularBalanceName |
Descrizioni e titoli dei flussi di accumulo | "points" / "point" |
tierBalanceName / singularTierBalanceName |
Punti livello richiesti | "tier points" / "tier point" |
Vengono lette da program.configurations.wallet (configurazione di base). Il singolare o il plurale viene scelto automaticamente in base alla quantità (1 = singolare, altrimenti plurale).
Questi quattro nomi sono disponibili anche come variabili globali del modello: {balanceName}, {singularBalanceName}, {tierBalanceName} e {singularTierBalanceName}. Puoi richiamarli direttamente in qualsiasi nodo di testo.
Impostazioni dell’editor del tema ¶
| Impostazione | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| Enable Loyalty Page | Casella di controllo | true |
Mostra o nasconde l’intero blocco |
| Hero Title | Testo | "Our Loyalty Program" | Titolo principale |
| Hero Subtitle | Area di testo | "Join our loyalty..." | Descrizione sotto il titolo |
| Guest CTA URL | URL | /account/login |
Destinazione degli ospiti |
| Logged-in CTA Action | Selettore | account |
account = vai alla pagina account, widget_rewards = apri il widget premi |
| Logged-in CTA Label | Testo | "See rewards" | Testo del pulsante per i clienti connessi |
| Logged-in CTA URL | URL | /account |
URL dell’azione "Go to account page" |
| Show How It Works | Casella di controllo | true |
Mostra o nasconde la sezione in 3 passaggi |
| Show Earning Rules | Casella di controllo | true |
Mostra o nasconde la sezione degli accumuli |
| Show VIP Tiers | Casella di controllo | true |
Mostra o nasconde la sezione dei livelli |
| Primary Color | Colore | #0f0f0f |
Pulsanti, accenti e badge |
| Primary Contrast | Colore | #fcfcfc |
Testo su sfondi primari |
| Secondary Color | Colore | #f5f5f5 |
Sfondi delle schede |
| Text Color | Colore | #0f0f0f |
Titoli e testo principale |
| Muted Color | Colore | #888888 |
Sottotitoli e descrizioni |
| Custom CSS | Area di testo | — | Regole CSS aggiuntive |
Integrazione del widget ¶
La CTA "See rewards" (quando cta_action è impostato su widget_rewards) usa #jeri=loyalty/rewards come href. Se il widget JeriCommerce è attivo nella pagina, facendo clic sul link si apre il pannello premi. Quindi:
- La loyalty page spiega il programma con informazioni pubbliche.
- Il widget gestisce premi, transazioni e account con autenticazione.
- Funzionano indipendentemente, ma si completano tramite il formato URL
#jeri=.
Visibilità condizionale ¶
La pagina nasconde automaticamente gli elementi in base alla configurazione del programma:
| Elemento | Condizione |
|---|---|
| Sezione VIP Tiers | Nascosta se il programma non prevede livelli |
| Sezione Ways to Earn | Nascosta se il programma non ha flussi di coinvolgimento attivi |
| Gruppo Purchases | Nascosto se non esistono flussi di tipo acquisto |
| Gruppo Actions | Nascosto se non esistono flussi di tipo azione |
Variabili CSS ¶
Variabili visibili al merchant ¶
Il modello Liquid le imposta su :root in base ai colori scelti nell’editor del tema:
| Variabile | Predefinito | Impostata da |
|---|---|---|
--jeri-loyalty-primary |
#0f0f0f |
Impostazione Primary Color |
--jeri-loyalty-primary-contrast |
#fcfcfc |
Impostazione Primary Contrast |
--jeri-loyalty-secondary |
#f5f5f5 |
Impostazione Secondary Color |
--jeri-loyalty-text |
#0f0f0f |
Impostazione Text Color |
--jeri-loyalty-muted |
#888888 |
Impostazione Muted Color |
Variabili interne ¶
Risolvono i valori del merchant e aggiungono token strutturali e di layout. Sovrascrivili in Custom CSS per un controllo più preciso:
| Variabile | Predefinito | Scopo |
|---|---|---|
--jlp-primary |
var(--jeri-loyalty-primary, #0f0f0f) |
Colore principale |
--jlp-primary-contrast |
var(--jeri-loyalty-primary-contrast, #fcfcfc) |
Testo su sfondo principale |
--jlp-text |
var(--jeri-loyalty-text, #0f0f0f) |
Colore del testo principale |
--jlp-muted |
var(--jeri-loyalty-muted, #888888) |
Colore del testo secondario |
--jlp-font |
var(--font-body-family, system stack) |
Famiglia di caratteri |
--jlp-border-radius |
16px |
Raggio dei bordi delle schede |
--jlp-space |
16px |
Unità di spaziatura di base |
--jlp-border-color |
#e8e8e8 |
Colore dei bordi di schede ed elenchi |
--jlp-card-bg |
#fcfcfc |
Colore di sfondo delle schede |
--jlp-divider |
#f0f0f0 |
Colore dei divisori delle righe |
--jlp-skeleton-bg |
#f5f5f5 |
Sfondo del caricamento scheletrico |
--jlp-icon-size |
48px |
Dimensione dell’icona della riga di accumulo |
--jlp-max-width |
1200px |
Larghezza massima della pagina |
Esempio: modifica la spaziatura ¶
.jeri-loyalty-page {
--jlp-space: 12px;
--jlp-border-radius: 8px;
}
Esempio: tema scuro ¶
.jeri-loyalty-page {
--jlp-card-bg: #1a1a1a;
--jlp-border-color: #333;
--jlp-divider: #2a2a2a;
--jlp-skeleton-bg: #222;
}
Riferimento alle classi CSS ¶
Layout ¶
| Classe | Elemento |
|---|---|
.jeri-loyalty-page |
Contenitore radice |
.jeri-loyalty-page--loading |
Stato di caricamento (mostra lo scheletro e nasconde i contenuti) |
.jeri-loyalty-page__hero |
Sezione hero |
.jeri-loyalty-page__section |
Sezione dei contenuti |
.jeri-loyalty-page__section-title |
Titolo della sezione |
.jeri-loyalty-page__skeleton |
Contenitore scheletrico |
Hero ¶
| Classe | Elemento |
|---|---|
.jeri-loyalty-page__hero-title |
Titolo hero |
.jeri-loyalty-page__hero-subtitle |
Descrizione hero |
.jeri-loyalty-page__hero-cta |
Contenitore del pulsante CTA |
.jeri-loyalty-page__cta-button |
Pulsante CTA di base |
.jeri-loyalty-page__cta-button--primary |
Variante CTA primaria |
Come funziona ¶
| Classe | Elemento |
|---|---|
.jeri-loyalty-page__steps |
Griglia dei passaggi (3 colonne) |
.jeri-loyalty-page__step |
Singolo passaggio |
.jeri-loyalty-page__step-number |
Cerchio con numero |
.jeri-loyalty-page__step-title |
Titolo del passaggio |
.jeri-loyalty-page__step-text |
Descrizione del passaggio |
Accumuli ¶
| Classe | Elemento |
|---|---|
.jeri-earning-group |
Contenitore del gruppo (Purchases/Actions) |
.jeri-earning-group__title |
Titolo del gruppo |
.jeri-earning-list |
Contenitore dell’elenco con bordo |
.jeri-earning-row |
Singola riga di accumulo |
.jeri-earning-row__icon |
Icona della riga (<img>) |
.jeri-earning-row__content |
Contenitore del testo della riga |
.jeri-earning-row__title |
Titolo della riga |
.jeri-earning-row__description |
Descrizione della riga |
.jeri-earning-row__points |
Visualizzazione dei punti |
Livelli ¶
| Classe | Elemento |
|---|---|
.jeri-tier-grid |
Contenitore flex delle schede livello |
.jeri-tier-card |
Singola scheda livello |
.jeri-tier-card__body |
Corpo della scheda |
.jeri-tier-card__top |
Riga con nome e moltiplicatore |
.jeri-tier-card__name |
Nome del livello |
.jeri-tier-card__factor |
Badge del moltiplicatore (nascosto se è 1x) |
.jeri-tier-card__content |
Descrizione (renderizzata come HTML) |
.jeri-tier-card__points |
Punti richiesti |
Internazionalizzazione (i18n) ¶
La loyalty page supporta più lingue in base alla lingua attuale del negozio:
- Inglese (en), predefinito
- Spagnolo (es)
- Francese (fr)
- Tedesco (de)
- Italiano (it)
Le lingue non supportate ripiegano automaticamente sull’inglese.
Come funziona ¶
L'internazionalizzazione si articola su due livelli:
- Testi Liquid (renderizzati lato server) — Usano il filtro Shopify
{{ 'key' | t }}con i file JSON delle lingue inlocales/. Traducono testi statici come "Purchases", "Actions", i passaggi "How It Works" e il pulsante CTA per gli ospiti. - Testi TypeScript (renderizzati lato client) — Usano l'utilità condivisa
i18n.tscon file.tsdelle lingue inclusi nel bundle JS. Traducono titoli e descrizioni dinamici dei flussi di accumulo.
Rilevamento della lingua ¶
La lingua del negozio viene passata a JavaScript tramite l'attributo data-locale dell'elemento radice:
<div id="jeri-loyalty-page-root" data-locale="{{ request.locale.iso_code }}" ...>
</div>
Aggiungere una nuova lingua ¶
- Crea
theme-extensions/loyalty-page/locales/{lang}.ts(copiaen.tse traduci i testi) - Crea
theme-extensions/loyalty-page/locales/{lang}.json(copiaen.default.jsone traduci i testi) - Importa la nuova lingua in
loyalty-page.tse aggiungila ainitFromSession(locale, { en, es, fr, de, it, {lang} }) - Esegui
npm run build:theme-extensionsper ricompilare
File di traduzione ¶
| File | Scopo |
|---|---|
locales/en.ts |
Traduzioni inglesi dei testi JS (incluse nel bundle JS) |
locales/es.ts |
Traduzioni spagnole dei testi JS (incluse nel bundle JS) |
locales/fr.ts |
Traduzioni francesi dei testi JS (incluse nel bundle JS) |
locales/de.ts |
Traduzioni tedesche dei testi JS (incluse nel bundle JS) |
locales/it.ts |
Traduzioni italiane dei testi JS (incluse nel bundle JS) |
locales/en.default.json |
Traduzioni inglesi dei testi Liquid (copiate nella directory locales/ di output) |
locales/es.json |
Traduzioni spagnole dei testi Liquid (copiate nella directory locales/ di output) |
locales/fr.json |
Traduzioni francesi dei testi Liquid (copiate nella directory locales/ di output) |
locales/de.json |
Traduzioni tedesche dei testi Liquid (copiate nella directory locales/ di output) |
locales/it.json |
Traduzioni italiane dei testi Liquid (copiate nella directory locales/ di output) |