Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Änderung 435 von Beeventionmanual (Diskussion) rückgängig gemacht.
Markierung: Rückgängigmachung
Zeile 1: Zeile 1:
/* Eigene Sprachleiste: ULS-Cookie setzen + persistente Sprache für Gäste + Diskussionsseiten-Redirect */
/* Eigene Sprachleiste: manuelles Umschalten (ohne Auto-Logik), robust für Minerva/Vector */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.init', 'jquery.cookie'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {


  // --- Nur im Lesemodus + im Haupt-Namensraum (0) anzeigen ---
  var action = mw.config.get('wgAction');
  var ns = mw.config.get('wgNamespaceNumber');
  if (action !== 'view' || ns !== 0) return;
  // --- Sprachen definieren ---
   var LANGS = [
   var LANGS = [
     { code: 'de', label: 'Deutsch' },
     { code: 'de', label: 'Deutsch' },
Zeile 7: Zeile 13:
     { code: 'fr', label: 'Français' }
     { code: 'fr', label: 'Français' }
   ];
   ];
   var FALLBACK_LANG = 'en';
   var ALLOWED = ['de', 'en', 'fr'];
  var ALLOWED_LANGS = ['de', 'en', 'fr'];
  var FALLBACK = 'en';


   var pageName = mw.config.get('wgPageName');
   // Doppelte Einbindung vermeiden
   var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
   if (document.getElementById('custom-langbar')) return;


   function normalizeLang(code) {
  var pageName = mw.config.get('wgPageName'); // mit _ statt Leerzeichen
     if (!code) return FALLBACK_LANG;
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); // ggf. /de,/en,… abschneiden
     code = code.toLowerCase().split('-')[0];
 
     return ALLOWED_LANGS.includes(code) ? code : FALLBACK_LANG;
   function normalize(code) {
     if (!code) return FALLBACK;
     code = String(code).toLowerCase().split('-')[0];
     return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
   }
   }


   function buildLangUrl(langCode) {
  // Ziel-URL: gleiche Seite in gewünschter Sprache über Special:MyLanguage + uselang
     var targetUrl = mw.util.getUrl(baseTitle + '/' + langCode);
   function targetUrl(code) {
     var sep = targetUrl.indexOf('?') > -1 ? '&' : '?';
    code = normalize(code);
    return targetUrl + sep + 'uselang=' + langCode;
    var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
     var url = mw.util.getUrl(title);
     return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
   }
   }


   // Sprachleiste erstellen
   // Bar bauen
   if (!document.getElementById('custom-langbar')) {
   var bar = document.createElement('div');
    var bar = document.createElement('div');
  bar.id = 'custom-langbar';
    bar.id = 'custom-langbar';
    var currentLang = normalizeLang(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK_LANG);


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


    var header = document.querySelector('.minerva-header') || document.body;
  // Sicher ins DOM hängen (Minerva/Vector kompatibel)
     header.parentNode.insertBefore(bar, header.nextSibling);
  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);
   }
   }


   function switchLanguageAndGo(code) {
   // Sprachwechsel: eingeloggte speichern; Gäste nur per URL-Parameter
    code = normalizeLang(code);
  function switchLanguage(code) {
 
     code = normalize(code);
    // Für Gäste: ULS-Cookie setzen (wie das originale UI)
    try {
      $.cookie('uls-previous-language', code, { path: '/', expires: 30 });
    } catch (e) {}
 
     if (mw.uls && typeof mw.uls.setLanguage === 'function') {
      mw.uls.setLanguage(code);
    }


     if (mw.config.get('wgUserName')) {
     if (mw.config.get('wgUserName')) {
      // Eingeloggte User: Sprache in Optionen speichern
       new mw.Api().postWithToken('csrf', {
       new mw.Api().postWithToken('csrf', {
         action: 'options',
         action: 'options',
         change: 'language=' + code
         change: 'language=' + code
       }).always(function () {
       }).always(function () {
         location.href = buildLangUrl(code);
         location.href = targetUrl(code);
       });
       });
     } else {
     } else {
      // Gäste: direkt umleiten
       location.href = targetUrl(code);
       location.href = buildLangUrl(code);
     }
     }
   }
   }


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


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

Version vom 8. August 2025, 14:20 Uhr

/* Eigene Sprachleiste: manuelles Umschalten (ohne Auto-Logik), robust für Minerva/Vector */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {

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

  // --- Sprachen definieren ---
  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'); // mit _ statt Leerzeichen
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); // ggf. /de,/en,… abschneiden

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

  // Ziel-URL: gleiche Seite in gewünschter Sprache über 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;
  }

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

  // Sicher ins DOM hängen (Minerva/Vector kompatibel)
  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: eingeloggte speichern; Gäste nur per URL-Parameter
  function switchLanguage(code) {
    code = normalize(code);

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

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

  // Gäste nicht auf Diskussionsseiten lassen → zurück zur Inhaltseite
  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;
    }
  }
});