[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fy255X33C2Q5YXPw0lNT85khFXDXVrtG0BZxRyd8T5z8":22,"megamenu":59,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":128,"footer-db":196,"$fDzLnnGtiwvX2NOeSVNf8pxVo0AafSH0EnVMo6dS-uPk":214,"header-db":228},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":33,"psVersions":34,"content":37,"faq":38,"tldr":54,"readingTime":55,"generatedAt":56,"publishDate":56,"relatedArticles":57,"sourceCategory":58},"Créer un champ multilingue dans un AdminController PrestaShop","creer-champ-multilingue-admincontroller-prestashop","Guide complet pour ajouter des champs multilingues dans un AdminController PrestaShop : table _lang, ObjectModel et formulaire avec gestion des langues.","developpement",[28,29,30,31,32],"AdminController","multilingue","ObjectModel","back-office","module","intermediaire",[35,36],"1.7","8.x","\u003Ch2>Introduction\u003C\u002Fh2>\n\u003Cp>Lorsque vous développez un module PrestaShop avec une interface d'administration personnalisée, vous aurez souvent besoin de gérer des contenus traduits dans plusieurs langues : descriptions, titres, labels… PrestaShop intègre nativement un mécanisme de champs multilingues dans ses \u003Ccode>AdminController\u003C\u002Fcode>, mais sa mise en place exige une architecture précise côté base de données et côté ObjectModel.\u003C\u002Fp>\n\u003Cp>Ce guide détaille les trois étapes indispensables : la création de la table \u003Ccode>_lang\u003C\u002Fcode>, la configuration du modèle objet, et le paramétrage du formulaire dans le contrôleur d'administration.\u003C\u002Fp>\n\u003Ch2>Étape 1 : Créer la table `_lang` en base de données\u003C\u002Fh2>\n\u003Cp>Le système multilingue de PrestaShop repose sur une convention stricte : pour chaque entité stockée dans une table principale (par exemple \u003Ccode>ps_mon_entite\u003C\u002Fcode>), les champs traduisibles sont isolés dans une table suffixée \u003Ccode>_lang\u003C\u002Fcode> (soit \u003Ccode>ps_mon_entite_lang\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>Cette table de langue doit obligatoirement contenir :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>La clé primaire de l'entité parente (`id_mon_entite`)\u003C\u002Fli>\n\u003Cli>L'identifiant de la langue (`id_lang`)\u003C\u002Fli>\n\u003Cli>Les colonnes traduisibles (titre, description, etc.)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Schéma SQL complet\u003C\u002Fh3>\n\u003Cp>Voici un exemple de script d'installation à placer dans la méthode \u003Ccode>install()\u003C\u002Fcode> de votre module :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nCREATE TABLE IF NOT EXISTS `_DB_PREFIX_mon_entite` (\n    `id_mon_entite` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,\n    `active` TINYINT(1) NOT NULL DEFAULT 1,\n    `date_add` DATETIME NOT NULL,\n    `date_upd` DATETIME NOT NULL,\n    PRIMARY KEY (`id_mon_entite`)\n) ENGINE=_MYSQL_ENGINE_ DEFAULT CHARSET=utf8mb4;\n\nCREATE TABLE IF NOT EXISTS `_DB_PREFIX_mon_entite_lang` (\n    `id_mon_entite` INT(11) UNSIGNED NOT NULL,\n    `id_lang` INT(11) UNSIGNED NOT NULL,\n    `title` VARCHAR(255) NOT NULL,\n    `description` TEXT,\n    PRIMARY KEY (`id_mon_entite`, `id_lang`)\n) ENGINE=_MYSQL_ENGINE_ DEFAULT CHARSET=utf8mb4;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Bonne pratique PrestaShop 8.x :\u003C\u002Fstrong> Utilisez systématiquement \u003Ccode>utf8mb4\u003C\u002Fcode> comme charset pour supporter les émojis et caractères spéciaux. Les anciennes versions utilisaient souvent \u003Ccode>utf8\u003C\u002Fcode> (alias de \u003Ccode>utf8mb3\u003C\u002Fcode>), ce qui provoquait des troncatures silencieuses.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>Prenez modèle sur les tables natives comme \u003Ccode>ps_category_lang\u003C\u002Fcode> ou \u003Ccode>ps_product_lang\u003C\u002Fcode> pour vous assurer de respecter la convention.\u003C\u002Fp>\n\u003Ch2>Étape 2 : Configurer l'ObjectModel avec les définitions multilingues\u003C\u002Fh2>\n\u003Cp>L'\u003Ccode>ObjectModel\u003C\u002Fcode> est le cœur du mécanisme. C'est lui qui indique à PrestaShop quels champs sont traduisibles et comment les persister dans la table \u003Ccode>_lang\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>La clé est le paramètre \u003Ccode>'lang' => true\u003C\u002Fcode> dans la définition des champs :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nclass MonEntite extends ObjectModel\n{\n    public $id_mon_entite;\n    public $active;\n    public $title;\n    public $description;\n    public $date_add;\n    public $date_upd;\n\n    public static $definition = [\n        'table' =&gt; 'mon_entite',\n        'primary' =&gt; 'id_mon_entite',\n        'multilang' =&gt; true,\n        'fields' =&gt; [\n            'active' =&gt; [\n                'type' =&gt; self::TYPE_BOOL,\n                'validate' =&gt; 'isBool',\n                'required' =&gt; true,\n            ],\n            'date_add' =&gt; [\n                'type' =&gt; self::TYPE_DATE,\n                'validate' =&gt; 'isDate',\n            ],\n            'date_upd' =&gt; [\n                'type' =&gt; self::TYPE_DATE,\n                'validate' =&gt; 'isDate',\n            ],\n            \u002F\u002F Champs multilingues\n            'title' =&gt; [\n                'type' =&gt; self::TYPE_STRING,\n                'lang' =&gt; true,\n                'validate' =&gt; 'isGenericName',\n                'size' =&gt; 255,\n                'required' =&gt; true,\n            ],\n            'description' =&gt; [\n                'type' =&gt; self::TYPE_HTML,\n                'lang' =&gt; true,\n                'validate' =&gt; 'isCleanHtml',\n            ],\n        ],\n    ];\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Points critiques à ne pas oublier\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**`'multilang' => true`** au niveau de la définition globale : sans cette directive, PrestaShop ne cherchera jamais la table `_lang`.\u003C\u002Fli>\n\u003Cli>**`'lang' => true`** sur chaque champ traduisible : c'est ce flag qui détermine dans quelle table le champ est stocké.\u003C\u002Fli>\n\u003Cli>**Les propriétés publiques** doivent exister pour chaque champ, y compris les champs multilingues. Lorsqu'ils sont chargés, ces champs deviennent des tableaux indexés par `id_lang` (ex : `$obj->title[1]` pour le français).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Gestion du multiboutique\u003C\u002Fh3>\n\u003Cp>Si votre module doit aussi supporter le multiboutique, ajoutez \u003Ccode>'multishop' => true\u003C\u002Fcode> et créez une table \u003Ccode>_shop\u003C\u002Fcode> supplémentaire :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic static $definition = [\n    'table' =&gt; 'mon_entite',\n    'primary' =&gt; 'id_mon_entite',\n    'multilang' =&gt; true,\n    'multishop' =&gt; true,\n    \u002F\u002F ...\n];\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>PrestaShop cherchera alors automatiquement \u003Ccode>ps_mon_entite_shop\u003C\u002Fcode> et \u003Ccode>ps_mon_entite_lang\u003C\u002Fcode> (voire \u003Ccode>ps_mon_entite_lang_shop\u003C\u002Fcode> si les traductions varient par boutique).\u003C\u002Fp>\n\u003Ch2>Étape 3 : Déclarer le champ multilingue dans le formulaire AdminController\u003C\u002Fh2>\n\u003Cp>Dans votre \u003Ccode>AdminController\u003C\u002Fcode>, la méthode \u003Ccode>renderForm()\u003C\u002Fcode> utilise un tableau \u003Ccode>$this->fields_form\u003C\u002Fcode> pour générer l'interface. Pour activer le sélecteur de langue sur un champ, il suffit d'ajouter \u003Ccode>'lang' => true\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nclass AdminMonEntiteController extends AdminController\n{\n    public function __construct()\n    {\n        $this-&gt;table = 'mon_entite';\n        $this-&gt;className = 'MonEntite';\n        $this-&gt;identifier = 'id_mon_entite';\n        $this-&gt;bootstrap = true;\n        $this-&gt;lang = true;\n\n        parent::__construct();\n    }\n\n    public function renderForm()\n    {\n        $this-&gt;fields_form = [\n            'legend' =&gt; [\n                'title' =&gt; $this-&gt;l('Mon Entité'),\n                'icon' =&gt; 'icon-pencil',\n            ],\n            'input' =&gt; [\n                [\n                    'type' =&gt; 'text',\n                    'lang' =&gt; true,\n                    'label' =&gt; $this-&gt;l('Titre'),\n                    'name' =&gt; 'title',\n                    'required' =&gt; true,\n                    'col' =&gt; 6,\n                ],\n                [\n                    'type' =&gt; 'textarea',\n                    'lang' =&gt; true,\n                    'label' =&gt; $this-&gt;l('Description'),\n                    'name' =&gt; 'description',\n                    'autoload_rte' =&gt; true,\n                    'required' =&gt; false,\n                    'cols' =&gt; 40,\n                    'rows' =&gt; 10,\n                ],\n                [\n                    'type' =&gt; 'switch',\n                    'label' =&gt; $this-&gt;l('Actif'),\n                    'name' =&gt; 'active',\n                    'values' =&gt; [\n                        ['id' =&gt; 'active_on', 'value' =&gt; 1, 'label' =&gt; $this-&gt;l('Oui')],\n                        ['id' =&gt; 'active_off', 'value' =&gt; 0, 'label' =&gt; $this-&gt;l('Non')],\n                    ],\n                ],\n            ],\n            'submit' =&gt; [\n                'title' =&gt; $this-&gt;l('Enregistrer'),\n            ],\n        ];\n\n        return parent::renderForm();\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Détail des paramètres du champ textarea multilingue\u003C\u002Fh3>\n\u003Ctr>\u003Cth>Paramètre\u003C\u002Fth>\u003Cth>Rôle\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`'lang' => true`\u003C\u002Fth>\u003Cth>Active le sélecteur de langue et lie le champ à la table `_lang`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`'autoload_rte' => true`\u003C\u002Fth>\u003Cth>Charge l'éditeur WYSIWYG TinyMCE automatiquement\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`'cols'` \u002F `'rows'`\u003C\u002Fth>\u003Cth>Dimensions par défaut du textarea (avant chargement TinyMCE)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`'required' => false`\u003C\u002Fth>\u003Cth>Le champ n'est pas obligatoire pour la validation\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Important :\u003C\u002Fstrong> N'oubliez pas \u003Ccode>$this->lang = true;\u003C\u002Fcode> dans le constructeur du contrôleur. Sans cette propriété, PrestaShop ne générera pas le sélecteur de langue même si vos champs sont déclarés avec \u003Ccode>'lang' => true\u003C\u002Fcode>.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Checklist récapitulative\u003C\u002Fh2>\n\u003Cp>Avant de tester votre formulaire multilingue, vérifiez ces points dans l'ordre :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Table `_lang` créée** avec la clé primaire composite (`id_entite`, `id_lang`)\u003C\u002Fli>\n\u003Cli>**`'multilang' => true`** dans la définition statique de l'ObjectModel\u003C\u002Fli>\n\u003Cli>**`'lang' => true`** sur chaque champ traduisible dans `$definition['fields']`\u003C\u002Fli>\n\u003Cli>**Propriétés publiques** déclarées dans la classe pour chaque champ\u003C\u002Fli>\n\u003Cli>**`$this->lang = true`** dans le constructeur de l'AdminController\u003C\u002Fli>\n\u003Cli>**`'lang' => true`** sur chaque input du formulaire `fields_form`\u003C\u002Fli>\n\u003Cli>**Charset `utf8mb4`** sur la table `_lang` pour éviter les problèmes d'encodage\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Si le sélecteur de langue n'apparaît pas ou que les traductions ne se sauvegardent pas, reprenez cette checklist point par point : dans 90 % des cas, c'est l'un de ces éléments qui manque.\u003C\u002Fp>\n\u003Ch2>Différences entre PrestaShop 1.7 et 8.x\u003C\u002Fh2>\n\u003Cp>Le mécanisme des \u003Ccode>AdminController\u003C\u002Fcode> legacy reste fonctionnel en PrestaShop 8.x et la syntaxe décrite ci-dessus est toujours valide. Cependant, PrestaShop 8 introduit progressivement les formulaires Symfony via le pattern CQRS. Pour les nouveaux développements sur PrestaShop 8.x, vous pouvez également utiliser :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Les `FormType` Symfony avec `TranslateType` ou `TranslatableType`\u003C\u002Fli>\n\u003Cli>Les `CommandHandler` pour la persistance\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Le choix entre l'approche legacy (\u003Ccode>AdminController\u003C\u002Fcode>) et l'approche Symfony dépend du contexte : si votre module doit rester compatible PrestaShop 1.7, l'approche legacy reste le choix le plus pragmatique.\u003C\u002Fp>",[39,42,45,48,51],{"q":40,"a":41},"Pourquoi mon champ multilingue ne s'affiche qu'en une seule langue dans le back-office PrestaShop ?","Ce problème survient généralement lorsque la propriété `$this->lang = true` n'est pas définie dans le constructeur de votre AdminController, ou lorsque le paramètre `'multilang' => true` est absent de la définition statique de votre ObjectModel. Ces deux déclarations sont indispensables pour que PrestaShop génère le sélecteur de langue et charge les traductions depuis la table `_lang`.",{"q":43,"a":44},"Comment créer correctement la table _lang pour un module PrestaShop personnalisé ?","La table `_lang` doit porter exactement le même nom que votre table principale suivi du suffixe `_lang` (exemple : `ps_mon_entite_lang`). Elle doit contenir une clé primaire composite composée de l'identifiant de l'entité (`id_mon_entite`) et de l'identifiant de la langue (`id_lang`), plus toutes les colonnes traduisibles. Utilisez le charset `utf8mb4` et prenez modèle sur `ps_category_lang` ou `ps_product_lang`.",{"q":46,"a":47},"Peut-on combiner champs multilingues et multiboutique dans un même ObjectModel PrestaShop ?","Oui, PrestaShop supporte la combinaison des deux. Ajoutez `'multilang' => true` et `'multishop' => true` dans votre définition statique, puis créez les tables `_lang`, `_shop` et éventuellement `_lang_shop` si les traductions doivent varier par boutique. La table `_lang_shop` utilise une clé primaire triple : `id_entite`, `id_lang` et `id_shop`.",{"q":49,"a":50},"Comment activer l'éditeur WYSIWYG TinyMCE sur un champ multilingue dans un AdminController ?","Dans la déclaration du champ au sein de `$this->fields_form`, utilisez `'type' => 'textarea'` combiné avec `'autoload_rte' => true` et `'lang' => true`. PrestaShop chargera automatiquement TinyMCE pour chaque version linguistique du champ. Assurez-vous que le type du champ dans l'ObjectModel est bien `self::TYPE_HTML` avec la validation `isCleanHtml`.",{"q":52,"a":53},"Les AdminController multilingues fonctionnent-ils encore sous PrestaShop 8 ?","Oui, les AdminController legacy avec gestion multilingue restent pleinement fonctionnels sous PrestaShop 8.x. La syntaxe `'lang' => true` dans les formulaires et les ObjectModel n'a pas changé. Cependant, pour les nouveaux développements ciblant exclusivement PrestaShop 8, vous pouvez opter pour les formulaires Symfony avec `TranslatableType`, qui offrent une meilleure intégration avec l'architecture moderne du back-office.","Pour créer un champ multilingue dans un AdminController PrestaShop, trois éléments sont indispensables : une table `_lang` en base de données avec clé composite, un ObjectModel déclaré avec `'multilang' => true` et `'lang' => true` sur chaque champ traduisible, et le paramètre `'lang' => true` dans la définition du formulaire du contrôleur.",6,"2026-03-21T16:12:43.000Z",[],"PrestaShop pour les développeurs",{"items":60},[61,72,80,88,96,105,113,120],{"id":62,"type":63,"label":64,"href":66,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":69,"children":70,"psChildren":71},41,"link",{"fr":65},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":73,"type":63,"label":74,"href":76,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":77,"children":78,"psChildren":79},42,{"fr":75},"Blog","\u002Fblog",1,[],[],{"id":81,"type":63,"label":82,"href":84,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":85,"children":86,"psChildren":87},43,{"fr":83},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":89,"type":63,"label":90,"href":92,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":93,"children":94,"psChildren":95},44,{"fr":91},"Outils IA","\u002Foutils-ia",3,[],[],{"id":97,"type":63,"label":98,"href":100,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":101,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":102,"children":103,"psChildren":104},45,{"fr":99},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},4,[],[],{"id":106,"type":63,"label":107,"href":109,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":110,"children":111,"psChildren":112},46,{"fr":108},"Academy","\u002Facademy",5,[],[],{"id":114,"type":63,"label":115,"href":117,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":55,"children":118,"psChildren":119},47,{"fr":116},"À propos","\u002Fa-propos",[],[],{"id":121,"type":63,"label":122,"href":124,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":125,"children":126,"psChildren":127},48,{"fr":123},"Contact","\u002Fcontact",7,[],[],{"columns":129},[130,142,172,188],{"title":131,"links":132},"Plateforme",[133,135,138,139],{"label":134,"href":100,"external":68},"Offre Starter (2 500 €)",{"label":136,"href":137,"external":68},"Devenir Ambassadeur","\u002Fambassadeur",{"label":83,"href":84,"external":68},{"label":140,"href":141,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":143,"links":144},"Le Synedre",[145,148,151,154,157,160,163,166,169],{"label":146,"href":147,"external":68},"L'histoire","\u002Fsynedre",{"label":149,"href":150,"external":68},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":152,"href":153,"external":68},"L'équipe","\u002Fequipe",{"label":155,"href":156,"external":68},"Le réacteur en direct","\u002Freacteur",{"label":158,"href":159,"external":68},"Le Drill (entraînement)","\u002Fdrill",{"label":161,"href":162,"external":68},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":164,"href":165,"external":68},"Les agents IA","\u002Fagents-ia",{"label":167,"href":168,"external":68},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":170,"href":171,"external":68},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":173,"links":174},"Ressources",[175,176,177,180,182,185],{"label":75,"href":76,"external":68},{"label":108,"href":109,"external":68},{"label":178,"href":179,"external":68},"Dictionnaire","\u002Fdictionnaire",{"label":181,"href":66,"external":68},"Expertise PrestaShop",{"label":183,"href":184,"external":68},"Flywheel","\u002Fflywheel",{"label":186,"href":187,"external":68},"Manifeste","\u002Fmanifeste",{"title":116,"links":189},[190,192,195],{"label":191,"href":117,"external":68},"Alexandre Carette",{"label":193,"href":194,"external":68},"Dossier de presse","\u002Fpresse",{"label":123,"href":124,"external":68},{"footer":197},{"theme":198,"description":67,"hours":67,"logo":199,"contact":202,"social":203,"bottomBar":213},"dark",{"src":200,"href":201,"alt":191},"\u002Flogo-ac.svg","\u002F",{"email":67,"phone":67,"address":67,"cta":67},[204,207,210],{"platform":205,"href":206,"label":205},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":208,"href":209,"label":208},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":211,"href":212,"label":211},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":67},{"academy":215,"blog":216,"expertise":227},[],[217,221,224],{"title":218,"url":219,"score":77,"type":220},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":222,"url":223,"score":77,"type":220},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":225,"url":226,"score":77,"type":220},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":229},{"logo":230,"topBar":233,"contactEmail":236,"features":237,"navBar":67},{"src":200,"alt":231,"text":191,"href":201,"class":232},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":67,"showLanguages":68,"align":234,"languages":235},"left",[],"contact@alexandrecarette.fr",{"showSearch":68,"showWishlist":68,"showLogin":20,"showContact":68,"showCart":68,"stickyHeader":20,"headerLayout":238},"inline"]