MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung Markierungen: Manuelle Zurücksetzung Zurückgesetzt |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: manuelles Umschalten + | /* 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 () { | ||
// --- | // --- Grundkonfiguration --- | ||
var LANGS = [ | var LANGS = [ | ||
{ code: 'de', label: 'Deutsch' }, | { code: 'de', label: 'Deutsch' }, | ||
| Zeile 16: | Zeile 11: | ||
var FALLBACK = 'en'; | var FALLBACK = 'en'; | ||
// Doppelte Einbindung | // --- Doppelte Einbindung verhindern --- | ||
if (document.getElementById('custom-langbar')) return; | if (document.getElementById('custom-langbar')) return; | ||
var pageName = mw.config.get('wgPageName'); | var pageName = mw.config.get('wgPageName'); | ||
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | ||
function normalize(code) { | function normalize(code) { | ||
| Zeile 28: | Zeile 23: | ||
} | } | ||
// Ziel-URL: gleiche Seite mit setlang erzwingen | |||
// Ziel-URL: gleiche Seite | |||
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('?') ? '&' : '?') + 'setlang=' + code; | ||
} | } | ||
// --- | // --- Sprachleiste bauen --- | ||
var current = normalize(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK); | |||
var bar = document.createElement('div'); | var bar = document.createElement('div'); | ||
bar.id = 'custom-langbar'; | bar.id = 'custom-langbar'; | ||
LANGS.forEach(function (lang) { | LANGS.forEach(function (lang) { | ||
| Zeile 71: | Zeile 48: | ||
}); | }); | ||
// | // In DOM einfügen | ||
var mount = | var mount = | ||
document.querySelector('.minerva-header') || | document.querySelector('.minerva-header') || | ||
| Zeile 84: | Zeile 61: | ||
} | } | ||
// | // --- Sprache umschalten --- | ||
function switchLanguage(code) { | function switchLanguage(code) { | ||
code = normalize(code); | code = normalize(code); | ||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
// Eingeloggt: User-Option setzen | |||
new mw.Api().postWithToken('csrf', { | new mw.Api().postWithToken('csrf', { | ||
action: 'options', | action: 'options', | ||
| Zeile 96: | Zeile 74: | ||
}); | }); | ||
} else { | } else { | ||
// Gäste: nur URL-Wechsel | |||
location.href = targetUrl(code); | 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 | // --- Anonyme markieren (falls CSS nötig) --- | ||
if (!mw.config.get('wgUserName')) { | if (!mw.config.get('wgUserName')) { | ||
document.documentElement.classList.add('bv-anon'); | document.documentElement.classList.add('bv-anon'); | ||
} | } | ||
// Gäste nicht auf Diskussionsseiten lassen | // --- Gäste nicht auf Diskussionsseiten lassen --- | ||
if (!mw.config.get('wgUserName')) { | if (!mw.config.get('wgUserName')) { | ||
var nsNum = mw.config.get('wgNamespaceNumber'); | var nsNum = mw.config.get('wgNamespaceNumber'); | ||
Version vom 8. August 2025, 14:32 Uhr
/* 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;
}
}
});