Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
/* Eigene Sprachleiste unter dem Header mit aktiver Sprache markiert */
/* Eigene Sprachleiste: komplette UI-Sprache umschalten (Minerva, global) */
mw.loader.using('mediawiki.util', function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
    // Definierte Sprachen und ihre URL-Suffixe
  // ---- Konfiguration: deine Sprachen (Label + Code) ----
    var langs = [
  var LANGS = [
        { code: 'de', label: 'Deutsch', suffix: '' },
    { code: 'de', label: 'Deutsch' },
        { code: 'en', label: 'English', suffix: '/en' },
    { code: 'en', label: 'English' },
        { code: 'fr', label: 'Français', suffix: '/fr' }
    { code: 'fr', label: 'Français' }
    ];
  ];


    var page = mw.config.get('wgPageName');
  // Nur einmal einfügen
  if (document.getElementById('custom-langbar')) return;


    // Wrapper für die Leiste
  var userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage');
    var $bar = $('<div id="custom-langbar"></div>');
  var page    = mw.config.get('wgPageName');


    langs.forEach(function (lang) {
  // Leiste bauen
        var url = mw.util.getUrl(page.replace(/\/[a-z]{2}$/, '') + lang.suffix);
  var bar = document.createElement('div');
        var $link = $('<a>')
  bar.id = 'custom-langbar';
            .attr('href', url)
            .text(lang.label);


        // Markierung, falls aktuelle Seite in dieser Sprache
  LANGS.forEach(function (lang) {
        if (
    var a = document.createElement('a');
            mw.config.get('wgContentLanguage') === lang.code ||
    a.href = '#';
            mw.config.get('wgPageName').endsWith('/' + lang.code)
    a.textContent = lang.label;
        ) {
    a.dataset.code = lang.code;
            $link.addClass('active-lang');
        }


        $bar.append($link);
    // Aktive Sprache markieren (UI-Sprache!)
    if (userLang === lang.code) a.className = 'active-lang';
 
    a.addEventListener('click', function (e) {
      e.preventDefault();
      switchLanguage(lang.code);
     });
     });


     // Unter den Header einfügen
     bar.appendChild(a);
    $('.minerva-header').after($bar);
  });
 
  // Direkt unter die Minerva-Header-Bar hängen
  var header = document.querySelector('.minerva-header') || document.body;
  header.parentNode.insertBefore(bar, header.nextSibling);
 
  // --- Sprachwechsel: eingeloggt => Preference setzen, Gast => setlang/uselang ---
  function switchLanguage(code) {
    var cur = mw.config.get('wgUserLanguage');
    if (cur === code) return;
 
    var urlBase = mw.util.getUrl(page);
 
    // Eingeloggt: Preference setzen (persistiert)
    if (mw.config.get('wgUserName')) {
      var api = new mw.Api();
      api.postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).then(function () {
        location.reload();
      }).catch(function () {
        // Fallback, falls API fehlschlägt
        location.href = urlBase + (urlBase.indexOf('?') > -1 ? '&' : '?') + 'setlang=' + code;
      });
      return;
    }
 
    // Gäste: erst versuchen, setlang (persistenter Cookie, falls verfügbar)
    var sep = urlBase.indexOf('?') > -1 ? '&' : '?';
    var setlangUrl = urlBase + sep + 'setlang=' + code;
    // Manche MW-Versionen haben setlang nicht; als Fallback uselang + localStorage
    try {
      // Merken, damit wir bei Folgeaufrufen automatisch anfügen können
      localStorage.setItem('preferredLang', code);
    } catch (e) { /* ignore */ }
 
    location.href = setlangUrl;
  }
 
  // Bonus: Falls der Gast schon mal gewählt hat und wir auf einer „nackten“ URL sind,
  // hänge automatisch ?uselang=… an (nur wenn keine lang-Parameter da sind)
  try {
    var pref = localStorage.getItem('preferredLang');
    if (!mw.config.get('wgUserName') && pref && !/[?&](?:use|set)lang=/.test(location.search)) {
      // Nur eine „stille“ Ergänzung – kein Endlosschleifen-Risiko
      var u = new URL(location.href);
      u.searchParams.set('uselang', pref);
      // Nur anwenden, wenn es nicht schon die aktuelle UI-Sprache ist
      if ((mw.config.get('wgUserLanguage') || '').toLowerCase() !== pref.toLowerCase()) {
        location.replace(u.toString());
      }
    }
  } catch (e) { /* ignore */ }
});
});

Version vom 8. August 2025, 09:51 Uhr

/* Eigene Sprachleiste: komplette UI-Sprache umschalten (Minerva, global) */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
  // ---- Konfiguration: deine Sprachen (Label + Code) ----
  var LANGS = [
    { code: 'de', label: 'Deutsch' },
    { code: 'en', label: 'English' },
    { code: 'fr', label: 'Français' }
  ];

  // Nur einmal einfügen
  if (document.getElementById('custom-langbar')) return;

  var userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage');
  var page    = mw.config.get('wgPageName');

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

  LANGS.forEach(function (lang) {
    var a = document.createElement('a');
    a.href = '#';
    a.textContent = lang.label;
    a.dataset.code = lang.code;

    // Aktive Sprache markieren (UI-Sprache!)
    if (userLang === lang.code) a.className = 'active-lang';

    a.addEventListener('click', function (e) {
      e.preventDefault();
      switchLanguage(lang.code);
    });

    bar.appendChild(a);
  });

  // Direkt unter die Minerva-Header-Bar hängen
  var header = document.querySelector('.minerva-header') || document.body;
  header.parentNode.insertBefore(bar, header.nextSibling);

  // --- Sprachwechsel: eingeloggt => Preference setzen, Gast => setlang/uselang ---
  function switchLanguage(code) {
    var cur = mw.config.get('wgUserLanguage');
    if (cur === code) return;

    var urlBase = mw.util.getUrl(page);

    // Eingeloggt: Preference setzen (persistiert)
    if (mw.config.get('wgUserName')) {
      var api = new mw.Api();
      api.postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).then(function () {
        location.reload();
      }).catch(function () {
        // Fallback, falls API fehlschlägt
        location.href = urlBase + (urlBase.indexOf('?') > -1 ? '&' : '?') + 'setlang=' + code;
      });
      return;
    }

    // Gäste: erst versuchen, setlang (persistenter Cookie, falls verfügbar)
    var sep = urlBase.indexOf('?') > -1 ? '&' : '?';
    var setlangUrl = urlBase + sep + 'setlang=' + code;
    // Manche MW-Versionen haben setlang nicht; als Fallback uselang + localStorage
    try {
      // Merken, damit wir bei Folgeaufrufen automatisch anfügen können
      localStorage.setItem('preferredLang', code);
    } catch (e) { /* ignore */ }

    location.href = setlangUrl;
  }

  // Bonus: Falls der Gast schon mal gewählt hat und wir auf einer „nackten“ URL sind,
  // hänge automatisch ?uselang=… an (nur wenn keine lang-Parameter da sind)
  try {
    var pref = localStorage.getItem('preferredLang');
    if (!mw.config.get('wgUserName') && pref && !/[?&](?:use|set)lang=/.test(location.search)) {
      // Nur eine „stille“ Ergänzung – kein Endlosschleifen-Risiko
      var u = new URL(location.href);
      u.searchParams.set('uselang', pref);
      // Nur anwenden, wenn es nicht schon die aktuelle UI-Sprache ist
      if ((mw.config.get('wgUserLanguage') || '').toLowerCase() !== pref.toLowerCase()) {
        location.replace(u.toString());
      }
    }
  } catch (e) { /* ignore */ }
});