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 v7: touch+viewport <=1200 = mobile (cattura Desktop Mode)
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
/* ============================================================
/* ============================================================
  * Auto-language for translated pages v2
  * Common.js v7 Wiki Methode Paret
  * ============================================================
  * ============================================================
  * Due logiche complementari:
  * REGOLA UNICA:
  *  
  *   URL /Titolo      → UI italiana
* A) Atterro su pagina /ru senza uselang forza UI russa (uselang=ru)
  *   URL /Titolo/ru    → UI russa
  *   Cookie: autolang_set = ru/en/fr/...
  *
*
  * Mobile detection v7:
* B) UI è in lingua X (ru/en/...) ma sono su pagina senza suffisso
  *   - Touch capability (funziona anche con "Versione Desktop" del browser)
  *   → se esiste Page/X la apro automaticamente
  *   - Viewport width <= 1200 (più tollerante: cattura anche desktop mode 1080)
  *   Eccezione: NON ridirige se già su /X o se utente ha esplicitamente
  *   - Una delle due basta
  *   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 ) {
Riga 19: Riga 15:


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


     function getCookie( name ) {
     function getCookie( name ) {
         var match = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) );
         var m = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) );
         return match ? decodeURIComponent( match[ 1 ] ) : null;
         return m ? decodeURIComponent( m[ 1 ] ) : null;
     }
     }
 
     function deleteCookie( name ) {
     function setCookie( name, value, days ) {
         var hostname = window.location.hostname;
         var d = new Date();
        var parts = hostname.split( '.' );
         d.setTime( d.getTime() + ( days * 24 * 60 * 60 * 1000 ) );
         var domains = [ hostname, '' ];
         document.cookie = name + '=' + encodeURIComponent( value ) +
        if ( parts.length > 2 ) {
             '; expires=' + d.toUTCString() + '; path=/; SameSite=Lax';
            domains.push( '.' + parts.slice( -2 ).join( '.' ) );
         }
        domains.forEach( function ( d ) {
             var suffix = d ? '; domain=' + d : '';
            document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/' + suffix;
        } );
     }
     }


     function getPageSuffixLang() {
     // ─── DETECTION MOBILE ROBUSTA ──────────────────────────
        var title = mw.config.get( 'wgPageName' ) || '';
    var ua = navigator.userAgent || '';
        var m = title.match( /\/([a-z]{2})$/ );
    var isMobileUA = /iPhone|iPad|iPod|Android|Mobile|webOS|BlackBerry|Opera Mini|IEMobile|Silk/i.test( ua );
        if ( m && SUPPORTED_LANGS.indexOf( m[ 1 ] ) !== -1 ) {
    var viewportWidth = window.innerWidth || document.documentElement.clientWidth || 1024;
            return m[ 1 ];
    var isSmallViewport = viewportWidth <= 1200;
        }
    var hasTouch = ( 'ontouchstart' in window ) ||
        return null;
                  ( navigator.maxTouchPoints > 0 ) ||
    }
                  ( navigator.msMaxTouchPoints > 0 );


     function getCurrentUILang() {
     // Mobile se: UA mobile OPPURE (touch + viewport piccolino)
        // mw.config wgUserLanguage è la lingua UI attiva (riflette uselang/ULS/preferenze)
    // Il caso "Versione Desktop attivata" ha touch=true e viewport ~1080 → cattura
        return mw.config.get( 'wgUserLanguage' );
    var isMobile = isMobileUA || ( hasTouch && isSmallViewport );
    }


     function getContentLang() {
     if ( isMobile ) {
         return mw.config.get( 'wgContentLanguage' ) || 'it';
         [ 'stopMobileRedirect', 'mf_useformat' ].forEach( function ( n ) {
            if ( getCookie( n ) !== null ) deleteCookie( n );
        } );
     }
     }


     /* Logica A: pagina /XX → forza UI in XX */
     [ 'autolang_set', 'no_auto_lang_redirect' ].forEach( function ( n ) {
    function autoForceUI() {
         if ( getCookie( n ) !== null ) deleteCookie( n );
         var targetLang = getPageSuffixLang();
    } );
        if ( !targetLang ) return false;


    // ─── Force ?useformat=mobile se mobile + su Vector ─────
    if ( isMobile &&
        document.body &&
        /skin-vector/.test( document.body.className ) ) {
         var url = new URL( window.location.href );
         var url = new URL( window.location.href );
         if ( url.searchParams.get( 'uselang' ) ) {
         if ( url.searchParams.get( 'useformat' ) !== 'mobile' ) {
             setCookie( COOKIE_AUTOLANG, url.searchParams.get( 'uselang' ), 365 );
             url.searchParams.set( 'useformat', 'mobile' );
             return false;
            window.location.replace( url.toString() );
             return;
         }
         }
    }
    // ─── URL decide UI lingua ─────────────────────────────
    function syncUILangFromURL() {
        if ( typeof mw === 'undefined' || !mw.config ) return;
        var pageName = mw.config.get( 'wgPageName' ) || '';
        var currentUI = mw.config.get( 'wgUserLanguage' );
        var contentLang = mw.config.get( 'wgContentLanguage' ) || 'it';


         // Già nella lingua corretta? (es. utente che torna avendo già autolang)
         var match = pageName.match( /\/([a-z]{2})$/ );
         if ( getCurrentUILang() === targetLang ) {
        var desiredLang;
             return false;
         if ( match && SUPPORTED_LANGS.indexOf( match[ 1 ] ) !== -1 ) {
            desiredLang = match[ 1 ];
        } else {
             desiredLang = contentLang;
         }
         }


         // Forza redirect
         if ( currentUI === desiredLang ) return;
        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' );
         var action = mw.config.get( 'wgAction' );
         if ( action && action !== 'view' ) return;
         if ( action && action !== 'view' ) return;
       
 
        // Non se siamo su una pagina speciale
         var ns = mw.config.get( 'wgNamespaceNumber' );
         var ns = mw.config.get( 'wgNamespaceNumber' );
         if ( ns < 0 ) return; // Special pages
         if ( ns < 0 ) return;
        // Per ns=0 (Main) sì, ns altri (talk, file, etc.) no
 
        if ( ns !== 0 ) return;
         var url = new URL( window.location.href );
       
        if ( url.searchParams.get( 'uselang' ) ) 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() {
        url.searchParams.set( 'uselang', desiredLang );
         // Logica A ha priorità: se reindirizziamo per UI, fermiamoci
         window.location.replace( url.toString() );
        if ( autoForceUI() ) return;
        // Logica B
        autoRedirectToTranslation();
     }
     }


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


}( window.mediaWiki || window.mw ) );
}( window.mediaWiki || window.mw ) );
/* ============================================================
* Fine auto-language v2
* ============================================================ */