MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* Sofortige Überschreibung der Sprache für Gäste */ | |||
(function () { | |||
var FALLBACK = 'en'; | |||
var ALLOWED = ['de', 'en', 'fr']; | |||
function normalize(code) { | |||
if (!code) return FALLBACK; | |||
code = String(code).toLowerCase().split('-')[0]; | |||
return ALLOWED.indexOf(code) > -1 ? code : FALLBACK; | |||
} | |||
try { | |||
var prefLang = localStorage.getItem('preferredLang'); | |||
if (!prefLang) return; // nichts zu tun | |||
prefLang = normalize(prefLang); | |||
var currentLang = normalize(mw.config.get('wgUserLanguage')); | |||
if (prefLang !== currentLang) { | |||
var url = new URL(window.location.href); | |||
url.searchParams.set('setlang', prefLang); | |||
location.replace(url.toString()); | |||
} | |||
} catch (e) {} | |||
})(); | |||
/* Eigene Sprachleiste: manuelles Umschalten mit setlang + Anpassung aller MyLanguage-Links */ | /* Eigene Sprachleiste: manuelles Umschalten mit setlang + Anpassung aller MyLanguage-Links */ | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | ||
Version vom 8. August 2025, 14:34 Uhr
/* Sofortige Überschreibung der Sprache für Gäste */
(function () {
var FALLBACK = 'en';
var ALLOWED = ['de', 'en', 'fr'];
function normalize(code) {
if (!code) return FALLBACK;
code = String(code).toLowerCase().split('-')[0];
return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
}
try {
var prefLang = localStorage.getItem('preferredLang');
if (!prefLang) return; // nichts zu tun
prefLang = normalize(prefLang);
var currentLang = normalize(mw.config.get('wgUserLanguage'));
if (prefLang !== currentLang) {
var url = new URL(window.location.href);
url.searchParams.set('setlang', prefLang);
location.replace(url.toString());
}
} catch (e) {}
})();
/* Eigene Sprachleiste: manuelles Umschalten mit setlang + Anpassung aller MyLanguage-Links */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
// --- Grundkonfiguration ---
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 verhindern ---
if (document.getElementById('custom-langbar')) return;
var pageName = mw.config.get('wgPageName');
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
function normalize(code) {
if (!code) return FALLBACK;
code = String(code).toLowerCase().split('-')[0];
return ALLOWED.indexOf(code) > -1 ? code : FALLBACK;
}
// Ziel-URL: gleiche Seite mit setlang erzwingen
function targetUrl(code) {
code = normalize(code);
var title = 'Special:MyLanguage/' + baseTitle.replace(/_/g, ' ');
var url = mw.util.getUrl(title);
return url + (url.includes('?') ? '&' : '?') + 'setlang=' + code;
}
// --- Sprachleiste bauen ---
var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK);
var bar = document.createElement('div');
bar.id = 'custom-langbar';
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);
});
// In DOM einfügen
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);
}
// --- Sprache umschalten ---
function switchLanguage(code) {
code = normalize(code);
if (mw.config.get('wgUserName')) {
// Eingeloggt: User-Option setzen
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = targetUrl(code);
});
} else {
// Gäste: nur URL-Wechsel
location.href = targetUrl(code);
}
}
// --- Alle MyLanguage-Links im Dokument anpassen ---
function adjustMyLanguageLinks(langCode) {
langCode = normalize(langCode);
document.querySelectorAll('a[href*="Special:MyLanguage/"]').forEach(function (link) {
var url = new URL(link.href, window.location.origin);
url.searchParams.set('setlang', langCode);
link.href = url.toString();
});
}
// Sofort auf aktuelle Sprache anwenden
adjustMyLanguageLinks(current);
// Falls der Nutzer über die Sprachleiste wechselt, Links neu anpassen
LANGS.forEach(function (lang) {
document.querySelectorAll('#custom-langbar a[data-code="' + lang.code + '"]').forEach(function (el) {
el.addEventListener('click', function () {
adjustMyLanguageLinks(lang.code);
});
});
});
// --- Anonyme markieren (falls CSS nötig) ---
if (!mw.config.get('wgUserName')) {
document.documentElement.classList.add('bv-anon');
}
// --- Gäste nicht auf Diskussionsseiten lassen ---
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;
}
}
});