MediaWiki:Common.js: Unterschied zwischen den Versionen
Erscheinungsbild
Doppelten Sprachumschalter entfernen |
DE/EN-Inhaltssprache dauerhaft speichern und automatisch beibehalten |
||
| (4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
/* BEGIN INFORMATIK.WIKI | /* BEGIN INFORMATIK.WIKI GLOBAL LANGSWITCH */ | ||
mw.loader.using( 'mediawiki.util' ).then( function () { | |||
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).then( function () { | |||
$( function () { | $( function () { | ||
var ns = mw.config.get( 'wgNamespaceNumber' ); | var ns = mw.config.get( 'wgNamespaceNumber' ); | ||
if ( ns < 0 ) { | if ( ns < 0 ) { | ||
return; | return; | ||
| Zeile 12: | Zeile 14: | ||
var isEnglish = /\/en$/.test( pageName ); | var isEnglish = /\/en$/.test( pageName ); | ||
var baseTitle = pageName.replace( /\/en$/, '' ); | var baseTitle = pageName.replace( /\/en$/, '' ); | ||
var englishTitle = baseTitle + '/en'; | |||
var | var storageKey = 'informatikwiki-content-language'; | ||
function getPreferredLanguage() { | |||
try { | |||
return window.localStorage.getItem( storageKey ); | |||
} catch ( e ) { | |||
return null; | |||
} | |||
} | |||
function setPreferredLanguage( language ) { | |||
try { | |||
window.localStorage.setItem( storageKey, language ); | |||
} catch ( e ) { | |||
// localStorage nicht verfügbar -> Schalter funktioniert | |||
// trotzdem, nur ohne dauerhafte Speicherung. | |||
} | |||
} | } | ||
var | function pageExists( title ) { | ||
var api = new mw.Api(); | |||
return api.post( { | |||
action: 'query', | |||
prop: 'info', | |||
titles: title, | |||
formatversion: 2 | |||
} ).then( function ( data ) { | |||
var pages = data && | |||
data.query && | |||
data.query.pages; | |||
var page = null; | |||
if ( Array.isArray( pages ) ) { | |||
page = pages[ 0 ]; | |||
} else if ( pages ) { | |||
var keys = Object.keys( pages ); | |||
if ( keys.length ) { | |||
page = pages[ keys[ 0 ] ]; | |||
} | |||
} | |||
return !!( | |||
page && | |||
typeof page.pageid === 'number' && | |||
page.pageid > 0 && | |||
page.missing !== true | |||
); | |||
} ); | |||
} | |||
function renderSwitch( hasEnglishPage ) { | |||
var old = document.getElementById( 'iw-lang-switch' ); | |||
if ( old ) { | |||
old.remove(); | |||
} | } | ||
var box = document.createElement( 'div' ); | |||
if ( active ) { | box.id = 'iw-lang-switch'; | ||
el.classList.add( 'iw-lang-active' ); | box.setAttribute( 'aria-label', 'Sprache / Language' ); | ||
function addLanguage( | |||
code, | |||
label, | |||
href, | |||
active, | |||
enabled | |||
) { | |||
var el; | |||
if ( enabled && !active ) { | |||
el = document.createElement( 'a' ); | |||
el.href = href; | |||
el.addEventListener( 'click', function () { | |||
setPreferredLanguage( code ); | |||
} ); | |||
} else { | |||
el = document.createElement( 'span' ); | |||
} | |||
el.textContent = label; | |||
el.lang = code; | |||
if ( active ) { | |||
el.classList.add( 'iw-lang-active' ); | |||
el.setAttribute( 'aria-current', 'page' ); | |||
} | |||
if ( !enabled ) { | |||
el.classList.add( 'iw-lang-unavailable' ); | |||
if ( code === 'en' ) { | |||
el.title = 'English page not available yet'; | |||
} | |||
} | |||
box.appendChild( el ); | |||
} | |||
addLanguage( | |||
'de', | |||
'DE', | |||
mw.util.getUrl( baseTitle ), | |||
!isEnglish, | |||
true | |||
); | |||
var separator = document.createElement( 'span' ); | |||
separator.className = 'iw-lang-separator'; | |||
separator.textContent = '|'; | |||
box.appendChild( separator ); | |||
addLanguage( | |||
'en', | |||
'EN', | |||
mw.util.getUrl( englishTitle ), | |||
isEnglish, | |||
hasEnglishPage || isEnglish | |||
); | |||
var heading = document.getElementById( 'firstHeading' ); | |||
if ( heading && heading.parentNode ) { | |||
heading.parentNode.insertBefore( box, heading ); | |||
} | |||
} | |||
var preferredLanguage = getPreferredLanguage(); | |||
var action = mw.config.get( 'wgAction' ); | |||
/* | |||
* Auf englischer Seite: | |||
* - EN anzeigen | |||
* - bei gespeicherter Sprache DE zurückwechseln. | |||
*/ | |||
if ( isEnglish ) { | |||
if ( | |||
preferredLanguage === 'de' && | |||
action === 'view' | |||
) { | |||
window.location.replace( | |||
mw.util.getUrl( baseTitle ) | |||
); | |||
return; | |||
} | } | ||
renderSwitch( true ); | |||
return; | |||
} | } | ||
/* | |||
* Auf deutscher Seite zuerst prüfen, | |||
* ob eine /en-Seite existiert. | |||
*/ | |||
pageExists( englishTitle ) | |||
.then( function ( hasEnglishPage ) { | |||
/* | |||
* EN wurde früher gewählt: | |||
* automatisch auf die vorhandene | |||
* englische Seite wechseln. | |||
*/ | |||
if ( | |||
preferredLanguage === 'en' && | |||
hasEnglishPage && | |||
action === 'view' | |||
) { | |||
window.location.replace( | |||
mw.util.getUrl( englishTitle ) | |||
); | |||
return; | |||
} | |||
renderSwitch( hasEnglishPage ); | |||
} ) | |||
.catch( function ( error ) { | |||
console.error( | |||
'informatik.wiki language switch:', | |||
englishTitle, | |||
error | |||
); | |||
renderSwitch( false ); | |||
} ); | |||
} ); | } ); | ||
} ); | } ); | ||
/* END INFORMATIK.WIKI | |||
/* END INFORMATIK.WIKI GLOBAL LANGSWITCH */ | |||
Aktuelle Version vom 11. September 2026, 18:19 Uhr
/* BEGIN INFORMATIK.WIKI GLOBAL LANGSWITCH */
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).then( function () {
$( function () {
var ns = mw.config.get( 'wgNamespaceNumber' );
if ( ns < 0 ) {
return;
}
var pageName = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
var isEnglish = /\/en$/.test( pageName );
var baseTitle = pageName.replace( /\/en$/, '' );
var englishTitle = baseTitle + '/en';
var storageKey = 'informatikwiki-content-language';
function getPreferredLanguage() {
try {
return window.localStorage.getItem( storageKey );
} catch ( e ) {
return null;
}
}
function setPreferredLanguage( language ) {
try {
window.localStorage.setItem( storageKey, language );
} catch ( e ) {
// localStorage nicht verfügbar -> Schalter funktioniert
// trotzdem, nur ohne dauerhafte Speicherung.
}
}
function pageExists( title ) {
var api = new mw.Api();
return api.post( {
action: 'query',
prop: 'info',
titles: title,
formatversion: 2
} ).then( function ( data ) {
var pages = data &&
data.query &&
data.query.pages;
var page = null;
if ( Array.isArray( pages ) ) {
page = pages[ 0 ];
} else if ( pages ) {
var keys = Object.keys( pages );
if ( keys.length ) {
page = pages[ keys[ 0 ] ];
}
}
return !!(
page &&
typeof page.pageid === 'number' &&
page.pageid > 0 &&
page.missing !== true
);
} );
}
function renderSwitch( hasEnglishPage ) {
var old = document.getElementById( 'iw-lang-switch' );
if ( old ) {
old.remove();
}
var box = document.createElement( 'div' );
box.id = 'iw-lang-switch';
box.setAttribute( 'aria-label', 'Sprache / Language' );
function addLanguage(
code,
label,
href,
active,
enabled
) {
var el;
if ( enabled && !active ) {
el = document.createElement( 'a' );
el.href = href;
el.addEventListener( 'click', function () {
setPreferredLanguage( code );
} );
} else {
el = document.createElement( 'span' );
}
el.textContent = label;
el.lang = code;
if ( active ) {
el.classList.add( 'iw-lang-active' );
el.setAttribute( 'aria-current', 'page' );
}
if ( !enabled ) {
el.classList.add( 'iw-lang-unavailable' );
if ( code === 'en' ) {
el.title = 'English page not available yet';
}
}
box.appendChild( el );
}
addLanguage(
'de',
'DE',
mw.util.getUrl( baseTitle ),
!isEnglish,
true
);
var separator = document.createElement( 'span' );
separator.className = 'iw-lang-separator';
separator.textContent = '|';
box.appendChild( separator );
addLanguage(
'en',
'EN',
mw.util.getUrl( englishTitle ),
isEnglish,
hasEnglishPage || isEnglish
);
var heading = document.getElementById( 'firstHeading' );
if ( heading && heading.parentNode ) {
heading.parentNode.insertBefore( box, heading );
}
}
var preferredLanguage = getPreferredLanguage();
var action = mw.config.get( 'wgAction' );
/*
* Auf englischer Seite:
* - EN anzeigen
* - bei gespeicherter Sprache DE zurückwechseln.
*/
if ( isEnglish ) {
if (
preferredLanguage === 'de' &&
action === 'view'
) {
window.location.replace(
mw.util.getUrl( baseTitle )
);
return;
}
renderSwitch( true );
return;
}
/*
* Auf deutscher Seite zuerst prüfen,
* ob eine /en-Seite existiert.
*/
pageExists( englishTitle )
.then( function ( hasEnglishPage ) {
/*
* EN wurde früher gewählt:
* automatisch auf die vorhandene
* englische Seite wechseln.
*/
if (
preferredLanguage === 'en' &&
hasEnglishPage &&
action === 'view'
) {
window.location.replace(
mw.util.getUrl( englishTitle )
);
return;
}
renderSwitch( hasEnglishPage );
} )
.catch( function ( error ) {
console.error(
'informatik.wiki language switch:',
englishTitle,
error
);
renderSwitch( false );
} );
} );
} );
/* END INFORMATIK.WIKI GLOBAL LANGSWITCH */