Mudanças entre as edições de "Widget:Droflax"

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(291 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
<div class="language-switch">
  <a data-lang="pt"><img src="https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg" width="32" height="24"></a>
  <a data-lang="es"><img src="https://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Spain.svg" width="32" height="24"></a>
  <a data-lang="en"><img src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg" width="32" height="24"></a>
  <a data-lang="pl"><img src="https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg" width="32" height="24"></a>
</div>
<style>
.language-switch {
  display: flex;
  gap: 6px;
  margin: 8px 0;
  justify-content: center;
}
.language-switch img {
  border: 1px solid #ccc;
  border-radius: 6px;
  cursor: pointer;
  transition: transform 0.2s ease, border-color 0.2s ease;
}
.language-switch img:hover {
  transform: scale(1.1);
  border-color: #333;
}
.language-switch img.active {
  border-color: #000;
}
</style>
<script>
<script>
(function () {
(function () {
   // Esperar a que el DOM esté listo
   let currentLang = 'pt'; // idioma por defecto
  function onReady(fn) {
    if (document.readyState !== 'loading') {
      fn();
    } else {
      document.addEventListener('DOMContentLoaded', fn);
    }
  }


   onReady(function () {
   const langSwitch = document.querySelector('.language-switch');
     const langs = ['pt', 'en', 'es', 'pl'];
  if (langSwitch) {
    const langFlags = {
     langSwitch.querySelectorAll('a[data-lang]').forEach(btn => {
      pt: 'https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg',
      btn.addEventListener('click', () => {
      en: 'https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg',
        currentLang = btn.dataset.lang;
      es: 'https://upload.wikimedia.org/wikipedia/en/9/9a/Flag_of_Spain.svg',
        langSwitch.querySelectorAll('img').forEach(img => img.classList.remove('active'));
      pl: 'https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg'
        btn.querySelector('img').classList.add('active');
    };


    // Obtener título de página actual
        const active = document.querySelector('.skill-icon.active');
    var currentTitle = (window.mw && mw.config && mw.config.get('wgPageName')) || '';
         if (active) active.click();
    if (!currentTitle) {
      currentTitle = decodeURIComponent(window.location.pathname.split('/').pop());
    }
 
    const langRegex = /\/(pt|en|es|pl)$/;
    const currentLangMatch = currentTitle.match(langRegex);
    const currentLang = currentLangMatch ? currentLangMatch[1] : 'pt';
    const baseTitle = currentTitle.replace(langRegex, '');
 
    // Función para consultar si una página existe usando API MediaWiki
    function pageExists(title, callback) {
      var apiUrl = (window.mw && mw.config && mw.config.get('wgScriptPath') ? mw.config.get('wgScriptPath') : '') + '/api.php';
      var url = apiUrl + '?action=query&titles=' + encodeURIComponent(title) + '&format=json';
 
      fetch(url)
        .then(response => response.json())
        .then(data => {
          var pages = data.query.pages;
          var pageId = Object.keys(pages)[0];
          // Si pageId es -1 la página no existe
          callback(pageId !== '-1');
        })
        .catch(() => {
          // En caso de error asumimos que no existe
          callback(false);
        });
    }
 
    // Si la URL tiene un sufijo de idioma y no es portugués, verificamos si existe la página
    if (currentLang !== 'pt') {
      pageExists(currentTitle, function (exists) {
         if (!exists) {
          // Si no existe, redirigir a la versión sin sufijo (la original)
          var baseUrl = (window.mw && mw.util && mw.util.getUrl) ? mw.util.getUrl(baseTitle) : '/index.php/' + encodeURIComponent(baseTitle);
          // Solo redirigir si no estamos ya ahí para evitar bucles
          if (window.location.pathname !== baseUrl) {
            window.location.replace(baseUrl);
          }
        }
       });
       });
     }
     });


     // CONTINUAR CON LA CREACIÓN DE LOS BOTONES DE IDIOMA
     // Activar la bandera por defecto
 
     const defaultBtn = langSwitch.querySelector('a[data-lang="pt"] img');
    // Redirección automática si usuario eligió idioma y no está en esa versión
     if (defaultBtn) defaultBtn.classList.add('active');
     const preferedLang = localStorage.getItem('preferedLang');
  }
     const alreadyInLang = currentLang === preferedLang;
    const redirected = sessionStorage.getItem('langRedirectDone');


    // Importante: Solo hacer esta redirección si ya NO estamos redirigiendo por página inexistente
  const oldClicks = document.querySelectorAll('.skill-icon');
    if (preferedLang && !alreadyInLang && !redirected && (currentLang === 'pt' || currentLang === 'pt')) {
  oldClicks.forEach(el => {
      const targetTitle = baseTitle + (preferedLang === 'pt' ? '' : '/' + preferedLang);
    el.addEventListener('click', () => {
      sessionStorage.setItem('langRedirectDone', '1');
       const name = el.dataset.nome || '';
       var targetUrl = (window.mw && mw.util && mw.util.getUrl) ? mw.util.getUrl(targetTitle) : '/index.php/' + encodeURIComponent(targetTitle);
       const rawDesc = el.dataset.desc || '';
       window.location.href = targetUrl;
       let descText = '';
       return;
    }


    // Crear contenedor para los botones de idioma
      try {
    var container = document.createElement('div');
        const obj = JSON.parse(rawDesc);
    container.className = 'language-buttons';
        descText = obj[currentLang] || obj['pt'] || '';
    container.style.position = 'fixed';
      } catch (e) {
    container.style.top = '20px';
        descText = rawDesc; // fallback si no es un JSON
    container.style.right = '20px';
      }
    container.style.display = 'flex';
    container.style.gap = '8px';
    container.style.background = '#ffffffcc';
    container.style.padding = '6px 10px';
    container.style.borderRadius = '8px';
    container.style.boxShadow = '0 0 6px rgba(0,0,0,0.2)';
    container.style.zIndex = '999';


    // Para cada idioma creamos el botón
       const attrs = el.dataset.atr || '';
    langs.forEach(function (lang) {
       const descBox = document.querySelector('.desc-box');
       var pageTitle = baseTitle + (lang === 'pt' ? '' : '/' + lang);
       if (descBox) {
      var link = document.createElement('a');
         descBox.innerHTML = `<div class="skill-title"><h3>${name}</h3></div>${renderAttributes(attrs)}<div class="desc">${descText}</div>`;
      link.title = lang.toUpperCase();
       }
 
      // Guardar preferencia al hacer click
      link.addEventListener('click', function () {
        localStorage.setItem('preferedLang', lang);
        sessionStorage.removeItem('langRedirectDone');
      });
 
       var img = document.createElement('img');
      img.src = langFlags[lang];
      img.style.width = '32px';
      img.style.height = '24px';
      img.style.borderRadius = '6px';
      img.style.border = (lang === currentLang) ? '2px solid #333' : '1px solid #ccc';
       img.style.transition = 'transform 0.2s ease';
      img.style.objectFit = 'cover';
      img.style.cursor = 'pointer';
      img.addEventListener('mouseenter', function () {
         img.style.transform = 'scale(1.1)';
        img.style.borderColor = '#888';
      });
      img.addEventListener('mouseleave', function () {
        img.style.transform = 'scale(1)';
        img.style.borderColor = (lang === currentLang) ? '#333' : '#ccc';
      });
 
      // Enlace apuntando directamente, sin verificar existencia, para que el usuario pueda probar.
      link.href = (window.mw && mw.util && mw.util.getUrl) ? mw.util.getUrl(pageTitle) : '/index.php/' + encodeURIComponent(pageTitle);
 
       link.appendChild(img);
      container.appendChild(link);
     });
     });
    document.body.appendChild(container);
   });
   });
})();
})();
</script>
</script>

Edição atual tal como às 06h05min de 31 de agosto de 2025

 <a data-lang="pt"><img src="https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg" width="32" height="24"></a>
 <a data-lang="es"><img src="https://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Spain.svg" width="32" height="24"></a>
 <a data-lang="en"><img src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg" width="32" height="24"></a>
 <a data-lang="pl"><img src="https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg" width="32" height="24"></a>

<style> .language-switch {

 display: flex;
 gap: 6px;
 margin: 8px 0;
 justify-content: center;

} .language-switch img {

 border: 1px solid #ccc;
 border-radius: 6px;
 cursor: pointer;
 transition: transform 0.2s ease, border-color 0.2s ease;

} .language-switch img:hover {

 transform: scale(1.1);
 border-color: #333;

} .language-switch img.active {

 border-color: #000;

} </style>

<script> (function () {

 let currentLang = 'pt'; // idioma por defecto
 const langSwitch = document.querySelector('.language-switch');
 if (langSwitch) {
   langSwitch.querySelectorAll('a[data-lang]').forEach(btn => {
     btn.addEventListener('click', () => {
       currentLang = btn.dataset.lang;
       langSwitch.querySelectorAll('img').forEach(img => img.classList.remove('active'));
       btn.querySelector('img').classList.add('active');
       const active = document.querySelector('.skill-icon.active');
       if (active) active.click();
     });
   });
   // Activar la bandera por defecto
   const defaultBtn = langSwitch.querySelector('a[data-lang="pt"] img');
   if (defaultBtn) defaultBtn.classList.add('active');
 }
 const oldClicks = document.querySelectorAll('.skill-icon');
 oldClicks.forEach(el => {
   el.addEventListener('click', () => {
     const name = el.dataset.nome || ;
     const rawDesc = el.dataset.desc || ;
     let descText = ;
     try {
       const obj = JSON.parse(rawDesc);
       descText = obj[currentLang] || obj['pt'] || ;
     } catch (e) {
       descText = rawDesc; // fallback si no es un JSON
     }
     const attrs = el.dataset.atr || ;
     const descBox = document.querySelector('.desc-box');
     if (descBox) {

descBox.innerHTML = `

${name}

${renderAttributes(attrs)}

${descText}

`;

     }
   });
 });

})(); </script>