Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
/* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () {
   // ---- deine Sprachen ----
 
   // --- Nur im Lesemodus + Haupt-Namensraum ---
  var action = mw.config.get('wgAction');
  var ns = mw.config.get('wgNamespaceNumber');
  if (action !== 'view' || ns !== 0) return;
 
  // --- Sprachen ---
   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 ALLOWED = ['de', 'en', 'fr'];
  var FALLBACK = 'en';


  // Doppelte Einbindung vermeiden
   if (document.getElementById('custom-langbar')) return;
   if (document.getElementById('custom-langbar')) return;


  var userLang = (mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || 'de').toLowerCase();
   var pageName = mw.config.get('wgPageName');
   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;
  }


   // Basis-Seitenname ohne evtl. Sprach-Suffix (/en, /fr, /pt-br, …)
   // Ziel-URL mit Special:MyLanguage und uselang
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
  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;
  }


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


   LANGS.forEach(function (lang) {
   LANGS.forEach(function (lang) {
Zeile 24: Zeile 46:
     a.href = '#';
     a.href = '#';
     a.textContent = lang.label;
     a.textContent = lang.label;
    a.dataset.code = lang.code;
     if (current === lang.code) a.className = 'active-lang';
 
     if (userLang === lang.code.toLowerCase()) a.className = 'active-lang';
 
     a.addEventListener('click', function (e) {
     a.addEventListener('click', function (e) {
       e.preventDefault();
       e.preventDefault();
       switchLanguageAndGo(lang.code);
       switchLanguage(lang.code);
     });
     });
     bar.appendChild(a);
     bar.appendChild(a);
   });
   });


  // Unter die Minerva-Header-Bar hängen
   var mount =
   var header = document.querySelector('.minerva-header') || document.body;
    document.querySelector('.minerva-header') ||
  header.parentNode.insertBefore(bar, header.nextSibling);
    document.querySelector('.vector-header') ||
    document.getElementById('content') ||
    document.body;


   // ---- Logik: Sprache setzen + auf Übersetzung springen ----
   if (mount && mount.parentNode) {
  function targetUrlFor(code) {
     mount.parentNode.insertBefore(bar, mount.nextSibling);
     // Special:MyLanguage löst auf die passende /lang-Unterseite auf
  } else {
    var title = 'Special:MyLanguage/' + baseTitle;
     document.body.insertBefore(bar, document.body.firstChild);
    var url = mw.util.getUrl(title);
    // setlang damit Gäste UND eingeloggte sofort die richtige UI sehen
     var sep = url.indexOf('?') > -1 ? '&' : '?';
    return url + sep + 'setlang=' + encodeURIComponent(code);
   }
   }


   function switchLanguageAndGo(code) {
  // --- Sprachwechsel ---
     code = code.toLowerCase();
   function switchLanguage(code) {
     code = normalize(code);


     // Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten
     // Versuch: Sprache direkt über ULS setzen (für Gäste persistent)
    if (mw.uls && typeof mw.uls.setLanguage === 'function') {
      mw.uls.setLanguage(code);
    }
 
    // Für eingeloggte Benutzer: Option speichern
     if (mw.config.get('wgUserName')) {
     if (mw.config.get('wgUserName')) {
       new mw.Api().postWithToken('csrf', {
       new mw.Api().postWithToken('csrf', {
Zeile 59: Zeile 81:
         change: 'language=' + code
         change: 'language=' + code
       }).always(function () {
       }).always(function () {
         location.href = targetUrlFor(code);
         location.href = targetUrl(code);
       });
       });
       return;
    } else {
       // Für Gäste: Sprache auch im localStorage sichern
      try { localStorage.setItem('preferredLang', code); } catch (e) {}
      location.href = targetUrl(code);
     }
     }
  }


    // Gäste: direkt mit setlang auf MyLanguage gehen (persistenter als nur uselang)
  // --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden ---
     try { localStorage.setItem('preferredLang', code); } catch (e) {}
  if (!mw.config.get('wgUserName')) {
    location.href = targetUrlFor(code);
     try {
      var pref = normalize(localStorage.getItem('preferredLang'));
      var currentLang = normalize(mw.config.get('wgUserLanguage'));
      if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) {
        location.replace(targetUrl(pref));
      }
    } catch (e) {}
   }
   }


   // Optional: Gästen automatisch ihre zuletzt gewählte Sprache geben
   // --- Anonyme markieren ---
   try {
   if (!mw.config.get('wgUserName')) {
     var pref = localStorage.getItem('preferredLang');
     document.documentElement.classList.add('bv-anon');
    if (!mw.config.get('wgUserName') && pref && userLang !== pref.toLowerCase() && !/[?&](?:use|set)lang=/.test(location.search)) {
  }
       var auto = targetUrlFor(pref);
 
      // Soft-redirect nur, wenn wir nicht schon auf Special:MyLanguage sind
  // --- Gäste nicht auf Diskussionsseiten lassen ---
      if (!/^Special:MyLanguage\//i.test(mw.config.get('wgTitle'))) {
  if (!mw.config.get('wgUserName')) {
        location.replace(auto);
    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;
     }
     }
   } catch (e) {}
   }
});
});

Aktuelle Version vom 8. August 2025, 14:41 Uhr

/* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () {

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

  // Doppelte Einbindung vermeiden
  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 mit Special:MyLanguage und 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;
  }

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

  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 ---
  function switchLanguage(code) {
    code = normalize(code);

    // Versuch: Sprache direkt über ULS setzen (für Gäste persistent)
    if (mw.uls && typeof mw.uls.setLanguage === 'function') {
      mw.uls.setLanguage(code);
    }

    // Für eingeloggte Benutzer: Option speichern
    if (mw.config.get('wgUserName')) {
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = targetUrl(code);
      });
    } else {
      // Für Gäste: Sprache auch im localStorage sichern
      try { localStorage.setItem('preferredLang', code); } catch (e) {}
      location.href = targetUrl(code);
    }
  }

  // --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden ---
  if (!mw.config.get('wgUserName')) {
    try {
      var pref = normalize(localStorage.getItem('preferredLang'));
      var currentLang = normalize(mw.config.get('wgUserLanguage'));
      if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) {
        location.replace(targetUrl(pref));
      }
    } catch (e) {}
  }

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