{"product_id":"mondopescatore","title":"Mondo Pescatore","description":"\u003cdiv class=\"checkout-deal-container\"\u003e\n  \u003cdiv class=\"review-stars\"\u003e\n    \u003cspan class=\"rating-number\"\u003e4.9\/5\u003c\/span\u003e\n    \u003cspan class=\"stars\"\u003e★★★★★\u003c\/span\u003e\n    \u003cspan class=\"review-count\" id=\"review-text\"\u003eReseñas\u003c\/span\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"viewing-square-box\"\u003e\n    \u003cspan class=\"dot green-pulse\"\u003e\u003c\/span\u003e\n    \u003cp\u003e\u003cstrong id=\"viewing-count\"\u003e7\u003c\/strong\u003e \u003cspan id=\"viewing-text\"\u003epersonas están viendo la oferta ahora\u003c\/span\u003e\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"scarcity-row\"\u003e\n    \u003cspan class=\"dot red-pulse\"\u003e\u003c\/span\u003e\n    \u003cp class=\"offer-badge\" id=\"badge-text\"\u003e¡Últimos lugares con Bonus incluidos!\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n  * {\n    box-sizing: border-box;\n  }\n\n  .checkout-deal-container {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    max-width: 100%;\n    margin: 20px auto;\n    padding: 20px;\n    background: #fff;\n    border: 1px solid #eaeaea;\n    border-radius: 12px;\n    text-align: center;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 15px;\n  }\n\n  .review-stars {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    flex-wrap: wrap;\n  }\n\n  .rating-number {\n    font-weight: 700;\n    color: #333;\n    font-size: 15px;\n  }\n\n  .stars {\n    color: #f39c12;\n    font-size: 16px;\n    letter-spacing: 1px;\n  }\n\n  .review-count {\n    color: #555;\n    font-size: 14px;\n    font-weight: 600;\n  }\n\n  .viewing-square-box {\n    display: flex;\n    align-items: center;\n    background: #fff;\n    border: 1px solid #e0e0e0;\n    border-radius: 6px;\n    padding: 8px 16px;\n    gap: 8px;\n  }\n\n  .viewing-square-box p {\n    margin: 0;\n    font-size: 13px;\n    color: #555;\n  }\n\n  .viewing-square-box strong {\n    color: #222;\n  }\n\n  .scarcity-row {\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    font-size: 13px;\n    margin: 0;\n  }\n\n  .scarcity-row p {\n    margin: 0;\n  }\n\n  .offer-badge {\n    font-weight: 700;\n    color: #d9534f;\n  }\n\n  .dot {\n    height: 8px;\n    width: 8px;\n    border-radius: 50%;\n    display: inline-block;\n    flex-shrink: 0;\n  }\n\n  .green-pulse {\n    background: #2ecc71;\n    animation: pulse-green 2s infinite;\n  }\n\n  .red-pulse {\n    background: #e74c3c;\n    animation: pulse-red 2s infinite;\n  }\n\n  @keyframes pulse-green {\n    0% {\n      box-shadow: 0 0 0 0 rgba(46, 204, 113, 0.7);\n    }\n    70% {\n      box-shadow: 0 0 0 8px rgba(46, 204, 113, 0);\n    }\n    100% {\n      box-shadow: 0 0 0 0 rgba(46, 204, 113, 0);\n    }\n  }\n\n  @keyframes pulse-red {\n    0% {\n      box-shadow: 0 0 0 0 rgba(231, 76, 60, 0.7);\n    }\n    70% {\n      box-shadow: 0 0 0 8px rgba(231, 76, 60, 0);\n    }\n    100% {\n      box-shadow: 0 0 0 0 rgba(231, 76, 60, 0);\n    }\n  }\n\n  @media (max-width: 480px) {\n    .viewing-square-box p,\n    .scarcity-row p {\n      font-size: 12px;\n    }\n    .viewing-square-box {\n      padding: 6px 12px;\n    }\n  }\n\u003c\/style\u003e\n\n\u003cscript\u003e\n  (function() {\n    \/\/ ============ TRADUCCIONES POR IDIOMA ============\n    const traducciones = {\n      es: {\n        reviews: 'Reseñas',\n        viewing: 'personas están viendo la oferta ahora',\n        badge: '¡Últimos lugares con Bonus incluidos!'\n      },\n      en: {\n        reviews: 'Reviews',\n        viewing: 'people are viewing this offer now',\n        badge: 'Last spots with Bonus included!'\n      },\n      pt: {\n        reviews: 'Avaliações',\n        viewing: 'pessoas estão vendo esta oferta agora',\n        badge: 'Últimas vagas com Bônus incluídos!'\n      },\n      fr: {\n        reviews: 'Avis',\n        viewing: 'personnes regardent cette offre maintenant',\n        badge: 'Dernières places avec Bonus inclus!'\n      },\n      de: {\n        reviews: 'Bewertungen',\n        viewing: 'Personen sehen sich dieses Angebot gerade an',\n        badge: 'Letzte Plätze mit Bonus inklusive!'\n      },\n      it: {\n        reviews: 'Recensioni',\n        viewing: 'persone stanno visualizzando questa offerta ora',\n        badge: 'Ultimi posti con Bonus inclusi!'\n      },\n      nl: {\n        reviews: 'Beoordelingen',\n        viewing: 'mensen bekijken nu deze aanbieding',\n        badge: 'Laatste plaatsen met Bonus inbegrepen!'\n      },\n      pl: {\n        reviews: 'Opinie',\n        viewing: 'osób ogląda teraz tę ofertę',\n        badge: 'Ostatnie miejsca z Bonusem w cenie!'\n      },\n      ru: {\n        reviews: 'Отзывы',\n        viewing: 'человек просматривают это предложение сейчас',\n        badge: 'Последние места с бонусами!'\n      },\n      ja: {\n        reviews: 'レビュー',\n        viewing: '人が今このオファーを見ています',\n        badge: 'ボーナス付きの最後のスポット！'\n      },\n      'zh': {\n        reviews: '评价',\n        viewing: '人正在查看此优惠',\n        badge: '包含奖金的最后名额！'\n      }\n    };\n\n    \/\/ Idioma por defecto\n    const idiomaDefault = 'es';\n\n    \/\/ ============ DETECTAR PAÍS ============\n    function detectarPais() {\n      return new Promise((resolve) =\u003e {\n        \/\/ Opción 1: ipapi.co (más rápida y confiable)\n        fetch('https:\/\/ipapi.co\/country_code\/')\n          .then(res =\u003e {\n            if (!res.ok) throw new Error('Error en ipapi');\n            return res.text();\n          })\n          .then(code =\u003e {\n            const pais = code.trim().toLowerCase();\n            console.log('🌍 País detectado:', pais);\n            resolve(pais);\n          })\n          .catch(() =\u003e {\n            \/\/ Opción 2: Fallback con ip-api.com\n            fetch('https:\/\/ip-api.com\/json\/')\n              .then(res =\u003e res.json())\n              .then(data =\u003e {\n                const pais = data.countryCode?.toLowerCase() || 'es';\n                console.log('🌍 País detectado (fallback):', pais);\n                resolve(pais);\n              })\n              .catch(() =\u003e {\n                console.warn('⚠️ No se pudo detectar país, usando español por defecto');\n                resolve('es');\n              });\n          });\n      });\n    }\n\n    \/\/ ============ OBTENER IDIOMA SEGÚN PAÍS ============\n    function obtenerIdiomaSegunPais(codigoPais) {\n      \/\/ Mapeo de países a idiomas\n      const mapaPaisIdioma = {\n        'es': 'es', \/\/ España\n        'mx': 'es', \/\/ México\n        'ar': 'es', \/\/ Argentina\n        'co': 'es', \/\/ Colombia\n        'pe': 'es', \/\/ Perú\n        'cl': 'es', \/\/ Chile\n        've': 'es', \/\/ Venezuela\n        'ec': 'es', \/\/ Ecuador\n        'gt': 'es', \/\/ Guatemala\n        'cu': 'es', \/\/ Cuba\n        'bo': 'es', \/\/ Bolivia\n        'do': 'es', \/\/ República Dominicana\n        'hn': 'es', \/\/ Honduras\n        'py': 'es', \/\/ Paraguay\n        'sv': 'es', \/\/ El Salvador\n        'ni': 'es', \/\/ Nicaragua\n        'cr': 'es', \/\/ Costa Rica\n        'pa': 'es', \/\/ Panamá\n        'uy': 'es', \/\/ Uruguay\n        'pr': 'es', \/\/ Puerto Rico\n        'us': 'en', \/\/ Estados Unidos\n        'gb': 'en', \/\/ Reino Unido\n        'au': 'en', \/\/ Australia\n        'ca': 'en', \/\/ Canadá (inglés)\n        'ie': 'en', \/\/ Irlanda\n        'nz': 'en', \/\/ Nueva Zelanda\n        'za': 'en', \/\/ Sudáfrica\n        'br': 'pt', \/\/ Brasil\n        'pt': 'pt', \/\/ Portugal\n        'fr': 'fr', \/\/ Francia\n        'be': 'fr', \/\/ Bélgica\n        'ch': 'fr', \/\/ Suiza (francés)\n        'ca': 'fr', \/\/ Canadá (francés)\n        'de': 'de', \/\/ Alemania\n        'at': 'de', \/\/ Austria\n        'it': 'it', \/\/ Italia\n        'nl': 'nl', \/\/ Países Bajos\n        'pl': 'pl', \/\/ Polonia\n        'ru': 'ru', \/\/ Rusia\n        'jp': 'ja', \/\/ Japón\n        'cn': 'zh', \/\/ China\n        'tw': 'zh', \/\/ Taiwán\n        'hk': 'zh', \/\/ Hong Kong\n      };\n\n      return mapaPaisIdioma[codigoPais] || idiomaDefault;\n    }\n\n    \/\/ ============ APLICAR TRADUCCIÓN ============\n    function aplicarTraduccion(idioma) {\n      const texts = traducciones[idioma];\n      if (!texts) {\n        console.warn('⚠️ Idioma no soportado, usando español');\n        const textsDefault = traducciones[idiomaDefault];\n        document.getElementById('review-text').textContent = textsDefault.reviews;\n        document.getElementById('viewing-text').textContent = textsDefault.viewing;\n        document.getElementById('badge-text').textContent = textsDefault.badge;\n        return;\n      }\n\n      document.getElementById('review-text').textContent = texts.reviews;\n      document.getElementById('viewing-text').textContent = texts.viewing;\n      document.getElementById('badge-text').textContent = texts.badge;\n\n      console.log(`✅ Textos traducidos al: ${idioma}`);\n    }\n\n    \/\/ ============ CONTADOR DE VISUALIZACIONES ============\n    function iniciarContador() {\n      const el = document.getElementById('viewing-count');\n      if (!el) return;\n\n      const min = 7,\n        max = 27;\n\n      function update() {\n        el.textContent = Math.floor(Math.random() * (max - min + 1)) + min;\n      }\n\n      el.textContent = Math.floor(Math.random() * (max - min + 1)) + min;\n      setInterval(update, 3000);\n    }\n\n    \/\/ ============ EJECUCIÓN PRINCIPAL ============\n    async function init() {\n      try {\n        const codigoPais = await detectarPais();\n        const idioma = obtenerIdiomaSegunPais(codigoPais);\n        aplicarTraduccion(idioma);\n      } catch (error) {\n        console.error('Error en la inicialización:', error);\n        \/\/ Fallback a español\n        aplicarTraduccion(idiomaDefault);\n      }\n\n      iniciarContador();\n    }\n\n    \/\/ Esperar a que el DOM esté listo\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', init);\n    } else {\n      init();\n    }\n  })();\n\u003c\/script\u003e","brand":"LibroDigital","offers":[{"title":"Default Title","offer_id":59346534465881,"sku":null,"price":17.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1078\/7618\/8505\/files\/pescatt.webp?v=1788946880","url":"https:\/\/www.digitals.lat\/products\/mondopescatore","provider":"LibroDigital","version":"1.0","type":"link"}