MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| (17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: | /* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */ | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () { | ||
// | // --- Nur im Lesemodus + Haupt-Namensraum --- | ||
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 28: | Zeile 13: | ||
{ code: 'fr', label: 'Français' } | { code: 'fr', label: 'Français' } | ||
]; | ]; | ||
var ALLOWED = ['de', 'en', 'fr']; | |||
var FALLBACK = 'en'; | |||
// Doppelte Einbindung vermeiden | |||
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, ''); | |||
function normalize(code) { | |||
if (!code) return FALLBACK; | |||
code = String(code).toLowerCase().split('-')[0]; | |||
return ALLOWED.indexOf(code) > -1 ? code : FALLBACK; | |||
} | |||
// Ziel-URL mit Special:MyLanguage und 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; | |||
} | |||
// | // --- Sprachleiste 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); | |||
LANGS.forEach(function (lang) { | LANGS.forEach(function (lang) { | ||
| Zeile 45: | Zeile 46: | ||
a.href = '#'; | a.href = '#'; | ||
a.textContent = lang.label; | a.textContent = lang.label; | ||
if (current === lang.code) a.className = 'active-lang'; | |||
if ( | |||
a.addEventListener('click', function (e) { | a.addEventListener('click', function (e) { | ||
e.preventDefault(); | e.preventDefault(); | ||
switchLanguage(lang.code); | |||
}); | }); | ||
bar.appendChild(a); | bar.appendChild(a); | ||
}); | }); | ||
var mount = | |||
var | 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); | |||
} | } | ||
function | // --- Sprachwechsel --- | ||
code = code. | function switchLanguage(code) { | ||
code = normalize(code); | |||
// Versuch: Sprache direkt über ULS setzen (für Gäste persistent) | |||
if (mw.uls && typeof mw.uls.setLanguage === 'function') { | |||
mw.uls.setLanguage(code); | |||
} | |||
// | // Für eingeloggte Benutzer: Option speichern | ||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
new mw.Api().postWithToken('csrf', { | new mw.Api().postWithToken('csrf', { | ||
| Zeile 80: | Zeile 81: | ||
change: 'language=' + code | change: 'language=' + code | ||
}).always(function () { | }).always(function () { | ||
location.href = | location.href = targetUrl(code); | ||
}); | }); | ||
} else { | |||
// Für Gäste: Sprache auch im localStorage sichern | |||
try { localStorage.setItem('preferredLang', code); } catch (e) {} | |||
location.href = targetUrl(code); | |||
} | } | ||
} | |||
// --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden --- | |||
try { localStorage. | if (!mw.config.get('wgUserName')) { | ||
try { | |||
var pref = normalize(localStorage.getItem('preferredLang')); | |||
var currentLang = normalize(mw.config.get('wgUserLanguage')); | |||
if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) { | |||
location.replace(targetUrl(pref)); | |||
} | |||
} catch (e) {} | |||
} | } | ||
// Anonyme | // --- Anonyme markieren --- | ||
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 | var nsNum = mw.config.get('wgNamespaceNumber'); | ||
if ( | if (nsNum % 2 === 1) { | ||
var | var subject = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | ||
window.location.href = | window.location.href = subject; | ||
} | } | ||
} | } | ||
}); | }); | ||
Aktuelle Version vom 8. August 2025, 14:41 Uhr
/* Eigene Sprachleiste: manuelles Umschalten + ULS-Integration + Fallback-Override */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.interface'], function () {
// --- Nur im Lesemodus + Haupt-Namensraum ---
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';
// Doppelte Einbindung vermeiden
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 mit Special:MyLanguage und 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;
}
// --- Sprachleiste bauen ---
var bar = document.createElement('div');
bar.id = 'custom-langbar';
var current = 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 (current === 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 ---
function switchLanguage(code) {
code = normalize(code);
// Versuch: Sprache direkt über ULS setzen (für Gäste persistent)
if (mw.uls && typeof mw.uls.setLanguage === 'function') {
mw.uls.setLanguage(code);
}
// Für eingeloggte Benutzer: Option speichern
if (mw.config.get('wgUserName')) {
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = targetUrl(code);
});
} else {
// Für Gäste: Sprache auch im localStorage sichern
try { localStorage.setItem('preferredLang', code); } catch (e) {}
location.href = targetUrl(code);
}
}
// --- Bei Seitenaufruf für Gäste gespeicherte Sprache anwenden ---
if (!mw.config.get('wgUserName')) {
try {
var pref = normalize(localStorage.getItem('preferredLang'));
var currentLang = normalize(mw.config.get('wgUserLanguage'));
if (pref && pref !== currentLang && !/[?&]uselang=/.test(location.search)) {
location.replace(targetUrl(pref));
}
} catch (e) {}
}
// --- Anonyme markieren ---
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;
}
}
});