MediaWiki:Common.js: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Änderung 377 von Beeventionmanual (Diskussion) rückgängig gemacht. Markierungen: Rückgängigmachung Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten | /* Eigene Sprachleiste: UI-Sprache + PageTranslation-Ziel umschalten */ | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () { | ||
| Zeile 6: | Zeile 6: | ||
try { | try { | ||
var prefLang = localStorage.getItem('preferredLang'); | var prefLang = localStorage.getItem('preferredLang'); | ||
var currentLang = | var currentLang = mw.config.get('wgUserLanguage'); | ||
if ( | if ( | ||
prefLang && | prefLang && | ||
prefLang.toLowerCase() !== currentLang && | prefLang.toLowerCase() !== currentLang.toLowerCase() && | ||
!/[?&](?:use|set)lang=/.test(location.search) | !/[?&](?:use|set)lang=/.test(location.search) | ||
) { | ) { | ||
var url = new URL(window.location.href); | var url = new URL(window.location.href); | ||
url.searchParams.set(' | url.searchParams.set('uselang', prefLang); | ||
location.replace(url.toString()); | location.replace(url.toString()); | ||
return; // Rest | return; // Rest des Codes nicht mehr ausführen | ||
} | } | ||
} catch (e) {} | } catch (e) {} | ||
| Zeile 30: | Zeile 29: | ||
]; | ]; | ||
if (document.getElementById('custom-langbar')) return; | if (document.getElementById('custom-langbar')) return; | ||
| Zeile 39: | Zeile 37: | ||
var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | var baseTitle = pageName.replace(/\/[a-z]{2}(?:-[a-z]{2})?$/i, ''); | ||
// | // Leiste bauen | ||
var | 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; | var header = document.querySelector('.minerva-header') || document.body; | ||
header.parentNode.insertBefore(bar, header.nextSibling); | header.parentNode.insertBefore(bar, header.nextSibling); | ||
// ---- Logik: Sprache setzen + auf Übersetzung springen ---- | // ---- Logik: Sprache setzen + auf Übersetzung springen ---- | ||
function targetUrlFor(code) { | function targetUrlFor(code) { | ||
// Special:MyLanguage löst auf die passende /lang-Unterseite | // Special:MyLanguage löst auf die passende /lang-Unterseite auf | ||
var title = 'Special:MyLanguage/' + baseTitle; | var title = 'Special:MyLanguage/' + baseTitle; | ||
var url = mw.util.getUrl(title); | var url = mw.util.getUrl(title); | ||
// setlang damit Gäste UND eingeloggte sofort die richtige UI sehen | |||
var sep = url.indexOf('?') > -1 ? '&' : '?'; | var sep = url.indexOf('?') > -1 ? '&' : '?'; | ||
return url + sep + 'setlang=' + encodeURIComponent(code); | return url + sep + 'setlang=' + encodeURIComponent(code); | ||
} | } | ||
| Zeile 107: | Zeile 74: | ||
code = code.toLowerCase(); | code = code.toLowerCase(); | ||
// Eingeloggt: Preference setzen, dann auf MyLanguage weiterleiten | |||
if (mw.config.get('wgUserName')) { | if (mw.config.get('wgUserName')) { | ||
new mw.Api().postWithToken('csrf', { | new mw.Api().postWithToken('csrf', { | ||
action: 'options', | action: 'options', | ||
| Zeile 118: | Zeile 85: | ||
} | } | ||
// Gäste: | // Gäste: direkt mit setlang auf MyLanguage gehen + in localStorage merken | ||
try { localStorage.setItem('preferredLang', code); } catch (e) {} | try { localStorage.setItem('preferredLang', code); } catch (e) {} | ||
location.href = targetUrlFor(code); | location.href = targetUrlFor(code); | ||
| Zeile 131: | Zeile 98: | ||
if (!mw.config.get('wgUserName')) { | if (!mw.config.get('wgUserName')) { | ||
var ns = mw.config.get('wgNamespaceNumber'); | var ns = mw.config.get('wgNamespaceNumber'); | ||
if (ns % 2 === 1) { // ungerade Namespace-Nummern = | if (ns % 2 === 1) { // ungerade Namespace-Nummern = Diskussions-Namespace | ||
var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | var subjectUrl = mw.util.getUrl(mw.config.get('wgPageName').replace(/^Talk:/, '')); | ||
window.location.href = subjectUrl; | window.location.href = subjectUrl; | ||
Version vom 8. August 2025, 11:57 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;
}
}
});