MediaWiki:Common.js: differenze tra le versioni

Admin (discussione | contributi)
Common.js v2: auto-redirect bidirezionale (UI russa atterra su pagina italiana redirige a /ru)
Admin (discussione | contributi)
Common.js v3: aggiunto auto-redirect-original (UI italiana + URL /ru = torna a Italian page)
Riga 1: Riga 1:
/* ============================================================
/* ============================================================
  * Auto-language for translated pages — v2
  * Auto-language for translated pages — v3
  * ============================================================
  * ============================================================
  * Due logiche complementari:
  * Tre logiche complementari:
  *  
  *  
  * A) Atterro su pagina /ru senza uselang forza UI russa (uselang=ru)
  * A) Atterro su pagina /XX senza uselang -> forza UI in XX
  *    Cookie: autolang_set = ru/en/fr/...
* B) UI in XX, pagina senza suffisso -> redirigo a Page/XX se esiste
* C) UI in italiano (default), pagina /XX -> redirigo alla pagina senza /XX
  *    (cioè: utente cambia da russo a italiano, torna alla pagina italiana)
  *  
  *  
  * B) UI è in lingua X (ru/en/...) ma sono su pagina senza suffisso
  * Tutte le redirezioni avvengono solo se l'utente NON ha già scelto manualmente
*    → se esiste Page/X la apro automaticamente
  * (cookie no_auto_lang_redirect per opt-out).
*    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),
  * L'icona globo (ULS) ha sempre priorità.
* che ha priorità più alta del cookie autolang_set.
  * ============================================================ */
  * ============================================================ */
