From 0d5c69f65587e20811a58da94eaed47021e5c2f0 Mon Sep 17 00:00:00 2001 From: Fomafix Date: Tue, 8 Sep 2015 20:21:05 +0000 Subject: [PATCH] Do not use setlang to change user language Requests using GET should only retrieve data and should have no other effect. (https://en.wikipedia.org/wiki/HTTP_GET_request) * Use API with POST to change the user interface language in user settings. * When allowed by wgULSAnonCanChangeLanguage set cookie for anonymous user or when API fails. This change uses mediawiki.cookie which requires MediaWiki 1.24+. Bug: T46649 Change-Id: Iaf6fafbf200933dfc760be69d2adf5e5efcf8245 --- Resources.php | 3 ++- resources/js/ext.uls.init.js | 37 +++++++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Resources.php b/Resources.php index 86563c43..cad40972 100644 --- a/Resources.php +++ b/Resources.php @@ -70,7 +70,8 @@ $wgResourceModules['ext.uls.init'] = array( 'monobook' => 'resources/css/ext.uls-monobook.css', ), 'dependencies' => array( - 'mediawiki.Uri', + 'mediawiki.api', + 'mediawiki.cookie', 'jquery.client', 'jquery.cookie', ), diff --git a/resources/js/ext.uls.init.js b/resources/js/ext.uls.init.js index 80334a85..4dae749d 100644 --- a/resources/js/ext.uls.init.js +++ b/resources/js/ext.uls.init.js @@ -60,19 +60,42 @@ }; /** - * Change the language of wiki using setlang URL parameter + * Change the language of wiki using API or set cookie and reload the page * @param {string} language Language code. */ mw.uls.changeLanguage = function ( language ) { - var uri = new mw.Uri( window.location.href ), - deferred = new $.Deferred(); + var deferred = new $.Deferred(); + + function changeLanguageAnon() { + if ( mw.config.get( 'wgULSAnonCanChangeLanguage' ) ) { + mw.cookie.set( 'language', language ); + location.reload(); + } + } deferred.done( function () { - uri.extend( { - setlang: language - } ); + var api; - window.location.href = uri.toString(); + if ( mw.user.isAnon() ) { + changeLanguageAnon(); + return; + } + + api = new mw.Api(); + // @todo Change this to api.saveOption when ULS minimum MW version is 1.25 + api.postWithToken( 'options', { + action: 'options', + optionname: 'language', + optionvalue: language + } ) + .done( function () { + location.reload(); + } ) + .fail( function () { + // Set options failed. Maybe the user has logged off. + // Continue like anonymous user and set cookie. + changeLanguageAnon(); + } ); } ); mw.hook( 'mw.uls.interface.language.change' ).fire( language, deferred );