MediaWiki:Gadget-setlang.js

From Wikimedia Incubator

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * This script emulates the desktop MediaWiki's setlang URL parameter
 * functionality for mobile (the Minerva skin). It is only supposed to load
 * for registered users who use the mobile site.
 * 
 * @version 1.0.5 (2023-03-23)
 * @author Jon Harald Søby
 */
( function() {

	if (
		// If the user is unregistered. Just a precaution, the gadget should
		// never load at all for unregistered users.
		!mw.user.getId() ||
		// If there is no setlang parameter
		!mw.util.getParamValue( 'setlang' ) ||
		// If the requested language is already the user's interface language
		mw.util.getParamValue( 'setlang' ) === mw.user.options.get( 'language' )
	) {
		// Do nothing
		return;
	}
	
	function fauxSetlang( lang ) {
		var autonym = $.uls.data.getAutonym( lang );
		new mw.Api().loadMessagesIfMissing( [
			'ext-uls-setlang-heading',
			'ext-uls-setlang-message',
			'ext-uls-setlang-cancel',
			'ext-uls-setlang-accept'
		] ).then( function() {
			var messageDialog = new OO.ui.MessageDialog(),
				windowManager = new OO.ui.WindowManager();
	
			$( document.body ).append( windowManager.$element );
			windowManager.addWindows( [ messageDialog ] );
			
			var saveButton = new OO.ui.ActionWidget( {
				action: 'save',
				label: mw.msg( 'ext-uls-setlang-accept' ),
				flags: [ 'primary', 'progressive' ],
				framed: true,
			} );
			
			saveButton.on( 'click', function() {
				new mw.Api().postWithEditToken( {
					action: 'options',
					format: 'json',
					optionname: 'language',
					optionvalue: lang,
					formatversion: 2
				} ).then( function() {
					// Reload the page (to put the change into effect),
					// but without the setlang parameter
					var uri = new mw.Uri();
					if ( window.history.replaceState ) {
						delete uri.query.setlang;
						window.history.replaceState( null, 'no-setlang-url', uri.toString() );
					}
					location.reload();
				});
			} );
	
			windowManager.openWindow( messageDialog, {
				title: mw.msg( 'ext-uls-setlang-heading', autonym ),
				message: $( '<p>' ).append( mw.message( 'ext-uls-setlang-message', autonym, lang ).parseDom() ),
				actions: [
					saveButton,
					{
						label: mw.msg( 'ext-uls-setlang-cancel' ),
						flags: 'safe'
					}
				]
			} );
		} );
	}
	
	fauxSetlang( mw.util.getParamValue( 'setlang' ) );

} )();