Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(25 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
/* === ULS-Button in Minerva neben der Glocke einblenden ===================== *
/* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */
* Voraussetzungen:
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () {
* - wfLoadExtension('UniversalLanguageSelector');
* - $wgULSAnonCanChangeLanguage = true; (optional)
* - Skin: Minerva (mobil/desktop)
* -------------------------------------------------------------------------- */


mw.loader.using(['ext.uls.interface', 'mediawiki.util'], function () {
  // --- Nur im Lesemodus + Haupt-Namensraum ---
   // Nur im Minerva-Skin eingreifen
  var action = mw.config.get('wgAction');
  if (mw.config.get('skin') !== 'minerva') return;
   var ns = mw.config.get('wgNamespaceNumber');
  if (action !== 'view' || ns !== 0) return;


   // 1) Vorhandenen ULS-Trigger nehmen oder einen eigenen bauen
   // --- Sprachen ---
   var $trigger = $('a.uls-trigger, #pt-uls a').first();
   var LANGS = [
  if (!$trigger.length) {
    { code: 'de', label: 'Deutsch' },
     $trigger = $('<a>')
    { code: 'en', label: 'English' },
      .attr('href', '#')
     { code: 'fr', label: 'Français' }
      .addClass('uls-trigger')
  ];
      .attr('title', mw.msg('uls-plang-title') || 'Sprache')
  var ALLOWED = ['de', 'en', 'fr'];
      .text('🌐'); // gern durch eigenes SVG/Icon ersetzen
  var FALLBACK = 'en';
 
  // Doppelte Einbindung vermeiden
  if (document.getElementById('custom-langbar')) return;
 
  var pageName = mw.config.get('wgPageName');
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
 
  function normalize(code) {
    if (!code) return FALLBACK;
    code = String(code).toLowerCase().split('-')[0];
    return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
   }
   }


   // 2) Versuche, die Glocke (Benachrichtigungen) im Minerva-Header zu finden
   // Ziel-URL mit Special:MyLanguage und uselang
   //    -> unterschiedliche Minerva-Versionen haben leicht andere Selektoren.
   function targetUrl(code) {
  var bell =
    code = normalize(code);
     document.querySelector('.minerva-header [href*="Special:Notifications"]') ||
     var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
    document.querySelector('.minerva-header .notifications') ||
     var url = mw.util.getUrl(title);
     document.querySelector('.minerva-header .icon--notifications') ||
     return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
     document.querySelector('.minerva-header .notification'); // letzter Versuch
  }


   // 3) Wenn Glocke gefunden: ULS-Button direkt DANACH einfügen
   // --- Sprachleiste bauen ---
   if (bell) {
   var bar = document.createElement('div');
    var holder = document.getElementById('mw-minerva-uls');
  bar.id = 'custom-langbar';
    if (!holder) {
 
      holder = document.createElement('div');
  var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK);
      holder.id = 'mw-minerva-uls';
 
       holder.className = 'minerva-icon mw-minerva-uls';
  LANGS.forEach(function (lang) {
    var a = document.createElement('a');
    a.href = '#';
    a.textContent = lang.label;
    if (current === lang.code) a.className = 'active-lang';
    a.addEventListener('click', function (e) {
       e.preventDefault();
      switchLanguage(lang.code);
    });
    bar.appendChild(a);
  });
 
  var mount =
    document.querySelector('.minerva-header') ||
    document.querySelector('.vector-header') ||
    document.getElementById('content') ||
    document.body;
 
  if (mount && mount.parentNode) {
    mount.parentNode.insertBefore(bar, mount.nextSibling);
  } else {
    document.body.insertBefore(bar, document.body.firstChild);
  }
 
  // --- Sprachwechsel ---
  function switchLanguage(code) {
    code = normalize(code);
 
    // Versuch: Sprache direkt über ULS setzen (für Gäste persistent)
    if (mw.uls && typeof mw.uls.setLanguage === 'function') {
      mw.uls.setLanguage(code);
    }
 
    // Für eingeloggte Benutzer: Option speichern
    if (mw.config.get('wgUserName')) {
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = targetUrl(code);
      });
     } else {
     } else {
       holder.innerHTML = '';
       // Für Gäste: Sprache auch im localStorage sichern
      try { localStorage.setItem('preferredLang', code); } catch (e) {}
      location.href = targetUrl(code);
     }
     }
     holder.appendChild($trigger.get(0));
  }
    bell.insertAdjacentElement('afterend', holder);
 
  // --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden ---
  if (!mw.config.get('wgUserName')) {
     try {
      var pref = normalize(localStorage.getItem('preferredLang'));
      var currentLang = normalize(mw.config.get('wgUserLanguage'));
      if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) {
        location.replace(targetUrl(pref));
      }
    } catch (e) {}
  }


    // Eventuellen Fallback-Button entfernen
  // --- Anonyme markieren ---
    var float = document.getElementById('mw-minerva-uls-float');
  if (!mw.config.get('wgUserName')) {
     if (float) float.remove();
     document.documentElement.classList.add('bv-anon');
    return;
   }
   }


   // 4) Fallback: Wenn Glocke nicht gefunden wurde, floatenden Button oben rechts zeigen,
   // --- Gäste nicht auf Diskussionsseiten lassen ---
  //    damit der ULS wenigstens erreichbar ist (zur Fehlersuche nützlich).
   if (!mw.config.get('wgUserName')) {
   if (!document.getElementById('mw-minerva-uls-float')) {
     var nsNum = mw.config.get('wgNamespaceNumber');
     var float = document.createElement('div');
     if (nsNum % 2 === 1) {
     float.id = 'mw-minerva-uls-float';
      var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
    float.className = 'mw-minerva-uls-float';
      window.location.href = subject;
    float.appendChild($trigger.get(0));
    }
    document.body.appendChild(float);
   }
   }
});
});

