Vai al contenuto

MediaWiki:Common.js: differenze tra le versioni

Da Wiki Progetto di Ricerca Metodo Paret.
Admin (discussione | contributi)
Auto-language switcher per pagine /ru /en /fr /es /pt
 
Admin (discussione | contributi)
Common.js v2: auto-redirect bidirezionale (UI russa atterra su pagina italiana redirige a /ru)
Riga 1: Riga 1:
/* ============================================================
/* ============================================================
  * Auto-language selection for translated pages
  * Auto-language for translated pages — v2
  * ============================================================
  * ============================================================
  * Quando l'utente atterra su una pagina con suffisso linguistico
  * Due logiche complementari:
  * (es. /ru, /en, /fr, /es, /pt), forza l'UI in quella lingua
*
  * UNA SOLA VOLTA, salvando un cookie. L'utente può comunque
* A) Atterro su pagina /ru senza uselang → forza UI russa (uselang=ru)
* cambiare lingua manualmente con l'icona globo (ULS), che ha
  *   Cookie: autolang_set = ru/en/fr/...
  * priorità più alta.
*
* B) UI è in lingua X (ru/en/...) ma sono su pagina senza suffisso
*    → se esiste Page/X la apro automaticamente
*    Eccezione: NON ridirige se già su /X o se utente ha esplicitamente
  *   fatto "vai alla versione italiana" (cookie no_auto_lang=1)
*
* L'utente può sempre cambiare lingua manualmente con l'icona globo (ULS),
  * che ha priorità più alta del cookie autolang_set.
  * ============================================================ */
  * ============================================================ */
