MediaWiki:Common.js: Unterschied zwischen den Versionen
Erscheinungsbild
Globalen DE/EN-Schalter dynamisch auf vorhandene /en-Seiten umstellen |
DE/EN-Schalter: robuste dynamische Erkennung vorhandener englischer Seiten |
||
| Zeile 25: | Zeile 25: | ||
var box = document.createElement( 'div' ); | var box = document.createElement( 'div' ); | ||
box.id = 'iw-lang-switch'; | box.id = 'iw-lang-switch'; | ||
box.setAttribute( 'aria-label', 'Sprache / Language' ); | box.setAttribute( 'aria-label', 'Sprache / Language' ); | ||
| Zeile 50: | Zeile 49: | ||
if ( !enabled ) { | if ( !enabled ) { | ||
el.classList.add( 'iw-lang-unavailable' ); | el.classList.add( 'iw-lang-unavailable' ); | ||
if ( code === 'en' ) { | |||
el.title = 'English page not available yet'; | |||
} | |||
} | } | ||
| Zeile 84: | Zeile 84: | ||
heading.parentNode.insertBefore( box, heading ); | heading.parentNode.insertBefore( box, heading ); | ||
} | } | ||
} | } | ||
/* | /* | ||
* Auf einer | * Auf einer /en-Seite existiert die englische | ||
* | * Seite definitionsgemäß bereits. | ||
*/ | */ | ||
if ( isEnglish ) { | if ( isEnglish ) { | ||
| Zeile 97: | Zeile 96: | ||
/* | /* | ||
* | * Existenz der /en-Seite immer aktuell über POST prüfen. | ||
* | * POST vermeidet mögliche zwischengespeicherte GET-Antworten. | ||
*/ | */ | ||
var api = new mw.Api(); | var api = new mw.Api(); | ||
api. | api.post( { | ||
action: 'query', | action: 'query', | ||
prop: 'info', | |||
titles: englishTitle, | titles: englishTitle, | ||
formatversion: 2 | formatversion: 2 | ||
} ).then( function ( data ) { | } ).then( function ( data ) { | ||
var | var pages = data && | ||
data.query && | |||
data.query.pages; | |||
var page = null; | |||
/* | |||
* Funktioniert sowohl bei formatversion=2 (Array) | |||
* als auch bei einer Objektstruktur. | |||
*/ | |||
if ( Array.isArray( pages ) ) { | |||
page = pages[ 0 ]; | |||
} else if ( pages ) { | |||
var keys = Object.keys( pages ); | |||
if ( keys.length ) { | |||
page = pages[ keys[ 0 ] ]; | |||
} | |||
} | |||
/* | /* | ||
* | * Eine echte MediaWiki-Seite besitzt eine positive pageid. | ||
*/ | */ | ||
var exists = !!( | |||
page && | |||
typeof page.pageid === 'number' && | |||
page.pageid > 0 && | |||
page.missing !== true | |||
); | |||
renderSwitch( exists ); | |||
} ).catch( function ( error ) { | |||
console.error( | |||
'informatik.wiki language switch:', | |||
englishTitle, | |||
error | |||
); | |||
renderSwitch( false ); | renderSwitch( false ); | ||
} ); | } ); | ||
Version vom 11. September 2026, 17:41 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';
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;
} 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 );
}
}
/*
* Auf einer /en-Seite existiert die englische
* Seite definitionsgemäß bereits.
*/
if ( isEnglish ) {
renderSwitch( true );
return;
}
/*
* Existenz der /en-Seite immer aktuell über POST prüfen.
* POST vermeidet mögliche zwischengespeicherte GET-Antworten.
*/
var api = new mw.Api();
api.post( {
action: 'query',
prop: 'info',
titles: englishTitle,
formatversion: 2
} ).then( function ( data ) {
var pages = data &&
data.query &&
data.query.pages;
var page = null;
/*
* Funktioniert sowohl bei formatversion=2 (Array)
* als auch bei einer Objektstruktur.
*/
if ( Array.isArray( pages ) ) {
page = pages[ 0 ];
} else if ( pages ) {
var keys = Object.keys( pages );
if ( keys.length ) {
page = pages[ keys[ 0 ] ];
}
}
/*
* Eine echte MediaWiki-Seite besitzt eine positive pageid.
*/
var exists = !!(
page &&
typeof page.pageid === 'number' &&
page.pageid > 0 &&
page.missing !== true
);
renderSwitch( exists );
} ).catch( function ( error ) {
console.error(
'informatik.wiki language switch:',
englishTitle,
error
);
renderSwitch( false );
} );
} );
} );
/* END INFORMATIK.WIKI GLOBAL LANGSWITCH */