MediaWiki:Common.js: Unterschied zwischen den Versionen
Änderung 435 von Beeventionmanual (Diskussion) rückgängig gemacht. Markierung: Rückgängigmachung |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: manuelles Umschalten ( | /* Eigene Sprachleiste: manuelles Umschalten + persistente Sprache für Gäste (ULS-ähnlich) */ | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | ||
| Zeile 36: | Zeile 36: | ||
} | } | ||
// Bar bauen | // --- Sprache aus Cookie lesen, wenn vorhanden --- | ||
function getLangCookie() { | |||
var match = document.cookie.match(/(?:^|; )uselang=([^;]+)/); | |||
return match ? normalize(match[1]) : null; | |||
} | |||
// --- Sprache ins Cookie schreiben (30 Tage gültig) --- | |||
function setLangCookie(code) { | |||
document.cookie = 'uselang=' + normalize(code) + '; path=/; max-age=' + (30 * 24 * 60 * 60); | |||
} | |||
// --- Falls kein uselang in URL, aber Cookie vorhanden → redirect mit Cookie-Sprache --- | |||
(function ensureLangFromCookie() { | |||
var url = new URL(window.location.href); | |||
if (!url.searchParams.get('uselang')) { | |||
var cookieLang = getLangCookie(); | |||
if (cookieLang) { | |||
url.searchParams.set('uselang', cookieLang); | |||
window.location.replace(url.toString()); | |||
} | |||
} | |||
})(); | |||
// --- Bar 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); | var current = normalize( | ||
new URL(window.location.href).searchParams.get('uselang') || | |||
getLangCookie() || | |||
mw.config.get('wgUserLanguage') || | |||
mw.config.get('wgContentLanguage') || | |||
FALLBACK | |||
); | |||
LANGS.forEach(function (lang) { | LANGS.forEach(function (lang) { | ||
| Zeile 67: | Zeile 96: | ||
} | } | ||
// Sprachwechsel: eingeloggte speichern; Gäste | // Sprachwechsel: eingeloggte speichern; Gäste per Cookie + URL | ||
function switchLanguage(code) { | function switchLanguage(code) { | ||
code = normalize(code); | code = normalize(code); | ||
setLangCookie(code); | |||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
Version vom 8. August 2025, 14:23 Uhr
/* Eigene Sprachleiste: manuelles Umschalten + persistente Sprache für Gäste (ULS-ähnlich) */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], 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 = [
{ 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'); // mit _ statt Leerzeichen
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); // ggf. /de,/en,… abschneiden
function normalize(code) {
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 targetUrl(code) {
code = normalize(code);
var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
var url = mw.util.getUrl(title);
return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code;
}
// --- Sprache aus Cookie lesen, wenn vorhanden ---
function getLangCookie() {
var match = document.cookie.match(/(?:^|; )uselang=([^;]+)/);
return match ? normalize(match[1]) : null;
}
// --- Sprache ins Cookie schreiben (30 Tage gültig) ---
function setLangCookie(code) {
document.cookie = 'uselang=' + normalize(code) + '; path=/; max-age=' + (30 * 24 * 60 * 60);
}
// --- Falls kein uselang in URL, aber Cookie vorhanden → redirect mit Cookie-Sprache ---
(function ensureLangFromCookie() {
var url = new URL(window.location.href);
if (!url.searchParams.get('uselang')) {
var cookieLang = getLangCookie();
if (cookieLang) {
url.searchParams.set('uselang', cookieLang);
window.location.replace(url.toString());
}
}
})();
// --- Bar bauen ---
var bar = document.createElement('div');
bar.id = 'custom-langbar';
var current = normalize(
new URL(window.location.href).searchParams.get('uselang') ||
getLangCookie() ||
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);
});
// Sicher ins DOM hängen (Minerva/Vector kompatibel)
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: eingeloggte speichern; Gäste per Cookie + URL
function switchLanguage(code) {
code = normalize(code);
setLangCookie(code);
if (mw.config.get('wgUserName')) {
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = targetUrl(code);
});
} else {
location.href = targetUrl(code);
}
}
// Anonyme markieren (falls du CSS darauf hast)
if (!mw.config.get('wgUserName')) {
document.documentElement.classList.add('bv-anon');
}
// Gäste nicht auf Diskussionsseiten lassen → zurück zur Inhaltseite
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;
}
}
});