( function ( mw ) {
( function ( mw ) {
     'use strict';
     'use strict';


     var SUPPORTED_SUFFIXES = [ 'ru', 'en', 'fr', 'es', 'pt' ];
     var SUPPORTED_LANGS = [ 'ru', 'en', 'fr', 'es', 'pt' ];
     var COOKIE_NAME = 'autolang_set';
     var COOKIE_AUTOLANG = 'autolang_set';
    var COOKIE_NO_AUTO = 'no_auto_lang_redirect';


    // Legge cookie semplice
     function getCookie( name ) {
     function getCookie( name ) {
         var match = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) );
         var match = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) );
Riga 27: Riga 34:
     }
     }


     function getPageLangFromTitle() {
     function getPageSuffixLang() {
        // Usa il titolo MediaWiki ufficiale (no URL encoding)
         var title = mw.config.get( 'wgPageName' ) || '';
         var title = mw.config.get( 'wgPageName' ) || '';
        // Cerca suffisso /XX in fondo al titolo
         var m = title.match( /\/([a-z]{2})$/ );
         var m = title.match( /\/([a-z]{2})$/ );
         if ( m && SUPPORTED_SUFFIXES.indexOf( m[ 1 ] ) !== -1 ) {
         if ( m && SUPPORTED_LANGS.indexOf( m[ 1 ] ) !== -1 ) {
             return m[ 1 ];
             return m[ 1 ];
         }
         }
Riga 38: Riga 43:
     }
     }


     function userHasExplicitChoice() {
     function getCurrentUILang() {
         // L'utente ha scelto manualmente una lingua se:
         // mw.config wgUserLanguage è la lingua UI attiva (riflette uselang/ULS/preferenze)
        // 1. ULS ha salvato preferenza (cookie 'uls-preferences' o simili)
         return mw.config.get( 'wgUserLanguage' );
        // 2. Abbiamo già forzato la lingua una volta in questa sessione
    }
        if ( getCookie( COOKIE_NAME ) ) {
 
            return true;
    function getContentLang() {
        }
         return mw.config.get( 'wgContentLanguage' ) || 'it';
        // Per utenti loggati: mw.user.options ha 'language' impostato
         var userLang = mw.user.options.get( 'language' );
         if ( userLang && userLang !== mw.config.get( 'wgContentLanguage' ) ) {
            return true;
        }
        return false;
     }
     }


     function init() {
    /* Logica A: pagina /XX → forza UI in XX */
         var targetLang = getPageLangFromTitle();
     function autoForceUI() {
         if ( !targetLang ) {
         var targetLang = getPageSuffixLang();
            return; // pagina non multilingue
         if ( !targetLang ) return false;
        }


        // Se l'URL ha già ?uselang=, l'utente sta già usando una lingua scelta
         var url = new URL( window.location.href );
         var url = new URL( window.location.href );
         if ( url.searchParams.get( 'uselang' ) ) {
         if ( url.searchParams.get( 'uselang' ) ) {
            // Salva il cookie per ricordare la scelta
             setCookie( COOKIE_AUTOLANG, url.searchParams.get( 'uselang' ), 365 );
             setCookie( COOKIE_NAME, url.searchParams.get( 'uselang' ), 365 );
             return false;
             return;
         }
         }


         // Se l'utente ha già fatto una scelta esplicita, non interferire
         // Già nella lingua corretta? (es. utente che torna avendo già autolang)
         if ( userHasExplicitChoice() ) {
         if ( getCurrentUILang() === targetLang ) {
             return;
             return false;
         }
         }


         // Aggiungi uselang=XX all'URL e ricarica (UNA volta)
         // Forza redirect
         setCookie( COOKIE_NAME, targetLang, 365 );
         setCookie( COOKIE_AUTOLANG, targetLang, 365 );
         url.searchParams.set( 'uselang', targetLang );
         url.searchParams.set( 'uselang', targetLang );
         window.location.replace( url.toString() );
         window.location.replace( url.toString() );
        return true;
    }
    /* Logica B: UI in XX ma pagina senza suffisso → cerca Page/XX */
    function autoRedirectToTranslation() {
        var uiLang = getCurrentUILang();
        var contentLang = getContentLang();
       
        // Solo se UI è in una lingua supportata DIVERSA dal contenuto base
        if ( !uiLang || uiLang === contentLang ) return;
        if ( SUPPORTED_LANGS.indexOf( uiLang ) === -1 ) return;
       
        // Non se la pagina ha già suffisso (gestita da logica A)
        if ( getPageSuffixLang() ) return;
       
        // Non se l'utente ha disabilitato l'auto-redirect
        if ( getCookie( COOKIE_NO_AUTO ) ) return;
       
        // Non se siamo in azione speciale (edit, history, diff, ecc.)
        var action = mw.config.get( 'wgAction' );
        if ( action && action !== 'view' ) return;
       
        // Non se siamo su una pagina speciale
        var ns = mw.config.get( 'wgNamespaceNumber' );
        if ( ns < 0 ) return; // Special pages
        // Per ns=0 (Main) sì, ns altri (talk, file, etc.) no
        if ( ns !== 0 ) return;
       
        var currentTitle = mw.config.get( 'wgPageName' );
        // mainpage può essere "Pagina_principale" o l'effettiva mainpage
        var targetTitle = currentTitle + '/' + uiLang;
       
        // Verifico esistenza pagina /XX via API prima di reindirizzare
        var api = new mw.Api();
        api.get( {
            action: 'query',
            titles: targetTitle,
            format: 'json'
        } ).then( function ( data ) {
            var pages = ( data.query && data.query.pages ) || {};
            var found = false;
            for ( var pid in pages ) {
                if ( pid > 0 ) { found = true; break; } // pid negativi = missing
            }
            if ( found ) {
                // Esiste la versione tradotta → reindirizzo
                var newUrl = mw.util.getUrl( targetTitle );
                // Aggiungo notice prima di reindirizzare
                console.log( '[autolang] Redirecting to translated version:', targetTitle );
                window.location.replace( newUrl );
            }
            // Se non esiste: niente. L'utente vede la pagina italiana con UI russa.
        } );
    }
    function init() {
        // Logica A ha priorità: se reindirizziamo per UI, fermiamoci
        if ( autoForceUI() ) return;
        // Logica B
        autoRedirectToTranslation();
     }
     }


    // Esegui non appena mw è pronto
     if ( typeof mw !== 'undefined' && mw.config ) {
     if ( typeof mw !== 'undefined' && mw.config ) {
         mw.loader.using( [ 'mediawiki.util', 'user.options' ] ).then( init );
         mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'user.options' ] ).then( init );
     }
     }


Riga 86: Riga 141:


/* ============================================================
/* ============================================================
  * Fine auto-language
  * Fine auto-language v2
  * ============================================================ */
  * ============================================================ */

Versione delle 00:35, 26 mag 2026

/* ============================================================
 * Auto-language for translated pages — v2
 * ============================================================
 * Due logiche complementari:
 * 
 * A) Atterro su pagina /ru senza uselang → forza UI russa (uselang=ru)
 *    Cookie: autolang_set = ru/en/fr/...
 * 
 * B) UI è in lingua X (ru/en/...) ma sono su pagina senza suffisso 
 *    → se esiste Page/X la apro automaticamente
 *    Eccezione: NON ridirige se già su /X o se utente ha esplicitamente
 *    fatto "vai alla versione italiana" (cookie no_auto_lang=1)
 * 
 * L'utente può sempre cambiare lingua manualmente con l'icona globo (ULS),
 * che ha priorità più alta del cookie autolang_set.
 * ============================================================ */