( function ( mw ) {
( function ( mw ) {
Riga 41: Riga 40:
         }
         }
         return null;
         return null;
    }
    function getTitleWithoutSuffix() {
        var title = mw.config.get( 'wgPageName' ) || '';
        return title.replace( /\/[a-z]{2}$/, '' );
     }
     }


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


     /* Logica A: pagina /XX forza UI in XX */
    function notViewAction() {
        var action = mw.config.get( 'wgAction' );
        return action && action !== 'view';
    }
 
    function notMainNamespace() {
        var ns = mw.config.get( 'wgNamespaceNumber' );
        return ns !== 0;
    }
 
    function urlHasUselang() {
        var url = new URL( window.location.href );
        return !!url.searchParams.get( 'uselang' );
    }
 
     /* Logica A: pagina /XX, UI diversa, no uselang -> forza UI in XX */
     function autoForceUI() {
     function autoForceUI() {
         var targetLang = getPageSuffixLang();
         var targetLang = getPageSuffixLang();
         if ( !targetLang ) return false;
         if ( !targetLang ) return false;


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


         // Già nella lingua corretta? (es. utente che torna avendo già autolang)
        if ( getCurrentUILang() === targetLang ) return false;
         if ( getCurrentUILang() === targetLang ) {
       
            return false;
         // Eccezione: se UI è italiana (default), NON forzare ru — l'utente ha scelto italiano
        }
        // (questa è la logica C che lascia rendere logica C)
         if ( getCurrentUILang() === getContentLang() ) return false;


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


     /* Logica B: UI in XX ma pagina senza suffisso → cerca Page/XX */
     /* Logica B: UI in XX, pagina senza suffisso -> redirigo a Page/XX se esiste */
     function autoRedirectToTranslation() {
     function autoRedirectToTranslation() {
         var uiLang = getCurrentUILang();
         var uiLang = getCurrentUILang();
         var contentLang = getContentLang();
         var contentLang = getContentLang();
          
          
        // Solo se UI è in una lingua supportata DIVERSA dal contenuto base
         if ( !uiLang || uiLang === contentLang ) return false;
         if ( !uiLang || uiLang === contentLang ) return;
         if ( SUPPORTED_LANGS.indexOf( uiLang ) === -1 ) return false;
         if ( SUPPORTED_LANGS.indexOf( uiLang ) === -1 ) return;
        if ( getPageSuffixLang() ) return false;
        if ( getCookie( COOKIE_NO_AUTO ) ) return false;
        if ( notViewAction() ) return false;
        if ( notMainNamespace() ) return false;
          
          
         // Non se la pagina ha già suffisso (gestita da logica A)
         var currentTitle = mw.config.get( 'wgPageName' );
         if ( getPageSuffixLang() ) return;
         var targetTitle = currentTitle + '/' + uiLang;
          
          
         // Non se l'utente ha disabilitato l'auto-redirect
         var api = new mw.Api();
         if ( getCookie( COOKIE_NO_AUTO ) ) return;
        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; }
            }
            if ( found ) {
                console.log( '[autolang B] Redirect to translated version:', targetTitle );
                window.location.replace( mw.util.getUrl( targetTitle ) );
            }
        } );
        return true;
    }
 
    /* Logica C: UI in italiano (default), pagina /XX -> redirigo a Page (senza suffisso) */
    function autoRedirectToOriginal() {
        var uiLang = getCurrentUILang();
        var contentLang = getContentLang();
        var pageLang = getPageSuffixLang();
          
          
         // Non se siamo in azione speciale (edit, history, diff, ecc.)
         if ( !pageLang ) return false;
         var action = mw.config.get( 'wgAction' );
        if ( uiLang !== contentLang ) return false; // solo se UI è italiana
         if ( action && action !== 'view' ) return;
        if ( getCookie( COOKIE_NO_AUTO ) ) return false;
         if ( notViewAction() ) return false;
        if ( notMainNamespace() ) return false;
         if ( urlHasUselang() ) return false; // l'utente sta forzando una lingua
          
          
         // Non se siamo su una pagina speciale
         // L'utente ha scelto italiano ma è su pagina /XX → vai alla pagina italiana
         var ns = mw.config.get( 'wgNamespaceNumber' );
         var originalTitle = getTitleWithoutSuffix();
         if ( ns < 0 ) return; // Special pages
         if ( !originalTitle ) return false;
        // Per ns=0 (Main) sì, ns altri (talk, file, etc.) no
        if ( ns !== 0 ) return;
          
          
        var currentTitle = mw.config.get( 'wgPageName' );
         // Verifica esistenza pagina italiana
         // 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();
         var api = new mw.Api();
         api.get( {
         api.get( {
             action: 'query',
             action: 'query',
             titles: targetTitle,
             titles: originalTitle,
             format: 'json'
             format: 'json'
         } ).then( function ( data ) {
         } ).then( function ( data ) {
Riga 114: Riga 155:
             var found = false;
             var found = false;
             for ( var pid in pages ) {
             for ( var pid in pages ) {
                 if ( pid > 0 ) { found = true; break; } // pid negativi = missing
                 if ( pid > 0 ) { found = true; break; }
             }
             }
             if ( found ) {
             if ( found ) {
                 // Esiste la versione tradotta → reindirizzo
                 console.log( '[autolang C] Redirect to original Italian:', originalTitle );
                var newUrl = mw.util.getUrl( targetTitle );
                 // Cancella il cookie autolang (utente vuole italiano stabilmente)
                 // Aggiungo notice prima di reindirizzare
                 setCookie( COOKIE_AUTOLANG, contentLang, 365 );
                 console.log( '[autolang] Redirecting to translated version:', targetTitle );
                 window.location.replace( mw.util.getUrl( originalTitle ) );
                 window.location.replace( newUrl );
             }
             }
            // Se non esiste: niente. L'utente vede la pagina italiana con UI russa.
         } );
         } );
        return true;
     }
     }


     function init() {
     function init() {
        // Logica A ha priorità: se reindirizziamo per UI, fermiamoci
         if ( autoForceUI() ) return;
         if ( autoForceUI() ) return;
         // Logica B
         if ( autoRedirectToOriginal() ) return;
         autoRedirectToTranslation();
         autoRedirectToTranslation();
     }
     }
Riga 140: Riga 179:
}( window.mediaWiki || window.mw ) );
}( window.mediaWiki || window.mw ) );


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