Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 1: Zeile 1:
/* Sofortige, aber kontrollierte Überschreibung der Sprache für Gäste */
/* Eigene Sprachleiste: manuelles Umschalten + persistente Speicherung via ULS-Cookie */
(function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
  var FALLBACK = 'en';
  var ALLOWED = ['de', 'en', 'fr'];
 
  function normalize(code) {
    if (!code) return FALLBACK;
    code = String(code).toLowerCase().split('-')[0];
    return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
  }
 
  if (mw.config.get('wgUserName')) return; // Nur Gäste betreffen
 
  try {
    var prefLang = localStorage.getItem('preferredLang');
    if (!prefLang) return; // Keine Sprache gespeichert → nix tun
    prefLang = normalize(prefLang);


    var currentLang = normalize(mw.config.get('wgUserLanguage'));
  // --- Nur im Lesemodus + Haupt-Namensraum (0) ---
    var url = new URL(window.location.href);
  var action = mw.config.get('wgAction');
  var ns = mw.config.get('wgNamespaceNumber');
  if (action !== 'view' || ns !== 0) return;


    // Wenn schon in richtiger Sprache oder URL bereits setlang/uselang hat → nix tun
   // --- Sprachen ---
    if (
      prefLang === currentLang ||
      url.searchParams.has('setlang') ||
      url.searchParams.has('uselang')
    ) {
      return;
    }
 
    // Merken, dass wir gerade gewechselt haben, um Schleifen zu vermeiden
    if (sessionStorage.getItem('justSwitchedLang') === prefLang) {
      sessionStorage.removeItem('justSwitchedLang');
      return;
    }
 
    sessionStorage.setItem('justSwitchedLang', prefLang);
    url.searchParams.set('setlang', prefLang);
    location.replace(url.toString());
 
  } catch (e) {}
})();
 
