{"id":16728,"date":"2026-05-29T22:00:27","date_gmt":"2026-05-29T20:00:27","guid":{"rendered":"https:\/\/cabanes-de-provence.com\/?page_id=16728"},"modified":"2026-05-29T22:00:35","modified_gmt":"2026-05-29T20:00:35","slug":"widget-calendario","status":"publish","type":"page","link":"https:\/\/cabanes-de-provence.com\/it\/calendar-widget\/","title":{"rendered":"Widget del calendario"},"content":{"rendered":"\n<div id=\"hostaway-calendar-widget\"><\/div>\n<script src=\"https:\/\/d2q3n06xhbi0am.cloudfront.net\/calendar.js\"><\/script>\n<script>\n(function() {\n    \/\/ 1. Automatically detect the language from the URL pathname\n    var p = window.location.pathname;\n    var langPath = '';\n    var currentLang = 'fr'; \/\/ Default language\n    \n    if (p.indexOf('\/en\/') !== -1) { langPath = 'en\/'; currentLang = 'en'; }\n    else if (p.indexOf('\/de\/') !== -1) { langPath = 'de\/'; currentLang = 'de'; }\n    else if (p.indexOf('\/es\/') !== -1) { langPath = 'es\/'; currentLang = 'es'; }\n    else if (p.indexOf('\/it\/') !== -1) { langPath = 'it\/'; currentLang = 'it'; }\n    else if (p.indexOf('\/pt\/') !== -1) { langPath = 'pt\/'; currentLang = 'pt'; }\n \n    \/\/ Complete translation dictionary\n    var dict = {\n        en: { select: 'Select check-in and check-out dates', minStay: 'Minimum stay is 1 night.', checkin: 'Check-in day', checkout: 'Check-out day', labelIn: 'Check-in', labelOut: 'Check-out' },\n        fr: { select: 'S\u00e9lectionnez les dates d\\'arriv\u00e9e et de d\u00e9part', minStay: 'S\u00e9jour minimum 1 nuit.', checkin: 'Jour d\\'arriv\u00e9e', checkout: 'Jour de d\u00e9part', labelIn: 'Arriv\u00e9e', labelOut: 'D\u00e9part' },\n        es: { select: 'Seleccione las fechas de entrada y salida', minStay: 'Estancia m\u00ednima 1 noche.', checkin: 'D\u00eda de entrada', checkout: 'D\u00eda de salida', labelIn: 'Entrada', labelOut: 'Salida' },\n        it: { select: 'Seleziona le date di check-in e check-out', minStay: 'Soggiorno minimo 1 notte.', checkin: 'Giorno di arrivo', checkout: 'Giorno di partenza', labelIn: 'Arrivo', labelOut: 'Partenza' },\n        pt: { select: 'Selecione as datas de check-in e check-out', minStay: 'Estadia m\u00ednima de 1 noite.', checkin: 'Dia de check-in', checkout: 'Dia de check-out', labelIn: 'Entrada', labelOut: 'Sa\u00edda' },\n        de: { select: 'W\u00e4hlen Sie An- und Abreisedatum', minStay: 'Mindestaufenthalt 1 Nacht.', checkin: 'Anreisetag', checkout: 'Abreisetag', labelIn: 'Anreise', labelOut: 'Abreise' }\n    };\n \n    var weekdays = {\n        fr: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam','Di','Lu','Ma','Me','Je','Ve','Sa'],\n        es: ['Do','Lu','Ma','Mi','Ju','Vi','Sa','Do','Lu','Ma','Mi','Ju','Vi','Sa'],\n        it: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab','Do','Lu','Ma','Me','Gi','Ve','Sa'],\n        pt: ['Dom','Seg','Ter','Qua','Qui','Sex','S\u00e1b','Do','Se','Te','Qu','Qu','Se','S\u00e1'],\n        de: ['So','Mo','Di','Mi','Do','Fr','Sa','So','Mo','Di','Mi','Do','Fr','Sa']\n    };\n \n    var months = {\n        fr: { January:'Janvier', February:'F\u00e9vrier', March:'Mars', April:'Avril', May:'Mai', June:'Juin', July:'Juillet', August:'Ao\u00fbt', September:'Septembre', October:'Octobre', November:'Novembre', December:'D\u00e9cembre' },\n        es: { January:'Enero', February:'Febrero', March:'Marzo', April:'Abril', May:'Mayo', June:'Junio', July:'Julio', August:'Agosto', September:'Setiembre', October:'Octubre', November:'Noviembre', December:'Diciembre' },\n        it: { January:'Gennaio', February:'Febbraio', March:'Marzo', April:'Aprile', May:'Maggio', June:'Giugno', July:'Luglio', August:'Agosto', September:'Settembre', October:'Ottobre', November:'Novembre', December:'Dicembre' },\n        pt: { January:'Janeiro', February:'Fevereiro', March:'Mar\u00e7o', April:'Abril', May:'Maio', June:'Junho', July:'Julho', August:'Agosto', September:'Setembro', October:'Outubro', November:'Novembre', December:'Dezembro' },\n        de: { January:'Januar', February:'Februar', March:'M\u00e4rz', April:'April', May:'Mai', June:'Juni', July:'Juli', August:'August', September:'September', October:'Oktober', November:'November', December:'Dezember' }\n    };\n\n    var shortMonths = {\n        fr: { Jan:'Janv.', Feb:'F\u00e9vr.', Mar:'Mars', Apr:'Avr.', May:'Mai', Jun:'Juin', Jul:'Juil.', Aug:'Ao\u00fbt', Sep:'Sept.', Oct:'Oct.', Nov:'Nov.', Dec:'D\u00e9c.' },\n        es: { Jan:'Ene', Feb:'Feb', Mar:'Mar', Apr:'Abr', May:'May', Jun:'Jun', Jul:'Jul', Aug:'Ago', Sep:'Set', Oct:'Oct', Nov:'Nov', Dec:'Dic' },\n        it: { Jan:'Gen', Feb:'Feb', Mar:'Mar', Apr:'Apr', May:'Mag', Jun:'Giu', Jul:'Lug', Aug:'Ago', Sep:'Set', Oct:'Ott', Nov:'Nov', Dec:'Dic' },\n        pt: { Jan:'Jan', Feb:'Fev', Mar:'Mar', Apr:'Abr', May:'Mai', Jun:'Jun', Jul:'Jul', Aug:'Ago', Sep:'Set', Oct:'Out', Nov:'Nov', Dec:'Dez' },\n        de: { Jan:'Jan', Feb:'Feb', Mar:'M\u00e4r', Apr:'Apr', May:'Mai', Jun:'Jun', Jul:'Jul', Aug:'Aug', Sep:'Sep', Oct:'Okt', Nov:'Nov', Dec:'Dez' }\n    };\n \n    var t = dict[currentLang] || dict['fr'];\n \n    \/\/ 2. Initialize Hostaway Widget\n    window.hostawayCalendarWidget({\n        baseUrl: 'https:\/\/book.cabanes-de-provence.com\/' + langPath,\n        listingId: 502056,\n        numberOfMonths: 2,\n        openInNewTab: true,\n        font: 'Open Sans',\n        rounded: true,\n        locale: currentLang, \n        lang: currentLang,   \n        button: {\n            action: 'checkout',\n            text: currentLang === 'fr' ? 'R\u00e9server' : (currentLang === 'en' ? 'Book' : (currentLang === 'es' ? 'Reservar' : (currentLang === 'it' ? 'Prenotare' : (currentLang === 'pt' ? 'Reservar' : 'Buchen')))),\n        },\n        clearButtonText: currentLang === 'fr' ? 'Effacer' : (currentLang === 'en' ? 'Clear' : (currentLang === 'es' ? 'Borrar' : (currentLang === 'it' ? 'Cancella' : (currentLang === 'pt' ? 'Limpar' : 'L\u00f6schen')))),\n        color: { mainColor: '#BAAD85', frameColor: '#000000', textColor: '#cfbe92' },\n    });\n \n    \/\/ 3. Deep Translation Engine for Calendar Grid (Months, Weekdays)\n    function translateDOM(node) {\n        if (!node) return;\n\n        if (node.nodeType === 3) { \/\/ Process Text Nodes\n            var v = node.nodeValue;\n            if (v) {\n                var cleanVal = v.trim();\n\n                \/\/ FIX: Catch the default text here before any clicks happen\n                if (cleanVal === 'Select check-in and check-out dates') {\n                    node.nodeValue = t.select;\n                    return;\n                }\n\n                \/\/ Weekday translations (handles both 2-letter and 3-letter variants safely)\n                var enDays = ['Su','Mo','Tu','We','Th','Fr','Sa','Sun','Mon','Tue','Wed','Thu','Fri','Sat'];\n                var dayIdx = enDays.indexOf(cleanVal);\n                if (dayIdx !== -1 && weekdays[currentLang]) {\n                    node.nodeValue = weekdays[currentLang][dayIdx];\n                    return;\n                }\n\n                \/\/ Month translations (handles full names like \"June 2026\" and short names like \"Jun 1\")\n                if (currentLang !== 'en') {\n                    if (months[currentLang]) {\n                        for (var m in months[currentLang]) {\n                            var regex = new RegExp('\\\\b' + m + '\\\\b', 'g');\n                            if (regex.test(v)) v = v.replace(regex, months[currentLang][m]);\n                        }\n                    }\n                    if (shortMonths[currentLang]) {\n                        for (var sm in shortMonths[currentLang]) {\n                            var regexSM = new RegExp('\\\\b' + sm + '\\\\b', 'g');\n                            if (regexSM.test(v)) v = v.replace(regexSM, shortMonths[currentLang][sm]);\n                        }\n                    }\n                    node.nodeValue = v;\n                }\n            }\n        }\n\n        var child = node.firstChild;\n        while (child) {\n            translateDOM(child);\n            child = child.nextSibling;\n        }\n    }\n\n    \/\/ 4. Master Translation Orchestrator (Combines Deep Node Translation & Macro Element Overrides)\n    function runAllTranslations(root) {\n        \/\/ Run deep translation for calendar grid grid, months and days (and default phrase)\n        translateDOM(root);\n\n        \/\/ Macro Override: Target the status notification area directly (Bypasses React split-nodes)\n        var bottomContentEls = root.querySelectorAll('[class*=\"styled__BottomContent-\"]');\n        bottomContentEls.forEach(function(el) {\n            var txt = el.textContent || '';\n            if (txt.indexOf('Select check-in and check-out dates') !== -1) el.innerHTML = t.select;\n            else if (txt.indexOf('Minimum stay is 1 night.') !== -1) el.innerHTML = t.minStay;\n            else if (txt.indexOf('Check-in day') !== -1) el.innerHTML = t.checkin;\n            else if (txt.indexOf('Check-out day') !== -1) el.innerHTML = t.checkout;\n        });\n\n        \/\/ Macro Override: Target static \"Check-in:\" and \"Check-out:\" layout labels\n        var bottomWrapper = root.querySelector('[class*=\"styled__Bottom-\"]');\n        if (bottomWrapper) {\n            var spans = bottomWrapper.querySelectorAll('span');\n            spans.forEach(function(span) {\n                var txt = span.textContent || '';\n                if (txt.indexOf('Check-in:') !== -1 && txt.indexOf(t.labelIn) === -1) {\n                    span.innerHTML = txt.replace('Check-in:', t.labelIn + ':');\n                }\n                if (txt.indexOf('Check-out:') !== -1 && txt.indexOf(t.labelOut) === -1) {\n                    span.innerHTML = txt.replace('Check-out:', t.labelOut + ':');\n                }\n            });\n        }\n    }\n \n    \/\/ 5. MutationObserver to capture every state change, re-render, month shift, and click\n    var observer = new MutationObserver(function(mutations) {\n        var root = document.querySelector('#hostaway-calendar-widget');\n        if (!root) return;\n        \n        observer.disconnect(); \/\/ Safely disconnect to prevent recursive loops during text writes\n        runAllTranslations(root);\n        observer.observe(root, { childList: true, subtree: true, characterData: true });\n    });\n \n    \/\/ Initializer loop ensuring the element is loaded before activating the engine\n    var checkExist = setInterval(function() {\n        var root = document.querySelector('#hostaway-calendar-widget');\n        if (root && root.childNodes.length > 0) {\n            clearInterval(checkExist);\n            runAllTranslations(root);\n            observer.observe(root, { childList: true, subtree: true, characterData: true });\n        }\n    }, 50);\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-16728","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/pages\/16728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/comments?post=16728"}],"version-history":[{"count":1,"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/pages\/16728\/revisions"}],"predecessor-version":[{"id":16730,"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/pages\/16728\/revisions\/16730"}],"wp:attachment":[{"href":"https:\/\/cabanes-de-provence.com\/it\/wp-json\/wp\/v2\/media?parent=16728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}