From 64c26ad1376e2c9ca2ef27d21c692ecf6c1297e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Laxstr=C3=B6m?= Date: Thu, 30 Aug 2012 10:23:59 +0000 Subject: [PATCH] Initial version of geolocation support Change-Id: Ia1a18ac336131520bbc67f52194f4aa9c547ea67 --- UniversalLanguageSelector.hooks.php | 7 ++++++- UniversalLanguageSelector.php | 19 ++++++++++++++++++- lib/jquery.uls/src/jquery.uls.core.js | 2 +- lib/jquery.uls/src/jquery.uls.lcd.js | 5 +++++ resources/js/ext.uls.geoclient.js | 14 ++++++++++++++ resources/js/ext.uls.init.js | 25 +++++++++++++++++++------ 6 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 resources/js/ext.uls.geoclient.js diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php index 7d95098f..b1d9b4f8 100644 --- a/UniversalLanguageSelector.hooks.php +++ b/UniversalLanguageSelector.hooks.php @@ -27,7 +27,11 @@ class UniversalLanguageSelectorHooks { * @return bool */ public static function addModules( $out, $skin ) { + global $wgULSGeoService; $out->addModules( 'ext.uls.init' ); + if ( $wgULSGeoService ) { + $out->addModules( 'ext.uls.geoclient' ); + } return true; } @@ -112,8 +116,9 @@ class UniversalLanguageSelectorHooks { * @return bool */ public static function addConfig( &$vars ) { - global $wgContLang; + global $wgContLang, $wgULSGeoService; $vars['wgULSLanguages'] = Language::fetchLanguageNames( $wgContLang->getCode(), 'mwfile' ); + $vars['wgULSGeoService'] = $wgULSGeoService; return true; } diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index 0a009175..8a751fa8 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -25,7 +25,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { /** * Version number used in extension credits and in other placed where needed. */ -define( 'ULS_VERSION', '2012-07-20' ); +define( 'ULS_VERSION', '2012-08-30' ); $wgExtensionCredits['other'][] = array( 'path' => __FILE__, @@ -45,6 +45,17 @@ $wgExtensionCredits['other'][] = array( 'descriptionmsg' => 'uls-desc', ); +/** + * ULS can use geolocation services to suggest languages based on the + * country the user is vising from. Setting this to false will prevent + * builtin geolocation from being used. You can provide your own geolocation + * by setting window.GEO to object which has key country_code. This is what + * Wikipedia does. + * + * The service should return jsonp that uses the supplied callback parameter. + */ +$wgULSGeoService = 'http://freegeoip.net/json/'; + $dir = __DIR__ ; // Internationalization @@ -77,6 +88,12 @@ $wgResourceModules['ext.uls.init'] = array( 'position' => 'top', ); +$wgResourceModules['ext.uls.geoclient'] = array( + 'scripts' => 'resources/js/ext.uls.geoclient.js', + 'localBasePath' => $dir, + 'remoteExtPath' => 'UniversalLanguageSelector', +); + $wgResourceModules['ext.uls.preferences'] = array( 'scripts' => 'resources/js/ext.uls.preferences.js', 'localBasePath' => $dir, diff --git a/lib/jquery.uls/src/jquery.uls.core.js b/lib/jquery.uls/src/jquery.uls.core.js index e9e83bf8..8634651c 100644 --- a/lib/jquery.uls/src/jquery.uls.core.js +++ b/lib/jquery.uls/src/jquery.uls.core.js @@ -335,7 +335,7 @@ onSelect: null, // Callback function to be called when a language is selected searchAPI: null, // Language search API languages: $.uls.data.autonyms(), // Languages to be used for ULS, default is all languages - quickList : null + quickList: null // Array of language codes of function that returns such }; $.fn.uls.Constructor = ULS; diff --git a/lib/jquery.uls/src/jquery.uls.lcd.js b/lib/jquery.uls/src/jquery.uls.lcd.js index c6b9981a..bf81a985 100644 --- a/lib/jquery.uls/src/jquery.uls.lcd.js +++ b/lib/jquery.uls/src/jquery.uls.lcd.js @@ -130,9 +130,14 @@ }, quicklist: function() { + if ( $.isFunction( this.options.quickList ) ) { + this.options.quickList = this.options.quickList(); + } + if ( !this.options.quickList ) { return; } + var $column; var quickList = this.options.quickList; var quickListLength = ( quickList.length <= 16 ) ? quickList.length : 16; diff --git a/resources/js/ext.uls.geoclient.js b/resources/js/ext.uls.geoclient.js new file mode 100644 index 00000000..b0cf8d2b --- /dev/null +++ b/resources/js/ext.uls.geoclient.js @@ -0,0 +1,14 @@ +( function( mw, $ ) { + "use strict"; + + window.setGeo = function ( data ) { + window.GEO = data; + } + var settings = { + cache: true, + dataType: "jsonp", + jsonpCallback: "setGeo" + }; + $.ajax( mw.config.get( 'wgULSGeoService' ), settings ); + +}( mediaWiki, jQuery ) ); diff --git a/resources/js/ext.uls.init.js b/resources/js/ext.uls.init.js index 4aa2c1ad..f3905749 100644 --- a/resources/js/ext.uls.init.js +++ b/resources/js/ext.uls.init.js @@ -101,12 +101,25 @@ }, languages: mw.config.get( 'wgULSLanguages' ), searchAPI: mw.util.wikiScript( 'api' ) + "?action=languagesearch", - quickList : $.unique( [ - mw.config.get( 'wgUserLanguage' ), - mw.config.get( 'wgContentLanguage' ), - mw.uls.getBrowserLanguage() - ].concat( mw.uls.getPreviousLanguages() ) ) - + quickList: function() { + var unique = [], + list = [ + mw.config.get( 'wgUserLanguage' ), + mw.config.get( 'wgContentLanguage' ), + mw.uls.getBrowserLanguage() + ]; + list = list.concat( mw.uls.getPreviousLanguages() ); + if ( window.GEO ) { + console.log( $.uls.data.languagesInTerritory( window.GEO.country_code ) ); + list = list.concat( $.uls.data.languagesInTerritory( window.GEO.country_code ) ); + } + $.each( list, function ( i, v ) { + if ( $.inArray( v, unique ) === -1 ) { + unique.push( v ); + } + } ); + return unique; + } } );