MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: | /* Eigene Sprachleiste: ULS-Cookie setzen + persistente Sprache für Gäste + Diskussionsseiten-Redirect */ | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.init', 'jquery.cookie'], function () { | ||
var LANGS = [ | var LANGS = [ | ||
{ code: 'de', label: 'Deutsch' }, | { code: 'de', label: 'Deutsch' }, | ||
| Zeile 13: | Zeile 7: | ||
{ code: 'fr', label: 'Français' } | { code: 'fr', label: 'Français' } | ||
]; | ]; | ||
var | var FALLBACK_LANG = 'en'; | ||
var ALLOWED_LANGS = ['de', 'en', 'fr']; | |||
var pageName = mw.config.get('wgPageName'); | |||
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | |||
function normalizeLang(code) { | |||
if (!code) return FALLBACK_LANG; | |||
code = code.toLowerCase().split('-')[0]; | |||
function | return ALLOWED_LANGS.includes(code) ? code : FALLBACK_LANG; | ||
if (!code) return | |||
code = | |||
return | |||
} | } | ||
function buildLangUrl(langCode) { | |||
function | var targetUrl = mw.util.getUrl(baseTitle + '/' + langCode); | ||
var sep = targetUrl.indexOf('?') > -1 ? '&' : '?'; | |||
return targetUrl + sep + 'uselang=' + langCode; | |||
var | |||
} | } | ||
// | // Sprachleiste erstellen | ||
var bar = document.createElement('div'); | if (!document.getElementById('custom-langbar')) { | ||
var bar = document.createElement('div'); | |||
bar.id = 'custom-langbar'; | |||
var currentLang = normalizeLang(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK_LANG); | |||
LANGS.forEach(function (lang) { | |||
var a = document.createElement('a'); | |||
a.href = '#'; | |||
a.textContent = lang.label; | |||
a.dataset.code = lang.code; | |||
if (currentLang === lang.code) a.className = 'active-lang'; | |||
a.addEventListener('click', function (e) { | |||
e.preventDefault(); | |||
switchLanguageAndGo(lang.code); | |||
}); | |||
bar.appendChild(a); | |||
}); | |||
var header = document.querySelector('.minerva-header') || document.body; | |||
var | header.parentNode.insertBefore(bar, header.nextSibling); | ||
} | |||
} | |||
function switchLanguageAndGo(code) { | |||
code = normalizeLang(code); | |||
// Für Gäste: ULS-Cookie setzen (wie das originale UI) | |||
try { | |||
$.cookie('uls-previous-language', code, { path: '/', expires: 30 }); | |||
} catch (e) {} | |||
if (mw.uls && typeof mw.uls.setLanguage === 'function') { | |||
mw.uls.setLanguage(code); | |||
} | |||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
// Eingeloggte User: Sprache in Optionen speichern | |||
new mw.Api().postWithToken('csrf', { | new mw.Api().postWithToken('csrf', { | ||
action: 'options', | action: 'options', | ||
change: 'language=' + code | change: 'language=' + code | ||
}).always(function () { | }).always(function () { | ||
location.href = | location.href = buildLangUrl(code); | ||
}); | }); | ||
} else { | } else { | ||
location.href = | // Gäste: direkt umleiten | ||
location.href = buildLangUrl(code); | |||
} | } | ||
} | } | ||
// Anonyme markieren | // 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 ns = mw.config.get('wgNamespaceNumber'); | ||
if ( | if (ns % 2 === 1) { | ||
var | var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | ||
window.location.href = | window.location.href = subjectUrl; | ||
} | } | ||
} | } | ||
}); | }); | ||
Version vom 8. August 2025, 14:18 Uhr
/* Eigene Sprachleiste: ULS-Cookie setzen + persistente Sprache für Gäste + Diskussionsseiten-Redirect */
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'ext.uls.init', 'jquery.cookie'], function () {
var LANGS = [
{ code: 'de', label: 'Deutsch' },
{ code: 'en', label: 'English' },
{ code: 'fr', label: 'Français' }
];
var FALLBACK_LANG = 'en';
var ALLOWED_LANGS = ['de', 'en', 'fr'];
var pageName = mw.config.get('wgPageName');
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
function normalizeLang(code) {
if (!code) return FALLBACK_LANG;
code = code.toLowerCase().split('-')[0];
return ALLOWED_LANGS.includes(code) ? code : FALLBACK_LANG;
}
function buildLangUrl(langCode) {
var targetUrl = mw.util.getUrl(baseTitle + '/' + langCode);
var sep = targetUrl.indexOf('?') > -1 ? '&' : '?';
return targetUrl + sep + 'uselang=' + langCode;
}
// Sprachleiste erstellen
if (!document.getElementById('custom-langbar')) {
var bar = document.createElement('div');
bar.id = 'custom-langbar';
var currentLang = normalizeLang(mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || FALLBACK_LANG);
LANGS.forEach(function (lang) {
var a = document.createElement('a');
a.href = '#';
a.textContent = lang.label;
a.dataset.code = lang.code;
if (currentLang === lang.code) a.className = 'active-lang';
a.addEventListener('click', function (e) {
e.preventDefault();
switchLanguageAndGo(lang.code);
});
bar.appendChild(a);
});
var header = document.querySelector('.minerva-header') || document.body;
header.parentNode.insertBefore(bar, header.nextSibling);
}
function switchLanguageAndGo(code) {
code = normalizeLang(code);
// Für Gäste: ULS-Cookie setzen (wie das originale UI)
try {
$.cookie('uls-previous-language', code, { path: '/', expires: 30 });
} catch (e) {}
if (mw.uls && typeof mw.uls.setLanguage === 'function') {
mw.uls.setLanguage(code);
}
if (mw.config.get('wgUserName')) {
// Eingeloggte User: Sprache in Optionen speichern
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = buildLangUrl(code);
});
} else {
// Gäste: direkt umleiten
location.href = buildLangUrl(code);
}
}
// 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 ns = mw.config.get('wgNamespaceNumber');
if (ns % 2 === 1) {
var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
window.location.href = subjectUrl;
}
}
});