{"elements":[{"id":7009,"title":"Multilingua","body":"<!-- Sezione 1: Priorit&agrave; di Rilevamento della Lingua -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Priorit&agrave; di Rilevamento della Lingua<\/h2>\n    <div class=\"text-center my-4\"><img src=\"\/assets\/images\/translator.png\" alt=\"Gestione traduzioni in DressAPI\" class=\"img-fluid rounded shadow\" style=\"max-width: 80%;\"><\/div>\n    <p>DressAPI offre un sistema di internazionalizzazione completo che gestisce automaticamente la traduzione sia delle etichette dell&rsquo;interfaccia utente che dei contenuti strutturati nel database. Il framework rileva la lingua del visitatore, seleziona i testi appropriati e supporta un numero illimitato di lingue, senza duplicare tabelle o complicare la struttura dei dati.<\/p>\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Priorit&agrave;<\/th><th>Sorgente<\/th><th>Descrizione<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td>1<\/td><td><code>DEFAULT_LANGUAGE<\/code><\/td><td>Se impostato su un codice specifico (es. <code>'IT'<\/code>), quella lingua viene sempre usata indipendentemente dal browser.<\/td><\/tr>\n        <tr><td>2<\/td><td><code>HTTP_ACCEPT_LANGUAGE<\/code><\/td><td>Se <code>DEFAULT_LANGUAGE<\/code> &egrave; <code>'AUTO'<\/code>, i primi 2 caratteri dell'header del browser vengono estratti e convertiti in maiuscolo (es. <code>it-IT,it;q=0.9<\/code> &rarr; <code>IT<\/code>).<\/td><\/tr>\n        <tr><td>3<\/td><td><code>LANGUAGES[0]<\/code><\/td><td>Se nessun header &egrave; presente (es. chiamate API senza header del browser), viene usato il primo elemento dell'array <code>LANGUAGES<\/code> (o <code>'EN'<\/code> se non definito).<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n    <div class=\"da-snippet\">define('DEFAULT_LANGUAGE', 'AUTO');  \/\/ Rileva dal browser\ndefine('LANGUAGES', ['IT', 'EN', 'DE', 'ES']);  \/\/ IT &egrave; il fallback<\/div>\n    <p class=\"mt-3\">Se il browser invia un codice lingua non presente nell'array <code>LANGUAGES<\/code> (es. <code>JA<\/code> per giapponese quando sono supportati solo <code>['IT','EN']<\/code>), il sistema ricade sulla prima lingua configurata.<\/p>\n  <\/div>\n<\/section>\n\n<!-- Sezione 2: Due Meccanismi di Traduzione -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Due Meccanismi di Traduzione<\/h2>\n    <p>DressAPI offre due approcci complementari per l'internazionalizzazione:<\/p>\n\n    <h3 class=\"mt-4\">1. Etichette UI tramite <code>_T()<\/code> e la tabella <code>_translation<\/code><\/h3>\n    <p>Per stringhe brevi dell'interfaccia utente (pulsanti, voci di menu, etichette). La funzione globale <code>_T()<\/code> cerca la stringa nella mappa delle traduzioni della lingua corrente.<\/p>\n    <div class=\"da-snippet\">\/\/ Nel codice PHP\n$etichetta = _T('Read more');\n\n\/\/ In un template PHP\n&lt;h1&gt;&lt;?= _T('Welcome') ?&gt;&lt;\/h1&gt;\n&lt;button&gt;&lt;?= _T('Search') ?&gt;&lt;\/button&gt;<\/div>\n    <p class=\"mt-2\">Quando viene chiamata <code>_T('Search')<\/code>:<\/p>\n    <ol>\n      <li>Il testo viene trimmato dagli spazi.<\/li>\n      <li><code>CTranslator::GetTextTranslated()<\/code> cerca il testo nell'array delle traduzioni della lingua corrente.<\/li>\n      <li>Se trovato: restituisce la stringa tradotta.<\/li>\n      <li>Se il testo contiene tag <code>&#64;&#64;<\/code>: chiama <code>GetTextTranslatedContent()<\/code> per estrarre la variante della lingua corrente.<\/li>\n      <li>Se non trovato e <code>LANGUAGE_LEARN<\/code> &egrave; <code>true<\/code>: inserisce il testo nella tabella <code>_translation<\/code>.<\/li>\n      <li>Se non trovato e <code>LANGUAGE_LEARN<\/code> &egrave; <code>false<\/code>: restituisce il testo originale con gli underscore sostituiti da spazi.<\/li>\n    <\/ol>\n\n    <h3 class=\"mt-4\">2. Contenuti tramite tag <code>&#64;&#64;XX<\/code> inline e <code>LANGUAGE_MULTI_CONTENTS<\/code><\/h3>\n    <p>Per contenuti lunghi (corpi di pagina, descrizioni). Quando <code>LANGUAGE_MULTI_CONTENTS<\/code> &egrave; <code>true<\/code>, DressAPI elabora automaticamente i tag <code>&#64;&#64;XX<\/code> in <strong>tutti<\/strong> i valori dei campi del database durante le operazioni di lettura.<\/p>\n    <div class=\"da-snippet\">\/\/ Nel campo body del database:\n&#64;&#64;IT\n&lt;h2&gt;Chi siamo&lt;\/h2&gt;\n&lt;p&gt;Siamo un'azienda italiana.&lt;\/p&gt;\n&#64;&#64;EN\n&lt;h2&gt;About Us&lt;\/h2&gt;\n&lt;p&gt;We are an Italian company.&lt;\/p&gt;<\/div>\n\n    <table class=\"table table-striped mt-3\">\n      <thead class=\"table-dark\">\n        <tr><th>Meccanismo<\/th><th>Usato Per<\/th><th>Storage<\/th><th>Controllato Da<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td>Tabella <code>_translation<\/code> + <code>_T()<\/code><\/td><td>Etichette UI, testo pulsanti, voci menu<\/td><td>Tabella DB <code>_translation<\/code><\/td><td>Sempre attivo quando <code>CTranslator::Init()<\/code> viene chiamato<\/td><\/tr>\n        <tr><td>Tag <code>&#64;&#64;XX<\/code> inline nei contenuti<\/td><td>Contenuti lunghi, corpi pagina, descrizioni<\/td><td>Direttamente in qualsiasi campo DB<\/td><td>Costante <code>LANGUAGE_MULTI_CONTENTS<\/code><\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n<\/section>\n\n<!-- Sezione 3: Limitazioni Critiche dei Tag &#64;&#64;XX con HTML -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Limitazione Critica: Tag &#64;&#64;XX con HTML<\/h2>\n    <div class=\"alert alert-danger\"><strong>Attenzione:<\/strong> Questa limitazione pu&ograve; distruggere silenziosamente il tuo output HTML.<\/div>\n    <p>La regex <code>&#64;&#64;XX<\/code> usa un match non-greedy che si ferma al successivo pattern <code>&#64;&#64;[A-Z]&#123;2&#125;<\/code>. Questo significa che <strong>tutte le varianti linguistiche per un singolo blocco traducibile devono essere contigue<\/strong> &mdash; non ci deve essere HTML o altro contenuto tra di esse.<\/p>\n\n    <h4 class=\"mt-3 text-danger\">SBAGLIATO &mdash; Questo si romper&agrave;<\/h4>\n    <div class=\"da-snippet\">&lt;h2&gt;&#64;&#64;EN About Us &#64;&#64;IT Chi siamo&lt;\/h2&gt;\n&lt;p&gt;&#64;&#64;EN We are a company. &#64;&#64;IT Siamo un'azienda.&lt;\/p&gt;<\/div>\n    <p class=\"mt-2\">Estraendo per <code>EN<\/code>, la regex cerca di rimuovere i blocchi <code>&#64;&#64;IT<\/code>. Partendo da <code>&#64;&#64;IT Chi siamo<\/code>, il <code>.*?<\/code> non-greedy cerca il successivo <code>&#64;&#64;[A-Z]&#123;2&#125;<\/code> e trova <code>&#64;&#64;EN<\/code> nel tag <code>&lt;p&gt;<\/code>. Tutto tra i due viene rimosso, compresi i tag HTML <code>&lt;\/h2&gt;&lt;p&gt;<\/code>.<\/p>\n\n    <h4 class=\"mt-3 text-success\">CORRETTO &mdash; Mantieni le varianti insieme<\/h4>\n    <div class=\"da-snippet\">&#64;&#64;EN\n&lt;h2&gt;About Us&lt;\/h2&gt;\n&lt;p&gt;We are a company.&lt;\/p&gt;\n&#64;&#64;IT\n&lt;h2&gt;Chi siamo&lt;\/h2&gt;\n&lt;p&gt;Siamo un'azienda.&lt;\/p&gt;<\/div>\n    <p class=\"mt-2\"><strong>Regola:<\/strong> Non intercalare mai i tag <code>&#64;&#64;XX<\/code> con la struttura HTML. Ogni blocco <code>&#64;&#64;XX<\/code> deve contenere HTML auto-consistente e completo.<\/p>\n  <\/div>\n<\/section>\n\n<!-- Sezione 4: Traduzione nei Template -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Traduzione nei Template<\/h2>\n    <p>Il motore di template DressAPI (<code>CHtmlRender<\/code>) si integra automaticamente con il sistema di traduzione. Il testo tra <code>&#123;&#123; 'testo' &#125;&#125;<\/code> viene tradotto automaticamente tramite <code>_T()<\/code>.<\/p>\n\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Espressione<\/th><th>Comportamento<\/th><th>Esempio<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td><code>&#123;&#123; 'testo' &#125;&#125;<\/code><\/td><td>Stringa letterale &mdash; sempre tradotta tramite <code>_T()<\/code><\/td><td><code>&#123;&#123; 'Search' &#125;&#125;<\/code><\/td><\/tr>\n        <tr><td><code>&#123;&#123; variabile &#125;&#125;<\/code><\/td><td>Valore variabile &mdash; sempre tradotto tramite <code>_T()<\/code><\/td><td><code>&#123;&#123; user::name &#125;&#125;<\/code><\/td><\/tr>\n        <tr><td><code>&#123;&#123; x ?? 'default' &#125;&#125;<\/code><\/td><td>Valore predefinito &mdash; anch'esso tradotto<\/td><td><code>&#123;&#123; page::title ?? 'Untitled' &#125;&#125;<\/code><\/td><\/tr>\n      <\/tbody>\n    <\/table>\n    <p class=\"mt-2\">Il testo con spazi tra apici singoli attiva la traduzione <code>_T()<\/code>. Questo permette di usare stringhe leggibili direttamente nei template.<\/p>\n  <\/div>\n<\/section>\n\n<!-- Sezione 5: Modificatori per Controllare la Traduzione -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Modificatori per Controllare la Traduzione<\/h2>\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Modificatore<\/th><th>Traduzione<\/th><th>Escaping HTML<\/th><th>Caso d'uso<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td><code>| raw<\/code><\/td><td>No<\/td><td>No<\/td><td>Contenuto HTML dal DB (gi&agrave; elaborato da <code>LANGUAGE_MULTI_CONTENTS<\/code>)<\/td><\/tr>\n        <tr><td><code>| nt<\/code><\/td><td>No<\/td><td>S&igrave;<\/td><td>Codici prodotto, URL, identificatori tecnici<\/td><\/tr>\n        <tr><td><code>| t<\/code><\/td><td>S&igrave; (forzata)<\/td><td>S&igrave;<\/td><td>Forza la traduzione su variabili speciali<\/td><\/tr>\n        <tr><td><em>(nessuno)<\/em><\/td><td>S&igrave;<\/td><td>S&igrave;<\/td><td>Comportamento predefinito per etichette UI<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n    <div class=\"da-snippet\">&lt;!-- Contenuto HTML: usa raw per saltare traduzione E escaping --&gt;\n&lt;div class=\"content\"&gt;&#123;&#123; page::body | raw &#125;&#125;&lt;\/div&gt;\n\n&lt;!-- Codici prodotto: salta traduzione ma mantieni escaping --&gt;\n&lt;span class=\"sku\"&gt;&#123;&#123; product::sku | nt &#125;&#125;&lt;\/span&gt;\n\n&lt;!-- Forza traduzione su una variabile locale --&gt;\n&lt;span&gt;&#123;&#123; locals::label | t &#125;&#125;&lt;\/span&gt;<\/div>\n  <\/div>\n<\/section>\n\n<!-- Sezione 6: Struttura della Tabella _translation -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Struttura della Tabella _translation<\/h2>\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Colonna<\/th><th>Tipo<\/th><th>Descrizione<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td><code>id<\/code><\/td><td>INT UNSIGNED AUTO_INCREMENT<\/td><td>Chiave primaria auto-incremento.<\/td><\/tr>\n        <tr><td><code>origin<\/code><\/td><td>TEXT (utf8mb3_bin)<\/td><td>La chiave di testo originale. La stringa passata a <code>_T()<\/code> o scritta in <code>&#123;&#123; 'testo' &#125;&#125;<\/code>. Ha vincolo UNIQUE.<\/td><\/tr>\n        <tr><td><code>translation<\/code><\/td><td>TEXT (utf8mb3_bin)<\/td><td>Le versioni tradotte, codificate con i tag <code>&#64;&#64;XX<\/code>. Se vuoto, viene usato il valore di <code>origin<\/code>.<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n    <p>Il campo <code>translation<\/code> usa il formato tag <code>&#64;&#64;XX<\/code> per memorizzare tutte le varianti linguistiche in un singolo campo:<\/p>\n    <div class=\"da-snippet\">-- Formato del campo translation:\n&#64;&#64;IT Testo italiano &#64;&#64;EN English text &#64;&#64;DE Deutscher Text\n\n-- Esempio di dati:\nINSERT INTO _translation VALUES\n(1, 'Go to',      '&#64;&#64;IT Vai a &#64;&#64;EN Go to'),\n(2, 'Search',     '&#64;&#64;IT Cerca &#64;&#64;EN Search'),\n(3, 'Read more',  '&#64;&#64;IT Leggi tutto &#64;&#64;EN Read more');<\/div>\n    <p class=\"mt-2\">Durante <code>CTranslator::Init()<\/code>, il servizio carica l'intera tabella, divide il campo <code>translation<\/code> per <code>&#64;&#64;<\/code> e costruisce una mappa associativa in memoria per lingua.<\/p>\n  <\/div>\n<\/section>\n\n<!-- Sezione 7: Elaborazione LANGUAGE_MULTI_CONTENTS -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Elaborazione LANGUAGE_MULTI_CONTENTS<\/h2>\n    <p>Quando <code>LANGUAGE_MULTI_CONTENTS<\/code> &egrave; <code>true<\/code>, il metodo <code>CTranslator::GetTextTranslatedContent()<\/code> viene applicato ricorsivamente a tutti i valori stringa dei dati letti dal database.<\/p>\n    <div class=\"da-snippet\">\/\/ In CBaseModel::GetViewData():\nif ($on_read &amp;&amp; defined('LANGUAGE_MULTI_CONTENTS') &amp;&amp; LANGUAGE_MULTI_CONTENTS)\n    array_walk_recursive($data,\n        fn(&amp;$text) =&gt; is_string($text) &amp;&amp;\n            CTranslator::GetTextTranslatedContent($text, 'EN'));<\/div>\n    <p class=\"mt-3\">La funzione <code>GetTextTranslatedContent()<\/code> usa una regex in due passaggi:<\/p>\n    <ol>\n      <li><strong>Rimuove le lingue non corrispondenti:<\/strong> la regex <code>\/&#64;&#64;(?!EN)w+.*?(?=&#64;&#64;[A-Z]&#123;2&#125;|z)\/s<\/code> rimuove ogni blocco <code>&#64;&#64;XX<\/code> il cui codice non corrisponde alla lingua corrente.<\/li>\n      <li><strong>Rimuove il marcatore della lingua corrente:<\/strong> la seconda regex <code>\/&#64;&#64;EN\/<\/code> rimuove il prefisso <code>&#64;&#64;EN<\/code> stesso, lasciando solo il testo tradotto.<\/li>\n    <\/ol>\n    <p>Questo elabora <strong>tutti i campi di tutte le tabelle<\/strong>, non solo tabelle specifiche. L'elaborazione avviene solo sulle operazioni di lettura (<code>GET<\/code>).<\/p>\n  <\/div>\n<\/section>\n\n<!-- Sezione 8: Best Practices -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Best Practices<\/h2>\n    <ol>\n      <li><strong>Mantieni i blocchi <code>&#64;&#64;XX<\/code> auto-consistenti.<\/strong> Non intercalare mai i tag <code>&#64;&#64;XX<\/code> con la struttura HTML. Raggruppa l'intero contenuto di ogni lingua come un singolo blocco.<\/li>\n      <li><strong>Usa <code>LANGUAGE_LEARN<\/code> solo in sviluppo.<\/strong> Non abilitarlo mai in produzione: ogni stringa non tradotta genera un INSERT nel database e un ricaricamento completo della cache.<\/li>\n      <li><strong>Usa <code>&#123;&#123; 'testo' &#125;&#125;<\/code> nei template<\/strong> per tutte le etichette visibili all'utente.<\/li>\n      <li><strong>Usa <code>| raw<\/code> per i contenuti HTML<\/strong> dal database, specialmente se gi&agrave; elaborati da <code>LANGUAGE_MULTI_CONTENTS<\/code>.<\/li>\n      <li><strong>Usa <code>| nt<\/code> per i valori tecnici<\/strong> come codici prodotto, URL o identificatori.<\/li>\n      <li><strong>Metti la lingua pi&ugrave; comune per prima<\/strong> nell'array <code>LANGUAGES<\/code>: serve come fallback.<\/li>\n      <li><strong>Usa <code>DEFAULT_LANGUAGE = 'AUTO'<\/code><\/strong> per i siti pubblici, un codice fisso per i pannelli di amministrazione.<\/li>\n      <li><strong>Svuota la cache dopo aver modificato le traduzioni.<\/strong> Le traduzioni sono cachate per lingua.<\/li>\n    <\/ol>\n  <\/div>\n<\/section>\n\n<!-- Sezione 9: Traduzioni Specifiche per Sezione (@#) -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"mb-4\">Traduzioni Specifiche per Sezione (&#64;#)<\/h2>\n    <p>Quando un sito DressAPI gestisce pi&ugrave; sezioni tematiche (es. giochi diversi, categorie di prodotti), &egrave; possibile avere traduzioni diverse per la stessa etichetta a seconda della sezione attiva. Questo meccanismo usa i tag <code>&#64;#nome_sezione<\/code> all'interno della tabella <code>_translation<\/code>.<\/p>\n\n    <h3 class=\"mt-4\">Come funziona<\/h3>\n    <p>Le rotte nel database possono impostare una sezione tramite il prefisso <code>s\/<\/code> nel percorso di destinazione:<\/p>\n    <div class=\"da-snippet\">-- Nella tabella _route:\n-- origin_path                              destination_path\n-- lotto\/patterns\/([a-z0-9_-]+)            s\/lotto\/pages\/3012\/read-patterns\n-- superenalotto\/patterns\/([a-z0-9_-]+)    s\/superenalotto\/pages\/4012\/read-patterns<\/div>\n    <p class=\"mt-3\">Quando l'URL corrisponde a una rotta con prefisso <code>s\/nome_sezione<\/code>, il framework (<code>CRequest<\/code>) estrae il nome della sezione e lo comunica al traduttore tramite <code>CTranslator::SetSection()<\/code>. Da quel momento, tutte le traduzioni cercano prima una versione specifica per quella sezione.<\/p>\n\n    <h3 class=\"mt-4\">Formato nella tabella _translation<\/h3>\n    <p>Nel campo <code>translation<\/code>, dopo il testo generico di ogni lingua, si aggiungono i tag <code>&#64;#nome_sezione<\/code> seguiti dal testo specifico:<\/p>\n    <div class=\"da-snippet\">-- origin: \"About odds and prizes\"\n-- translation:\n&#64;&#64;IT Informazioni su quote e premi &#64;#lotto Informazioni su quote e premi del Lotto &#64;#superenalotto Informazioni su quote e premi del SuperEnalotto\n&#64;&#64;EN About odds and prizes &#64;#lotto About Lotto odds and prizes &#64;#superenalotto About SuperEnalotto odds and prizes<\/div>\n\n    <h3 class=\"mt-4\">Ordine di priorit&agrave;<\/h3>\n    <p>Quando <code>CTranslator::GetTextTranslated()<\/code> cerca la traduzione per un testo, applica questo ordine:<\/p>\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Priorit&agrave;<\/th><th>Sorgente<\/th><th>Esempio<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td>1<\/td><td>Traduzione specifica per sezione e lingua<\/td><td><code>&#64;#lotto Informazioni su quote e premi del Lotto<\/code><\/td><\/tr>\n        <tr><td>2<\/td><td>Traduzione generica per lingua<\/td><td><code>&#64;&#64;IT Informazioni su quote e premi<\/code><\/td><\/tr>\n        <tr><td>3<\/td><td>Fallback: il testo originale con underscore sostituiti da spazi<\/td><td><code>About odds and prizes<\/code><\/td><\/tr>\n      <\/tbody>\n    <\/table>\n\n    <h3 class=\"mt-4\">Esempio reale<\/h3>\n    <p>In un sito che gestisce diversi giochi (Lotto, SuperEnalotto, MillionDay, ecc.), la stessa etichetta \"About odds and prizes\" nel template viene tradotta in modo diverso a seconda della sezione attiva:<\/p>\n    <table class=\"table table-striped\">\n      <thead class=\"table-dark\">\n        <tr><th>Sezione attiva<\/th><th>Testo visualizzato (IT)<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td><code>lotto<\/code><\/td><td>Informazioni su quote e premi del Lotto<\/td><\/tr>\n        <tr><td><code>superenalotto<\/code><\/td><td>Informazioni su quote e premi del SuperEnalotto<\/td><\/tr>\n        <tr><td><em>(nessuna)<\/em><\/td><td>Informazioni su quote e premi<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n\n    <h3 class=\"mt-4\">Configurazione<\/h3>\n    <p>Per usare le sezioni, assicurarsi che:<\/p>\n    <ol>\n      <li>Le rotte nella tabella <code>_route<\/code> usino il prefisso <code>s\/nome_sezione\/<\/code> nel campo <code>destination_path<\/code>.<\/li>\n      <li>Le traduzioni nella tabella <code>_translation<\/code> contengano i tag <code>&#64;#nome_sezione<\/code> con i testi specifici.<\/li>\n      <li>La sezione viene impostata automaticamente dal framework durante il parsing della rotta &mdash; non serve codice aggiuntivo.<\/li>\n    <\/ol>\n  <\/div>\n<\/section>\n<p class=\"text-center mt-4\"><a href=\"\/tutorials\" class=\"btn btn-outline-primary\">&larr; Torna ai Tutorial<\/a><\/p>","description":"Traduzioni automatiche e contenuti multilingua","meta_keywords":"","visible":"yes","status":"public","creation_date":"0000-00-00","id__user":1,"priority":0,"groupname":"TUTORIAL"}],"module":"pages","permissions":{"can_read":true},"main_item_title":"title","related_tables":[{"name":"Newsonpage","module":"newsonpage","FK":"id_cmspage","permissions":[]}],"page_info":{"table":"","key":"id","url":"\/pages","url_list":"\/pages","filters":{"id":["=","7009"]},"pagination":{"total_items":23,"page":1,"total_pages":2,"step":1,"items_per_page":20,"url_prev":"\/pages","url_next":"\/pages\/p\/2","url_tmpl":"\/pages\/p\/[[p]]","url_tmpl_with_order":"\/pages\/p\/[[p]]\/ob\/[[ob]]"},"order":{"field":"id","type":"DESC","url_tmpl":"\/pages\/p\/[[p]]"},"module":{"title":"Pages","description":"List of pages","name":"pages"},"current":{"title":"Pages","description":"List of pages","name":"pages","url":"\/tutorials\/multilingua"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}