From 5ca0d5d4005c3139a41bf49d5d37c20ebc7e0acc Mon Sep 17 00:00:00 2001 From: Niharika Kohli Date: Wed, 29 Jan 2014 05:07:50 +0000 Subject: [PATCH] Compacting the interlanguage links with the ULS Displays a shorter version of the language list with the languages that are more relevant to you. More info at https://www.mediawiki.org/wiki/Universal_Language_Selector/Design/Interlanguage_links Due to a problem with duplicate patchsets we had to create a new one. The history and info on code and security revisions is available at https://gerrit.wikimedia.org/r/#/c/104793/ Change-Id: I109bfb10f6181b6408aab170db5e8ca32493d657 --- Resources.php | 11 ++ UniversalLanguageSelector.hooks.php | 21 +++ UniversalLanguageSelector.i18n.php | 5 + UniversalLanguageSelector.php | 2 + i18n/en.json | 3 +- i18n/qqq.json | 6 +- resources/css/ext.uls.compactlinks.css | 38 +++++ resources/images/compact-links-ltr.png | Bin 0 -> 7424 bytes resources/images/compact-links-ltr.svg | 1 + resources/images/compact-links-rtl.png | Bin 0 -> 7301 bytes resources/images/compact-links-rtl.svg | 1 + resources/js/ext.uls.compactlinks.js | 228 +++++++++++++++++++++++++ 12 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 resources/css/ext.uls.compactlinks.css create mode 100644 resources/images/compact-links-ltr.png create mode 100644 resources/images/compact-links-ltr.svg create mode 100644 resources/images/compact-links-rtl.png create mode 100644 resources/images/compact-links-rtl.svg create mode 100644 resources/js/ext.uls.compactlinks.js diff --git a/Resources.php b/Resources.php index cb01d805..1d073321 100644 --- a/Resources.php +++ b/Resources.php @@ -146,6 +146,17 @@ $wgResourceModules['ext.uls.preferences'] = array( ), ) + $resourcePaths; +$wgResourceModules['ext.uls.compactlinks'] = array( + 'scripts' => 'resources/js/ext.uls.compactlinks.js', + 'styles' => 'resources/css/ext.uls.compactlinks.css', + 'dependencies' => array( + 'ext.uls.mediawiki', + 'ext.uls.init', + 'jquery.uls.compact', + 'mediawiki.ui.button', + ), +) + $resourcePaths; + $wgResourceModules['ext.uls.webfonts'] = array( 'scripts' => 'resources/js/ext.uls.webfonts.js', 'dependencies' => array( diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php index 9315718a..f740f528 100644 --- a/UniversalLanguageSelector.hooks.php +++ b/UniversalLanguageSelector.hooks.php @@ -62,6 +62,13 @@ class UniversalLanguageSelectorHooks { // If the extension is enabled, basic features (API, language data) available. $out->addModules( 'ext.uls.init' ); + // If compact ULS beta feature is enabled + if ( class_exists( 'BetaFeatures' ) && + BetaFeatures::isFeatureEnabled( $out->getUser(), 'uls-compact-links' ) + ) { + $out->addModules( 'ext.uls.compactlinks' ); + } + if ( is_string( $wgULSGeoService ) ) { $out->addModules( 'ext.uls.geoclient' ); } @@ -327,6 +334,20 @@ class UniversalLanguageSelectorHooks { return true; } + public static function onGetBetaFeaturePreferences( $user, &$prefs ) { + global $wgExtensionAssetsPath; + $prefs['uls-compact-links'] = array( + 'label-message' => 'uls-betafeature-label', + 'desc-message' => 'uls-betafeature-desc', + 'screenshot' => $wgExtensionAssetsPath . + '/UniversalLanguageSelector/resources/images/compact-links-ltr.png', + 'info-link' => + 'https://www.mediawiki.org/wiki/Universal_Language_Selector/Design/Interlanguage_links', + 'discussion-link' => + 'https://www.mediawiki.org/wiki/Talk:Universal_Language_Selector/Design/Interlanguage_links', + ); + } + /** * Hook: SkinTemplateOutputPageBeforeExec * @param Skin $skin diff --git a/UniversalLanguageSelector.i18n.php b/UniversalLanguageSelector.i18n.php index c12250d8..5941686e 100644 --- a/UniversalLanguageSelector.i18n.php +++ b/UniversalLanguageSelector.i18n.php @@ -26,6 +26,7 @@ $messages = array(); * @author Amire80 * @author Nike * @author Kunal Mehta + * @author Niharika */ $messages['en'] = array( 'UniversalLanguageSelector' => 'Universal Language Selector', @@ -36,6 +37,8 @@ $messages['en'] = array( 'ext-uls-select-language-settings-icon-tooltip' => 'Language settings', 'ext-uls-undo-language-tooltip-text' => 'Language changed from $1', 'ext-uls-language-settings-preferences-link' => 'More language settings', + 'uls-betafeature-label' => 'Compacting interlanguage links', + 'uls-betafeature-desc' => 'Displays a shorter version of the language list with the languages that are more relevant to you.', ); /** Message documentation (Message documentation) @@ -58,6 +61,8 @@ This title is shown when there are no interlanguage links there, but an icon tha 'ext-uls-undo-language-tooltip-text' => 'Text for the tooltip appearing when language is changed. Parameters: * $1 - the previous language acronym', 'ext-uls-language-settings-preferences-link' => 'Text for the link showin in user preference screen', + 'uls-betafeature-label' => 'Title for the compact interlanguage links beta feature', + 'uls-betafeature-desc' => 'Description for the compact interlanguage links beta feature' ); /** Arabic (العربية) diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index 85178ace..7f9ec456 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -203,6 +203,8 @@ $GLOBALS['wgHooks']['EnterMobileMode'][] = 'UniversalLanguageSelectorHooks::onEn $GLOBALS['wgDefaultUserOptions']['uls-preferences'] = ''; $GLOBALS['wgHooks']['GetPreferences'][] = 'UniversalLanguageSelectorHooks::onGetPreferences'; +$GLOBALS['wgHooks']['GetBetaFeaturePreferences'][] = + 'UniversalLanguageSelectorHooks::onGetBetaFeaturePreferences'; $GLOBALS['wgExtensionFunctions'][] = function () { global $wgHooks, $wgResourceModules, $wgULSEventLogging, $wgULSGeoService; diff --git a/i18n/en.json b/i18n/en.json index 640a868d..0e8fd714 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -48,5 +48,6 @@ "ext-uls-input-disable-notification-undo": "Undo", "ext-uls-input-disable-notification-info-personal": "You can enable the input tools at any time from the language settings.", "ext-uls-input-disable-notification-info-interlanguage": "You can enable the input tools at any time from the language settings next to the language list.", -"ext-uls-language-settings-applying": "Applying..." +"ext-uls-language-settings-applying": "Applying...", +"ext-uls-compact-link-count": "{{PLURAL:$1|One more language|$1 more languages}}" } diff --git a/i18n/qqq.json b/i18n/qqq.json index bcc60639..67f99081 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -50,5 +50,7 @@ "ext-uls-input-disable-notification-undo": "Undo link text in the input method disable notification bubble.\n\nPreceded by the notification message {{msg-mw|Jquery-uls-ext-uls-input-disable-notification}}.\n{{Identical|Undo}}", "ext-uls-input-disable-notification-info-personal": "Notification bubble text when input methods are disabled, appears if the ULS is at personal toolbar", "ext-uls-input-disable-notification-info-interlanguage": "Notification bubble text when input methods are disabled, appears if the ULS is at interlanguage toolbar", - "ext-uls-language-settings-applying": "Label for apply settings button in language settings screen, while settings being saved. Please keep it short." -} \ No newline at end of file + "ext-uls-language-settings-applying": "Label for apply settings button in language settings screen, while settings being saved. Please keep it short.", + "ext-uls-language-settings-preferences-link": "Text for the link showing in user preference screen", + "ext-uls-compact-link-count": "Message next to list of languages which indicates that there are more languages than the ones shown. Parameters:\n* $1 - number of languages" +} diff --git a/resources/css/ext.uls.compactlinks.css b/resources/css/ext.uls.compactlinks.css new file mode 100644 index 00000000..a71f3d33 --- /dev/null +++ b/resources/css/ext.uls.compactlinks.css @@ -0,0 +1,38 @@ +#more-lang-label { + color: #8b8989; + font-size: 12px; + display: block; +} + +#p-lang-list .uls-trigger { + background-image: none; + padding: 0; +} + +.mw-interlanguage-selector { + cursor: pointer; + margin: 2px 0; + padding: 0 8px; +} + +.interlanguage-uls-menu:after, +.interlanguage-uls-menu:before { + right: 100%; + content: " "; + position: absolute; + border: 1px solid black; +} + +.interlanguage-uls-menu:after { + border-color: transparent; + border-right-color: #FCFCFC; + border-width: 20px; + top: 250px; +} + +.interlanguage-uls-menu:before { + border-color: transparent; + border-right-color: #555555; + border-width: 20px; + top: 250px; +} \ No newline at end of file diff --git a/resources/images/compact-links-ltr.png b/resources/images/compact-links-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..8634c89e67b9b7126fc64cb4e74e7d01e974f336 GIT binary patch literal 7424 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 literal 0 HcmV?d00001 diff --git a/resources/images/compact-links-ltr.svg b/resources/images/compact-links-ltr.svg new file mode 100644 index 00000000..cb5f42cf --- /dev/null +++ b/resources/images/compact-links-ltr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/compact-links-rtl.png b/resources/images/compact-links-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2ef6332c43ad55212366da5ee986abd82956dc GIT binary patch literal 7301 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 \ No newline at end of file diff --git a/resources/js/ext.uls.compactlinks.js b/resources/js/ext.uls.compactlinks.js new file mode 100644 index 00000000..c3fdcfca --- /dev/null +++ b/resources/js/ext.uls.compactlinks.js @@ -0,0 +1,228 @@ +/** + * Compact the interlanguage links in the sidebar + * + * Copyright (C) 2012-2014 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris, + * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland, Niharika Kohli + * and other contributors. See CREDITS for a list. + * + * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't + * have to do anything special to choose one license or the other and you don't + * have to notify anyone which license you are using. You are free to use + * UniversalLanguageSelector in commercial projects as long as the copyright + * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details. + * + * @file + * @ingroup Extensions + * @licence GNU GPL-2.0+ + * @licence MIT License + */ + +( function ( $, mw ) { + 'use strict'; + + /** + * Add a language to the interlanguage list + * @param {string} name Name of language in Autonym font + * @param {string} url Link of the article in the respective language wiki + */ + function addLanguage( name, url ) { + var $linkNode, + $listNode, + $interlanguageList; + + $linkNode = $( '' ) + .addClass( 'active' ) + .attr( 'href', url ) + .text( name ); + + $listNode = $( '
  • ' ) + .append( $linkNode ); + + $interlanguageList = $( '#p-lang > div > ul' ); + $interlanguageList.append( $listNode ); + } + + /** + * Find out the existing languages supported + * by article and fetch their href + * @return {Object} List of exiting language codes and their hrefs + */ + function getInterlanguageList() { + var interlangList = {}, + selectedElement; + $( '#p-lang > div > ul > li > a' ).each( function() { + selectedElement = $( this ); + interlangList[ selectedElement.attr( 'lang' ) ] = selectedElement.attr( 'href' ); + } ); + return interlangList; + } + + /** + * Fetch list of language names(in Autonym) which are supported by the article + * @return {Object} List of Language names in Autonym supported by article + */ + function getCurrentLanguages() { + var acceptedLanglist = {}, + interlangList = getInterlanguageList(), i; + for ( i in interlangList ) { + if( interlangList.hasOwnProperty( i ) ) { + acceptedLanglist[ i ] = $.uls.data.getAutonym(i); + } + } + return acceptedLanglist; + } + + /** + * Frequently spoken languages which are supported by the article for + * the Common Languages section of the ULS + * @return {Array} List of those language codes which are supported by article and appears + * in the Common Languages section of ULS + */ + function getCommonLanguages() { + // From ext.uls.init.js + var frequentLang = mw.uls.getFrequentLanguageList(), + $acceptedLang = $.map( getCurrentLanguages(), function ( element, index ) { + return index; + } ), + commonLanguages = [], i; + for ( i = 0; i < frequentLang.length; i++ ) { + if ( $.inArray( frequentLang[i], $acceptedLang ) >= 0 ) { + commonLanguages.push( frequentLang[i] ); + } + } + return commonLanguages; + } + + /** + * Add a ULS trigger beneath the interlanguage links + */ + function addULSlink() { + var $newLinknode, + $interlanguageList, + supportedLangs, + posOfTrigger; + + $newLinknode = $( '
    ' ) + .addClass( 'mw-interlanguage-selector mw-ui-button active' ) + .html( '…' ) + .append( $newLinknode ); + + $interlanguageList = $( '#p-lang > div > ul' ); + $interlanguageList.append( $newLinknode ); + posOfTrigger = $newLinknode.offset(); + + $( '.mw-interlanguage-selector' ).uls( { + onReady: function() { + this.$menu.addClass( 'interlanguage-uls-menu' ); + }, + + onSelect: function( language ) { + supportedLangs = getInterlanguageList(); + window.location.href = supportedLangs[language]; + }, + + compact: true, + left: posOfTrigger.left + $newLinknode.width() + 50 + 'px', + top: posOfTrigger.top - $newLinknode.height()/2 - 250 + 'px', + languages: getCurrentLanguages(), + quickList: getCommonLanguages() + } ); + } + + /** + * Hide existing languages displayed on the page + */ + function hideLanguages() { + var $languages = $( '.interlanguage-link' ); + $languages.hide(); + } + + /** + * Returns all languages returned by the commonLanguages function + * and randomly some more if the number falls short of numberOfLanguagesToShow parameter + * @param {number} numberOfLanguagesToShow Number of languages to be shown in sidebar + * @return {Array} Language codes of the final list to be displayed + */ + function displayLanguages( numberOfLanguagesToShow ) { + var commonLang = getCommonLanguages(), + currentLangs = getInterlanguageList(), i, + count, + finalList = []; + + // Check existing languages for ones in common, and add them to final list + for ( i = 0; i < commonLang.length; i++ ) { + finalList.push( commonLang[i] ); + } + + count = commonLang.length; + if ( count < numberOfLanguagesToShow ) { + for ( i in currentLangs ) { + if ( $.inArray( i, commonLang ) === -1 ) { + finalList.push( i ); + count++; + if ( count === numberOfLanguagesToShow ) { + break; + } + } + } + } + + // Sorting the language list in alphabetical order of ISO codes + finalList = finalList.sort(); + return finalList; + } + + /* + * Adds a label stating the number of more languages + * beneath the ULS link + * @param {Number} numberOfLanguagesSupported Number of languages supported by article + * @param {Number} numberOfLanguagesToShow Number of languages to be shown in the sidebar + */ + function addLabel( numberOfLanguagesSupported, numberOfLanguagesToShow ) { + var $interlanguageList = $( '#p-lang > div > ul' ), + newLabel = $( '