MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste | /* Eigene Sprachleiste: komplette UI-Sprache umschalten (Minerva, global) */ | ||
mw.loader.using('mediawiki.util', function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | ||
// ---- Konfiguration: deine Sprachen (Label + Code) ---- | |||
var LANGS = [ | |||
{ code: 'de', label: 'Deutsch' }, | |||
{ code: 'en', label: 'English' }, | |||
{ code: 'fr', label: 'Français' } | |||
]; | |||
// Nur einmal einfügen | |||
if (document.getElementById('custom-langbar')) return; | |||
var userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage'); | |||
var page = mw.config.get('wgPageName'); | |||
// 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; | |||
// Aktive Sprache markieren (UI-Sprache!) | |||
if (userLang === lang.code) a.className = 'active-lang'; | |||
a.addEventListener('click', function (e) { | |||
e.preventDefault(); | |||
switchLanguage(lang.code); | |||
}); | }); | ||
// | bar.appendChild(a); | ||
}); | |||
// Direkt unter die Minerva-Header-Bar hängen | |||
var header = document.querySelector('.minerva-header') || document.body; | |||
header.parentNode.insertBefore(bar, header.nextSibling); | |||
// --- Sprachwechsel: eingeloggt => Preference setzen, Gast => setlang/uselang --- | |||
function switchLanguage(code) { | |||
var cur = mw.config.get('wgUserLanguage'); | |||
if (cur === code) return; | |||
var urlBase = mw.util.getUrl(page); | |||
// Eingeloggt: Preference setzen (persistiert) | |||
if (mw.config.get('wgUserName')) { | |||
var api = new mw.Api(); | |||
api.postWithToken('csrf', { | |||
action: 'options', | |||
change: 'language=' + code | |||
}).then(function () { | |||
location.reload(); | |||
}).catch(function () { | |||
// Fallback, falls API fehlschlägt | |||
location.href = urlBase + (urlBase.indexOf('?') > -1 ? '&' : '?') + 'setlang=' + code; | |||
}); | |||
return; | |||
} | |||
// Gäste: erst versuchen, setlang (persistenter Cookie, falls verfügbar) | |||
var sep = urlBase.indexOf('?') > -1 ? '&' : '?'; | |||
var setlangUrl = urlBase + sep + 'setlang=' + 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, | |||
// hänge automatisch ?uselang=… an (nur wenn keine lang-Parameter da sind) | |||
try { | |||
var pref = localStorage.getItem('preferredLang'); | |||
if (!mw.config.get('wgUserName') && pref && !/[?&](?:use|set)lang=/.test(location.search)) { | |||
// Nur eine „stille“ Ergänzung – kein Endlosschleifen-Risiko | |||
var u = new URL(location.href); | |||
u.searchParams.set('uselang', pref); | |||
// Nur anwenden, wenn es nicht schon die aktuelle UI-Sprache ist | |||
if ((mw.config.get('wgUserLanguage') || '').toLowerCase() !== pref.toLowerCase()) { | |||
location.replace(u.toString()); | |||
} | |||
} | |||
} catch (e) { /* ignore */ } | |||
}); | }); | ||
Version vom 8. August 2025, 09:51 Uhr
/* Eigene Sprachleiste: komplette UI-Sprache umschalten (Minerva, global) */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
// ---- Konfiguration: deine Sprachen (Label + Code) ----
var LANGS = [
{ code: 'de', label: 'Deutsch' },
{ code: 'en', label: 'English' },
{ code: 'fr', label: 'Français' }
];
// Nur einmal einfügen
if (document.getElementById('custom-langbar')) return;
var userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage');
var page = mw.config.get('wgPageName');
// 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;
// Aktive Sprache markieren (UI-Sprache!)
if (userLang === lang.code) a.className = 'active-lang';
a.addEventListener('click', function (e) {
e.preventDefault();
switchLanguage(lang.code);
});
bar.appendChild(a);
});
// Direkt unter die Minerva-Header-Bar hängen
var header = document.querySelector('.minerva-header') || document.body;
header.parentNode.insertBefore(bar, header.nextSibling);
// --- Sprachwechsel: eingeloggt => Preference setzen, Gast => setlang/uselang ---
function switchLanguage(code) {
var cur = mw.config.get('wgUserLanguage');
if (cur === code) return;
var urlBase = mw.util.getUrl(page);
// Eingeloggt: Preference setzen (persistiert)
if (mw.config.get('wgUserName')) {
var api = new mw.Api();
api.postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).then(function () {
location.reload();
}).catch(function () {
// Fallback, falls API fehlschlägt
location.href = urlBase + (urlBase.indexOf('?') > -1 ? '&' : '?') + 'setlang=' + code;
});
return;
}
// Gäste: erst versuchen, setlang (persistenter Cookie, falls verfügbar)
var sep = urlBase.indexOf('?') > -1 ? '&' : '?';
var setlangUrl = urlBase + sep + 'setlang=' + 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,
// hänge automatisch ?uselang=… an (nur wenn keine lang-Parameter da sind)
try {
var pref = localStorage.getItem('preferredLang');
if (!mw.config.get('wgUserName') && pref && !/[?&](?:use|set)lang=/.test(location.search)) {
// Nur eine „stille“ Ergänzung – kein Endlosschleifen-Risiko
var u = new URL(location.href);
u.searchParams.set('uselang', pref);
// Nur anwenden, wenn es nicht schon die aktuelle UI-Sprache ist
if ((mw.config.get('wgUserLanguage') || '').toLowerCase() !== pref.toLowerCase()) {
location.replace(u.toString());
}
}
} catch (e) { /* ignore */ }
});