( function ( mw ) {
    'use strict';

    var SUPPORTED_LANGS = [ 'ru', 'en', 'fr', 'es', 'pt' ];
    var COOKIE_AUTOLANG = 'autolang_set';
    var COOKIE_NO_AUTO = 'no_auto_lang_redirect';

    function getCookie( name ) {
        var match = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) );
        return match ? decodeURIComponent( match[ 1 ] ) : null;
    }

    function setCookie( name, value, days ) {
        var d = new Date();
        d.setTime( d.getTime() + ( days * 24 * 60 * 60 * 1000 ) );
        document.cookie = name + '=' + encodeURIComponent( value ) +
            '; expires=' + d.toUTCString() + '; path=/; SameSite=Lax';
    }

    function getPageSuffixLang() {
        var title = mw.config.get( 'wgPageName' ) || '';
        var m = title.match( /\/([a-z]{2})$/ );
        if ( m && SUPPORTED_LANGS.indexOf( m[ 1 ] ) !== -1 ) {
            return m[ 1 ];
        }
        return null;
    }

    function getCurrentUILang() {
        // mw.config wgUserLanguage è la lingua UI attiva (riflette uselang/ULS/preferenze)
        return mw.config.get( 'wgUserLanguage' );
    }

    function getContentLang() {
        return mw.config.get( 'wgContentLanguage' ) || 'it';
    }

    /* Logica A: pagina /XX → forza UI in XX */
    function autoForceUI() {
        var targetLang = getPageSuffixLang();
        if ( !targetLang ) return false;

        var url = new URL( window.location.href );
        if ( url.searchParams.get( 'uselang' ) ) {
            setCookie( COOKIE_AUTOLANG, url.searchParams.get( 'uselang' ), 365 );
            return false;
        }

        // Già nella lingua corretta? (es. utente che torna avendo già autolang)
        if ( getCurrentUILang() === targetLang ) {
            return false;
        }

        // Forza redirect
        setCookie( COOKIE_AUTOLANG, targetLang, 365 );
        url.searchParams.set( 'uselang', targetLang );
        window.location.replace( url.toString() );
        return true;
    }

    /* Logica B: UI in XX ma pagina senza suffisso → cerca Page/XX */
    function autoRedirectToTranslation() {
        var uiLang = getCurrentUILang();
        var contentLang = getContentLang();
        
        // Solo se UI è in una lingua supportata DIVERSA dal contenuto base
        if ( !uiLang || uiLang === contentLang ) return;
        if ( SUPPORTED_LANGS.indexOf( uiLang ) === -1 ) return;
        
        // Non se la pagina ha già suffisso (gestita da logica A)
        if ( getPageSuffixLang() ) return;
        
        // Non se l'utente ha disabilitato l'auto-redirect
        if ( getCookie( COOKIE_NO_AUTO ) ) return;
        
        // Non se siamo in azione speciale (edit, history, diff, ecc.)
        var action = mw.config.get( 'wgAction' );
        if ( action && action !== 'view' ) return;
        
        // Non se siamo su una pagina speciale
        var ns = mw.config.get( 'wgNamespaceNumber' );
        if ( ns < 0 ) return; // Special pages
        // Per ns=0 (Main) sì, ns altri (talk, file, etc.) no
        if ( ns !== 0 ) return;
        
        var currentTitle = mw.config.get( 'wgPageName' );
        // mainpage può essere "Pagina_principale" o l'effettiva mainpage
        var targetTitle = currentTitle + '/' + uiLang;
        
        // Verifico esistenza pagina /XX via API prima di reindirizzare
        var api = new mw.Api();
        api.get( {
            action: 'query',
            titles: targetTitle,
            format: 'json'
        } ).then( function ( data ) {
            var pages = ( data.query && data.query.pages ) || {};
            var found = false;
            for ( var pid in pages ) {
                if ( pid > 0 ) { found = true; break; } // pid negativi = missing
            }
            if ( found ) {
                // Esiste la versione tradotta → reindirizzo
                var newUrl = mw.util.getUrl( targetTitle );
                // Aggiungo notice prima di reindirizzare
                console.log( '[autolang] Redirecting to translated version:', targetTitle );
                window.location.replace( newUrl );
            }
            // Se non esiste: niente. L'utente vede la pagina italiana con UI russa.
        } );
    }

    function init() {
        // Logica A ha priorità: se reindirizziamo per UI, fermiamoci
        if ( autoForceUI() ) return;
        // Logica B
        autoRedirectToTranslation();
    }

    if ( typeof mw !== 'undefined' && mw.config ) {
        mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'user.options' ] ).then( init );
    }

}( window.mediaWiki || window.mw ) );

/* ============================================================
 * Fine auto-language v2
 * ============================================================ */