Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
/* Eigene Sprachleiste: komplette UI-Sprache umschalten (Minerva, global) */
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
   // ---- Konfiguration: deine Sprachen (Label + Code) ----
   // ---- deine Sprachen ----
   var LANGS = [
   var LANGS = [
     { code: 'de', label: 'Deutsch' },
     { code: 'de', label: 'Deutsch' },
Zeile 8: Zeile 8:
   ];
   ];


  // Nur einmal einfügen
   if (document.getElementById('custom-langbar')) return;
   if (document.getElementById('custom-langbar')) return;


   var userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage');
   var userLang = (mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || 'de').toLowerCase();
   var page    = mw.config.get('wgPageName');
   var pageName = mw.config.get('wgPageName');
 
  // Basis-Seitenname ohne evtl. Sprach-Suffix (/en, /fr, /pt-br, …)
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');


   // Leiste bauen
   // Leiste bauen
Zeile 24: Zeile 26:
     a.dataset.code = lang.code;
     a.dataset.code = lang.code;


    // Aktive Sprache markieren (UI-Sprache!)
     if (userLang === lang.code.toLowerCase()) a.className = 'active-lang';
     if (userLang === lang.code) a.className = 'active-lang';


     a.addEventListener('click', function (e) {
     a.addEventListener('click', function (e) {
       e.preventDefault();
       e.preventDefault();
       switchLanguage(lang.code);
       switchLanguageAndGo(lang.code);
     });
     });


Zeile 35: Zeile 36:
   });
   });


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


   // --- Sprachwechsel: eingeloggt => Preference setzen, Gast => setlang/uselang ---
   // ---- Logik: Sprache setzen + auf Übersetzung springen ----
   function switchLanguage(code) {
   function targetUrlFor(code) {
     var cur = mw.config.get('wgUserLanguage');
    // Special:MyLanguage löst auf die passende /lang-Unterseite auf
     if (cur === code) return;
    var title = 'Special:MyLanguage/' + baseTitle;
     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);
  }


     var urlBase = mw.util.getUrl(page);
  function switchLanguageAndGo(code) {
     code = code.toLowerCase();


     // Eingeloggt: Preference setzen (persistiert)
     // Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten
     if (mw.config.get('wgUserName')) {
     if (mw.config.get('wgUserName')) {
       var api = new mw.Api();
       new mw.Api().postWithToken('csrf', {
      api.postWithToken('csrf', {
         action: 'options',
         action: 'options',
         change: 'language=' + code
         change: 'language=' + code
       }).then(function () {
       }).always(function () {
        location.reload();
         location.href = targetUrlFor(code);
      }).catch(function () {
        // Fallback, falls API fehlschlägt
         location.href = urlBase + (urlBase.indexOf('?') > -1 ? '&' : '?') + 'setlang=' + code;
       });
       });
       return;
       return;
     }
     }


     // Gäste: erst versuchen, setlang (persistenter Cookie, falls verfügbar)
     // Gäste: direkt mit setlang auf MyLanguage gehen (persistenter als nur uselang)
    var sep = urlBase.indexOf('?') > -1 ? '&' : '?';
     try { localStorage.setItem('preferredLang', code); } catch (e) {}
    var setlangUrl = urlBase + sep + 'setlang=' + code;
     location.href = targetUrlFor(code);
    // Manche MW-Versionen haben setlang nicht; als Fallback uselang + localStorage
     try {
      // Merken, damit wir bei Folgeaufrufen automatisch anfügen können
      localStorage.setItem('preferredLang', code);
    } catch (e) { /* ignore */ }
 
     location.href = setlangUrl;
   }
   }


   // Bonus: Falls der Gast schon mal gewählt hat und wir auf einer „nackten“ URL sind,
   // Optional: Gästen automatisch ihre zuletzt gewählte Sprache geben
  // hänge automatisch ?uselang=… an (nur wenn keine lang-Parameter da sind)
   try {
   try {
     var pref = localStorage.getItem('preferredLang');
     var pref = localStorage.getItem('preferredLang');
     if (!mw.config.get('wgUserName') && pref && !/[?&](?:use|set)lang=/.test(location.search)) {
     if (!mw.config.get('wgUserName') && pref && userLang !== pref.toLowerCase() && !/[?&](?:use|set)lang=/.test(location.search)) {
      // Nur eine „stille“ Ergänzung – kein Endlosschleifen-Risiko
       var auto = targetUrlFor(pref);
       var u = new URL(location.href);
       // Soft-redirect nur, wenn wir nicht schon auf Special:MyLanguage sind
      u.searchParams.set('uselang', pref);
       if (!/^Special:MyLanguage\//i.test(mw.config.get('wgTitle'))) {
       // Nur anwenden, wenn es nicht schon die aktuelle UI-Sprache ist
         location.replace(auto);
       if ((mw.config.get('wgUserLanguage') || '').toLowerCase() !== pref.toLowerCase()) {
         location.replace(u.toString());
       }
       }
     }
     }
   } catch (e) { /* ignore */ }
   } catch (e) {}
});
});

Version vom 8. August 2025, 09:59 Uhr

/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
  // ---- deine Sprachen ----
  var LANGS = [
    { code: 'de', label: 'Deutsch' },
    { code: 'en', label: 'English' },
    { code: 'fr', label: 'Français' }
  ];

  if (document.getElementById('custom-langbar')) return;

  var userLang = (mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || 'de').toLowerCase();
  var pageName = mw.config.get('wgPageName');

  // Basis-Seitenname ohne evtl. Sprach-Suffix (/en, /fr, /pt-br, …)
  var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');

  // Leiste bauen
  var bar = document.createElement('div');
  bar.id = 'custom-langbar';

  LANGS.forEach(function (lang) {
    var a = document.createElement('a');
    a.href = '#';
    a.textContent = lang.label;
    a.dataset.code = lang.code;

    if (userLang === lang.code.toLowerCase()) a.className = 'active-lang';

    a.addEventListener('click', function (e) {
      e.preventDefault();
      switchLanguageAndGo(lang.code);
    });

    bar.appendChild(a);
  });

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

  // ---- Logik: Sprache setzen + auf Übersetzung springen ----
  function targetUrlFor(code) {
    // Special:MyLanguage löst auf die passende /lang-Unterseite auf
    var title = 'Special:MyLanguage/' + baseTitle;
    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) {
    code = code.toLowerCase();

    // Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten
    if (mw.config.get('wgUserName')) {
      new mw.Api().postWithToken('csrf', {
        action: 'options',
        change: 'language=' + code
      }).always(function () {
        location.href = targetUrlFor(code);
      });
      return;
    }

    // Gäste: direkt mit setlang auf MyLanguage gehen (persistenter als nur uselang)
    try { localStorage.setItem('preferredLang', code); } catch (e) {}
    location.href = targetUrlFor(code);
  }

  // Optional: Gästen automatisch ihre zuletzt gewählte Sprache geben
  try {
    var pref = localStorage.getItem('preferredLang');
    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
      if (!/^Special:MyLanguage\//i.test(mw.config.get('wgTitle'))) {
        location.replace(auto);
      }
    }
  } catch (e) {}
});