diff --git a/README b/README new file mode 100644 index 00000000..b3c92b59 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +== Copying == +See http://www.gnu.org/licenses/gpl2.html + +== Installation == +For very very quick start add the following to LocalSettings.php: + +include("$IP/extensions/UniversalLanguageSelector/UniversalLanguageSelector.php"); + +More documenation is at + http://www.mediawiki.org/wiki/Universal_Language_Selector + +== Change log == diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php new file mode 100644 index 00000000..9af3b102 --- /dev/null +++ b/UniversalLanguageSelector.hooks.php @@ -0,0 +1,52 @@ +addModules( 'ext.uls.init' ); + return true; + } + /** + * ResourceLoaderTestModules hook handler. + * @param $testModules: array of javascript testing modules. 'qunit' is fed using tests/qunit/QUnitTestResources.php. + * @param $resourceLoader object + * @return bool + */ + public static function addTestModules( array &$testModules, ResourceLoader &$resourceLoader ) { + $testModules['qunit']['ext.uls.tests'] = array( + 'scripts' => array( 'tests/qunit/ext.uls.tests.js' ), + 'dependencies' => array( 'ext.uls.init' ), + 'localBasePath' => dirname( __FILE__ ), + 'remoteExtPath' => 'UniversalLanguageSelector', + ); + return true; + } + /** + * Add some tabs for navigation for users who do not use Ajax interface. + * Hooks: SkinTemplateNavigation, SkinTemplateTabs + */ + static function addTrigger( array &$personal_urls, &$title ) { + global $wgLang; + $tabindex = 2; + $personal_urls = array( 'uls'=> array( + 'text' => $wgLang->getLanguageName( $wgLang->getCode() ), + 'href' => '#', + 'class' => 'uls-trigger', + 'active' => true + ) ) + $personal_urls; + return true; + } + +} diff --git a/UniversalLanguageSelector.i18n.php b/UniversalLanguageSelector.i18n.php new file mode 100644 index 00000000..9dd57915 --- /dev/null +++ b/UniversalLanguageSelector.i18n.php @@ -0,0 +1,18 @@ + 'Universal Language Selector', + 'uls-desc' => 'Universal Language Selector', + 'uls-select-content-language' => 'Select Content Language', +); diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php new file mode 100644 index 00000000..8636df22 --- /dev/null +++ b/UniversalLanguageSelector.php @@ -0,0 +1,58 @@ + __FILE__, + 'name' => 'UniversalLanguageSelector', + 'version' => '0.1', + 'author' => array( 'Santhosh Thottingal' ), + 'url' => 'https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector', + 'descriptionmsg' => 'uls-desc', +); + +$dir = dirname( __FILE__ ); + +// Internationalization +$wgExtensionMessagesFiles['UniversalLanguageSelector'] = "$dir/UniversalLanguageSelector.i18n.php"; + +// Register auto load for the page class +$wgAutoloadClasses['UniversalLanguageSelectorHooks'] = "$dir/UniversalLanguageSelector.hooks.php"; + +$wgHooks['BeforePageDisplay'][] = 'UniversalLanguageSelectorHooks::addModules'; +$wgHooks['PersonalUrls'][] = 'UniversalLanguageSelectorHooks::addTrigger'; + +$wgResourceModules['ext.uls.init'] = array( + 'scripts' => 'resources/ext.uls.init.js', + 'localBasePath' => $dir, + 'remoteExtPath' => 'UniversalLanguageSelector', + 'dependencies' => 'ext.uls.core', + 'position' => 'top', +); + +$wgResourceModules['ext.uls.core'] = array( + 'scripts' => array( 'resources/ext.uls.core.js' ), + 'styles' => 'resources/css/ext.uls.css', + 'localBasePath' => $dir, + 'remoteExtPath' => 'UniversalLanguageSelector', + 'dependencies' => array( + 'mediawiki.util', + ), + 'messages' => array( + 'uls-select-content-language', + ), + 'position' => 'top', +); diff --git a/resources/css/ext.uls.css b/resources/css/ext.uls.css new file mode 100644 index 00000000..485a1f1e --- /dev/null +++ b/resources/css/ext.uls.css @@ -0,0 +1,49 @@ +.uls-trigger { + /* @embed */ + background: url('../images/icon-language.png') no-repeat scroll left center transparent; + padding-left: 36px; +} + +.uls-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 400px; + min-height: 400px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + width: 50% +} +.uls-menu h2 { + float:left; +} +a.close{ + float: right; + padding: 10px; +} + +div#worldmap { + /* @embed */ + background: url('../images/world_map.png') no-repeat scroll left center transparent; + float: right; + width: 400px; + height: 200px; +} diff --git a/resources/ext.uls.core.js b/resources/ext.uls.core.js new file mode 100644 index 00000000..e4749cd7 --- /dev/null +++ b/resources/ext.uls.core.js @@ -0,0 +1,103 @@ +(function($) { + "use strict"; + + var ULS = function(element, options) { + this.$element = $( element ); + this.options = $.extend( {}, $.fn.uls.defaults, options ); + this.$menu = $( this.options.menu ).appendTo( 'body' ); + this.shown = false; + this.render(); + this.listen(); + } + + ULS.prototype = { + constructor : ULS, + show : function() { + var pos = $.extend( {}, this.$element.offset(), { + height : this.$element[0].offsetHeight + } ); + + this.$menu.css( { + top : pos.top + pos.height, + left : '25%' //pos.left // FIXME + } ); + + this.$menu.show(); + this.shown = true; + return this; + }, + hide : function() { + this.$menu.hide(); + this.shown = false; + return this; + }, + render: function(){ + // TODO : All UI construction code to go here. + var $heading = $("

