Guide pratique pour écrire des expressions CEL dans le CMS.
Guide pratique pour écrire des expressions CEL dans le CMS.
CEL (Common Expression Language) est un langage de script léger intégré à notre CMS. Il vous permet d'écrire des expressions dynamiques qui peuvent extraire des données des documents, lire les paramÚtres d'URL et calculer des valeurs à la volée.
Voici ce qui se passe lorsqu'un script CEL s'exécute :
Votre script Le moteur Résultat
| | |
v v v
documents.get("article", "intro") --> RécupÚre depuis la base de données --> { headline: "Welcome", body: "..." }
.headline --> Extrait le champ --> "Welcome"
ConsidĂ©rez CEL comme un langage de requĂȘte en lecture seule. Il ne peut rien modifier dans la base de donnĂ©es : il se contente de lire des donnĂ©es et de renvoyer un rĂ©sultat calculĂ©. Cela le rend sĂ»r Ă utiliser partout dans le CMS.
Chaque expression CEL a accĂšs Ă trois choses :
| Objet | Ce que c'est | Exemple |
|---|---|---|
documents | RécupÚre n'importe quel document du CMS | documents.get("country", "us") |
meta | Informations sur la requĂȘte en cours (locale, paramĂštres d'URL) | meta.locale, meta.params.slug |
schema | Définitions des champs du document courant | schema.fields |
docLorsque vous écrivez des expressions CEL dans un éditeur de document, vous pouvez accéder aux valeurs des champs du document courant à l'aide de l'objet doc. Cela permet de créer des champs calculés et des références entre champs.
// Accéder au champ price du document courant
doc.price
// Calculer un total Ă partir des champs du document courant
doc.price * doc.quantity
// Condition en fonction de l'état du document courant
doc.status == "published" ? doc.title : "Brouillon : " + doc.title
L'objet doc contient toutes les valeurs des champs du document en cours d'édition. C'est utile pour :
doc.price * doc.quantity)La fonctionnalité la plus puissante de CEL est la récupération de documents partout dans votre CMS.
Syntaxe : documents.get(schemaName, identifier)
Supposons que vous ayez un document article stocké avec l'identifiant "welcome-post" :
// Stocké dans le CMS sous : article / welcome-post
{
"headline": "Bienvenue sur notre plateforme",
"author": "Sarah Chen",
"body": "Nous sommes ravis d'annoncer...",
"tags": ["annonce", "actualités"]
}
Pour récupérer l'intégralité du document :
documents.get("article", "welcome-post")
Renvoie :
{
"headline": "Bienvenue sur notre plateforme",
"author": "Sarah Chen",
"body": "Nous sommes ravis d'annoncer...",
"tags": ["annonce", "actualités"]
}
Pour récupérer uniquement le titre :
documents.get("article", "welcome-post").headline
Renvoie : "Bienvenue sur notre plateforme"
Pour récupérer l'autrice :
documents.get("article", "welcome-post").author
Renvoie : "Sarah Chen"
Lorsque votre page utilise des routes dynamiques (comme /articles/[slug]), vous pouvez utiliser meta.params pour récupérer le paramÚtre d'URL et obtenir le bon document.
Si quelqu'un visite /articles/welcome-post :
documents.get("article", meta.params.slug).headline
Renvoie : "Bienvenue sur notre plateforme"
C'est ainsi que vous construisez des pages dynamiques : le mĂȘme script CEL fonctionne pour n'importe quel article, en utilisant simplement le slug prĂ©sent dans l'URL.
Syntaxe : documents.find(schemaName) ou documents.find(schemaName, filter)
// Obtenir tous les pays
documents.find("country")
Renvoie :
[
{ "code": "us", "name": "Ătats-Unis", "flag": "US" },
{ "code": "sa", "name": "Arabie saoudite", "flag": "SA" },
{ "code": "gb", "name": "Royaume-Uni", "flag": "GB" }
]
// Obtenir des pays avec un filtre
documents.find("country", { "where": { "code": "us" } })
Renvoie :
[
{ "code": "us", "name": "Ătats-Unis", "flag": "US" }
]
CEL prend en charge la récupération de contenu traduit de deux maniÚres : traduction automatique basée sur la locale et recherche de traduction explicite.
Lorsque meta.locale est définie (par exemple à partir des paramÚtres de route ou des préférences utilisateur), documents.get() fusionne automatiquement le contenu traduit :
// Si meta.locale vaut "fr", renvoie la traduction française fusionnée avec le document de base
documents.get("greeting", "welcome").headline
Fonctionnement :
meta.locale n'est pas "en" ou "en-US", recherche la traduction dans la table translations{ ...baseContent, ...translatedContent }Cela signifie que les champs traduits remplacent les champs de base, tandis que les champs non traduits reviennent au document d'origine.
Pour les cas oĂč vous devez rĂ©cupĂ©rer une traduction spĂ©cifique quel que soit la locale courante :
Syntaxe : documents.translated(schemaName, identifier, locale)
// Toujours récupérer la traduction espagnole
documents.translated("greeting", "welcome", "es").headline
// Récupérer la traduction en fonction du paramÚtre d'URL
documents.translated("product", meta.params.id, meta.params.lang).description
// Comparer des traductions
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title
Vos documents de salutation avec traductions :
// Document de base : greeting / welcome
{ "headline": "Welcome", "subheadline": "Welcome to our platform" }
// Traduction (langue : "fr")
{ "headline": "Bienvenue", "subheadline": "Bienvenue sur notre plateforme" }
// Traduction (langue : "es")
{ "headline": "Bienvenido", "subheadline": "Bienvenido a nuestra plataforma" }
Scripts CEL :
// Avec meta.locale = "fr"
documents.get("greeting", "welcome").headline
// Renvoie : "Bienvenue"
// Traduction espagnole explicite
documents.translated("greeting", "welcome", "es").headline
// Renvoie : "Bienvenido"
// Patrons de repli en cas de traduction manquante
documents.translated("greeting", "welcome", meta.params.lang) != null
? documents.translated("greeting", "welcome", meta.params.lang).headline
: documents.get("greeting", "welcome").headline
Vous avez un hero-block qui doit afficher un titre provenant d'un document article.
Votre document article (identifiant : "homepage-hero") :
{
"headline": "Construisez plus vite, livrez plus intelligemment",
"subheadline": "Le CMS moderne pour les développeurs"
}
Script CEL dans le champ titre du bloc héros :
documents.get("article", "homepage-hero").headline
Résultat : le héros affiche "Construisez plus vite, livrez plus intelligemment"
Vous construisez une page Ă /countries/[code] et souhaitez afficher le nom complet du pays.
Vos documents de pays :
// country / us
{ "code": "us", "name": "Ătats-Unis", "flag": "US", "languages": ["en", "es"] }
// country / sa
{ "code": "sa", "name": "Arabie saoudite", "flag": "SA", "languages": ["ar", "en"] }
Script CEL :
documents.get("country", meta.params.code).name
Quand quelqu'un visite /countries/us :
meta.params.code = "us""Ătats-Unis"Quand quelqu'un visite /countries/sa :
meta.params.code = "sa""Arabie saoudite"Afficher des titres différents selon la locale de l'utilisateur.
meta.locale == "ar-SA" ? "Bienvenue Ă tous" : "Bienvenue"
Si la locale est "ar-SA" : renvoie "Bienvenue Ă tous"
Si la locale est autre : renvoie "Bienvenue"
Votre article possĂšde un champ countryCode, et vous voulez obtenir le nom complet du pays.
Document article :
{ "headline": "ActualitĂ©s des Ătats-Unis", "countryCode": "us" }
Script CEL :
documents.get("country", documents.get("article", "us-news").countryCode).name
Ce qui se passe :
documents.get("article", "us-news") renvoie { "headline": "ActualitĂ©s des Ătats-Unis", "countryCode": "us" }.countryCode extrait "us"documents.get("country", "us") renvoie { "code": "us", "name": "Ătats-Unis", ... }.name extrait "Ătats-Unis"RĂ©sultat : "Ătats-Unis"
Si un document peut ne pas exister, vous pouvez fournir une valeur de repli :
documents.get("article", meta.params.slug) != null
? documents.get("article", meta.params.slug).headline
: "Article introuvable"
Ou vérifier si un champ spécifique existe :
documents.get("article", "intro").author != null
? documents.get("article", "intro").author
: "Auteur inconnu"
Votre article possÚde des tags et vous voulez vérifier si un tag spécifique existe :
"featured" in documents.get("article", "welcome-post").tags
Renvoie : true si l'article possĂšde le tag "featured"
Obtenir le premier tag :
documents.get("article", "welcome-post").tags[0]
Renvoie : "annonce" (le premier tag)
Compter les tags :
size(documents.get("article", "welcome-post").tags)
Renvoie : 2 (nombre de tags)
Les routes paramétriques sont la clé pour construire des pages dynamiques et localisées. Lorsque vous définissez un motif de route comme /{lang}/landingPage, le CMS extrait les paramÚtres de l'URL et les rend disponibles via meta.params.
Définition de motif de route :
Les routes utilisent la syntaxe :paramName ou {paramName} pour définir des segments dynamiques :
| Motif | Exemple d'URL | ParamĂštres extraits |
|---|---|---|
/:lang/landingPage | /ko/landingPage | { lang: "ko" } |
/{country}/{lang}/products | /us/en/products | { country: "us", lang: "en" } |
/articles/:slug | /articles/welcome-post | { slug: "welcome-post" } |
Liaisons de paramĂštres : Chaque paramĂštre de route peut ĂȘtre liĂ© Ă un schĂ©ma de document pour validation :
{
"pattern": "/{lang}/landingPage",
"param_bindings": {
"lang": "language"
}
}
Cette liaison indique au CMS :
lang de l'URLlanguage (recherche d'un document oĂč content.code correspond)Configuration de la route :
/{lang}/landingPage/{lang}/landingPage{ "lang": "language" }Vos documents de salutation :
// greeting / ko
{ "code": "ko", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Get Started", "ctaUrl": "/ko/get-started" }
// greeting / en
{ "code": "en", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Get Started", "ctaUrl": "/en/get-started" }
// greeting / ja
{ "code": "ja", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Start", "ctaUrl": "/ja/get-started" }
Script CEL pour récupérer le contenu localisé :
documents.get("greeting", meta.params.lang).headline
Comment cela se résout :
| URL | meta.params.lang | Résultat |
|---|---|---|
/ko/landingPage | "ko" | "Welcome" |
/en/landingPage | "en" | "Welcome" |
/ja/landingPage | "ja" | "Welcome" |
Pour des routes comme /{country}/{lang}/products :
Configuration de la route :
{
"pattern": "/{country}/{lang}/products",
"param_bindings": {
"country": "country",
"lang": "language"
}
}
Scripts CEL :
// Obtenir le nom du pays
documents.get("country", meta.params.country).name
// Obtenir la liste des produits localisée selon le pays
documents.find("product", { "where": { "country": meta.params.country } })
// Combiné : afficher une salutation spécifique au pays dans la langue de l'utilisateur
documents.get("greeting", meta.params.lang).headline + " depuis " + documents.get("country", meta.params.country).name
Cascade de validation :
Le CMS valide les paramÚtres hiérarchiquement. Pour les routes /{country}/{lang} :
country par rapport au schéma countrylang par rapport au schéma languagelang figure dans le tableau country.languages[] (validation hiérarchique)meta.segments fournit le chemin brut de l'URL sous forme de tableau, utile lorsque vous avez besoin d'un accÚs positionnel sans paramÚtres nommés.
Fonctionnement :
| Chemin d'URL | meta.segments |
|---|---|
/articles/tech/ai-news | ["articles", "tech", "ai-news"] |
/ko/landingPage | ["ko", "landingPage"] |
/us/en/products/featured | ["us", "en", "products", "featured"] |
/ | [] |
| Cas d'usage | Meilleure approche |
|---|---|
| ParamÚtres nommés provenant du motif de route | meta.params.lang |
| AccÚs basé sur la position | meta.segments[0] |
| Obtenir la profondeur du chemin | size(meta.segments) |
| Vérifier si le chemin contient un segment | "admin" in meta.segments |
// Obtenir le premier segment (souvent le code langue)
meta.segments[0]
// Vérifier la profondeur du chemin
size(meta.segments) > 2 ? "profond" : "peu profond"
// Vérifier si nous sommes dans la section admin
"admin" in meta.segments ? "mode admin" : "mode public"
// Repli : utiliser le segment si le paramÚtre n'est pas lié
has(meta.params.lang) ? meta.params.lang : meta.segments[0]
L'objet meta contient tout le contexte concernant la requĂȘte en cours :
| Propriété | Type | Description | |
|---|---|---|---|
meta.locale | string | Code de locale courant (par ex. "en-US", "ko-KR", "ar-SA") | |
meta.params | Record<string, string> | ParamĂštres de route extraits du motif d'URL | |
meta.segments | string[] | Chemin d'URL scindé en segments | |
meta.docId | string \| null | UUID du document courant (null pour un nouveau document) | |
meta.title | string | Titre du document courant |
Le code de locale suit le format BCP 47 (langue-région) :
// Vérifier la locale pour les langues RTL
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"
// Obtenir uniquement la partie langue
meta.locale.split("-")[0] // Non pris en charge - utilisez plutĂŽt meta.params.lang
Les paramÚtres de route sont toujours des chaßnes de caractÚres. Le CMS les valide par rapport aux schémas liés avant l'évaluation :
// Accéder à un paramÚtre nommé
meta.params.lang // "ko"
meta.params.country // "us"
meta.params.slug // "welcome-post"
// Vérifier si un paramÚtre existe
has(meta.params.category) // true/false
// Utiliser lors d'une récupération de document
documents.get("greeting", meta.params.lang)
documents.ref("airports").get(meta.params.code)
Segments bruts de l'URL sous forme de tableau :
// Accéder par index (à partir de 0)
meta.segments[0] // Premier segment
meta.segments[1] // DeuxiĂšme segment
// Vérifier la longueur
size(meta.segments) // Nombre de segments
// Vérifier la présence
"products" in meta.segments // Le chemin contient-il "products" ?
L'UUID du document courant, utile pour des scripts auto-référentiels :
// Disponible uniquement lors de l'édition d'un document existant
meta.docId != null ? "édition" : "création"
// Utiliser dans une logique conditionnelle
meta.docId != null ? documents.get("article", meta.docId).status : "draft"
Le titre du document courant :
// Utiliser pour l'affichage
"Ădition : " + meta.title
// Condition basé sur le titre
meta.title.contains("Draft") ? "travail en cours" : "publié"
Pour une syntaxe plus claire lorsque le schéma est connu mais que l'identifiant est dynamique :
// Approche traditionnelle
documents.get("airports", meta.params.code).name
// Avec ref() - schéma séparé de l'identifiant dynamique
documents.ref("airports").get(meta.params.code).name
Les deux sont équivalents, mais ref() met davantage en évidence la partie dynamique.
documents.get("schema", "identifier") // Récupérer un document
documents.get("schema", "id").fieldName // Récupérer un champ spécifique
documents.find("schema") // Récupérer tous les documents
documents.find("schema", { "where": {...}}) // RequĂȘte filtrĂ©e
documents.ref("schema").get(identifier) // Recherche chaßnée
documents.translated("schema", "id", "fr") // Récupération avec locale explicite
meta.locale // "en-US", "ar-SA", etc.
meta.params.xyz // ParamÚtre d'URL nommé "xyz"
meta.segments // Chemin d'URL sous forme de tableau : ["articles", "intro"]
meta.segments[0] // Premier segment du chemin
meta.docId // ID du document courant (ou null)
meta.title // Titre du document courant
doc.fieldName // Valeur du champ du document courant (en contexte éditeur)
// Comparaison
== != < <= > >=
// Logique
&& || !
// Ternaires (if-else)
condition ? valeurSiVrai : valeurSiFaux
// Appartenance
"value" in listOrMap
size(list) // Compter les éléments
size(string) // Longueur d'une chaĂźne
"text".startsWith("te") // true
"text".endsWith("xt") // true
"text".contains("ex") // true
has(object.property) // Vérifier si la propriété existe
hasProperty(obj, "key") // Vérifier si l'objet possÚde la clé (syntaxe alternative)
Si quelque chose se passe mal, vous verrez l'un de ceux-ci :
| Erreur | Signification |
|---|---|
SYNTAX_ERROR | Une faute de frappe dans votre script (guillemet manquant, opérateur incorrect) |
TYPE_ERROR | Vous mélangez des types incompatibles |
RUNTIME_ERROR | Le script s'est exécuté mais a rencontré un problÚme (variable indéfinie) |
FETCH_LIMIT_EXCEEDED | Vous récupérez trop de documents (max 50) |
TIMEOUT | Le script a mis trop de temps (max 5 secondes) |
AST_DEPTH_EXCEEDED | Expression trop imbriquée (profondeur max : 50) |
SCRIPT_TOO_LONG | Le script dépasse la limite de 5000 caractÚres |
Le moteur CEL est conçu pour ĂȘtre extensible. Les capacitĂ©s futures prĂ©vues incluent :
// Futur : appeler des services externes via MCP
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)
// Futur : génération de contenu assistée par IA
ai.summarize(documents.get("article", meta.params.id).body, 100)
ai.translate(meta.params.text, meta.params.targetLang)
ai.classify(meta.params.input, ["positive", "negative", "neutral"])
Ces capacités seront ajoutées via le systÚme de fonctions enregistrées, en maintenant la rétrocompatibilité avec les scripts existants.
documents. ou meta. et l'éditeur affichera les options disponiblesdocuments.get("schema", "id"), puis ajoutez .fieldName!= null ? ... : ...documents.get() ou documents.find() compte dans la limite de 50 récupérationshas(meta.params.category) avant d'y accéderCette section couvre des patrons avancés pour lier des documents entre eux et construire des structures de contenu relationnel.
La forme la plus simple : un document référence un autre par identifiant.
// L'article stocke l'ID de l'auteur, récupérer le nom de l'auteur
documents.get("author", documents.get("article", "intro").authorId).name
Pour une syntaxe plus claire lorsque l'identifiant est dynamique :
// Approche traditionnelle
documents.get("country", documents.get("airport", meta.params.code).countryCode).name
// Avec ref() - plus clair lorsque le schéma est connu mais l'identifiant est dynamique
documents.ref("country").get(documents.get("airport", meta.params.code).countryCode).name
Construisez des relations profondes en chaĂźnant plusieurs recherches :
// AĂ©roport â Pays â RĂ©gion â Continent
documents.get("continent",
documents.get("region",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).regionCode
).continentCode
).name
Combinez références de documents et traductions :
// Obtenir le nom localisé du pays pour un aéroport
documents.translated("country",
documents.get("airport", meta.params.code).countryCode,
meta.params.lang
).name
Le document stocke un ID qui référence un autre document.
// article / tech-news
{ "title": "Mise Ă jour tech", "authorId": "author-123", "categoryId": "cat-tech" }
// Résoudre le nom de l'auteur
documents.get("author", documents.get("article", meta.params.slug).authorId).name
// Résoudre la catégorie avec repli
documents.get("article", meta.params.slug).categoryId != null
? documents.get("category", documents.get("article", meta.params.slug).categoryId).name
: "Sans catégorie"
Les documents se référencent via des codes sémantiques plutÎt que des UUID.
// airport / JFK
{ "code": "JFK", "name": "John F. Kennedy International", "countryCode": "us" }
// country / us
{ "code": "us", "name": "Ătats-Unis", "currencyCode": "usd" }
// currency / usd
{ "code": "usd", "symbol": "$", "name": "Dollar américain" }
// ChaĂźne AĂ©roport â Pays â Devise
documents.get("currency",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).currencyCode
).symbol
// Pour JFK : renvoie "$"
Utilisez doc pour des champs calculés qui référencent d'autres documents en fonction des valeurs du document courant.
// Dans un document produit, récupérer les détails de la catégorie liée
documents.get("category", doc.categoryId).description
// Coût d'expédition calculé d'aprÚs le pays d'origine du produit
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight
Lorsque des documents se référencent mutuellement, faites attention aux limites de récupération.
// Récupérer l'auteur de l'article, puis les autres articles de cet auteur (surveillez le nombre de fetch)
documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })
Lorsque qu'un champ peut référencer différents schémas :
// content-block / hero-1
{ "type": "hero", "sourceType": "article", "sourceId": "welcome-post" }
// content-block / hero-2
{ "type": "hero", "sourceType": "product", "sourceId": "featured-item" }
// Recherche de schéma dynamique selon sourceType
documents.get("content-block", "hero-1").sourceType == "article"
? documents.get("article", documents.get("content-block", "hero-1").sourceId).headline
: documents.get("product", documents.get("content-block", "hero-1").sourceId).name
Chaque appel Ă documents.get(), documents.find() et documents.ref().get() est suivi pour l'invalidation de cache. Lorsqu'un document rĂ©fĂ©rencĂ© change, le CMS sait quelles expressions CEL doivent ĂȘtre réévaluĂ©es.
Les dépendances suivies incluent :
schema:identifier â DĂ©pendance Ă un document spĂ©cifiqueschema:identifier â Identique Ă get, via la syntaxe chaĂźnĂ©eschema:* â DĂ©pendance au niveau du schĂ©ma (tout document du schĂ©ma)// Mauvais : rĂ©cupĂšre le mĂȘme document deux fois
documents.get("author", documents.get("article", "intro").authorId).name + " - " +
documents.get("author", documents.get("article", "intro").authorId).bio
// Mieux : utilisez une condition pour vérifier une seule fois
documents.get("article", "intro").authorId != null
? documents.get("author", documents.get("article", "intro").authorId).name
: "Auteur inconnu"
Ce guide pas-à -pas crée une page de destination multilingue accessible à /{lang}/landingPage.
Dans l'administration du CMS, créez un schéma personnalisé nommé greeting :
{
"name": "greeting",
"fields": [
{ "name": "code", "type": "string", "required": true },
{ "name": "headline", "type": "string", "required": true },
{ "name": "subheadline", "type": "string" },
{ "name": "ctaText", "type": "string" },
{ "name": "ctaUrl", "type": "string" }
]
}
Créez des documents pour chaque langue :
Document : greeting/ko
{
"code": "ko",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/ko/get-started"
}
Document : greeting/en
{
"code": "en",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/en/get-started"
}
Document : greeting/ja
{
"code": "ja",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Start",
"ctaUrl": "/ja/get-started"
}
Créez une page avec la configuration suivante :
/{lang}/landingPagelang â le composant language {
"lang": "language"
}
Ajoutez un bloc héros à la route avec ces scripts CEL pour chaque champ :
Champ Headline :
documents.get("greeting", meta.params.lang).headline
Champ Subheadline :
documents.get("greeting", meta.params.lang).subheadline
Champ CTA Text :
documents.get("greeting", meta.params.lang).ctaText
Champ CTA URL :
documents.get("greeting", meta.params.lang).ctaUrl
Ajoutez une route catch-all. ParametricRoutePage rĂ©sout la page, extrait meta.params depuis l'URL, Ă©value vos liaisons CEL cĂŽtĂ© serveur et rend chaque bloc via votre registre â vous n'avez pas Ă construire le contexte meta ni Ă appeler directement le client bas niveau.
// app/[...slug]/page.tsx
import ParametricRoutePage from 'cms-renderer/lib/renderer';
import { registry } from '@/lib/registry';
import { cmsConfig } from '@/lib/cms-config';
export const dynamic = 'force-static';
interface PageProps {
params: Promise<{ slug: string[] }>;
}
export default async function Page({ params }: PageProps) {
const { slug } = await params;
return (
<ParametricRoutePage
registry={registry}
apiKey={cmsConfig.apiKey}
websiteId={cmsConfig.websiteId}
cmsUrl={cmsConfig.cmsUrl}
params={Promise.resolve({ slug })}
/>
);
}
Visitez ces URL pour voir le contenu localisé :
| URL | Titre attendu |
|---|---|
/ko/landingPage | íì |
/en/landingPage | Welcome |
/ja/landingPage | ăăăŁăăăăŸă |
Lorsqu'un utilisateur visite /ko/landingPage :
/{lang}/landingPagemeta.params.lang = "ko"languagedocuments.get("greeting", meta.params.lang) renvoient le contenu coréeninterface CelMeta {
/** Code de locale courant (par ex. 'en-US') */
locale: string;
/** ParamĂštres de route extraits de l'URL */
params: Record<string, string>;
/** Segments du chemin d'URL */
segments: string[];
/** ID du document courant (si édition d'un document existant) */
docId: string | null;
/** Titre du document courant */
title: string;
}
La fonction extractParams traite les chemins d'URL :
Motif : /{country}/{lang}/products
Chemin : /us/en/products
Algorithme :
1. Normaliser les deux (supprimer les barres obliques finales)
2. Diviser en segments : ["us", "en", "products"] et ["{country}", "{lang}", "products"]
3. Faire correspondre le nombre de segments (doit ĂȘtre identique)
4. Pour chaque paire de segments :
- Si le motif commence par : ou {}, extraire comme paramĂštre
- Sinon, la correspondance doit ĂȘtre exacte
5. Retourner : { country: "us", lang: "en" }
// Liaison simple (utilise le champ "code" pour la recherche)
{ "lang": "language" }
// Liaison détaillée (champ slug personnalisé)
{
"lang": {
"schemaName": "language",
"slugField": "code"
},
"slug": {
"schemaName": "article",
"slugField": "slug"
}
}
Lors d'une récupération via documents.get(schema, identifier) :
idcontent.codecontent.slugtitleCela permet des références de documents flexibles par n'importe quel identifiant unique.