diff --git a/lib/jquery.ime/jquery.ime.js b/lib/jquery.ime/jquery.ime.js index c09bd54d..f969fcba 100644 --- a/lib/jquery.ime/jquery.ime.js +++ b/lib/jquery.ime/jquery.ime.js @@ -760,6 +760,7 @@ */ selectLanguage: function ( languageCode ) { var ime, + imePref = $.ime.preferences.getIM( languageCode ), language = $.ime.languages[languageCode]; if ( !language ) { @@ -772,7 +773,8 @@ // Nothing to do. It is same as the current language, // but check whether the input method changed. if ( ime.inputmethod && - ime.inputmethod.id === $.ime.preferences.getIM( languageCode ) + ime.inputmethod.id === imePref || + imePref === 'system' ) { return false; } diff --git a/resources/js/ext.uls.interface.js b/resources/js/ext.uls.interface.js index 2bb3b8b2..7516a952 100644 --- a/resources/js/ext.uls.interface.js +++ b/resources/js/ext.uls.interface.js @@ -1,5 +1,5 @@ /** - * ULS Interface language selector + * ULS interface integration logic * * Copyright (C) 2012-2013 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris, * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other @@ -17,172 +17,119 @@ * @licence MIT License */ -( function ( $, mw, window, document, undefined ) { +( function ( $, mw ) { 'use strict'; - $( document ).ready( function () { - var $ulsTrigger, - $ulsSettingsTrigger, - $pLang, - ulsOptions, - previousLanguages, previousLang, - anonMode, - rtlPage = $( 'body' ).hasClass( 'rtl' ), + /* + * Construct the display settings link + */ + function displaySettings() { + var $displaySettingsTitle, displaySettingsText, $displaySettings; + + displaySettingsText = $.i18n( 'ext-uls-display-settings-desc' ); + $displaySettingsTitle = $( '
' ) + .addClass( 'settings-title' ) + .attr( 'title', displaySettingsText ); + $displaySettings = $( '
' ) + .addClass( 'display-settings-block' ) + .prop( 'id', 'display-settings-block' ) + .append( $displaySettingsTitle ); + + return $displaySettings; + } + + /* + * Construct the input settings link + */ + function inputSettings() { + var $inputSettingsTitle, inputSettingsText, $inputSettings; + + inputSettingsText = $.i18n( 'ext-uls-input-settings-desc' ); + $inputSettingsTitle = $( '
' ) + .addClass( 'settings-title' ) + .attr( 'title', inputSettingsText ); + $inputSettings = $( '
' ) + .addClass( 'input-settings-block' ) + .prop( 'id', 'input-settings-block' ) + .append( $inputSettingsTitle ); + + return $inputSettings; + } + + /* + * Add display settings link to the settings bar in ULS + * @param {Object} uls The ULS object + */ + function addDisplaySettings( uls ) { + var $displaySettings = displaySettings(), ulsPosition = mw.config.get( 'wgULSPosition' ), + anonMode = ( mw.user.isAnon() && + !mw.config.get( 'wgULSAnonCanChangeLanguage' ) ), + displaySettingsOptions = { + defaultModule: 'display' + }; + + // If the ULS trigger is shown in the top personal menu, + // closing the display settings must show the main ULS + // languages list, unless we are in anon mode and thus + // cannot show the language list + if ( ulsPosition === 'personal' && !anonMode ) { + displaySettingsOptions.onClose = function () { + uls.show(); + }; + } + $.extend( displaySettingsOptions, uls.position() ); + + uls.$menu.find( '#settings-block' ).append( $displaySettings ); + $displaySettings.languagesettings( displaySettingsOptions ); + $displaySettings.on( 'click', function () { + uls.hide(); + } ); + } + + /* + * Add input settings link to the settings bar in ULS + * @param {Object} uls The ULS object + */ + function addInputSettings( uls ) { + var $inputSettings, position; + + $inputSettings = inputSettings(); + uls.$menu.find( '#settings-block' ).append( $inputSettings ); + position = uls.position(); + + $inputSettings.languagesettings( { + defaultModule: 'input', + onClose: function () { + uls.show(); + }, + top: position.top, + left: position.left + } ); + + $inputSettings.on( 'click', function () { + uls.hide(); + } ); + } + + /* + * The tooltip to be shown when language changed using ULS + * It also allows to undo the language selection. + */ + function showULSTooltip() { + var $ulsTrigger = $( '.uls-trigger' ), + ulsPosition = mw.config.get( 'wgULSPosition' ), + currentLang = mw.config.get( 'wgUserLanguage' ), + previousLang, + rtlPage = $( 'body' ).hasClass( 'rtl' ), tipsyGravity = { personal: 'n', interlanguage: rtlPage ? 'e' : 'w' }, - currentLang = mw.config.get( 'wgUserLanguage' ); + previousLanguages = mw.uls.getPreviousLanguages() || []; - anonMode = ( mw.user.isAnon() && - !mw.config.get( 'wgULSAnonCanChangeLanguage' ) ); - - if ( ulsPosition === 'interlanguage' ) { - // The interlanguage links section - $pLang = $( '#p-lang' ); - // Add an element near the interlanguage links header - $ulsSettingsTrigger = $( '' ) - .addClass( 'uls-settings-trigger' ) - .attr( 'title', $.i18n( 'ext-uls-language-settings-title' ) ); - $pLang.prepend( $ulsSettingsTrigger ); - - // Remove the dummy link that was added to make sure that the section appears - $pLang.find( '.uls-p-lang-dummy' ).remove(); - - if ( !$pLang.find( 'div ul' ).children().length ) { - // Replace the title of the interlanguage links - // area if there are no interlanguage links - $pLang.find( 'h3' ) - .text( mw.msg( 'uls-plang-title-languages' ) ); - - // Remove the empty box that appears in the monobook skin - if ( mw.config.get( 'skin' ) === 'monobook' ) { - $pLang.find( 'div.pBody' ).remove(); - } - } - } - - $ulsTrigger = $( '.uls-trigger' ); - previousLanguages = mw.uls.getPreviousLanguages() || []; previousLang = previousLanguages.slice( -1 )[0]; - function displaySettings() { - var $displaySettingsTitle, displaySettingsText, $displaySettings; - - displaySettingsText = $.i18n( 'ext-uls-display-settings-desc' ); - $displaySettingsTitle = $( '
' ) - .addClass( 'settings-title' ) - .attr( 'title', displaySettingsText ); - $displaySettings = $( '
' ) - .addClass( 'display-settings-block' ) - .prop( 'id', 'display-settings-block' ) - .append( $displaySettingsTitle ); - - return $displaySettings; - } - - function inputSettings() { - var $inputSettingsTitle, inputSettingsText, $inputSettings; - - inputSettingsText = $.i18n( 'ext-uls-input-settings-desc' ); - $inputSettingsTitle = $( '
' ) - .addClass( 'settings-title' ) - .attr( 'title', inputSettingsText ); - $inputSettings = $( '
' ) - .addClass( 'input-settings-block' ) - .prop( 'id', 'input-settings-block' ) - .append( $inputSettingsTitle ); - - return $inputSettings; - } - - function addDisplaySettings( uls ) { - var $displaySettings = displaySettings(), - displaySettingsOptions = { - defaultModule: 'display' - }; - - // If the ULS trigger is shown in the top personal menu, - // closing the display settings must show the main ULS - // languages list, unless we are in anon mode and thus - // cannot show the language list - if ( ulsPosition === 'personal' && !anonMode ) { - displaySettingsOptions.onClose = function () { - uls.show(); - }; - } - $.extend( displaySettingsOptions, uls.position() ); - - uls.$menu.find( '#settings-block' ).append( $displaySettings ); - $displaySettings.languagesettings( displaySettingsOptions ); - $displaySettings.on( 'click', function () { - uls.hide(); - } ); - } - - function addInputSettings( uls ) { - var $inputSettings, position; - - $inputSettings = inputSettings(); - uls.$menu.find( '#settings-block' ).append( $inputSettings ); - position = uls.position(); - - $inputSettings.languagesettings( { - defaultModule: 'input', - onClose: function () { - uls.show(); - }, - top: position.top, - left: position.left - } ); - - $inputSettings.on( 'click', function () { - uls.hide(); - } ); - } - - // ULS options that are common to all modes of showing - ulsOptions = { - onReady: function () { - if ( $.fn.languagesettings ) { - addDisplaySettings( this ); - addInputSettings( this ); - } - }, - onSelect: function ( language ) { - mw.uls.changeLanguage( language ); - }, - languages: mw.config.get( 'wgULSLanguages' ), - searchAPI: mw.util.wikiScript( 'api' ) + '?action=languagesearch', - quickList: function () { - return mw.uls.getFrequentLanguageList(); - } - }; - - if ( ulsPosition === 'interlanguage' ) { - $ulsSettingsTrigger.attr( 'title', $.i18n( 'ext-uls-select-language-settings-icon-tooltip' ) ); - $ulsSettingsTrigger.languagesettings( { - onVisible: function () { - var ulsTriggerOffset = $ulsSettingsTrigger.offset(); - this.left = rtlPage ? ulsTriggerOffset.left - 30 - :ulsTriggerOffset.left + 30; - this.top = ulsTriggerOffset.top - 50; - this.position(); - } - } ); - $( '.uls-menu' ).each( function () { - $( this ).prepend( - $( '' ).addClass( 'caret-before' ), - $( '' ).addClass( 'caret-after' ) - ); - } ); - } else if ( anonMode ) { - $ulsTrigger.languagesettings(); - } else { - $ulsTrigger.uls( ulsOptions ); - } - if ( previousLang === currentLang ) { // Do not show tooltip nor update language list return true; @@ -265,5 +212,83 @@ $ulsTrigger.on( 'click', function () { hideTipsy(); } ); + } + + $( document ).ready( function () { + var $ulsTrigger = $( '.uls-trigger' ), + $ulsSettingsTrigger, + $pLang, + ulsOptions, + rtlPage = $( 'body' ).hasClass( 'rtl' ), + anonMode = ( mw.user.isAnon() && + !mw.config.get( 'wgULSAnonCanChangeLanguage' ) ), + ulsPosition = mw.config.get( 'wgULSPosition' ); + + if ( ulsPosition === 'interlanguage' ) { + // The interlanguage links section + $pLang = $( '#p-lang' ); + // Add an element near the interlanguage links header + $ulsSettingsTrigger = $( '' ) + .addClass( 'uls-settings-trigger' ) + .attr( 'title', $.i18n( 'ext-uls-language-settings-title' ) ); + $pLang.prepend( $ulsSettingsTrigger ); + + // Remove the dummy link that was added to make sure that the section appears + $pLang.find( '.uls-p-lang-dummy' ).remove(); + + if ( !$pLang.find( 'div ul' ).children().length ) { + // Replace the title of the interlanguage links + // area if there are no interlanguage links + $pLang.find( 'h3' ) + .text( mw.msg( 'uls-plang-title-languages' ) ); + + // Remove the empty box that appears in the monobook skin + if ( mw.config.get( 'skin' ) === 'monobook' ) { + $pLang.find( 'div.pBody' ).remove(); + } + } + } + // ULS options that are common to all modes of showing + ulsOptions = { + onReady: function () { + if ( $.fn.languagesettings ) { + addDisplaySettings( this ); + addInputSettings( this ); + } + }, + onSelect: function ( language ) { + mw.uls.changeLanguage( language ); + }, + languages: mw.config.get( 'wgULSLanguages' ), + searchAPI: mw.util.wikiScript( 'api' ) + '?action=languagesearch', + quickList: function () { + return mw.uls.getFrequentLanguageList(); + } + }; + + if ( ulsPosition === 'interlanguage' ) { + $ulsSettingsTrigger.attr( 'title', $.i18n( 'ext-uls-select-language-settings-icon-tooltip' ) ); + $ulsSettingsTrigger.languagesettings( { + onVisible: function () { + var ulsTriggerOffset = $ulsSettingsTrigger.offset(); + this.left = rtlPage ? ulsTriggerOffset.left - 30 + :ulsTriggerOffset.left + 30; + this.top = ulsTriggerOffset.top - 50; + this.position(); + } + } ); + $( '.uls-menu' ).each( function () { + $( this ).prepend( + $( '' ).addClass( 'caret-before' ), + $( '' ).addClass( 'caret-after' ) + ); + } ); + } else if ( anonMode ) { + $ulsTrigger.languagesettings(); + } else { + $ulsTrigger.uls( ulsOptions ); + } + + showULSTooltip(); } ); -}( jQuery, mediaWiki, window, document ) ); +}( jQuery, mediaWiki ) );