").text(mw.msg("uls-select-content-language")); + this.$menu.append($heading); + var $wordldMap = $("
"); + this.$menu.append($wordldMap); + }, + listen : function() { + // Register all event listeners to the ULS here. + this.$element.on( 'click', $.proxy( this.click, this ) ); + this.$menu.on( 'keyup', $.proxy( this.click, this ) ) + .on( 'keypress', $.proxy( this.click, this ) ); + }, + keyup : function(e) { + switch(e.keyCode) { + case 27: + // escape + if (!this.shown ) { + return this.hide(); + } + break; + } + + e.stopPropagation(); + e.preventDefault(); + }, + keypress : function(e) { + if (!this.shown ) + return; + + switch(e.keyCode) { + case 27: + // escape + e.preventDefault(); + break; + } + e.stopPropagation(); + }, + click : function(e) { + e.stopPropagation(); + e.preventDefault(); + if ( !this.shown ) { + this.show(); + } else { + this.hide(); + } + }, + } + + /* ULS PLUGIN DEFINITION + * =========================== */ + + $.fn.uls = function(option) { + return this.each( function() { + var $this = $( this ), data = $this.data( 'uls' ), options = typeof option == 'object' && option; + if (!data ) + $this.data( 'uls', ( data = new ULS(this, options)) ); + if ( typeof option == 'string' ) + data[option](); + } ) + }; + + $.fn.uls.defaults = { + // FIXME Menu template. Can it come from PHP? + menu : '', + }; + + $.fn.uls.Constructor = ULS; + +} )( jQuery ); diff --git a/resources/ext.uls.init.js b/resources/ext.uls.init.js new file mode 100644 index 00000000..57fb3462 --- /dev/null +++ b/resources/ext.uls.init.js @@ -0,0 +1,14 @@ +/** + * ULS startup script + */ +( function( $ ) { + $( document ).ready( function() { + /* Create a trigger somewhere in the page. + $trigger = $("") + .addClass( 'uls-trigger' ) + .text("English"); // FIXME proper trigger text to go here. + $('#mw-head').append( $trigger );*/ + // Bind ULS to the trigger. + $('.uls-trigger').uls(); + } ); +} )( jQuery ); diff --git a/resources/images/icon-language.png b/resources/images/icon-language.png new file mode 100644 index 00000000..c4c289cb Binary files /dev/null and b/resources/images/icon-language.png differ diff --git a/resources/images/world_map.png b/resources/images/world_map.png new file mode 100644 index 00000000..96c7240f Binary files /dev/null and b/resources/images/world_map.png differ diff --git a/tests/phpunit/Makefile b/tests/phpunit/Makefile new file mode 100644 index 00000000..be366553 --- /dev/null +++ b/tests/phpunit/Makefile @@ -0,0 +1,2 @@ +default: + php ../../../tests/phpunit/phpunit.php . diff --git a/tests/qunit/ext.uls.tests.js b/tests/qunit/ext.uls.tests.js new file mode 100644 index 00000000..0859d0c8 --- /dev/null +++ b/tests/qunit/ext.uls.tests.js @@ -0,0 +1,18 @@ +/** + * QUnit tests for ULS + * + * @file + * @author Santhosh Thottingal + * @copyright Copyright © 2012 Santhosh Thottingal + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later + */ +( function () { + +module( "ext.uls", QUnit.newMwEnvironment() ); + +test( "-- Initial check", function() { + expect( 2 ); + ok( $.fn.uls, "$.fn.uls is defined" ); +} ); + +}());