MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* | /* Eigene Sprachleiste: manuelles Umschalten + persistente Speicherung via ULS-Cookie */ | ||
( | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | ||
// --- Nur im Lesemodus + Haupt-Namensraum (0) --- | |||
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 53: | Zeile 15: | ||
var ALLOWED = ['de', 'en', 'fr']; | var ALLOWED = ['de', 'en', 'fr']; | ||
var FALLBACK = 'en'; | var FALLBACK = 'en'; | ||
function normalize(code) { | function normalize(code) { | ||
if (!code) return FALLBACK; | if (!code) return FALLBACK; | ||
code = String(code).toLowerCase().split('-')[0]; | code = String(code).toLowerCase().split('-')[0]; | ||
return ALLOWED. | return ALLOWED.includes(code) ? code : FALLBACK; | ||
} | } | ||
// Ziel-URL: | // Basis-Titel ohne Sprach-Suffix | ||
var pageName = mw.config.get('wgPageName'); | |||
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | |||
// Ziel-URL mit Special:MyLanguage + uselang | |||
function targetUrl(code) { | function targetUrl(code) { | ||
code = normalize(code); | code = normalize(code); | ||
var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' '); | var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' '); | ||
var url = mw.util.getUrl(title); | var url = mw.util.getUrl(title); | ||
return url + (url.includes('?') ? '&' : '?') + ' | return url + (url.includes('?') ? '&' : '?') + 'uselang=' + code; | ||
} | |||
// ULS-Cookie setzen | |||
function setULSCookie(lang) { | |||
var days = 30; | |||
var expires = new Date(Date.now() + days * 864e5).toUTCString(); | |||
document.cookie = "language=" + encodeURIComponent(lang) + | |||
"; expires=" + expires + | |||
"; path=/; samesite=lax"; | |||
} | } | ||
// | // Sprachleiste einfügen | ||
if (!document.getElementById('custom-langbar')) { | |||
var bar = document.createElement('div'); | |||
bar.id = 'custom-langbar'; | |||
var currentLang = 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 (currentLang === 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 durchführen | ||
function switchLanguage(code) { | function switchLanguage(code) { | ||
code = normalize(code); | code = normalize(code); | ||
try { | |||
localStorage.setItem('preferredLang', code); | |||
} catch (e) {} | |||
setULSCookie(code); // Gäste: Cookie setzen, damit ULS Browser-Sprache ignoriert | |||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
// Eingeloggt: | // Eingeloggt: auch MW-Option setzen | ||
new mw.Api().postWithToken('csrf', { | new mw.Api().postWithToken('csrf', { | ||
action: 'options', | action: 'options', | ||
| Zeile 117: | Zeile 98: | ||
}); | }); | ||
} else { | } else { | ||
location.href = targetUrl(code); | location.href = targetUrl(code); | ||
} | } | ||
} | } | ||
// | // Gäste markieren für CSS | ||
if (!mw.config.get('wgUserName')) { | |||
document.documentElement.classList.add('bv-anon'); | |||
} | } | ||
// | // Gäste nicht auf Diskussionsseiten lassen | ||
if (!mw.config.get('wgUserName') && ns % 2 === 1) { | |||
var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | |||
window.location.href = subject; | |||
} | |||
// | // --- Beim Laden prüfen: Cookie oder localStorage nutzen --- | ||
if (!mw.config.get('wgUserName')) { | |||
try { | |||
var prefLang = normalize(localStorage.getItem('preferredLang')); | |||
var cookieLang = (document.cookie.match(/(?:^|; )language=([^;]+)/) || [])[1]; | |||
cookieLang = normalize(cookieLang); | |||
var chosenLang = prefLang || cookieLang; | |||
if (chosenLang && chosenLang !== normalize(mw.config.get('wgUserLanguage'))) { | |||
setULSCookie(chosenLang); | |||
var url = new URL(window.location.href); | |||
if (url.searchParams.get('uselang') !== chosenLang) { | |||
url.searchParams.set('uselang', chosenLang); | |||
location.replace(url.toString()); | |||
} | |||
} | |||
} catch (e) {} | |||
} | } | ||
}); | }); | ||
Version vom 8. August 2025, 14:38 Uhr
/* Eigene Sprachleiste: manuelles Umschalten + persistente Speicherung via ULS-Cookie */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
// --- Nur im Lesemodus + Haupt-Namensraum (0) ---
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';
function normalize(code) {
if (!code) return FALLBACK;
code = String(code).toLowerCase().split('-')[0];
return ALLOWED.includes(code) ? code : FALLBACK;
}
// Basis-Titel ohne Sprach-Suffix
var pageName = mw.config.get('wgPageName');
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
// Ziel-URL mit 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;
}
// ULS-Cookie setzen
function setULSCookie(lang) {
var days = 30;
var expires = new Date(Date.now() + days * 864e5).toUTCString();
document.cookie = "language=" + encodeURIComponent(lang) +
"; expires=" + expires +
"; path=/; samesite=lax";
}
// Sprachleiste einfügen
if (!document.getElementById('custom-langbar')) {
var bar = document.createElement('div');
bar.id = 'custom-langbar';
var currentLang = 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 (currentLang === 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 durchführen
function switchLanguage(code) {
code = normalize(code);
try {
localStorage.setItem('preferredLang', code);
} catch (e) {}
setULSCookie(code); // Gäste: Cookie setzen, damit ULS Browser-Sprache ignoriert
if (mw.config.get('wgUserName')) {
// Eingeloggt: auch MW-Option setzen
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = targetUrl(code);
});
} else {
location.href = targetUrl(code);
}
}
// Gäste markieren für CSS
if (!mw.config.get('wgUserName')) {
document.documentElement.classList.add('bv-anon');
}
// Gäste nicht auf Diskussionsseiten lassen
if (!mw.config.get('wgUserName') && ns % 2 === 1) {
var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
window.location.href = subject;
}
// --- Beim Laden prüfen: Cookie oder localStorage nutzen ---
if (!mw.config.get('wgUserName')) {
try {
var prefLang = normalize(localStorage.getItem('preferredLang'));
var cookieLang = (document.cookie.match(/(?:^|; )language=([^;]+)/) || [])[1];
cookieLang = normalize(cookieLang);
var chosenLang = prefLang || cookieLang;
if (chosenLang && chosenLang !== normalize(mw.config.get('wgUserLanguage'))) {
setULSCookie(chosenLang);
var url = new URL(window.location.href);
if (url.searchParams.get('uselang') !== chosenLang) {
url.searchParams.set('uselang', chosenLang);
location.replace(url.toString());
}
}
} catch (e) {}
}
});