Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 1: Zeile 1:
/* Eigene Sprachleiste: manuelles Umschalten (ohne Auto-Logik), robust für Minerva/Vector */
/* Eigene Sprachleiste: ULS-Cookie setzen + persistente Sprache für Gäste + Diskussionsseiten-Redirect */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.init', 'jquery.cookie'], 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 13: Zeile 7:
     { code: 'fr', label: 'Français' }
     { code: 'fr', label: 'Français' }
   ];
   ];
   var ALLOWED = ['de', 'en', 'fr'];
   var FALLBACK_LANG = 'en';
  var FALLBACK = 'en';
  var ALLOWED_LANGS = ['de', 'en', 'fr'];


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


  var pageName = mw.config.get('wgPageName'); // mit _ statt Leerzeichen
   function normalizeLang(code) {
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); // ggf. /de,/en,… abschneiden
     if (!code) return FALLBACK_LANG;
 
     code = code.toLowerCase().split('-')[0];
   function normalize(code) {
     return ALLOWED_LANGS.includes(code) ? code : FALLBACK_LANG;
     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 buildLangUrl(langCode) {
   function targetUrl(code) {
     var targetUrl = mw.util.getUrl(baseTitle + '/' + langCode);
     code = normalize(code);
     var sep = targetUrl.indexOf('?') > -1 ? '&' : '?';
    var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
    return targetUrl + sep + 'uselang=' + langCode;
     var url = mw.util.getUrl(title);
    return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
   }
   }


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


  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;
      a.dataset.code = lang.code;
      if (currentLang === lang.code) a.className = 'active-lang';
      a.addEventListener('click', function (e) {
        e.preventDefault();
        switchLanguageAndGo(lang.code);
      });
      bar.appendChild(a);
    });


  LANGS.forEach(function (lang) {
     var header = document.querySelector('.minerva-header') || document.body;
     var a = document.createElement('a');
     header.parentNode.insertBefore(bar, header.nextSibling);
    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)
   function switchLanguageAndGo(code) {
  var mount =
    code = normalizeLang(code);
    document.querySelector('.minerva-header') ||
    document.querySelector('.vector-header') ||
    document.getElementById('content') ||
    document.body;


  if (mount && mount.parentNode) {
    // Für Gäste: ULS-Cookie setzen (wie das originale UI)
    mount.parentNode.insertBefore(bar, mount.nextSibling);
    try {
  } else {
      $.cookie('uls-previous-language', code, { path: '/', expires: 30 });
    document.body.insertBefore(bar, document.body.firstChild);
    } catch (e) {}
  }


  // Sprachwechsel: eingeloggte speichern; Gäste nur per URL-Parameter
    if (mw.uls && typeof mw.uls.setLanguage === 'function') {
  function switchLanguage(code) {
      mw.uls.setLanguage(code);
    code = normalize(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 = targetUrl(code);
         location.href = buildLangUrl(code);
       });
       });
     } else {
     } else {
       location.href = targetUrl(code);
      // Gäste: direkt umleiten
       location.href = buildLangUrl(code);
     }
     }
   }
   }


   // Anonyme markieren (falls du CSS darauf hast)
   // Anonyme markieren
   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 → zurück zur Inhaltseite
   // Gäste nicht auf Diskussionsseiten lassen
   if (!mw.config.get('wgUserName')) {
   if (!mw.config.get('wgUserName')) {
     var nsNum = mw.config.get('wgNamespaceNumber');
     var ns = mw.config.get('wgNamespaceNumber');
     if (nsNum % 2 === 1) {
     if (ns % 2 === 1) {
       var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
       var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
       window.location.href = subject;
       window.location.href = subjectUrl;
     }
     }
   }
   }
});
});

Version vom 8. August 2025, 14:18 Uhr

/* Eigene Sprachleiste: ULS-Cookie setzen + persistente Sprache für Gäste + Diskussionsseiten-Redirect */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.init', 'jquery.cookie'], function () {

  var LANGS = [
    { code: 'de', label: 'Deutsch' },
    { code: 'en', label: 'English' },
    { code: 'fr', label: 'Français' }
  ];
  var FALLBACK_LANG = 'en';
  var ALLOWED_LANGS = ['de', 'en', 'fr'];

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

  function normalizeLang(code) {
    if (!code) return FALLBACK_LANG;
    code = code.toLowerCase().split('-')[0];
    return ALLOWED_LANGS.includes(code) ? code : FALLBACK_LANG;
  }

  function buildLangUrl(langCode) {
    var targetUrl = mw.util.getUrl(baseTitle + '/' + langCode);
    var sep = targetUrl.indexOf('?') > -1 ? '&' : '?';
    return targetUrl + sep + 'uselang=' + langCode;
  }

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

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

    var header = document.querySelector('.minerva-header') || document.body;
    header.parentNode.insertBefore(bar, header.nextSibling);
  }

  function switchLanguageAndGo(code) {
    code = normalizeLang(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')) {
      // Eingeloggte User: Sprache in Optionen speichern
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = buildLangUrl(code);
      });
    } else {
      // Gäste: direkt umleiten
      location.href = buildLangUrl(code);
    }
  }

  // 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 ns = mw.config.get('wgNamespaceNumber');
    if (ns % 2 === 1) {
      var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
      window.location.href = subjectUrl;
    }
  }

});