MediaWiki:Common.js: Unterschied zwischen den Versionen
Blanked the page Markierungen: Geleert Zurückgesetzt |
Keine Bearbeitungszusammenfassung Markierung: Rückgängigmachung |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */ | |||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | |||
// ====== Automatische Anwendung der gespeicherten Sprache für Gäste ====== | |||
if (!mw.config.get('wgUserName')) { | |||
try { | |||
var prefLang = localStorage.getItem('preferredLang'); | |||
var currentLang = mw.config.get('wgUserLanguage'); | |||
if ( | |||
prefLang && | |||
prefLang.toLowerCase() !== currentLang.toLowerCase() && | |||
!/[?&](?:use|set)lang=/.test(location.search) | |||
) { | |||
var url = new URL(window.location.href); | |||
url.searchParams.set('uselang', prefLang); | |||
location.replace(url.toString()); | |||
return; // Rest des Codes nicht mehr ausführen | |||
} | |||
} catch (e) {} | |||
} | |||
// ======================================================================== | |||
// ---- deine Sprachen ---- | |||
var LANGS = [ | |||
{ code: 'de', label: 'Deutsch' }, | |||
{ code: 'en', label: 'English' }, | |||
{ code: 'fr', label: 'Français' } | |||
]; | |||
if (document.getElementById('custom-langbar')) return; | |||
var userLang = (mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || 'de').toLowerCase(); | |||
var pageName = mw.config.get('wgPageName'); | |||
// Basis-Seitenname ohne evtl. Sprach-Suffix (/en, /fr, /pt-br, …) | |||
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | |||
// Leiste bauen | |||
var bar = document.createElement('div'); | |||
bar.id = 'custom-langbar'; | |||
LANGS.forEach(function (lang) { | |||
var a = document.createElement('a'); | |||
a.href = '#'; | |||
a.textContent = lang.label; | |||
a.dataset.code = lang.code; | |||
if (userLang === lang.code.toLowerCase()) a.className = 'active-lang'; | |||
a.addEventListener('click', function (e) { | |||
e.preventDefault(); | |||
switchLanguageAndGo(lang.code); | |||
}); | |||
bar.appendChild(a); | |||
}); | |||
// Unter die Minerva-Header-Bar hängen | |||
var header = document.querySelector('.minerva-header') || document.body; | |||
header.parentNode.insertBefore(bar, header.nextSibling); | |||
// ---- Logik: Sprache setzen + auf Übersetzung springen ---- | |||
function targetUrlFor(code) { | |||
// Special:MyLanguage löst auf die passende /lang-Unterseite auf | |||
var title = 'Special:MyLanguage/' + baseTitle; | |||
var url = mw.util.getUrl(title); | |||
// setlang damit Gäste UND eingeloggte sofort die richtige UI sehen | |||
var sep = url.indexOf('?') > -1 ? '&' : '?'; | |||
return url + sep + 'setlang=' + encodeURIComponent(code); | |||
} | |||
function switchLanguageAndGo(code) { | |||
code = code.toLowerCase(); | |||
// Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten | |||
if (mw.config.get('wgUserName')) { | |||
new mw.Api().postWithToken('csrf', { | |||
action: 'options', | |||
change: 'language=' + code | |||
}).always(function () { | |||
location.href = targetUrlFor(code); | |||
}); | |||
return; | |||
} | |||
// Gäste: direkt mit setlang auf MyLanguage gehen + in localStorage merken | |||
try { localStorage.setItem('preferredLang', code); } catch (e) {} | |||
location.href = targetUrlFor(code); | |||
} | |||
// Anonyme erkennen und Flag auf <html> setzen | |||
if (!mw.config.get('wgUserName')) { | |||
document.documentElement.classList.add('bv-anon'); | |||
} | |||
// Gäste nicht auf Diskussionsseiten lassen → auf Inhaltsseite umleiten | |||
if (!mw.config.get('wgUserName')) { | |||
var ns = mw.config.get('wgNamespaceNumber'); | |||
if (ns % 2 === 1) { // ungerade Namespace-Nummern = Diskussions-Namespace | |||
var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | |||
window.location.href = subjectUrl; | |||
} | |||
} | |||
}); | |||
Version vom 8. August 2025, 13:43 Uhr
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
// ====== Automatische Anwendung der gespeicherten Sprache für Gäste ======
if (!mw.config.get('wgUserName')) {
try {
var prefLang = localStorage.getItem('preferredLang');
var currentLang = mw.config.get('wgUserLanguage');
if (
prefLang &&
prefLang.toLowerCase() !== currentLang.toLowerCase() &&
!/[?&](?:use|set)lang=/.test(location.search)
) {
var url = new URL(window.location.href);
url.searchParams.set('uselang', prefLang);
location.replace(url.toString());
return; // Rest des Codes nicht mehr ausführen
}
} catch (e) {}
}
// ========================================================================
// ---- deine Sprachen ----
var LANGS = [
{ code: 'de', label: 'Deutsch' },
{ code: 'en', label: 'English' },
{ code: 'fr', label: 'Français' }
];
if (document.getElementById('custom-langbar')) return;
var userLang = (mw.config.get('wgUserLanguage') || mw.config.get('wgContentLanguage') || 'de').toLowerCase();
var pageName = mw.config.get('wgPageName');
// Basis-Seitenname ohne evtl. Sprach-Suffix (/en, /fr, /pt-br, …)
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, '');
// Leiste bauen
var bar = document.createElement('div');
bar.id = 'custom-langbar';
LANGS.forEach(function (lang) {
var a = document.createElement('a');
a.href = '#';
a.textContent = lang.label;
a.dataset.code = lang.code;
if (userLang === lang.code.toLowerCase()) a.className = 'active-lang';
a.addEventListener('click', function (e) {
e.preventDefault();
switchLanguageAndGo(lang.code);
});
bar.appendChild(a);
});
// Unter die Minerva-Header-Bar hängen
var header = document.querySelector('.minerva-header') || document.body;
header.parentNode.insertBefore(bar, header.nextSibling);
// ---- Logik: Sprache setzen + auf Übersetzung springen ----
function targetUrlFor(code) {
// Special:MyLanguage löst auf die passende /lang-Unterseite auf
var title = 'Special:MyLanguage/' + baseTitle;
var url = mw.util.getUrl(title);
// setlang damit Gäste UND eingeloggte sofort die richtige UI sehen
var sep = url.indexOf('?') > -1 ? '&' : '?';
return url + sep + 'setlang=' + encodeURIComponent(code);
}
function switchLanguageAndGo(code) {
code = code.toLowerCase();
// Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten
if (mw.config.get('wgUserName')) {
new mw.Api().postWithToken('csrf', {
action: 'options',
change: 'language=' + code
}).always(function () {
location.href = targetUrlFor(code);
});
return;
}
// Gäste: direkt mit setlang auf MyLanguage gehen + in localStorage merken
try { localStorage.setItem('preferredLang', code); } catch (e) {}
location.href = targetUrlFor(code);
}
// Anonyme erkennen und Flag auf <html> setzen
if (!mw.config.get('wgUserName')) {
document.documentElement.classList.add('bv-anon');
}
// Gäste nicht auf Diskussionsseiten lassen → auf Inhaltsseite umleiten
if (!mw.config.get('wgUserName')) {
var ns = mw.config.get('wgNamespaceNumber');
if (ns % 2 === 1) { // ungerade Namespace-Nummern = Diskussions-Namespace
var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, ''));
window.location.href = subjectUrl;
}
}
});