Aktuelle Version vom 8. August 2025, 14:41 Uhr

/* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () {

  // --- Nur im Lesemodus + Haupt-Namensraum ---
  var action = mw.config.get('wgAction');
  var ns = mw.config.get('wgNamespaceNumber');
  if (action !== 'view' || ns !== 0) return;

  // --- Sprachen ---
  var LANGS = [
    { code: 'de', label: 'Deutsch' },
    { code: 'en', label: 'English' },
    { code: 'fr', label: 'Français' }
  ];
  var ALLOWED = ['de', 'en', 'fr'];
  var FALLBACK = 'en';

  // Doppelte Einbindung vermeiden
  if (document.getElementById('custom-langbar')) return;

  var pageName = mw.config.get('wgPageName');
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');

  function normalize(code) {
    if (!code) return FALLBACK;
    code = String(code).toLowerCase().split('-')[0];
    return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
  }

  // Ziel-URL mit Special:MyLanguage und uselang
  function targetUrl(code) {
    code = normalize(code);
    var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
    var url = mw.util.getUrl(title);
    return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
  }

  // --- Sprachleiste bauen ---
  var bar = document.createElement('div');
  bar.id = 'custom-langbar';

  var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK);

  LANGS.forEach(function (lang) {
    var a = document.createElement('a');
    a.href = '#';
    a.textContent = lang.label;
    if (current === lang.code) a.className = 'active-lang';
    a.addEventListener('click', function (e) {
      e.preventDefault();
      switchLanguage(lang.code);
    });
    bar.appendChild(a);
  });

  var mount =
    document.querySelector('.minerva-header') ||
    document.querySelector('.vector-header') ||
    document.getElementById('content') ||
    document.body;

  if (mount && mount.parentNode) {
    mount.parentNode.insertBefore(bar, mount.nextSibling);
  } else {
    document.body.insertBefore(bar, document.body.firstChild);
  }

  // --- Sprachwechsel ---
  function switchLanguage(code) {
    code = normalize(code);

    // Versuch: Sprache direkt über ULS setzen (für Gäste persistent)
    if (mw.uls && typeof mw.uls.setLanguage === 'function') {
      mw.uls.setLanguage(code);
    }

    // Für eingeloggte Benutzer: Option speichern
    if (mw.config.get('wgUserName')) {
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = targetUrl(code);
      });
    } else {
      // Für Gäste: Sprache auch im localStorage sichern
      try { localStorage.setItem('preferredLang', code); } catch (e) {}
      location.href = targetUrl(code);
    }
  }

  // --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden ---
  if (!mw.config.get('wgUserName')) {
    try {
      var pref = normalize(localStorage.getItem('preferredLang'));
      var currentLang = normalize(mw.config.get('wgUserLanguage'));
      if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) {
        location.replace(targetUrl(pref));
      }
    } catch (e) {}
  }

  // --- Anonyme markieren ---
  if (!mw.config.get('wgUserName')) {
    document.documentElement.classList.add('bv-anon');
  }

  // --- Gäste nicht auf Diskussionsseiten lassen ---
  if (!mw.config.get('wgUserName')) {
    var nsNum = mw.config.get('wgNamespaceNumber');
    if (nsNum % 2 === 1) {
      var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
      window.location.href = subject;
    }
  }
});