/* Eigene Sprachleiste: manuelles Umschalten mit setlang + Anpassung aller MyLanguage-Links */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
 
   // --- Grundkonfiguration ---
   var LANGS = [
   var LANGS = [
     { code: 'de', label: 'Deutsch' },
     { code: 'de', label: 'Deutsch' },
Zeile 53: Zeile 15:
   var ALLOWED = ['de', 'en', 'fr'];
   var ALLOWED = ['de', 'en', 'fr'];
   var FALLBACK = 'en';
   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) {
   function normalize(code) {
     if (!code) return FALLBACK;
     if (!code) return FALLBACK;
     code = String(code).toLowerCase().split('-')[0];
     code = String(code).toLowerCase().split('-')[0];
     return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
     return ALLOWED.includes(code) ? code : FALLBACK;
   }
   }


   // Ziel-URL: gleiche Seite mit setlang erzwingen
  // Basis-Titel ohne Sprach-Suffix
  var pageName = mw.config.get('wgPageName');
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
 
   // Ziel-URL mit Special:MyLanguage + uselang
   function targetUrl(code) {
   function targetUrl(code) {
     code = normalize(code);
     code = normalize(code);
     var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
     var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
     var url = mw.util.getUrl(title);
     var url = mw.util.getUrl(title);
     return url + (url.includes('?') ? '&' : '?') + 'setlang=' + code;
     return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
  }
 
  // ULS-Cookie setzen
  function setULSCookie(lang) {
    var days = 30;
    var expires = new Date(Date.now() + days * 864e5).toUTCString();
    document.cookie = "language=" + encodeURIComponent(lang) +
                      "; expires=" + expires +
                      "; path=/; samesite=lax";
   }
   }


   // --- Sprachleiste bauen ---
   // Sprachleiste einfügen
   var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK);
   if (!document.getElementById('custom-langbar')) {
  var bar = document.createElement('div');
    var bar = document.createElement('div');
  bar.id = 'custom-langbar';
    bar.id = 'custom-langbar';


  LANGS.forEach(function (lang) {
    var currentLang = normalize(
    var a = document.createElement('a');
      mw.config.get('wgUserLanguage') ||
    a.href = '#';
      mw.config.get('wgContentLanguage') ||
    a.textContent = lang.label;
      FALLBACK
    if (current === lang.code) a.className = 'active-lang';
    );
    a.addEventListener('click', function (e) {
 
      e.preventDefault();
    LANGS.forEach(function (lang) {
      switchLanguage(lang.code);
      var a = document.createElement('a');
      a.href = '#';
      a.textContent = lang.label;
      if (currentLang === lang.code) a.className = 'active-lang';
      a.addEventListener('click', function (e) {
        e.preventDefault();
        switchLanguage(lang.code);
      });
      bar.appendChild(a);
     });
     });
    bar.appendChild(a);
  });


  // In DOM einfügen
    var mount =
  var mount =
      document.querySelector('.minerva-header') ||
    document.querySelector('.minerva-header') ||
      document.querySelector('.vector-header') ||
    document.querySelector('.vector-header') ||
      document.getElementById('content') ||
    document.getElementById('content') ||
      document.body;
    document.body;


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


   // --- Sprache umschalten ---
   // Sprachwechsel durchführen
   function switchLanguage(code) {
   function switchLanguage(code) {
     code = normalize(code);
     code = normalize(code);
    try {
      localStorage.setItem('preferredLang', code);
    } catch (e) {}
    setULSCookie(code); // Gäste: Cookie setzen, damit ULS Browser-Sprache ignoriert


     if (mw.config.get('wgUserName')) {
     if (mw.config.get('wgUserName')) {
       // Eingeloggt: User-Option setzen
       // Eingeloggt: auch MW-Option setzen
       new mw.Api().postWithToken('csrf', {
       new mw.Api().postWithToken('csrf', {
         action: 'options',
         action: 'options',
Zeile 117: Zeile 98:
       });
       });
     } else {
     } else {
      // Gäste: nur URL-Wechsel
       location.href = targetUrl(code);
       location.href = targetUrl(code);
     }
     }
   }
   }


   // --- Alle MyLanguage-Links im Dokument anpassen ---
   // Gäste markieren für CSS
   function adjustMyLanguageLinks(langCode) {
   if (!mw.config.get('wgUserName')) {
    langCode = normalize(langCode);
    document.documentElement.classList.add('bv-anon');
    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
   // Gäste nicht auf Diskussionsseiten lassen
   adjustMyLanguageLinks(current);
   if (!mw.config.get('wgUserName') && ns % 2 === 1) {
    var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
    window.location.href = subject;
  }


   // Falls der Nutzer über die Sprachleiste wechselt, Links neu anpassen
   // --- Beim Laden prüfen: Cookie oder localStorage nutzen ---
   LANGS.forEach(function (lang) {
   if (!mw.config.get('wgUserName')) {
     document.querySelectorAll('#custom-langbar a[data-code="' + lang.code + '"]').forEach(function (el) {
     try {
       el.addEventListener('click', function () {
      var prefLang = normalize(localStorage.getItem('preferredLang'));
        adjustMyLanguageLinks(lang.code);
       var cookieLang = (document.cookie.match(/(?:^|; )language=([^;]+)/) || [])[1];
      });
      cookieLang = normalize(cookieLang);
    });
  });


  // --- Anonyme markieren (falls CSS nötig) ---
      var chosenLang = prefLang || cookieLang;
  if (!mw.config.get('wgUserName')) {
      if (chosenLang && chosenLang !== normalize(mw.config.get('wgUserLanguage'))) {
    document.documentElement.classList.add('bv-anon');
        setULSCookie(chosenLang);
        var url = new URL(window.location.href);
        if (url.searchParams.get('uselang') !== chosenLang) {
          url.searchParams.set('uselang', chosenLang);
          location.replace(url.toString());
        }
      }
    } catch (e) {}
   }
   }


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

Version vom 8. August 2025, 14:38 Uhr

/* Eigene Sprachleiste: manuelles Umschalten + persistente Speicherung via ULS-Cookie */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {

  // --- Nur im Lesemodus + Haupt-Namensraum (0) ---
  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';

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

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

  // Ziel-URL mit Special:MyLanguage + 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;
  }

  // ULS-Cookie setzen
  function setULSCookie(lang) {
    var days = 30;
    var expires = new Date(Date.now() + days * 864e5).toUTCString();
    document.cookie = "language=" + encodeURIComponent(lang) +
                      "; expires=" + expires +
                      "; path=/; samesite=lax";
  }

  // Sprachleiste einfügen
  if (!document.getElementById('custom-langbar')) {
    var bar = document.createElement('div');
    bar.id = 'custom-langbar';

    var currentLang = 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 (currentLang === 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 durchführen
  function switchLanguage(code) {
    code = normalize(code);

    try {
      localStorage.setItem('preferredLang', code);
    } catch (e) {}

    setULSCookie(code); // Gäste: Cookie setzen, damit ULS Browser-Sprache ignoriert

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

  // Gäste markieren für CSS
  if (!mw.config.get('wgUserName')) {
    document.documentElement.classList.add('bv-anon');
  }

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

  // --- Beim Laden prüfen: Cookie oder localStorage nutzen ---
  if (!mw.config.get('wgUserName')) {
    try {
      var prefLang = normalize(localStorage.getItem('preferredLang'));
      var cookieLang = (document.cookie.match(/(?:^|; )language=([^;]+)/) || [])[1];
      cookieLang = normalize(cookieLang);

      var chosenLang = prefLang || cookieLang;
      if (chosenLang && chosenLang !== normalize(mw.config.get('wgUserLanguage'))) {
        setULSCookie(chosenLang);
        var url = new URL(window.location.href);
        if (url.searchParams.get('uselang') !== chosenLang) {
          url.searchParams.set('uselang', chosenLang);
          location.replace(url.toString());
        }
      }
    } catch (e) {}
  }

});