MediaWiki:Common.js: differenze tra le versioni
Aspetto
Auto-language switcher per pagine /ru /en /fr /es /pt |
Common.js v2: auto-redirect bidirezionale (UI russa atterra su pagina italiana redirige a /ru) |
||
| Riga 1: | Riga 1: | ||
/* ============================================================ | /* ============================================================ | ||
* Auto-language | * 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/... | |||
* 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 | var SUPPORTED_LANGS = [ 'ru', 'en', 'fr', 'es', 'pt' ]; | ||
var | 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 match = document.cookie.match( new RegExp( '(?:^|;\\s*)' + name + '=([^;]*)' ) ); | ||
| Riga 27: | Riga 34: | ||
} | } | ||
function | function getPageSuffixLang() { | ||
var title = mw.config.get( 'wgPageName' ) || ''; | var title = mw.config.get( 'wgPageName' ) || ''; | ||
var m = title.match( /\/([a-z]{2})$/ ); | var m = title.match( /\/([a-z]{2})$/ ); | ||
if ( m && | if ( m && SUPPORTED_LANGS.indexOf( m[ 1 ] ) !== -1 ) { | ||
return m[ 1 ]; | return m[ 1 ]; | ||
} | } | ||
| Riga 38: | Riga 43: | ||
} | } | ||
function | 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'; | |||
} | } | ||
function | /* Logica A: pagina /XX → forza UI in XX */ | ||
var targetLang = | function autoForceUI() { | ||
if ( !targetLang ) | var targetLang = getPageSuffixLang(); | ||
if ( !targetLang ) return false; | |||
var url = new URL( window.location.href ); | var url = new URL( window.location.href ); | ||
if ( url.searchParams.get( 'uselang' ) ) { | if ( url.searchParams.get( 'uselang' ) ) { | ||
setCookie( COOKIE_AUTOLANG, url.searchParams.get( 'uselang' ), 365 ); | |||
setCookie( | return false; | ||
return; | |||
} | } | ||
// | // Già nella lingua corretta? (es. utente che torna avendo già autolang) | ||
if ( | if ( getCurrentUILang() === targetLang ) { | ||
return; | return false; | ||
} | } | ||
// | // Forza redirect | ||
setCookie( | 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(); | |||
} | } | ||
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
* ============================================================ */