MediaWiki:Common.js: differenze tra le versioni
Aspetto
Common.js v2: auto-redirect bidirezionale (UI russa atterra su pagina italiana redirige a /ru) |
Common.js v3: aggiunto auto-redirect-original (UI italiana + URL /ru = torna a Italian page) |
||
| Riga 1: | Riga 1: | ||
/* ============================================================ | /* ============================================================ | ||
* Auto-language for translated pages — | * Auto-language for translated pages — v3 | ||
* ============================================================ | * ============================================================ | ||
* | * Tre logiche complementari: | ||
* | * | ||
* A) Atterro su pagina / | * A) Atterro su pagina /XX senza uselang -> forza UI in XX | ||
* | * 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) | |||
* | * | ||
* | * Tutte le redirezioni avvengono solo se l'utente NON ha già scelto manualmente | ||
* (cookie no_auto_lang_redirect per opt-out). | |||
* | |||
* | * | ||
* L | * L'icona globo (ULS) ha sempre priorità. | ||
* ============================================================ */ | * ============================================================ */ | ||
( 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() { | ||
return mw.config.get( 'wgUserLanguage' ); | return mw.config.get( 'wgUserLanguage' ); | ||
} | } | ||
| Riga 52: | Riga 55: | ||
} | } | ||
/* Logica A: pagina /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() ) { | ||
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; | ||
} | } | ||
// | if ( getCurrentUILang() === targetLang ) return false; | ||
if ( getCurrentUILang() === | |||
// 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; | |||
setCookie( COOKIE_AUTOLANG, targetLang, 365 ); | setCookie( COOKIE_AUTOLANG, targetLang, 365 ); | ||
var newUrl = new URL( window.location.href ); | |||
window.location.replace( | newUrl.searchParams.set( 'uselang', targetLang ); | ||
window.location.replace( newUrl.toString() ); | |||
return true; | return true; | ||
} | } | ||
/* Logica B: UI in 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(); | ||
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; | |||
var currentTitle = mw.config.get( 'wgPageName' ); | |||
var targetTitle = currentTitle + '/' + uiLang; | |||
var api = new mw.Api(); | |||
if ( | 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(); | |||
// | if ( !pageLang ) return false; | ||
if ( uiLang !== contentLang ) return false; // solo se UI è italiana | |||
if ( | 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 | |||
// | // L'utente ha scelto italiano ma è su pagina /XX → vai alla pagina italiana | ||
var | var originalTitle = getTitleWithoutSuffix(); | ||
if ( | if ( !originalTitle ) return false; | ||
// Verifica esistenza pagina italiana | |||
// | |||
var api = new mw.Api(); | var api = new mw.Api(); | ||
api.get( { | api.get( { | ||
action: 'query', | action: 'query', | ||
titles: | 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; } | if ( pid > 0 ) { found = true; break; } | ||
} | } | ||
if ( found ) { | if ( found ) { | ||
console.log( '[autolang C] Redirect to original Italian:', originalTitle ); | |||
// Cancella il cookie autolang (utente vuole italiano stabilmente) | |||
// | setCookie( COOKIE_AUTOLANG, contentLang, 365 ); | ||
window.location.replace( mw.util.getUrl( originalTitle ) ); | |||
window.location.replace( | |||
} | } | ||
} ); | } ); | ||
return true; | |||
} | } | ||
function init() { | function init() { | ||
if ( autoForceUI() ) return; | if ( autoForceUI() ) return; | ||
if ( autoRedirectToOriginal() ) return; | |||
autoRedirectToTranslation(); | autoRedirectToTranslation(); | ||
} | } | ||
| Riga 140: | Riga 179: | ||
}( window.mediaWiki || window.mw ) ); | }( window.mediaWiki || window.mw ) ); | ||
/ | /* ============================================================ */ | ||
Versione delle 00:50, 26 mag 2026
/* ============================================================
* Auto-language for translated pages — v3
* ============================================================
* Tre logiche complementari:
*
* A) Atterro su pagina /XX senza uselang -> forza UI in XX
* 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)
*
* Tutte le redirezioni avvengono solo se l'utente NON ha già scelto manualmente
* (cookie no_auto_lang_redirect per opt-out).
*
* L'icona globo (ULS) ha sempre priorità.
* ============================================================ */
( 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 getTitleWithoutSuffix() {
var title = mw.config.get( 'wgPageName' ) || '';
return title.replace( /\/[a-z]{2}$/, '' );
}
function getCurrentUILang() {
return mw.config.get( 'wgUserLanguage' );
}
function getContentLang() {
return mw.config.get( 'wgContentLanguage' ) || 'it';
}
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() {
var targetLang = getPageSuffixLang();
if ( !targetLang ) return false;
if ( urlHasUselang() ) {
var url = new URL( window.location.href );
setCookie( COOKIE_AUTOLANG, url.searchParams.get( 'uselang' ), 365 );
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;
setCookie( COOKIE_AUTOLANG, targetLang, 365 );
var newUrl = new URL( window.location.href );
newUrl.searchParams.set( 'uselang', targetLang );
window.location.replace( newUrl.toString() );
return true;
}
/* Logica B: UI in XX, pagina senza suffisso -> redirigo a Page/XX se esiste */
function autoRedirectToTranslation() {
var uiLang = getCurrentUILang();
var contentLang = getContentLang();
if ( !uiLang || uiLang === contentLang ) return false;
if ( SUPPORTED_LANGS.indexOf( uiLang ) === -1 ) return false;
if ( getPageSuffixLang() ) return false;
if ( getCookie( COOKIE_NO_AUTO ) ) return false;
if ( notViewAction() ) return false;
if ( notMainNamespace() ) return false;
var currentTitle = mw.config.get( 'wgPageName' );
var targetTitle = currentTitle + '/' + uiLang;
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; }
}
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();
if ( !pageLang ) return false;
if ( uiLang !== contentLang ) return false; // solo se UI è italiana
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
// L'utente ha scelto italiano ma è su pagina /XX → vai alla pagina italiana
var originalTitle = getTitleWithoutSuffix();
if ( !originalTitle ) return false;
// Verifica esistenza pagina italiana
var api = new mw.Api();
api.get( {
action: 'query',
titles: originalTitle,
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 C] Redirect to original Italian:', originalTitle );
// Cancella il cookie autolang (utente vuole italiano stabilmente)
setCookie( COOKIE_AUTOLANG, contentLang, 365 );
window.location.replace( mw.util.getUrl( originalTitle ) );
}
} );
return true;
}
function init() {
if ( autoForceUI() ) return;
if ( autoRedirectToOriginal() ) return;
autoRedirectToTranslation();
}
if ( typeof mw !== 'undefined' && mw.config ) {
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'user.options' ] ).then( init );
}
}( window.mediaWiki || window.mw ) );
/* ============================================================ */