Zum Inhalt springen

MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Informatik.wiki
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' );
                     el.title = code === 'en'
 
                         ? 'English page not available yet'
                     if ( code === 'en' ) {
                        : 'Deutsche Seite nicht verfügbar';
                         el.title = 'English page not available yet';
                    }
                 }
                 }


Zeile 84: Zeile 84:
                 heading.parentNode.insertBefore( box, heading );
                 heading.parentNode.insertBefore( box, heading );
             }
             }
         }
         }


         /*
         /*
         * Auf einer englischen Seite wissen wir bereits,
         * Auf einer /en-Seite existiert die englische
         * dass die englische Version existiert.
         * Seite definitionsgemäß bereits.
         */
         */
         if ( isEnglish ) {
         if ( isEnglish ) {
Zeile 97: Zeile 96:


         /*
         /*
         * Auf deutschen Seiten automatisch prüfen,
         * Existenz der /en-Seite immer aktuell über POST prüfen.
         * ob die entsprechende echte /en-Seite existiert.
         * POST vermeidet mögliche zwischengespeicherte GET-Antworten.
         */
         */
         var api = new mw.Api();
         var api = new mw.Api();


         api.get( {
         api.post( {
             action: 'query',
             action: 'query',
            prop: 'info',
             titles: englishTitle,
             titles: englishTitle,
             formatversion: 2
             formatversion: 2
         } ).then( function ( data ) {
         } ).then( function ( data ) {


             var page = data.query.pages[ 0 ];
             var pages = data &&
            var exists = !Object.prototype.hasOwnProperty.call( page, 'missing' );
                        data.query &&
                        data.query.pages;


             renderSwitch( exists );
             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 );


        } ).catch( function () {
                if ( keys.length ) {
                    page = pages[ keys[ 0 ] ];
                }
            }


             /*
             /*
             * Bei einem API-Fehler lieber EN deaktivieren,
             * Eine echte MediaWiki-Seite besitzt eine positive pageid.
            * statt auf eine nicht geprüfte Seite zu verlinken.
             */
             */
            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 */