Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
  // ====== Automatische Anwendung der gespeicherten Sprache für Gäste ======
  if (!mw.config.get('wgUserName')) {
    try {
      var prefLang = localStorage.getItem('preferredLang');
      var currentLang = mw.config.get('wgUserLanguage');
      if (
        prefLang &&
        prefLang.toLowerCase() !== currentLang.toLowerCase() &&
        !/[?&](?:use|set)lang=/.test(location.search)
      ) {
        var url = new URL(window.location.href);
        url.searchParams.set('uselang', prefLang);
        location.replace(url.toString());
        return; // Rest des Codes nicht mehr ausführen
      }
    } catch (e) {}
  }
  // ========================================================================
   // ---- deine Sprachen ----
   // ---- deine Sprachen ----
   var LANGS = [
   var LANGS = [
Zeile 64: Zeile 85:
     }
     }


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


   // Optional: Gästen automatisch ihre zuletzt gewählte Sprache geben
   // Anonyme erkennen und Flag auf <html> setzen
  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) {}
});
 
// Anonyme erkennen und Flag auf <html> setzen
mw.loader.using('mediawiki.util', function () {
   if (!mw.config.get('wgUserName')) {
   if (!mw.config.get('wgUserName')) {
     document.documentElement.classList.add('bv-anon');
     document.documentElement.classList.add('bv-anon');
   }
   }
});


mw.loader.using('mediawiki.util', function () {
  // Gäste nicht auf Diskussionsseiten lassen → auf Inhaltsseite umleiten
   if (!mw.config.get('wgUserName')) {
   if (!mw.config.get('wgUserName')) {
     var ns = mw.config.get('wgNamespaceNumber');
     var ns = mw.config.get('wgNamespaceNumber');
Zeile 97: Zeile 103:
     }
     }
   }
   }
});
});

Version vom 8. August 2025, 10:25 Uhr

/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {

  // ====== Automatische Anwendung der gespeicherten Sprache für Gäste ======
  if (!mw.config.get('wgUserName')) {
    try {
      var prefLang = localStorage.getItem('preferredLang');
      var currentLang = mw.config.get('wgUserLanguage');

      if (
        prefLang &&
        prefLang.toLowerCase() !== currentLang.toLowerCase() &&
        !/[?&](?:use|set)lang=/.test(location.search)
      ) {
        var url = new URL(window.location.href);
        url.searchParams.set('uselang', prefLang);
        location.replace(url.toString());
        return; // Rest des Codes nicht mehr ausführen
      }
    } catch (e) {}
  }
  // ========================================================================

  // ---- 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 + in localStorage merken
    try { localStorage.setItem('preferredLang', code); } catch (e) {}
    location.href = targetUrlFor(code);
  }

  // Anonyme erkennen und Flag auf <html> setzen
  if (!mw.config.get('wgUserName')) {
    document.documentElement.classList.add('bv-anon');
  }

  // Gäste nicht auf Diskussionsseiten lassen → auf Inhaltsseite umleiten
  if (!mw.config.get('wgUserName')) {
    var ns = mw.config.get('wgNamespaceNumber');
    if (ns % 2 === 1) { // ungerade Namespace-Nummern = Diskussions-Namespace
      var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
      window.location.href = subjectUrl;
    }
  }

});