Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* Eigene Sprachleiste: manuelles Umschalten mit setlang + Anpassung aller MyLanguage-Links */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {

  // --- Grundkonfiguration ---
  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 verhindern ---
  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: gleiche Seite mit setlang erzwingen
  function targetUrl(code) {
    code = normalize(code);
    var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
    var url = mw.util.getUrl(title);
    return url + (url.includes('?') ? '&' : '?') + 'setlang=' + code;
  }

  // --- Sprachleiste bauen ---
  var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK);
  var bar = document.createElement('div');
  bar.id = 'custom-langbar';

  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);
  });

  // In DOM einfügen
  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);
  }

  // --- Sprache umschalten ---
  function switchLanguage(code) {
    code = normalize(code);

    if (mw.config.get('wgUserName')) {
      // Eingeloggt: User-Option setzen
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = targetUrl(code);
      });
    } else {
      // Gäste: nur URL-Wechsel
      location.href = targetUrl(code);
    }
  }

  // --- Alle MyLanguage-Links im Dokument anpassen ---
  function adjustMyLanguageLinks(langCode) {
    langCode = normalize(langCode);
    document.querySelectorAll('a[href*="Special:MyLanguage/"]').forEach(function (link) {
      var url = new URL(link.href, window.location.origin);
      url.searchParams.set('setlang', langCode);
      link.href = url.toString();
    });
  }

  // Sofort auf aktuelle Sprache anwenden
  adjustMyLanguageLinks(current);

  // Falls der Nutzer über die Sprachleiste wechselt, Links neu anpassen
  LANGS.forEach(function (lang) {
    document.querySelectorAll('#custom-langbar a[data-code="' + lang.code + '"]').forEach(function (el) {
      el.addEventListener('click', function () {
        adjustMyLanguageLinks(lang.code);
      });
    });
  });

  // --- Anonyme markieren (falls CSS nötig) ---
  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;
    }
  }
});