[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":22,"$f8-2FzUWKZgpzHFwokoAABDKPplqmeN9LdiEcMRSAjz4":103,"megamenu":172,"footer-db":228,"header-db":246,"$fHiH26XXTAR8sJcrTMB3EgC45dVUGb2CbDNnMITDvwv4":257},{"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",{"columns":23},[24,40,70,91],{"title":25,"links":26},"Plateforme",[27,31,34,37],{"label":28,"href":29,"external":30},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":32,"href":33,"external":30},"Devenir Ambassadeur","\u002Fambassadeur",{"label":35,"href":36,"external":30},"Modules PrestaShop","\u002Fmodules",{"label":38,"href":39,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":41,"links":42},"Le Synedre",[43,46,49,52,55,58,61,64,67],{"label":44,"href":45,"external":30},"L'histoire","\u002Fsynedre",{"label":47,"href":48,"external":30},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":50,"href":51,"external":30},"L'équipe","\u002Fequipe",{"label":53,"href":54,"external":30},"Le réacteur en direct","\u002Freacteur",{"label":56,"href":57,"external":30},"Le Drill (entraînement)","\u002Fdrill",{"label":59,"href":60,"external":30},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":62,"href":63,"external":30},"Les agents IA","\u002Fagents-ia",{"label":65,"href":66,"external":30},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":68,"href":69,"external":30},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":71,"links":72},"Ressources",[73,76,79,82,85,88],{"label":74,"href":75,"external":30},"Blog","\u002Fblog",{"label":77,"href":78,"external":30},"Academy","\u002Facademy",{"label":80,"href":81,"external":30},"Dictionnaire","\u002Fdictionnaire",{"label":83,"href":84,"external":30},"Expertise PrestaShop","\u002Fexpertise",{"label":86,"href":87,"external":30},"Flywheel","\u002Fflywheel",{"label":89,"href":90,"external":30},"Manifeste","\u002Fmanifeste",{"title":92,"links":93},"À propos",[94,97,100],{"label":95,"href":96,"external":30},"Alexandre Carette","\u002Fa-propos",{"label":98,"href":99,"external":30},"Dossier de presse","\u002Fpresse",{"label":101,"href":102,"external":30},"Contact","\u002Fcontact",{"title":104,"slug":105,"metaDescription":106,"category":107,"tags":108,"difficulty":115,"psVersions":116,"content":120,"faq":121,"tldr":167,"readingTime":168,"generatedAt":169,"publishDate":169,"relatedArticles":170,"sourceCategory":171},"Gérer les traductions dans les templates Smarty PrestaShop","gerer-traductions-templates-smarty-prestashop","Apprenez à traduire vos textes dans les fichiers TPL PrestaShop : balise {l}, traductions de modules, conditions Smarty et bonnes pratiques multilingues.","developpement",[109,110,111,112,113,114],"smarty","traduction","tpl","multilingue","module","internationalisation","intermediaire",[117,118,119],"1.6","1.7","8.x","\u003Ch2>Introduction\u003C\u002Fh2>\n\u003Cp>Lorsqu'on développe un module ou qu'on personnalise un thème PrestaShop, la gestion des traductions dans les fichiers \u003Ccode>.tpl\u003C\u002Fcode> est un passage obligé. La balise Smarty \u003Ccode>{l}\u003C\u002Fcode> est l'outil central du système d'internationalisation de PrestaShop, mais son fonctionnement recèle quelques subtilités qui piègent régulièrement les développeurs — notamment l'impossibilité d'y injecter directement des variables Smarty.\u003C\u002Fp>\n\u003Cp>Cet article détaille les différentes approches pour rendre vos templates multilingues, du mécanisme natif \u003Ccode>{l}\u003C\u002Fcode> aux alternatives plus avancées comme \u003Ccode>sprintf\u003C\u002Fcode> et les paramètres dynamiques.\u003C\u002Fp>\n\u003Ch2>Comprendre la balise `{l}` de PrestaShop\u003C\u002Fh2>\n\u003Ch3>Fonctionnement de base\u003C\u002Fh3>\n\u003Cp>La balise \u003Ccode>{l}\u003C\u002Fcode> est un plugin Smarty enregistré par PrestaShop. Elle sert à marquer une chaîne comme traduisible afin qu'elle soit collectée par le système de traduction du back-office.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{l s='Add to cart'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le paramètre \u003Ccode>s\u003C\u002Fcode> contient la chaîne source (généralement en anglais). PrestaShop recherche ensuite la traduction correspondante dans la langue active de la boutique.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Point crucial :\u003C\u002Fstrong> la valeur de \u003Ccode>s\u003C\u002Fcode> doit être une chaîne littérale, pas une variable Smarty. Le parseur de traduction de PrestaShop scanne les fichiers TPL de manière statique pour extraire les chaînes traduisibles. Une variable comme \u003Ccode>{l s=$maVariable}\u003C\u002Fcode> ne sera jamais détectée lors de l'extraction.\u003C\u002Fp>\n\u003Ch3>Traductions dans un module\u003C\u002Fh3>\n\u003Cp>Pour les templates de modules, le paramètre \u003Ccode>mod\u003C\u002Fcode> est indispensable. Sans lui, PrestaShop ne saura pas dans quel contexte chercher la traduction :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{l s='My custom text' mod='mon_module'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La valeur de \u003Ccode>mod\u003C\u002Fcode> doit correspondre exactement au nom technique du module (le nom du dossier dans \u003Ccode>\u002Fmodules\u002F\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3>Traductions dans un thème (PrestaShop 1.7+)\u003C\u002Fh3>\n\u003Cp>Depuis PrestaShop 1.7, les templates de thème utilisent le paramètre \u003Ccode>d\u003C\u002Fcode> (domain) à la place de \u003Ccode>mod\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{l s='My custom text' d='Shop.Theme.Actions'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Les domaines de traduction suivent une convention hiérarchique (\u003Ccode>Shop.Theme.*\u003C\u002Fcode>, \u003Ccode>Shop.Forms.*\u003C\u002Fcode>, \u003Ccode>Modules.MonModule.*\u003C\u002Fcode>, etc.).\u003C\u002Fp>\n\u003Ch2>Méthode recommandée : le workflow de traduction natif\u003C\u002Fh2>\n\u003Cp>La façon la plus propre de gérer le multilingue dans vos templates est d'exploiter le workflow natif de PrestaShop :\u003C\u002Fp>\n\u003Ch3>Étape 1 : Déclarer vos chaînes en anglais\u003C\u002Fh3>\n\u003Cp>Écrivez toutes vos chaînes en anglais dans le fichier TPL :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* Module *}\n{l s='Free shipping on orders over 50€' mod='mon_module'}\n\n{* Thème (PS 1.7+) *}\n{l s='Free shipping on orders over 50€' d='Shop.Theme.Checkout'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 2 : Traduire via le back-office\u003C\u002Fh3>\n\u003Cp>Rendez-vous dans \u003Cstrong>International > Traductions\u003C\u002Fstrong> et sélectionnez :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Type de traduction :** « Traductions de modules installés » (pour un module) ou « Traductions du thème » (pour un thème)\u003C\u002Fli>\n\u003Cli>**Module \u002F Thème :** sélectionnez le vôtre\u003C\u002Fli>\n\u003Cli>**Langue :** la langue cible\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>PrestaShop affiche alors toutes les chaînes détectées avec un champ pour saisir la traduction. Ce mécanisme fonctionne parce que PrestaShop scanne le contenu des paramètres \u003Ccode>s\u003C\u002Fcode> dans vos fichiers \u003Ccode>.tpl\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Étape 3 : Vider le cache\u003C\u002Fh3>\n\u003Cp>Après avoir sauvegardé vos traductions, videz le cache de PrestaShop pour que les modifications prennent effet :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Back-office :** Paramètres avancés > Performances > Vider le cache\u003C\u002Fli>\n\u003Cli>**Ligne de commande (PS 8.x) :** `php bin\u002Fconsole cache:clear`\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Injecter des valeurs dynamiques dans les traductions\u003C\u002Fh2>\n\u003Cp>Si vous devez inclure une valeur variable dans une chaîne traduite — par exemple un nom de produit ou un montant — la balise \u003Ccode>{l}\u003C\u002Fcode> offre un mécanisme de substitution via \u003Ccode>sprintf\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>PrestaShop 1.6\u003C\u002Fh3>\n\u003Cp>Utilisez le paramètre \u003Ccode>sprintf\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{l s='Welcome, %s! You have %d items in your cart.' sprintf=[$customer_name, $cart_count] mod='mon_module'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>PrestaShop 1.7 \u002F 8.x\u003C\u002Fh3>\n\u003Cp>La syntaxe recommandée utilise des placeholders nommés avec le paramètre \u003Ccode>sprintf\u003C\u002Fcode> sous forme de tableau associatif :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{l\n  s='Welcome, [1]%name%[\u002F1]! You have %count% items in your cart.'\n  sprintf=['%name%' =&gt; $customer_name, '%count%' =&gt; $cart_count]\n  d='Modules.MonModule.Shop'\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche résout élégamment le problème initial : on n'injecte pas de variable dans \u003Ccode>s\u003C\u002Fcode>, mais on utilise des placeholders que \u003Ccode>sprintf\u003C\u002Fcode> remplace à l'exécution.\u003C\u002Fp>\n\u003Ch2>Alternative : les conditions Smarty pour le multilingue\u003C\u002Fh2>\n\u003Cp>Dans certains cas très spécifiques — par exemple du contenu HTML riche qui ne se prête pas bien au système de traduction — on peut recourir aux conditions Smarty basées sur la langue active :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{if $language.id == 1}\n  &lt;p&gt;Bienvenue sur notre boutique !&lt;\u002Fp&gt;\n{elseif $language.id == 2}\n  &lt;p&gt;Welcome to our shop!&lt;\u002Fp&gt;\n{else}\n  &lt;p&gt;Willkommen in unserem Shop!&lt;\u002Fp&gt;\n{\u002Fif}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Attention :\u003C\u002Fstrong> cette méthode est un dernier recours. Elle présente plusieurs inconvénients majeurs :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Les traductions ne sont pas centralisées dans le back-office\u003C\u002Fli>\n\u003Cli>L'ajout d'une nouvelle langue impose de modifier le code\u003C\u002Fli>\n\u003Cli>Les identifiants de langue sont susceptibles de varier d'une installation à l'autre\u003C\u002Fli>\n\u003Cli>Le template devient rapidement illisible avec de nombreuses langues\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Pour un code maintenable et professionnel, privilégiez systématiquement la balise \u003Ccode>{l}\u003C\u002Fcode> avec \u003Ccode>sprintf\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Bonnes pratiques pour les traductions PrestaShop\u003C\u002Fh2>\n\u003Ch3>1. Toujours écrire les chaînes source en anglais\u003C\u002Fh3>\n\u003Cp>L'anglais est la langue de référence dans l'écosystème PrestaShop. Écrire vos chaînes en anglais garantit la compatibilité avec les outils de traduction communautaires et facilite la collaboration internationale.\u003C\u002Fp>\n\u003Ch3>2. Exporter vos traductions\u003C\u002Fh3>\n\u003Cp>Utilisez le système d'export de PrestaShop pour sauvegarder vos traductions. En PrestaShop 8.x, les traductions sont stockées dans la base de données (table \u003Ccode>ps_translation\u003C\u002Fcode>) et peuvent être exportées au format XLF.\u003C\u002Fp>\n\u003Ch3>3. Utiliser les domaines de traduction (PS 1.7+)\u003C\u002Fh3>\n\u003Cp>Les domaines (\u003Ccode>d='Shop.Theme.Actions'\u003C\u002Fcode>) organisent vos traductions par contexte fonctionnel. Respectez la convention de nommage officielle pour maintenir la cohérence.\u003C\u002Fp>\n\u003Ch3>4. Ne jamais concaténer des chaînes traduites\u003C\u002Fh3>\n\u003Cp>Évitez absolument ce pattern :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* ❌ MAUVAISE PRATIQUE *}\n{l s='Bonjour' mod='mon_module'} {$name}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Préférez :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* ✅ BONNE PRATIQUE *}\n{l s='Hello %s' sprintf=[$name] mod='mon_module'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La concaténation casse la structure grammaticale dans les langues où l'ordre des mots diffère du français ou de l'anglais.\u003C\u002Fp>\n\u003Ch3>5. Fichiers de traduction dans les modules\u003C\u002Fh3>\n\u003Cp>Pour distribuer un module avec ses traductions pré-remplies, créez les fichiers dans le dossier \u003Ccode>translations\u002F\u003C\u002Fcode> de votre module :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\nmodules\u002Fmon_module\u002F\n├── translations\u002F\n│   ├── fr.php    (PS 1.6)\n│   └── fr-FR\u002F    (PS 1.7+, format XLF ou XLIFF)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Migration vers PrestaShop 8.x : ce qui change\u003C\u002Fh2>\n\u003Cp>PrestaShop 8.x poursuit la transition vers le système de traduction Symfony. Les points d'attention :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Nouveaux domaines :** le catalogue de domaines de traduction s'est enrichi. Consultez la documentation officielle pour les correspondances.\u003C\u002Fli>\n\u003Cli>**Format XLIFF :** les fichiers de traduction utilisent désormais le format `.xlf` (standard Symfony).\u003C\u002Fli>\n\u003Cli>**Console Symfony :** la commande `php bin\u002Fconsole translation:extract` permet d'extraire automatiquement les chaînes traduisibles.\u003C\u002Fli>\n\u003Cli>**Rétrocompatibilité :** la balise `{l s='' mod=''}` reste fonctionnelle dans les modules, mais `{l s='' d=''}` est recommandé pour tout nouveau développement.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Résumé des syntaxes par version\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Version\u003C\u002Fth>\u003Cth>Module\u003C\u002Fth>\u003Cth>Thème\u003C\u002Fth>\u003Cth>Variables dynamiques\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.6\u003C\u002Fth>\u003Cth>`{l s='...' mod='nom'}`\u003C\u002Fth>\u003Cth>`{l s='...'}`\u003C\u002Fth>\u003Cth>`sprintf=[$var]`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.7\u003C\u002Fth>\u003Cth>`{l s='...' mod='nom'}`\u003C\u002Fth>\u003Cth>`{l s='...' d='Shop.Theme.*'}`\u003C\u002Fth>\u003Cth>`sprintf=['%key%' => $var]`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 8.x\u003C\u002Fth>\u003Cth>`{l s='...' d='Modules.Nom.*'}`\u003C\u002Fth>\u003Cth>`{l s='...' d='Shop.Theme.*'}`\u003C\u002Fth>\u003Cth>`sprintf=['%key%' => $var]`\u003C\u002Fth>\u003C\u002Ftr>",[122,125,128,131,134,137,140,143,146,149,152,155,158,161,164],{"q":123,"a":124},"Peut-on utiliser une variable Smarty dans la balise {l s=''} de PrestaShop ?","Non, le paramètre `s` de la balise `{l}` doit contenir une chaîne littérale, pas une variable. Le système de traduction scanne les fichiers TPL de manière statique pour extraire les chaînes. Pour injecter des valeurs dynamiques, utilisez le paramètre `sprintf` : `{l s='Bonjour %s' sprintf=[$name] mod='mon_module'}`.",{"q":126,"a":127},"Où traduire les textes d'un module PrestaShop dans le back-office ?","Rendez-vous dans International > Traductions, sélectionnez « Traductions de modules installés » comme type de traduction, choisissez votre module et la langue cible. PrestaShop affichera toutes les chaînes détectées dans vos fichiers TPL avec un champ de saisie pour chaque traduction.",{"q":129,"a":130},"Quelle est la différence entre les paramètres mod et d dans la balise {l} ?","Le paramètre `mod` (module) est utilisé dans PrestaShop 1.6 et reste compatible en 1.7\u002F8.x pour les modules. Le paramètre `d` (domain) est le système moderne introduit en 1.7, basé sur les domaines de traduction Symfony (ex: `Shop.Theme.Actions`). Pour tout nouveau développement, préférez `d` qui offre une organisation plus fine des traductions.",{"q":132,"a":133},"Comment gérer les traductions avec des valeurs dynamiques dans PrestaShop 8 ?","Utilisez des placeholders nommés dans votre chaîne et le paramètre `sprintf` pour les remplacer : `{l s='Bienvenue %name%, vous avez %count% articles' sprintf=['%name%' => $customer_name, '%count%' => $nb_products] d='Modules.MonModule.Shop'}`. Cette approche est compatible avec tous les outils de traduction et respecte l'ordre des mots variable selon les langues.",{"q":135,"a":136},"Pourquoi mes traductions ne s'affichent pas après modification dans le back-office ?","La cause la plus fréquente est le cache. Videz le cache de PrestaShop (Paramètres avancés > Performances > Vider le cache) ou en ligne de commande avec `php bin\u002Fconsole cache:clear`. Vérifiez également que le paramètre `mod` correspond exactement au nom technique de votre module et que la compilation Smarty est désactivée en développement.",{"q":138,"a":139},"Faut-il écrire les chaînes de traduction en français ou en anglais ?","Toujours en anglais. C'est la convention de l'écosystème PrestaShop et la langue de référence du core. Écrire en anglais facilite la collaboration avec des développeurs internationaux, la compatibilité avec les outils de traduction communautaires, et garantit un fallback lisible si une traduction manque.",{"q":141,"a":142},"Comment exporter et sauvegarder les traductions d'un module PrestaShop ?","En PrestaShop 1.7\u002F8.x, les traductions sont stockées en base de données dans la table `ps_translation`. Pour les exporter, utilisez la commande Symfony `php bin\u002Fconsole translation:extract --dir=modules\u002Fmon_module`. Vous pouvez aussi créer manuellement les fichiers XLIFF dans le dossier `translations\u002Ffr-FR\u002F` de votre module pour les distribuer avec les traductions pré-remplies.",{"q":144,"a":145},"Comment afficher un texte différent selon la langue sans utiliser le système de traduction ?","Vous pouvez utiliser des conditions Smarty : `{if $language.id == 1}Texte français{elseif $language.id == 2}English text{\u002Fif}`. Cependant, cette méthode est déconseillée car elle rend le code difficile à maintenir, les traductions ne sont pas centralisées, et les identifiants de langue peuvent varier entre installations. Privilégiez toujours la balise `{l}` avec `sprintf`.",{"q":147,"a":148},"La balise {l} fonctionne-t-elle dans les fichiers .twig de PrestaShop 8 ?","Non, `{l}` est une balise Smarty. Dans les templates Twig (utilisés dans le back-office et progressivement en front), utilisez le filtre `trans` de Symfony : `{{ 'Mon texte'|trans({}, 'Modules.MonModule.Admin') }}`. Le principe reste le même : chaîne littérale en source, domaine de traduction, et paramètres pour les valeurs dynamiques.",{"q":150,"a":151},"Comment éviter les erreurs de traduction lors d'une migration PrestaShop 1.6 vers 8.x ?","Lors de la migration, les anciennes traductions avec `mod` restent fonctionnelles mais il est recommandé de migrer vers les domaines `d`. Exportez d'abord toutes vos traductions existantes, puis convertissez les fichiers PHP en format XLIFF. Testez chaque page pour détecter les chaînes non traduites. L'outil `php bin\u002Fconsole translation:extract` vous aidera à identifier les chaînes manquantes.",{"q":153,"a":154},"Comment traduire les textes ajoutés en JavaScript dans un module PrestaShop ?","Passez les traductions depuis le TPL vers JavaScript via des variables globales ou des attributs data. Par exemple : `\u003Cdiv id='mon-module' data-msg-success='{l s=\"Success\" mod=\"mon_module\"}'>\u003C\u002Fdiv>`, puis en JS : `document.getElementById('mon-module').dataset.msgSuccess`. En PrestaShop 8.x, vous pouvez aussi utiliser le service de traduction JavaScript intégré au back-office.",{"q":156,"a":157},"Pourquoi le back-office ne détecte-t-il pas certaines chaînes de traduction ?","Le scanner de PrestaShop cherche des patterns stricts comme `{l s='...' mod='...'}`. Les causes fréquentes de non-détection : chaîne sur plusieurs lignes, utilisation de guillemets doubles au lieu de simples, variable dans le paramètre `s`, nom de module incorrect dans `mod`, ou fichier TPL hors du dossier standard du module. Vérifiez aussi que votre module est bien installé et activé.",{"q":159,"a":160},"Comment organiser les traductions d'un module PrestaShop multilingue complexe ?","Structurez vos traductions avec des domaines distincts pour le front-office et le back-office : `Modules.MonModule.Shop` pour le front, `Modules.MonModule.Admin` pour le back. Regroupez les chaînes par fonctionnalité dans vos TPL. Créez un fichier XLIFF par langue dans `translations\u002F`. Documentez les chaînes clés dans un README pour faciliter la contribution de traducteurs externes.",{"q":162,"a":163},"Comment tester que toutes les chaînes d'un module sont bien traduites ?","Activez le mode debug de PrestaShop (`_PS_MODE_DEV_ = true` dans `config\u002Fdefines.inc.php`). Parcourez toutes les pages où votre module intervient dans chaque langue active. Les chaînes non traduites apparaîtront en anglais. Vous pouvez aussi exécuter `php bin\u002Fconsole translation:extract` qui liste les chaînes manquantes. En développement, activez les logs Smarty pour détecter les erreurs de syntaxe dans les balises `{l}`.",{"q":165,"a":166},"Quelle est la limite de caractères pour une chaîne dans la balise {l} ?","Il n'y a pas de limite technique stricte dans la balise `{l}`, mais la colonne de traduction en base de données utilise un type TEXT. En pratique, gardez vos chaînes courtes et atomiques (une phrase maximum). Pour du contenu long, utilisez plutôt les pages CMS de PrestaShop ou des blocs de contenu configurables depuis le back-office. Les chaînes trop longues compliquent aussi le travail des traducteurs.","La balise Smarty `{l}` de PrestaShop ne permet pas d'injecter directement des variables dans le paramètre `s`. Pour inclure des valeurs dynamiques dans vos traductions, utilisez le paramètre `sprintf` avec des placeholders, et gérez toutes vos traductions de manière centralisée via le back-office.",6,"2026-03-21T15:14:28.000Z",[],"PrestaShop pour les développeurs",{"items":173},[174,183,189,195,203,211,217,222],{"id":175,"type":176,"label":177,"href":84,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":180,"children":181,"psChildren":182},41,"link",{"fr":178},"Expertise",null,0,[],[],{"id":184,"type":176,"label":185,"href":75,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":186,"children":187,"psChildren":188},42,{"fr":74},1,[],[],{"id":190,"type":176,"label":191,"href":36,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":192,"children":193,"psChildren":194},43,{"fr":35},2,[],[],{"id":196,"type":176,"label":197,"href":199,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":200,"children":201,"psChildren":202},44,{"fr":198},"Outils IA","\u002Foutils-ia",3,[],[],{"id":204,"type":176,"label":205,"href":29,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":207,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":208,"children":209,"psChildren":210},45,{"fr":206},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":212,"type":176,"label":213,"href":78,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":214,"children":215,"psChildren":216},46,{"fr":77},5,[],[],{"id":218,"type":176,"label":219,"href":96,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":168,"children":220,"psChildren":221},47,{"fr":92},[],[],{"id":223,"type":176,"label":224,"href":102,"icon":179,"description":179,"badge":179,"groupTitle":179,"style":179,"gridColumns":179,"cssClass":179,"psCategoryId":179,"showPsChildren":30,"position":225,"children":226,"psChildren":227},48,{"fr":101},7,[],[],{"footer":229},{"theme":230,"description":179,"hours":179,"logo":231,"contact":234,"social":235,"bottomBar":245},"dark",{"src":232,"href":233,"alt":95},"\u002Flogo-ac.svg","\u002F",{"email":179,"phone":179,"address":179,"cta":179},[236,239,242],{"platform":237,"href":238,"label":237},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":240,"href":241,"label":240},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":243,"href":244,"label":243},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":179},{"header":247},{"logo":248,"topBar":251,"contactEmail":254,"features":255,"navBar":179},{"src":232,"alt":249,"text":95,"href":233,"class":250},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":179,"showLanguages":30,"align":252,"languages":253},"left",[],"contact@alexandrecarette.fr",{"showSearch":30,"showWishlist":30,"showLogin":20,"showContact":30,"showCart":30,"stickyHeader":20,"headerLayout":256},"inline",{"academy":258,"blog":259,"expertise":270},[],[260,264,267],{"title":261,"url":262,"score":186,"type":263},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":265,"url":266,"score":186,"type":263},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":268,"url":269,"score":186,"type":263},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[]]