#10 css: Add padding around Fedora logo
Closed 6 years ago by bex. Opened 6 years ago by sanqui.
fedora-docs/ sanqui/docs-fp-o master  into  master

empty or binary file added
file added
+1
@@ -0,0 +1,1 @@ 

+ <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12.52" height="12.52"><rect width="1.688" height="16.018" x="-.844" y=".844" transform="rotate(-45)" fill="#555"/><rect width="1.688" height="16.018" x="8.009" y="-8.009" transform="rotate(45)" fill="#555"/></svg> 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,1 @@ 

+ <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="27" height="16"><path fill="#D3E3F4" d="M0 0h11.876v16h-11.876v-16z"/><path fill="#E9E9E9" d="M12.819 0v15.969h10.755c1.085-2.578 1.837-4.991 3.062-8.591l-3.062-7.378h-10.755z"/><path fill="#434343" d="M14.828 4.146c.32.023.639.035.951.035.471 0 .922-.016 1.354-.046l.023-.258.034-.367.081-.711.033-.333.873.058c-.073.577-.133 1.091-.179 1.542 1.116-.119 2.233-.331 3.349-.637l.092.809c-1.078.271-2.251.472-3.521.602-.05.463-.082.968-.098 1.514.524-.187 1.14-.313 1.847-.378.064-.207.136-.461.213-.763l.865.201c-.027.123-.088.315-.184.579.814.104 1.461.34 1.938.711.681.542 1.021 1.252 1.021 2.128 0 .963-.406 1.746-1.221 2.351-.635.47-1.505.784-2.609.94l-.505-.779c.968-.104 1.739-.337 2.317-.7.733-.458 1.101-1.066 1.101-1.823 0-.772-.341-1.363-1.021-1.772-.345-.21-.764-.344-1.256-.401-.604 1.422-1.4 2.598-2.387 3.527.035.352.102.715.201 1.09l-.849.314-.126-.773c-.654.462-1.27.693-1.847.693-.696 0-1.044-.407-1.044-1.222 0-1.104.591-2.103 1.771-2.993.227-.165.532-.352.918-.562.012-.524.046-1.128.104-1.812-.585.046-1.143.069-1.675.069l-.493-.011-.071-.822m2.127 3.384c-.268.161-.545.392-.831.694-.612.619-.94 1.226-.986 1.817l-.017.121.017.138c0 .252.112.378.339.378.492 0 1.02-.258 1.582-.773-.057-.613-.092-1.404-.104-2.375m2.455-.884c-.57.08-1.111.226-1.623.436 0 .883.018 1.581.052 2.093.634-.707 1.158-1.55 1.571-2.529"/><path fill="#1A1A1A" d="M8.517 11.735l-.734-2.409h-3.69l-.734 2.409h-2.313l3.573-10.165h2.625l3.587 10.165h-2.314m-1.246-4.21c-.679-2.183-1.062-3.418-1.149-3.704-.083-.286-.143-.512-.18-.678-.153.59-.589 2.051-1.309 4.382h2.638"/><path fill="#BCBCBC" d="M12.817 13.5v2.5h10.757l.98-2.5h-11.737z"/><path fill="#3692D0" d="M.011 13.511h3.569l2.367-3.116 2.367 3.116h3.57v2.484h-11.873v-2.484z"/></svg> 

\ No newline at end of file

empty or binary file added
file added
+4
@@ -0,0 +1,4 @@ 

+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>

+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="Layer_1">

+     <path d="M16.4 16.4c1-1.2 1.6-2.7 1.6-4.4 0-3.9-3.1-7-7-7s-7 3.1-7 7 3.1 7 7 7c1.2 0 2.3-.3 3.2-.8L17 21c1.4 1.4 2.5 1.5 4 0l-4.6-4.6zM6 12c0-2.8 2.2-5 5-5s5 2.2 5 5-2.2 5-5 5-5-2.3-5-5z" id="path3" fill="#555"/>

+ </svg>

@@ -0,0 +1,443 @@ 

+ /**

+  * Universal Language Selector

+  * ULS core component.

+  *

+  * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,

+  * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland 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 General Public Licence 2.0 or later

+  * @licence MIT License

+  */

+ 

+ ( function ( $ ) {

+ 	'use strict';

+ 

+ 	var template, ULS;

+ 

+ 	// Region numbers in id attributes also appear in the langdb.

+ 	/*jshint multistr:true */

+ 	template = '<div class="grid uls-menu"> \

+ 			<div id="search" class="row uls-search"> \

+ 				<div class="uls-search-wrapper"> \

+ 					<label class="uls-search-label" for="uls-languagefilter"></label>\

+ 					<div class="uls-search-input-wrapper">\

+ 						<span id="uls-languagefilter-clear" class="uls-languagefilter-clear"></span>\

+ 						<input type="text" class="uls-filterinput uls-filtersuggestion"\

+ 							id="uls-filtersuggestion" disabled="true" autocomplete="off">\

+ 						<input type="text" class="uls-filterinput uls-languagefilter"\

+ 							id="uls-languagefilter" data-clear="uls-languagefilter-clear"\

+ 							data-suggestion="uls-filtersuggestion"\

+ 							placeholder="Search for a language" autocomplete="off">\

+ 					</div>\

+ 				</div>\

+ 			</div>\

+ 			<div class="row uls-language-list"></div>\

+ 			<div class="row" id="uls-settings-block"></div>\

+ 		</div>';

+ 	/*jshint multistr:false */

+ 

+ 	/**

+ 	 * Count the number of keys in an object.

+ 	 * Works in a cross-browser way.

+ 	 * @param {Object} The object.

+ 	 */

+ 	function objectLength ( obj ) {

+ 		var count, key;

+ 

+ 		// Some old browsers don't support Object.keys

+ 		if ( Object.keys ) {

+ 			return Object.keys( obj ).length;

+ 		}

+ 

+ 		count = 0;

+ 

+ 		for ( key in obj ) {

+ 			if ( Object.prototype.hasOwnProperty.call( obj, key ) ) {

+ 				count++;

+ 			}

+ 		}

+ 

+ 		return count;

+ 	}

+ 

+ 	/**

+ 	 * ULS Public class definition

+ 	 */

+ 	ULS = function ( element, options ) {

+ 		this.$element = $( element );

+ 		this.options = $.extend( {}, $.fn.uls.defaults, options );

+ 		this.$menu = $( template );

+ 		this.languages = this.options.languages;

+ 

+ 		for ( var code in this.languages ) {

+ 			if ( $.uls.data.languages[ code ] === undefined ) {

+ 				// Language is unknown to ULS.

+ 				delete this.languages[ code ];

+ 			}

+ 		}

+ 

+ 		this.left = this.options.left;

+ 		this.top = this.options.top;

+ 		this.shown = false;

+ 		this.initialized = false;

+ 

+ 		this.$languageFilter = this.$menu.find( '#uls-languagefilter' );

+ 		this.$resultsView = this.$menu.find( '.uls-language-list' );

+ 

+ 		this.render();

+ 		this.listen();

+ 		this.ready();

+ 	};

+ 

+ 	ULS.prototype = {

+ 		constructor: ULS,

+ 

+ 		/**

+ 		 * A "hook" that runs after the ULS constructor.

+ 		 * At this point it is not guaranteed that the ULS has its dimensions

+ 		 * and that the languages lists are initialized.

+ 		 *

+ 		 * To use it, pass a function as the onReady parameter

+ 		 * in the options when initializing ULS.

+ 		 */

+ 		ready: function () {

+ 			if ( this.options.onReady ) {

+ 				this.options.onReady.call( this );

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * A "hook" that runs after the ULS panel becomes visible

+ 		 * by using the show method.

+ 		 *

+ 		 * To use it, pass a function as the onVisible parameter

+ 		 * in the options when initializing ULS.

+ 		 */

+ 		visible: function () {

+ 			if ( this.options.onVisible ) {

+ 				this.options.onVisible.call( this );

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * Calculate the position of ULS

+ 		 * Returns an object with top and left properties.

+ 		 * @returns {Object}

+ 		 */

+ 		position: function () {

+ 			var pos,

+ 				top = this.top,

+ 				left = this.left;

+ 

+ 			if ( top === undefined ) {

+ 				pos = $.extend( {}, this.$element.offset(), {

+ 					height: this.$element[ 0 ].offsetHeight

+ 				} );

+ 				top =  pos.top + pos.height;

+ 			}

+ 

+ 			if ( left === undefined ) {

+ 				left = $( window ).width() / 2 - this.$menu.outerWidth() / 2;

+ 			}

+ 

+ 

+ 			return {

+ 				top: top,

+ 				left: left

+ 			};

+ 		},

+ 

+ 		/**

+ 		 * Show the ULS window

+ 		 */

+ 		show: function () {

+ 			var widthClasses = {

+ 				wide: 'uls-wide',

+ 				medium: 'uls-medium',

+ 				narrow: 'uls-narrow'

+ 			};

+ 

+ 			this.$menu.addClass( widthClasses[this.getMenuWidth()] );

+ 

+ 			if ( !this.initialized ) {

+ 				$( 'body' ).prepend( this.$menu );

+ 				this.i18n();

+ 				this.initialized = true;

+ 			}

+ 

+ 			this.$menu.css( this.position() );

+ 			this.$menu.show();

+ 			this.$menu.scrollIntoView();

+ 			this.shown = true;

+ 

+ 			if ( !this.isMobile() ) {

+ 				this.$languageFilter.focus();

+ 			}

+ 

+ 			this.visible();

+ 		},

+ 

+ 		i18n: function () {

+ 			if ( $.i18n ) {

+ 				this.$menu.find( '[data-i18n]' ).i18n();

+ 				this.$languageFilter.prop( 'placeholder', $.i18n( 'uls-search-placeholder' ) );

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * Hide the ULS window

+ 		 */

+ 		hide: function () {

+ 			this.$menu.hide();

+ 			this.shown = false;

+ 

+ 			if ( this.options.onCancel ) {

+ 				this.options.onCancel.call( this );

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * Render the UI elements.

+ 		 * Does nothing by default. Can be used for customization.

+ 		 */

+ 		render: function () {

+ 			// Rendering stuff here

+ 		},

+ 

+ 		/**

+ 		 * Callback for no results found context.

+ 		 */

+ 		noresults: function () {

+ 			this.$resultsView.lcd( 'noResults' );

+ 		},

+ 

+ 		/**

+ 		 * callback for results found context.

+ 		 */

+ 		success: function () {

+ 			this.$resultsView.show();

+ 		},

+ 

+ 		/**

+ 		 * Bind the UI elements with their event listeners

+ 		 */

+ 		listen: function () {

+ 			var lcd, columnsOptions, languagesCount;

+ 

+ 			columnsOptions = {

+ 				wide: 4,

+ 				medium: 2,

+ 				narrow: 1

+ 			};

+ 

+ 			// Register all event listeners to the ULS here.

+ 			this.$element.on( 'click', $.proxy( this.click, this ) );

+ 

+ 			// Don't do anything if pressing on empty space in the ULS

+ 			this.$menu.on( 'click', function ( e ) {

+ 				e.stopPropagation();

+ 			} );

+ 

+ 			// Handle key press events on the menu

+ 			this.$menu.on( 'keypress', $.proxy( this.keypress, this ) )

+ 				.on( 'keyup', $.proxy( this.keyup, this ) );

+ 

+ 			if ( this.eventSupported( 'keydown' ) ) {

+ 				this.$menu.on( 'keydown', $.proxy( this.keypress, this ) );

+ 			}

+ 

+ 			languagesCount = objectLength( this.options.languages );

+ 			lcd = this.$resultsView.lcd( {

+ 				languages: this.languages,

+ 				columns: columnsOptions[ this.getMenuWidth() ],

+ 

+ 				quickList: languagesCount > 12 ? this.options.quickList : [],

+ 				clickhandler: $.proxy( this.select, this ),

+ 				source: this.$languageFilter,

+ 				showRegions: this.options.showRegions,

+ 				languageDecorator: this.options.languageDecorator

+ 			} ).data( 'lcd' );

+ 

+ 			this.$languageFilter.languagefilter( {

+ 				$target: lcd,

+ 				languages: this.languages,

+ 				searchAPI: this.options.searchAPI,

+ 				onSelect: $.proxy( this.select, this )

+ 			} );

+ 

+ 			this.$languageFilter.on( 'noresults.uls', $.proxy( this.noresults, this ) );

+ 			this.$languageFilter.on( 'resultsfound.uls', $.proxy( this.success, this ) );

+ 

+ 			$( 'html' ).click( $.proxy( this.cancel, this ) );

+ 		},

+ 

+ 		/**

+ 		 * On select handler for search results

+ 		 * @param langCode

+ 		 */

+ 		select: function ( langCode ) {

+ 			this.hide();

+ 			if ( this.options.onSelect ) {

+ 				this.options.onSelect.call( this, langCode );

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * On cancel handler for the uls menu

+ 		 */

+ 		cancel: function ( e ) {

+ 			if ( e && ( this.$element.is( e.target ) || $.contains( this.$element[0], e.target ) ) ) {

+ 				return;

+ 			}

+ 

+ 			this.hide();

+ 		},

+ 

+ 		keyup: function ( e ) {

+ 			if ( !this.shown ) {

+ 				return;

+ 			}

+ 

+ 			if ( e.keyCode === 27 ) { // escape

+ 				this.cancel();

+ 				e.preventDefault();

+ 				e.stopPropagation();

+ 			}

+ 		},

+ 

+ 		keypress: function ( e ) {

+ 			if ( !this.shown ) {

+ 				return;

+ 			}

+ 

+ 			if ( e.keyCode === 27 ) { // escape

+ 				this.cancel();

+ 				e.preventDefault();

+ 				e.stopPropagation();

+ 			}

+ 		},

+ 

+ 		click: function () {

+ 			if ( this.shown ) {

+ 				this.hide();

+ 			} else {

+ 				this.show();

+ 			}

+ 		},

+ 

+ 		eventSupported: function ( eventName ) {

+ 			var isSupported = eventName in this.$menu;

+ 

+ 			if ( !isSupported ) {

+ 				this.$element.setAttribute( eventName, 'return;' );

+ 				isSupported = typeof this.$element[ eventName ] === 'function';

+ 			}

+ 

+ 			return isSupported;

+ 		},

+ 

+ 		/**

+ 		 * Get the panel menu width parameter

+ 		 * @return string

+ 		 */

+ 		getMenuWidth: function () {

+ 			var languagesCount;

+ 

+ 			if ( this.options.menuWidth ) {

+ 				return this.options.menuWidth;

+ 			}

+ 

+ 			languagesCount = objectLength( this.options.languages );

+ 

+ 			if ( languagesCount < 25 ) {

+ 				return 'narrow';

+ 			}

+ 

+ 			if ( languagesCount < 100 ) {

+ 				return 'medium';

+ 			}

+ 

+ 			return 'wide';

+ 		},

+ 

+ 		isMobile: function () {

+ 			return navigator.userAgent.match( /(iPhone|iPod|iPad|Android|BlackBerry)/ );

+ 		}

+ 	};

+ 

+ 	/* 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 = {

+ 		onSelect: null, // Callback function to be called when a language is selected

+ 		searchAPI: null, // Language search API

+ 		languages: $.uls.data.getAutonyms(), // Languages to be used for ULS, default is all languages

+ 		quickList: [], // Array of language codes or function that returns such

+ 		// The options are wide (4 columns), medium (2 columns), and narrow (1 column).

+ 		// If not specified, it will be set automatically.

+ 		menuWidth: null,

+ 		showRegions: [ 'WW', 'AM', 'EU', 'ME', 'AF', 'AS', 'PA' ],

+ 		languageDecorator: null // Callback function to be called when a language link is prepared - for custom decoration.

+ 	};

+ 

+ 	// Define a dummy i18n function, if jquery.i18n not integrated.

+ 	if ( !$.fn.i18n ) {

+ 		$.fn.i18n = function () {};

+ 	}

+ 

+ 	/*

+ 	 * Simple scrollIntoView plugin.

+ 	 * Scrolls the element to the viewport smoothly if it is not already.

+ 	 */

+ 	$.fn.scrollIntoView = function () {

+ 		return this.each( function () {

+ 			var scrollPosition,

+ 				$window = $( window ),

+ 				windowHeight = $window.height(),

+ 				windowTop = $window.scrollTop(),

+ 				windowBottom = windowTop + windowHeight,

+ 				$element = $( this ),

+ 				panelHeight = $element.height(),

+ 				panelTop = $element.offset().top,

+ 				panelBottom = panelTop + panelHeight;

+ 

+ 			if ( ( panelTop < windowTop ) || ( panelBottom > windowBottom ) ) {

+ 				if ( windowTop > panelTop ) {

+ 					scrollPosition = panelTop;

+ 				} else {

+ 					scrollPosition = panelBottom - windowHeight;

+ 				}

+ 				$( 'html, body' ).stop().animate( {

+ 					scrollTop: scrollPosition

+ 				}, 500 );

+ 			}

+ 		} );

+ 	};

+ 

+ 	$.fn.uls.Constructor = ULS;

+ }( jQuery ) );

@@ -0,0 +1,7 @@ 

+ // Please do not edit. This file is generated from data/langdb.yaml by ulsdata2json.php

+ ( function ( $ ) {

+ 	'use strict';

+ 	$.uls = $.uls || {};

+ 	//noinspection JSHint

+ 	$.uls.data = {"languages":{"aa":["Latn",["AF"],"Qafár af"],"ab":["Cyrl",["EU"],"Аҧсшәа"],"abs":["Latn",["AS"],"Bahasa Ambon"],"ace":["Latn",["AS","PA"],"Acèh"],"acf":["Latn",["AM"],"kwéyòl"],"ady":["Cyrl",["EU","ME"],"Адыгабзэ"],"ady-cyrl":["ady"],"ady-latn":["Latn",["EU","ME"],"Adygabze"],"aeb":["aeb-arab"],"aeb-arab":["Arab",["AF"],"تونسي"],"aeb-latn":["Latn",["AF"],"Tûnsî"],"af":["Latn",["AF"],"Afrikaans"],"ahr":["Deva",["AS"],"अहिराणी"],"ais":["Latn",["AS"],"Sakizaya"],"ak":["Latn",["AF"],"Akan"],"akz":["Latn",["AM"],"Albaamo innaaɬiilka"],"aln":["Latn",["EU"],"Gegë"],"am":["Ethi",["AF"],"አማርኛ"],"ami":["Latn",["AS"],"Pangcah"],"an":["Latn",["EU"],"aragonés"],"ang":["Latn",["EU"],"Ænglisc"],"anp":["Deva",["AS"],"अङ्गिका"],"ar":["Arab",["ME"],"العربية"],"arc":["Syrc",["ME"],"ܐܪܡܝܐ"],"arn":["Latn",["AM"],"mapudungun"],"aro":["Latn",["AM"],"Araona"],"arq":["Arab",["AF"],"جازايرية"],"ary":["Latn",["ME"],"Maġribi"],"arz":["Arab",["ME"],"مصرى"],"as":["Beng",["AS"],"অসমীয়া"],"ase":["Sgnw",["AM"],"American sign language"],"ast":["Latn",["EU"],"asturianu"],"atj":["Latn",["AM"],"atikamekw"],"av":["Cyrl",["EU"],"авар"],"avk":["Latn",["WW"],"Kotava"],"ay":["Latn",["AM"],"Aymar aru"],"az":["az-latn"],"az-arab":["Arab",["AS","ME"],"تۆرکجه"],"az-latn":["Latn",["EU","ME"],"azərbaycanca"],"az-cyrl":["Cyrl",["EU","ME"],"азәрбајҹанҹа"],"azb":["az-arab"],"azj":["az-latn"],"ba":["Cyrl",["EU"],"башҡортса"],"ban":["Bali",["AS"],"ᬩᬲᬩᬮᬶ"],"bar":["Latn",["EU"],"Boarisch"],"bat-smg":["sgs"],"bbc-latn":["Latn",["AS"],"Batak Toba"],"bbc-batk":["Batk",["AS"],"ᯅᯖᯂ᯲ ᯖᯬᯅ"],"bbc":["bbc-latn"],"bcc":["Arab",["AS","ME"],"جهلسری بلوچی"],"bcl":["Latn",["AS"],"Bikol Central"],"be-tarask":["Cyrl",["EU"],"беларуская (тарашкевіца)"],"be-x-old":["be-tarask"],"be":["Cyrl",["EU"],"беларуская"],"bew":["Latn",["AS"],"Bahasa Betawi"],"bfa":["Latn",["AF"],"Bari"],"bft":["Arab",["AS"],"بلتی"],"bfq":["Taml",["AS"],"படகா"],"bg":["Cyrl",["EU"],"български"],"bgn":["Arab",["AS","ME"],"روچ کپتین بلوچی"],"bh":["bho"],"bho":["Deva",["AS"],"भोजपुरी"],"bi":["Latn",["PA"],"Bislama"],"bjn":["Latn",["AS"],"Bahasa Banjar"],"bm":["Latn",["AF"],"bamanankan"],"bn":["Beng",["AS"],"বাংলা"],"bo":["Tibt",["AS"],"བོད་ཡིག"],"bpy":["Beng",["AS"],"বিষ্ণুপ্রিয়া মণিপুরী"],"bqi":["Arab",["AS","ME"],"بختیاری"],"br":["Latn",["EU"],"brezhoneg"],"brh":["Latn",["ME","AS"],"Bráhuí"],"brx":["Deva",["AS"],"बड़ो"],"bs":["Latn",["EU"],"bosanski"],"bto":["Latn",["AS"],"Iriga Bicolano"],"bug":["Bugi",["AS"],"ᨅᨔ ᨕᨘᨁᨗ"],"bxr":["Cyrl",["AS"],"буряад"],"byn":["Ethi",["AF"],"ብሊን"],"ca":["Latn",["EU"],"català"],"cbk-zam":["Latn",["AS"],"Chavacano de Zamboanga"],"cdo":["Latn",["AS"],"Mìng-dĕ̤ng-ngṳ̄"],"ce":["Cyrl",["EU"],"нохчийн"],"ceb":["Latn",["AS"],"Cebuano"],"ch":["Latn",["PA"],"Chamoru"],"chm":["mhr"],"cho":["Latn",["AM"],"Choctaw"],"chr":["Cher",["AM"],"ᏣᎳᎩ"],"chy":["Latn",["AM"],"Tsetsêhestâhese"],"ciw":["Latn",["AM"],"Ojibwemowin"],"cjy":["cjy-hant"],"cjy-hans":["Hans",["AS"],"晋语(简化字)"],"cjy-hant":["Hant",["AS"],"晉語"],"ckb":["Arab",["ME"],"کوردی"],"cnh":["Latn",["AS"],"Lai holh"],"co":["Latn",["EU"],"corsu"],"cop":["Copt",["AF","ME"],"ϯⲙⲉⲧⲣⲉⲙⲛ̀ⲭⲏⲙⲓ"],"cps":["Latn",["AS"],"Capiceño"],"cr":["Cans",["AM"],"ᓀᐦᐃᔭᐍᐏᐣ"],"cr-cans":["cr"],"cr-latn":["Latn",["AM"],"Nēhiyawēwin"],"crh":["Latn",["EU"],"qırımtatarca"],"crh-cyrl":["Cyrl",["EU"],"къырымтатарджа"],"crh-latn":["crh"],"cs":["Latn",["EU"],"čeština"],"csb":["Latn",["EU"],"kaszëbsczi"],"cu":["Cyrl",["EU"],"словѣньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ"],"cv":["Cyrl",["EU"],"Чӑвашла"],"cy":["Latn",["EU"],"Cymraeg"],"da":["Latn",["EU"],"dansk"],"dag":["Latn",["AF"],"dagbanli"],"de-at":["Latn",["EU"],"Österreichisches Deutsch"],"de-ch":["Latn",["EU"],"Schweizer Hochdeutsch"],"de-formal":["Latn",["EU"],"Deutsch (Sie-Form)"],"de":["Latn",["EU"],"Deutsch"],"din":["Latn",["AF"],"Thuɔŋjäŋ"],"diq":["Latn",["EU","AS"],"Zazaki"],"doi":["Deva",["AS"],"डोगरी"],"dsb":["Latn",["EU"],"dolnoserbski"],"dtp":["Latn",["AS"],"Dusun Bundu-liwan"],"dty":["Deva",["AS"],"डोटेली"],"dv":["Thaa",["AS"],"ދިވެހިބަސް"],"dz":["Tibt",["AS"],"ཇོང་ཁ"],"ee":["Latn",["AF"],"eʋegbe"],"egl":["Latn",["EU"],"Emiliàn"],"el":["Grek",["EU"],"Ελληνικά"],"eml":["Latn",["EU"],"emiliàn e rumagnòl"],"en-ca":["Latn",["AM"],"Canadian English"],"en-gb":["Latn",["EU","AS","PA"],"British English"],"en":["Latn",["EU","AM","AF","ME","AS","PA","WW"],"English"],"eo":["Latn",["WW"],"Esperanto"],"es-419":["Latn",["AM"],"español de America Latina"],"es-formal":["Latn",["EU","AM","AF","WW"],"español (formal)"],"es":["Latn",["EU","AM","AF","WW"],"español"],"es-ni":["Latn",["AM"],"español nicaragüense"],"esu":["Latn",["AM"],"Yup'ik"],"et":["Latn",["EU"],"eesti"],"eu":["Latn",["EU"],"euskara"],"ext":["Latn",["EU"],"estremeñu"],"fa":["Arab",["AS","ME"],"فارسی"],"fax":["Latn",["EU"],"Fala"],"ff":["Latn",["AF"],"Fulfulde"],"fi":["Latn",["EU"],"suomi"],"fil":["tl"],"fit":["Latn",["EU"],"meänkieli"],"fiu-vro":["vro"],"fj":["Latn",["PA"],"Na Vosa Vakaviti"],"fo":["Latn",["EU"],"føroyskt"],"fr":["Latn",["EU","AM","WW"],"français"],"frc":["Latn",["AM"],"français cadien"],"frp":["Latn",["EU"],"arpetan"],"frr":["Latn",["EU"],"Nordfriisk"],"fur":["Latn",["EU"],"furlan"],"fy":["Latn",["EU"],"Frysk"],"ga":["Latn",["EU"],"Gaeilge"],"gaa":["Latn",["AF"],"Ga"],"gag":["Latn",["EU"],"Gagauz"],"gah":["Latn",["AS"],"Alekano"],"gan-hans":["Hans",["AS"],"赣语(简体)"],"gan-hant":["gan"],"gan":["Hant",["AS"],"贛語"],"gbz":["Latn",["AS"],"Dari-e Mazdeyasnā"],"gcf":["Latn",["AM"],"Guadeloupean Creole French"],"gd":["Latn",["EU"],"Gàidhlig"],"gl":["Latn",["EU"],"galego"],"glk":["Arab",["AS","ME"],"گیلکی"],"gn":["Latn",["AM"],"Avañe'ẽ"],"gom":["gom-deva"],"gom-deva":["Deva",["AS"],"गोंयची कोंकणी"],"gom-latn":["Latn",["AS"],"Gõychi Konknni"],"got":["Goth",["EU"],"𐌲𐌿𐍄𐌹𐍃𐌺"],"grc":["Grek",["EU"],"Ἀρχαία ἑλληνικὴ"],"gsw":["Latn",["EU"],"Alemannisch"],"gu":["Gujr",["AS"],"ગુજરાતી"],"guc":["Latn",["AM"],"Wayúu"],"gum":["Latn",["AM"],"Namtrik"],"gur":["Latn",["AF"],"Gurenɛ"],"gv":["Latn",["EU"],"Gaelg"],"ha-arab":["Arab",["AF"],"هَوُسَ"],"ha-latn":["Latn",["AF"],"Hausa"],"ha":["ha-latn"],"hak":["Latn",["AS"],"Hak-kâ-fa"],"haw":["Latn",["AM","PA"],"Hawai`i"],"he":["Hebr",["ME"],"עברית"],"hak-hans":["Hans",["AS"],"客家语(简体)"],"hak-hant":["Hant",["AS"],"客家語(繁體)"],"hi":["Deva",["AS"],"हिन्दी"],"hif":["Latn",["PA","AS"],"Fiji Hindi"],"hif-deva":["Deva",["AS"],"फ़ीजी हिन्दी"],"hif-latn":["hif"],"hil":["Latn",["AS"],"Ilonggo"],"hne":["Deva",["AS"],"छत्तीसगढ़ी"],"ho":["Latn",["PA"],"Hiri Motu"],"hoc":["Wara",["AS"],"𑢹𑣉𑣉"],"hr":["Latn",["EU"],"hrvatski"],"hrx":["Latn",["AM"],"Hunsrik"],"hsb":["Latn",["EU"],"hornjoserbsce"],"hsn":["Hans",["AS"],"湘语"],"ht":["Latn",["AM"],"Kreyòl ayisyen"],"hu-formal":["Latn",["EU"],"Magyar (magázó)"],"hu":["Latn",["EU"],"magyar"],"hy":["Armn",["EU","ME"],"Հայերեն"],"hz":["Latn",["AF"],"Otsiherero"],"ia":["Latn",["WW"],"interlingua"],"id":["Latn",["AS"],"Bahasa Indonesia"],"ie":["Latn",["WW"],"Interlingue"],"ig":["Latn",["AF"],"Igbo"],"ii":["Yiii",["AS"],"ꆇꉙ"],"ik":["Latn",["AM"],"Iñupiak"],"ike-cans":["Cans",["AM"],"ᐃᓄᒃᑎᑐᑦ"],"ike-latn":["Latn",["AM"],"inuktitut"],"ilo":["Latn",["AS"],"Ilokano"],"inh":["Cyrl",["EU"],"ГӀалгӀай"],"io":["Latn",["WW"],"Ido"],"is":["Latn",["EU"],"íslenska"],"it":["Latn",["EU"],"italiano"],"iu":["ike-cans"],"ja":["Jpan",["AS"],"日本語"],"jam":["Latn",["AM"],"Patois"],"jbo":["Latn",["WW"],"lojban"],"jdt":["jdt-cyrl"],"jdt-cyrl":["Cyrl",["EU","AS"],"жугьури"],"jut":["Latn",["EU"],"jysk"],"jv":["Latn",["AS","PA"],"Basa Jawa"],"jv-java":["Java",["AS","PA"],"ꦧꦱꦗꦮ"],"ka":["Geor",["EU"],"ქართული"],"kaa":["Latn",["AS"],"Qaraqalpaqsha"],"kab":["Latn",["AF","EU"],"Taqbaylit"],"kac":["Latn",["AS"],"Jinghpaw"],"kbd-cyrl":["kbd"],"kbd-latn":["Latn",["EU"],"Qabardjajəbza"],"kbd":["Cyrl",["EU","ME"],"Адыгэбзэ"],"kbp":["Latn",["AF"],"Kabɩyɛ"],"kea":["Latn",["AF"],"Kabuverdianu"],"kg":["Latn",["AF"],"Kongo"],"kgp":["Latn",["AM"],"Kaingáng"],"khw":["Arab",["ME","AS"],"کھوار"],"ki":["Latn",["AF"],"Gĩkũyũ"],"kiu":["Latn",["EU","ME"],"Kırmancki"],"kj":["Latn",["AF"],"Kwanyama"],"kjh":["Cyrl",["AS"],"хакас"],"kk":["kk-cyrl"],"kk-arab":["Arab",["EU","AS"],"قازاقشا (تٶتە)"],"kk-cn":["kk-arab"],"kk-cyrl":["Cyrl",["EU","AS"],"қазақша"],"kk-kz":["kk-cyrl"],"kk-latn":["Latn",["EU","AS","ME"],"qazaqşa"],"kk-tr":["kk-latn"],"kl":["Latn",["AM","EU"],"kalaallisut"],"km":["Khmr",["AS"],"ភាសាខ្មែរ"],"kn":["Knda",["AS"],"ಕನ್ನಡ"],"knn":["Deva",["AS"],"महाराष्ट्रीय कोंकणी"],"ko-kp":["Kore",["AS"],"한국어 (조선)"],"ko":["Kore",["AS"],"한국어"],"koi":["Cyrl",["EU"],"Перем Коми"],"kr":["Latn",["AF"],"Kanuri"],"krc":["Cyrl",["EU"],"къарачай-малкъар"],"kri":["Latn",["AF"],"Krio"],"krj":["Latn",["ME","EU"],"Kinaray-a"],"krl":["Latn",["EU"],"Karjala"],"ks-arab":["Arab",["AS"],"کٲشُر"],"ks-deva":["Deva",["AS"],"कॉशुर"],"ks":["ks-arab"],"ksf":["Latn",["AF"],"Bafia"],"ksh":["Latn",["EU"],"Ripoarisch"],"ku":["ku-latn"],"ku-arab":["Arab",["EU","ME"],"كوردي"],"ku-latn":["Latn",["EU","ME"],"Kurdî"],"kv":["Cyrl",["EU"],"коми"],"kw":["Latn",["EU"],"kernowek"],"ky":["Cyrl",["AS"],"Кыргызча"],"la":["Latn",["EU"],"Latina"],"lad":["lad-latn"],"lad-latn":["Latn",["ME","EU","AM"],"Ladino"],"lad-hebr":["Hebr",["ME","EU","AM"],"לאדינו"],"lag":["Latn",["AF"],"Kilaangi"],"lb":["Latn",["EU"],"Lëtzebuergesch"],"lbe":["Cyrl",["EU"],"лакку"],"lez":["Cyrl",["EU"],"лезги"],"lfn":["Latn",["WW"],"Lingua Franca Nova"],"lg":["Latn",["AF"],"Luganda"],"li":["Latn",["EU"],"Limburgs"],"lij":["Latn",["EU"],"Ligure"],"liv":["Latn",["EU"],"Līvõ kēļ"],"lki":["Arab",["AS","ME"],"لەکی"],"lkt":["Latn",["AM"],"Lakȟótiyapi"],"lld":["Latn",["EU"],"Ladin"],"lmo":["Latn",["EU"],"lumbaart"],"ln":["Latn",["AF"],"lingála"],"lo":["Laoo",["AS"],"ລາວ"],"loz":["Latn",["AF"],"Silozi"],"lt":["Latn",["EU"],"lietuvių"],"lrc":["Arab",["AS","ME"],"لۊری شومالی"],"ltg":["Latn",["EU"],"latgaļu"],"lud":["Latn",["EU"],"lüüdi"],"lus":["Latn",["AS"],"Mizo ţawng"],"lut":["Latn",["AM"],"dxʷləšucid"],"luz":["Arab",["ME"],"لئری دوٙمینی"],"lv":["Latn",["EU"],"latviešu"],"lzh":["Hant",["AS"],"文言"],"lzz":["Latn",["EU","ME"],"Lazuri"],"mai":["Deva",["AS"],"मैथिली"],"map-bms":["Latn",["AS"],"Basa Banyumasan"],"mdf":["Cyrl",["EU"],"мокшень"],"mfe":["Latn",["AM"],"Morisyen"],"mg":["Latn",["AF"],"Malagasy"],"mh":["Latn",["PA"],"Ebon"],"mhr":["Cyrl",["EU"],"олык марий"],"mi":["Latn",["PA"],"Māori"],"mic":["Latn",["AM"],"Mi'kmaq"],"min":["Latn",["AS"],"Baso Minangkabau"],"miq":["Latn",["AM"],"Mískitu"],"mk":["Cyrl",["EU"],"македонски"],"ml":["Mlym",["AS","ME"],"മലയാളം"],"mn":["Cyrl",["AS"],"монгол"],"mnc":["Mong",["AS"],"ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ"],"mni":["Beng",["AS"],"মেইতেই লোন্"],"mnw":["Mymr",["AS"],"ဘာသာ မန်"],"mo":["Cyrl",["EU"],"молдовеняскэ"],"mr":["Deva",["AS","ME"],"मराठी"],"mrj":["Cyrl",["EU"],"кырык мары"],"ms":["Latn",["AS"],"Bahasa Melayu"],"mt":["Latn",["EU"],"Malti"],"mui":["Latn",["AS"],"Musi"],"mus":["Latn",["AM"],"Mvskoke"],"mwl":["Latn",["EU"],"Mirandés"],"mwv":["Latn",["AS"],"Behase Mentawei"],"mww":["mww-latn"],"mww-latn":["Latn",["AS"],"Hmoob Dawb"],"my":["Mymr",["AS"],"မြန်မာဘာသာ"],"myv":["Cyrl",["EU"],"эрзянь"],"mzn":["Arab",["ME","AS"],"مازِرونی"],"na":["Latn",["PA"],"Dorerin Naoero"],"nah":["Latn",["AM"],"Nāhuatl"],"nan":["Latn",["AS"],"Bân-lâm-gú"],"nap":["Latn",["EU"],"Napulitano"],"nb":["Latn",["EU"],"norsk (bokmål)"],"nds-nl":["Latn",["EU"],"Nedersaksisch"],"nds":["Latn",["EU"],"Plattdüütsch"],"ne":["Deva",["AS"],"नेपाली"],"new":["Deva",["AS"],"नेपाल भाषा"],"ng":["Latn",["AF"],"Oshiwambo"],"niu":["Latn",["PA"],"ko e vagahau Niuē"],"njo":["Latn",["AS"],"Ao"],"nl-informal":["Latn",["EU","AM"],"Nederlands (informeel)"],"nl":["Latn",["EU","AM"],"Nederlands"],"nn":["Latn",["EU"],"norsk (nynorsk)"],"no":["Latn",["EU"],"norsk"],"nod":["Thai",["AS"],"คำเมือง"],"nov":["Latn",["WW"],"Novial"],"nqo":["Nkoo",["AF"],"ߒߞߏ"],"nrm":["Latn",["EU"],"Nouormand"],"nso":["Latn",["AF"],"Sesotho sa Leboa"],"nv":["Latn",["AM"],"Diné bizaad"],"ny":["Latn",["AF"],"Chi-Chewa"],"nys":["Latn",["PA"],"Nyungar"],"oc":["Latn",["EU"],"occitan"],"olo":["Latn",["AS","EU"],"Livvinkarjala"],"om":["Latn",["AF"],"Oromoo"],"or":["Orya",["AS"],"ଓଡ଼ିଆ"],"os":["Cyrl",["EU"],"Ирон"],"ota":["Arab",["AS","EU"],"لسان عثمانى"],"ovd":["Latn",["EU"],"övdalsk"],"pa":["pa-guru"],"pa-guru":["Guru",["AS"],"ਪੰਜਾਬੀ"],"pag":["Latn",["AS"],"Pangasinan"],"pam":["Latn",["AS"],"Kapampangan"],"pap":["Latn",["AM"],"Papiamentu"],"pbb":["Latn",["AM"],"Nasa Yuwe"],"pcd":["Latn",["EU"],"Picard"],"pdc":["Latn",["EU","AM"],"Deitsch"],"pdt":["Latn",["EU","AM"],"Plautdietsch"],"pfl":["Latn",["EU"],"Pälzisch"],"pi":["Deva",["AS"],"पालि"],"pih":["Latn",["PA"],"Norfuk \/ Pitkern"],"pis":["Latn",["PA"],"Pijin"],"pko":["Latn",["AF"],"Pökoot"],"pl":["Latn",["EU"],"polski"],"pms":["Latn",["EU"],"Piemontèis"],"pnb":["Arab",["AS","ME"],"پنجابی"],"pnt":["Grek",["EU"],"Ποντιακά"],"ppl":["Latn",["AM"],"Nawat"],"prg":["Latn",["EU"],"Prūsiskan"],"prs":["Arab",["AS","ME"],"دری"],"ps":["Arab",["AS","ME"],"پښتو"],"pt-br":["Latn",["AM"],"português do Brasil"],"pt":["Latn",["EU","AM","AS","PA","AF","WW"],"português"],"qu":["Latn",["AM"],"Runa Simi"],"qug":["Latn",["AM"],"Runa shimi"],"rap":["Latn",["AM"],"arero rapa nui"],"rcf":["Latn",["AF"],"Kreol Réyoné"],"rgn":["Latn",["EU"],"Rumagnôl"],"rif":["Latn",["AF"],"Tarifit"],"rki":["Mymr",["AS"],"ရခိုင်"],"rm":["Latn",["EU"],"rumantsch"],"rmf":["Latn",["EU"],"kaalengo tšimb"],"rmy":["Latn",["EU"],"Romani"],"rn":["Latn",["AF"],"Kirundi"],"ro":["Latn",["EU"],"română"],"roa-rup":["rup"],"roa-tara":["Latn",["EU"],"tarandíne"],"rtm":["Latn",["PA"],"Faeag Rotuma"],"ru":["Cyrl",["EU","AS","ME"],"русский"],"rue":["Cyrl",["EU"],"русиньскый"],"rup":["Latn",["EU"],"armãneashti"],"ruq":["Cyrl",["EU"],"Влахесте"],"ruq-cyrl":["ruq"],"ruq-grek":["Grek",["EU"],"Megleno-Romanian (Greek script)"],"ruq-latn":["Latn",["EU"],"Vlăheşte"],"rut":["Cyrl",["EU"],"мыхаӀбишды"],"rw":["Latn",["AF"],"Kinyarwanda"],"rwr":["Deva",["AS"],"मारवाड़ी"],"ryu":["Kana",["AS"],"ʔucināguci"],"sa":["Deva",["AS"],"संस्कृतम्"],"sah":["Cyrl",["EU","AS"],"саха тыла"],"sat":["Latn",["AS"],"Santali"],"saz":["Saur",["AS"],"ꢱꣃꢬꢵꢯ꣄ꢡ꣄ꢬꢵ"],"sc":["Latn",["EU"],"sardu"],"scn":["Latn",["EU"],"sicilianu"],"sco":["Latn",["EU"],"Scots"],"sd":["Arab",["AS"],"سنڌي"],"sdc":["Latn",["EU"],"Sassaresu"],"sdh":["Arab",["ME"],"کوردی خوارگ"],"se":["Latn",["EU"],"sámegiella"],"ses":["Latn",["AF"],"Koyraboro Senni"],"sei":["Latn",["AM"],"Cmique Itom"],"sg":["Latn",["AF"],"Sängö"],"sgs":["Latn",["EU"],"žemaitėška"],"sh":["Latn",["EU"],"srpskohrvatski"],"shi-latn":["Latn",["AF"],"Tašlḥiyt"],"shi-tfng":["Tfng",["AF"],"ⵜⴰⵛⵍⵃⵉⵜ"],"shi":["shi-latn"],"shn":["Mymr",["AS"],"လိၵ်ႈတႆး"],"si":["Sinh",["AS"],"සිංහල"],"simple":["Latn",["WW"],"Simple English"],"sjo":["Mong",["AS"],"ᠰᡞᠪᡝ ᡤᡞᠰᡠᠨ"],"sk":["Latn",["EU"],"slovenčina"],"sl":["Latn",["EU"],"slovenščina"],"sli":["Latn",["EU"],"Schläsch"],"slr":["Latn",["AS"],"Salırça"],"sly":["Latn",["AS"],"Bahasa Selayar"],"skr-arab":["Arab",["AS"],"سرائیکی"],"skr":["skr-arab"],"syc":["Syrc",["ME"],"ܣܘܪܝܝܐ"],"sm":["Latn",["PA"],"Gagana Samoa"],"sma":["Latn",["EU"],"åarjelsaemien"],"smj":["Latn",["EU"],"julevsámegiella"],"smn":["Latn",["EU"],"anarâškielâ"],"sms":["Latn",["EU"],"sää´mǩiõll"],"sn":["Latn",["AF"],"chiShona"],"so":["Latn",["AF"],"Soomaaliga"],"son":["Latn",["AF"],"soŋay"],"sq":["Latn",["EU"],"shqip"],"sr":["sr-cyrl"],"sr-ec":["sr-cyrl"],"sr-cyrl":["Cyrl",["EU"],"српски"],"sr-el":["sr-latn"],"sr-latn":["Latn",["EU"],"srpski"],"srn":["Latn",["AM","EU"],"Sranantongo"],"ss":["Latn",["AF"],"SiSwati"],"st":["Latn",["AF"],"Sesotho"],"stq":["Latn",["EU"],"Seeltersk"],"sty":["Cyrl",["EU","AS"],"себертатар"],"su":["Latn",["AS"],"Basa Sunda"],"sv":["Latn",["EU"],"svenska"],"sw":["Latn",["AF"],"Kiswahili"],"swb":["Latn",["AF"],"Shikomoro"],"sxu":["Latn",["EU"],"Säggssch"],"szl":["Latn",["EU"],"ślůnski"],"ta":["Taml",["AS"],"தமிழ்"],"tay":["Latn",["AS"],"Tayal"],"tcy":["Knda",["AS"],"ತುಳು"],"te":["Telu",["AS"],"తెలుగు"],"tet":["Latn",["AS","PA"],"tetun"],"tg-cyrl":["Cyrl",["AS"],"тоҷикӣ"],"tg-latn":["Latn",["AS"],"tojikī"],"tg":["tg-cyrl"],"th":["Thai",["AS"],"ไทย"],"ti":["Ethi",["AF"],"ትግርኛ"],"tig":["Ethi",["AF"],"ትግረ"],"tk":["Latn",["AS"],"Türkmençe"],"tkr":["Cyrl",["AS"],"ЦӀаӀхна миз"],"tl":["Latn",["AS"],"Tagalog"],"tly":["Cyrl",["EU","AS","ME"],"толышә зывон"],"tmr":["Hebr",["ME","EU","AM"],"ארמית בבלית"],"tn":["Latn",["AF"],"Setswana"],"to":["Latn",["PA"],"lea faka-Tonga"],"tokipona":["Latn",["WW"],"Toki Pona"],"tpi":["Latn",["PA","AS"],"Tok Pisin"],"tr":["Latn",["EU","ME"],"Türkçe"],"trp":["Latn",["AS"],"Kokborok (Tripuri)"],"tru":["Latn",["AS"],"Ṫuroyo"],"trv":["Latn",["AS"],"Sediq Taroko"],"ts":["Latn",["AF"],"Xitsonga"],"tsd":["Grek",["EU"],"Τσακωνικά"],"tt":["Cyrl",["EU"],"татарча"],"tt-cyrl":["tt"],"tt-latn":["Latn",["EU"],"tatarça"],"ttt":["Cyrl",["AS"],"Tati"],"tum":["Latn",["AF"],"chiTumbuka"],"tw":["Latn",["AF"],"Twi"],"twd":["Latn",["EU"],"Tweants"],"ty":["Latn",["PA"],"reo tahiti"],"tyv":["Cyrl",["AS"],"тыва дыл"],"tzl":["Latn",["WW"],"Talossan"],"tzm":["Tfng",["AF"],"ⵜⴰⵎⴰⵣⵉⵖⵜ"],"udm":["Cyrl",["EU"],"удмурт"],"ug":["ug-arab"],"ug-arab":["Arab",["AS"],"ئۇيغۇرچە"],"ug-latn":["Latn",["AS"],"uyghurche"],"ug-cyrl":["Cyrl",["AS"],"уйғурчә"],"uk":["Cyrl",["EU"],"українська"],"ur":["Arab",["AS","ME"],"اردو"],"uz":["Latn",["AS"],"oʻzbekcha"],"ve":["Latn",["AF"],"Tshivenda"],"vec":["Latn",["EU"],"vèneto"],"vep":["Latn",["EU"],"vepsän kel’"],"vi":["Latn",["AS"],"Tiếng Việt"],"vls":["Latn",["EU"],"West-Vlams"],"vmf":["Latn",["EU"],"Mainfränkisch"],"vo":["Latn",["WW"],"Volapük"],"vot":["Latn",["EU"],"Vaďďa"],"vro":["Latn",["EU"],"Võro"],"wa":["Latn",["EU"],"walon"],"war":["Latn",["AS"],"Winaray"],"wls":["Latn",["PA"],"Faka'uvea"],"wo":["Latn",["AF"],"Wolof"],"wuu":["Hans",["AS"],"吴语"],"xal":["Cyrl",["EU"],"хальмг"],"xh":["Latn",["AF"],"isiXhosa"],"xmf":["Geor",["EU"],"მარგალური"],"xsy":["Latn",["AS"],"SaiSiyat"],"ydd":["Hebr",["AS","EU"],"Eastern Yiddish"],"yi":["Hebr",["ME","EU","AM"],"ייִדיש"],"yo":["Latn",["AF"],"Yorùbá"],"yrk":["Cyrl",["AS"],"Ненэцяʼ вада"],"yrl":["Latn",["AM"],"ñe'engatú"],"yua":["Latn",["AM"],"Maaya T'aan"],"yue":["Hant",["AS"],"粵語"],"za":["Latn",["AS"],"Vahcuengh"],"zea":["Latn",["EU"],"Zeêuws"],"zgh":["Tfng",["AF"],"ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ"],"zh":["Hans",["AS"],"中文"],"zh-classical":["lzh"],"zh-cn":["Hans",["AS"],"中文(中国大陆)"],"zh-hans":["Hans",["AS"],"中文(简体)"],"zh-hant":["Hant",["AS"],"中文(繁體)"],"zh-hk":["Hant",["AS"],"中文(香港)"],"zh-min-nan":["nan"],"zh-mo":["Hant",["AS"],"中文(澳門)"],"zh-my":["Hans",["AS"],"中文(马来西亚)"],"zh-sg":["Hans",["AS"],"中文(新加坡)"],"zh-tw":["Hant",["AS"],"中文(台灣)"],"zh-yue":["yue"],"zu":["Latn",["AF"],"isiZulu"]},"scriptgroups":{"Latin":["Latn","Goth"],"Greek":["Grek"],"WestCaucasian":["Armn","Geor"],"Arabic":["Arab"],"MiddleEastern":["Hebr","Syrc"],"African":["Ethi","Nkoo","Tfng","Copt"],"SouthAsian":["Beng","Deva","Gujr","Guru","Knda","Mlym","Orya","Saur","Sinh","Taml","Telu","Tibt","Thaa","Wara"],"Cyrillic":["Cyrl"],"CJK":["Hans","Hant","Kana","Kore","Jpan","Yiii"],"SouthEastAsian":["Bali","Batk","Bugi","Java","Khmr","Laoo","Mymr","Thai"],"Mongolian":["Mong"],"SignWriting":["Sgnw"],"NativeAmerican":["Cher","Cans"],"Special":["Zyyy"]},"rtlscripts":["Arab","Hebr","Syrc","Nkoo","Thaa"],"regiongroups":{"WW":1,"SP":1,"AM":2,"EU":3,"ME":3,"AF":3,"AS":4,"PA":4},"territories":{"AC":["en"],"AD":["ca","es","fr"],"AE":["ar","ml","ps","fa"],"AF":["fa","ps","uz","tk","bgn","ug-arab","kk-arab","kk-cyrl"],"AG":["en","pt"],"AI":["en"],"AL":["sq","el","mk"],"AM":["hy","ku-latn","az-latn"],"AO":["pt","ln"],"AR":["es","en","cy","gn"],"AS":["sm","en"],"AT":["de","bar","en","fr","it","hr","sl","hu"],"AU":["en","zh-hant","zh","it"],"AW":["nl","pap","en"],"AX":["sv"],"AZ":["az-latn","az-cyrl","tly","ku-latn","ttt","tkr"],"BA":["bs","en","hr","sr-cyrl","sr-latn"],"BB":["en"],"BD":["bn","en","my","mni"],"BE":["en","nl","fr","de","vls","wa"],"BF":["fr"],"BG":["bg","en","ru","tr","de"],"BH":["ar","ml"],"BI":["rn","fr","sw","en"],"BJ":["fr","yo"],"BL":["fr"],"BM":["en"],"BN":["ms","zh-hant","zh","en"],"BO":["es","qu","ay","gn","aro"],"BQ":["pap","nl"],"BR":["pt","en","de","it","ja","es","ko","kgp","yrl"],"BS":["en"],"BT":["dz","ne","en"],"BW":["en","tn","af"],"BY":["be","ru"],"BZ":["en","es"],"CA":["en","fr","it","de","pdt","cr","yi","ike-cans","atj"],"CC":["ms","en"],"CD":["sw","fr","ln","kg","rw"],"CF":["fr","sg","ln"],"CG":["fr","ln"],"CH":["de","gsw","en","fr","it","lmo","pt","rm"],"CI":["fr"],"CK":["en"],"CL":["es","en","arn"],"CM":["fr","en","ff","ar","ksf","ha-arab","ha-latn"],"CN":["zh","wuu","yue","hsn","hak","nan","gan","ii","ug-arab","za","mn","bo","ko","kk-arab","kk-cyrl","ky","en","ru","vi","uz","lzh"],"CO":["es","guc"],"CR":["es"],"CU":["es"],"CV":["kea","pt"],"CW":["pap","nl","es"],"CX":["en"],"CY":["el","en","tr","fr","hy","ar"],"CZ":["cs","en","sk","de","pl"],"DE":["de","en","fr","bar","nds","nl","it","es","ru","vmf","tr","gsw","da","hr","ku-latn","el","ksh","pl","hsb","frr","dsb","stq","pfl"],"DG":["en"],"DJ":["aa","so","ar","fr"],"DK":["da","en","de","sv","fo","kl","jut"],"DM":["en"],"DO":["es","en"],"DZ":["arq","ar","fr","kab","en"],"EA":["es"],"EC":["es","qu","qug"],"EE":["et","ru","en","fi","vro"],"EG":["ar","arz","en","el"],"EH":["ar"],"ER":["ti","en","tig","ar","aa","byn"],"ES":["es","en","ca","gl","eu","ast","ext"],"ET":["en","am","om","so","ti","aa"],"FI":["fi","en","sv","de","ru","et","rmf","se","smn","sms"],"FJ":["en","hi","hif","fj","rtm"],"FK":["en"],"FM":["en"],"FO":["fo"],"FR":["fr","en","es","de","oc","it","pt","pcd","gsw","br","co","ca","nl","eu","frp","ia"],"GA":["fr"],"GB":["en","fr","de","sco","pa-guru","cy","bn","zh-hant","zh","el","it","ks-arab","gd","yi","ml","ga","kw"],"GD":["en"],"GE":["ka","xmf","ru","hy","ab","os","ku-latn"],"GF":["fr","zh-hant","zh"],"GG":["en"],"GH":["ak","en","ee","gur","gaa","ha-latn"],"GI":["en","es"],"GL":["kl","da"],"GM":["en"],"GN":["fr","ff","nqo"],"GP":["fr"],"GQ":["es","fr","pt"],"GR":["el","en","fr","de","pnt","mk","tr","bg","sq","tsd"],"GT":["es"],"GU":["en","ch"],"GW":["pt"],"GY":["en"],"HK":["zh-hant","zh","yue","en"],"HN":["es","en"],"HR":["hr","en","it"],"HT":["ht","fr"],"HU":["hu","en","de","fr","ro","hr","sk","sl"],"IC":["es"],"ID":["id","jv","su","ms","min","bew","ban","bug","bjn","ace","bbc-latn","zh-hant","zh","sly","mwv"],"IE":["en","ga","fr"],"IL":["he","en","ar","ru","ro","yi","pl","lad-latn","hu","am","ti","ml"],"IM":["en","gv"],"IN":["hi","en","bn","te","mr","ta","ur","gu","kn","ml","or","pa-guru","bho","as","mai","hne","ne","sat","ks-arab","gom-deva","sd","doi","tcy","brx","mni","hoc","saz","bfq","njo","bo","bpy","bft","sa","dv","dz"],"IO":["en"],"IQ":["ar","en","ckb","az-arab","az-latn","fa","lrc"],"IR":["fa","az-arab","az-latn","mzn","glk","ckb","sdh","tk","lrc","ar","bqi","luz","lki","bgn","hy","ps","ka","gbz","kk-arab","kk-cyrl"],"IS":["is","da"],"IT":["it","en","fr","sc","de","vec","nap","lij","scn","sl","sdc","fur","egl","ca","el","lmo","pms","hr","rgn"],"JE":["en"],"JM":["en","jam"],"JO":["ar","en"],"JP":["ja","ryu","ko"],"KE":["sw","en","ki","so","pko","om","ar","pa-guru","gu"],"KG":["ky","ru"],"KH":["km"],"KI":["en"],"KM":["ar","fr"],"KN":["en"],"KP":["ko"],"KR":["ko"],"KW":["ar"],"KY":["en"],"KZ":["ru","kk-cyrl","en","de","ug-cyrl","ug-arab"],"LA":["lo"],"LB":["ar","en","hy","ku-arab","ku-latn","fr"],"LC":["en"],"LI":["de","gsw"],"LK":["si","ta","en"],"LR":["en"],"LS":["st","en","zu","ss","xh"],"LT":["lt","ru","en","de","sgs"],"LU":["fr","lb","de","en","pt"],"LV":["lv","en","ru","ltg"],"LY":["ar"],"MA":["ary","ar","zgh","fr","en","tzm","shi-latn","rif","es"],"MC":["fr"],"MD":["ro","uk","bg","gag","ru"],"ME":["sr-latn","sr-cyrl","sq"],"MF":["fr"],"MG":["mg","fr","en"],"MH":["en","mh"],"MK":["mk","sq","tr"],"ML":["bm","fr","ses","ar"],"MM":["my","shn","kac","mnw"],"MN":["mn","kk-arab","kk-cyrl","zh","ru","ug-cyrl","ug-arab"],"MO":["zh-hant","zh","pt","en"],"MP":["en","ch"],"MQ":["fr"],"MR":["ar","fr","ff","wo"],"MS":["en"],"MT":["mt","en","it","fr"],"MU":["mfe","en","bho","ur","fr","ta"],"MV":["dv"],"MW":["en","ny","tum","zu"],"MX":["es","en","yua","sei"],"MY":["ms","en","zh-hant","zh","ta","jv","dtp","ml","bug","bjn"],"MZ":["pt","ts","ny","sw","zu"],"NA":["af","kj","ng","hz","en","de","tn"],"NC":["fr"],"NE":["ha-latn","fr","ar"],"NF":["en"],"NG":["en","ha-latn","ig","yo","ha-arab","ar"],"NI":["es"],"NL":["nl","en","de","fr","nds","li","fy","id","zea","rif","tr"],"NO":["nb","nn","se"],"NP":["ne","mai","bho","new","en","dty","hi","bo","bn"],"NR":["en","na"],"NU":["en","niu"],"NZ":["en","mi"],"OM":["ar","fa"],"PA":["es","en","zh-hant","zh"],"PE":["es","qu","ay"],"PF":["fr","ty","zh-hant","zh"],"PG":["tpi","en","ho"],"PH":["en","tl","es","ceb","ilo","hil","war","pam","pag","zh-hant","zh","cps","krj","bto"],"PK":["ur","pa-guru","en","ps","sd","skr-arab","brh","fa","bgn","tg-cyrl","bft","khw","ks-arab"],"PL":["pl","en","de","ru","szl","be","uk","csb","sli","lt"],"PM":["fr","en"],"PN":["en"],"PR":["es","en"],"PS":["ar"],"PT":["pt","en","fr","es","gl"],"PW":["en"],"PY":["gn","es","de"],"QA":["ar","fa","ml"],"RE":["fr","rcf","ta"],"RO":["ro","en","fr","es","hu","de","tr","sr-latn","sr-cyrl","bg","el","pl"],"RS":["sr-cyrl","sr-latn","sq","hu","ro","hr","sk","uk"],"RU":["ru","tt","ba","cv","hy","ce","av","udm","mhr","sah","os","kbd","myv","mdf","kv","lez","krc","inh","tyv","az-cyrl","az-latn","ady","krl","lbe","koi","mrj","fi","sr-latn","sr-cyrl","vep","mn","vot","cu"],"RW":["rw","en","fr"],"SA":["ar"],"SB":["en"],"SC":["fr","en"],"SD":["ar","en","ha-arab","ha-latn"],"SE":["sv","en","fi","fit","se","yi","smj","sma","ia"],"SG":["en","zh","ms","ta","ml","pa-guru"],"SH":["en"],"SI":["sl","hr","en","de","hu","it"],"SJ":["nb","ru"],"SK":["sk","cs","en","de","hu","uk","pl"],"SL":["kri","en"],"SM":["it","eo"],"SN":["wo","fr","ff"],"SO":["so","ar","sw","om"],"SR":["nl","srn","zh-hant","zh"],"SS":["ar","en"],"ST":["pt"],"SV":["es"],"SX":["en","es","nl"],"SY":["ar","ku-latn","fr","hy"],"SZ":["en","ss","zu","ts"],"TA":["en"],"TC":["en"],"TD":["fr","ar"],"TF":["fr"],"TG":["fr","ee"],"TH":["th","en","nod","zh-hant","zh","mnw","shn"],"TJ":["tg-cyrl","ru","fa","ar"],"TK":["en"],"TL":["pt","tet"],"TM":["tk","ru","uz","ku-latn"],"TN":["aeb-arab","ar","fr"],"TO":["to","en"],"TR":["tr","en","ku-latn","kbd","az-latn","az-arab","ar","bg","ady","kiu","hy","ka","sr-latn","sr-cyrl","lzz","sq","ab","el","tru","uz","ky","kk-cyrl"],"TT":["en","es"],"TV":["en"],"TW":["zh-hant","zh","trv"],"TZ":["sw","en","lag"],"UA":["uk","ru","pl","yi","rue","be","crh","ro","bg","tr","hu","el"],"UG":["sw","lg","en","rw","hi"],"UM":["en"],"US":["en","es","zh-hant","zh","fr","de","tl","it","vi","ko","ru","nv","yi","pdc","haw","frc","chr","esu","cho","lkt","ik","mus"],"UY":["es"],"UZ":["uz","ru","kaa","tr"],"VA":["it","la"],"VC":["en"],"VE":["es"],"VG":["en"],"VI":["en"],"VN":["vi","zh-hant","zh"],"VU":["bi","en","fr"],"WF":["wls","fr"],"WS":["sm","en"],"XK":["sq","aln","sr-cyrl","sr-latn"],"YE":["ar","en"],"YT":["swb","fr","sw"],"ZA":["en","zu","xh","af","nso","tn","st","ts","ss","ve","hi","sw"],"ZM":["en","ny","loz"],"ZW":["sn","en","ny","ve","tn"]}};

+ } ( jQuery ) );

@@ -0,0 +1,300 @@ 

+ /**

+  * Utility functions for querying language data.

+  *

+  * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,

+  * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland 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 General Public Licence 2.0 or later

+  * @licence MIT License

+  */

+ 

+ ( function ( $ ) {

+ 	'use strict';

+ 

+ 	/**

+ 	 * Is this language a redirect to another language?

+ 	 * @param language string Language code

+ 	 * @return Target language code if it's a redirect or false if it's not

+ 	 */

+ 	$.uls.data.isRedirect = function ( language ) {

+ 		return ( $.uls.data.languages[language] !== undefined &&

+ 			$.uls.data.languages[language].length === 1 ) ? $.uls.data.languages[language][0] : false;

+ 	};

+ 

+ 	/**

+ 	 * Returns the script of the language.

+ 	 * @param language string Language code

+ 	 * @return string

+ 	 */

+ 	$.uls.data.getScript = function ( language ) {

+ 		var target = $.uls.data.isRedirect( language );

+ 

+ 		if ( target ) {

+ 			return $.uls.data.getScript( target );

+ 		}

+ 

+ 		if ( !$.uls.data.languages[language] ) {

+ 			// Undetermined

+ 			return 'Zyyy';

+ 		}

+ 

+ 		return $.uls.data.languages[language][0];

+ 	};

+ 

+ 	/**

+ 	 * Returns the regions in which a language is spoken.

+ 	 * @param language string Language code

+ 	 * @return array|string 'UNKNOWN'

+ 	 */

+ 	$.uls.data.getRegions = function ( language ) {

+ 		var target = $.uls.data.isRedirect( language );

+ 

+ 		if ( target ) {

+ 			return $.uls.data.getRegions( target );

+ 		}

+ 

+ 		return ( $.uls.data.languages[language] && $.uls.data.languages[language][1] ) || 'UNKNOWN';

+ 	};

+ 

+ 	/**

+ 	 * Returns the autonym of the language.

+ 	 * @param language string Language code

+ 	 * @return string

+ 	 */

+ 	$.uls.data.getAutonym = function ( language ) {

+ 		var target = $.uls.data.isRedirect( language );

+ 

+ 		if ( target ) {

+ 			return $.uls.data.getAutonym( target );

+ 		}

+ 

+ 		return ( $.uls.data.languages[language] && $.uls.data.languages[language][2] ) || language;

+ 	};

+ 

+ 	/**

+ 	 * Returns all language codes and corresponding autonyms

+ 	 * @return array

+ 	 */

+ 	$.uls.data.getAutonyms = function () {

+ 		var language,

+ 			autonymsByCode = {};

+ 

+ 		for ( language in $.uls.data.languages ) {

+ 			if ( $.uls.data.isRedirect( language ) ) {

+ 				continue;

+ 			}

+ 

+ 			autonymsByCode[language] = $.uls.data.getAutonym( language );

+ 		}

+ 

+ 		return autonymsByCode;

+ 	};

+ 

+ 	/**

+ 	 * Returns all languages written in script.

+ 	 * @param script string

+ 	 * @return array of strings (languages codes)

+ 	 */

+ 	$.uls.data.getLanguagesInScript = function ( script ) {

+ 		return $.uls.data.getLanguagesInScripts( [ script ] );

+ 	};

+ 

+ 	/**

+ 	 * Returns all languages written in the given scripts.

+ 	 * @param scripts array of strings

+ 	 * @return array of strings (languages codes)

+ 	 */

+ 	$.uls.data.getLanguagesInScripts = function ( scripts ) {

+ 		var language, i,

+ 			languagesInScripts = [];

+ 

+ 		for ( language in $.uls.data.languages ) {

+ 			if ( $.uls.data.isRedirect( language ) ) {

+ 				continue;

+ 			}

+ 

+ 			for ( i = 0; i < scripts.length; i++ ) {

+ 				if ( scripts[i] === $.uls.data.getScript( language ) ) {

+ 					languagesInScripts.push( language );

+ 					break;

+ 				}

+ 			}

+ 		}

+ 

+ 		return languagesInScripts;

+ 	};

+ 

+ 	/**

+ 	 * Returns an associative array of languages in a region,

+ 	 * grouped by script group.

+ 	 * @param region string Region code

+ 	 * @return associative array

+ 	 */

+ 	$.uls.data.getLanguagesByScriptGroupInRegion = function ( region ) {

+ 		return $.uls.data.getLanguagesByScriptGroupInRegions( [ region ] );

+ 	};

+ 

+ 	/**

+ 	 * Get the given list of languages grouped by script.

+ 	 * @param languages Array of language codes

+ 	 * @return {Object} Array of languages indexed by script codes

+ 	 */

+ 	$.uls.data.getLanguagesByScriptGroup = function ( languages ) {

+ 		var languagesByScriptGroup = {},

+ 			language, resolvedRedirect, langScriptGroup;

+ 

+ 		for ( language in languages ) {

+ 			resolvedRedirect = $.uls.data.isRedirect( language ) || language;

+ 

+ 			langScriptGroup = $.uls.data.getScriptGroupOfLanguage( resolvedRedirect );

+ 

+ 			if ( !languagesByScriptGroup[langScriptGroup] ) {

+ 				languagesByScriptGroup[langScriptGroup] = [];

+ 			}

+ 

+ 			languagesByScriptGroup[langScriptGroup].push( language );

+ 		}

+ 

+ 		return languagesByScriptGroup;

+ 	};

+ 

+ 	/**

+ 	 * Returns an associative array of languages in several regions,

+ 	 * grouped by script group.

+ 	 * @param regions array of strings - region codes

+ 	 * @return associative array

+ 	 */

+ 	$.uls.data.getLanguagesByScriptGroupInRegions = function ( regions ) {

+ 		var language, i, scriptGroup,

+ 			languagesByScriptGroupInRegions = {};

+ 

+ 		for ( language in $.uls.data.languages ) {

+ 			if ( $.uls.data.isRedirect( language ) ) {

+ 				continue;

+ 			}

+ 

+ 			for ( i = 0; i < regions.length; i++ ) {

+ 				if ( $.inArray( regions[i], $.uls.data.getRegions( language ) ) !== -1 ) {

+ 					scriptGroup = $.uls.data.getScriptGroupOfLanguage( language );

+ 

+ 					if ( languagesByScriptGroupInRegions[scriptGroup] === undefined ) {

+ 						languagesByScriptGroupInRegions[scriptGroup] = [];

+ 					}

+ 

+ 					languagesByScriptGroupInRegions[scriptGroup].push( language );

+ 					break;

+ 				}

+ 			}

+ 		}

+ 

+ 		return languagesByScriptGroupInRegions;

+ 	};

+ 

+ 	/**

+ 	 * Returns the script group of a script or 'Other' if it doesn't

+ 	 * belong to any group.

+ 	 * @param script string Script code

+ 	 * @return string script group name

+ 	 */

+ 	$.uls.data.getGroupOfScript = function ( script ) {

+ 		var scriptGroup;

+ 

+ 		for ( scriptGroup in $.uls.data.scriptgroups ) {

+ 			if ( $.inArray( script, $.uls.data.scriptgroups[scriptGroup] ) !== -1 ) {

+ 				return scriptGroup;

+ 			}

+ 		}

+ 

+ 		return 'Other';

+ 	};

+ 

+ 	/**

+ 	 * Returns the script group of a language.

+ 	 * @param language string Language code

+ 	 * @return string script group name

+ 	 */

+ 	$.uls.data.getScriptGroupOfLanguage = function ( language ) {

+ 		return $.uls.data.getGroupOfScript( $.uls.data.getScript( language ) );

+ 	};

+ 

+ 	/**

+ 	 * A callback for sorting languages by autonym.

+ 	 * Can be used as an argument to a sort function.

+ 	 * @param a string Language code

+ 	 * @param b string Language code

+ 	 */

+ 	$.uls.data.sortByAutonym = function ( a, b ) {

+ 		var autonymA = $.uls.data.getAutonym( a ) || a,

+ 			autonymB = $.uls.data.getAutonym( b ) || b;

+ 

+ 		return ( autonymA.toLowerCase() < autonymB.toLowerCase() ) ? -1 : 1;

+ 	};

+ 

+ 	/**

+ 	 * Check if a language is right-to-left.

+ 	 * @param language string Language code

+ 	 * @return boolean

+ 	 */

+ 	$.uls.data.isRtl = function ( language ) {

+ 		return $.inArray( $.uls.data.getScript( language ), $.uls.data.rtlscripts ) !== -1;

+ 	};

+ 

+ 	/**

+ 	 * Return the direction of the language

+ 	 * @param language string Language code

+ 	 * @return string

+ 	 */

+ 	$.uls.data.getDir = function ( language ) {

+ 		return $.uls.data.isRtl( language ) ? 'rtl' : 'ltr';

+ 	};

+ 

+ 	/**

+ 	 * Returns the languages spoken in a territory.

+ 	 * @param territory string Territory code

+ 	 * @return list of language codes

+ 	 */

+ 	$.uls.data.getLanguagesInTerritory = function ( territory ) {

+ 		return $.uls.data.territories[territory];

+ 	};

+ 

+ 	/**

+ 	 * Adds a language in run time and sets its options as provided.

+ 	 * If the target option is provided, the language is defined as a redirect.

+ 	 * Other possible options are script, regions and autonym.

+ 	 *

+ 	 * @param code string New language code.

+ 	 * @param options Object Language properties.

+ 	 */

+ 	$.uls.data.addLanguage = function( code, options ) {

+ 		if ( options.target ) {

+ 			$.uls.data.languages[code] = [options.target];

+ 		} else {

+ 			$.uls.data.languages[code] = [options.script, options.regions, options.autonym];

+ 		}

+ 	};

+ 

+ 	/**

+ 	 * Removes a language from the langdb in run time.

+ 	 *

+ 	 * @param code string Language code to delete.

+ 	 * @return true if the language was removed, false otherwise.

+ 	 */

+ 	$.uls.data.deleteLanguage = function( code ) {

+ 		if ( $.uls.data.languages[code] ) {

+ 			delete $.uls.data.languages[code];

+ 

+ 			return true;

+ 		}

+ 

+ 		return false;

+ 	};

+ } ( jQuery ) );

@@ -0,0 +1,365 @@ 

+ /**

+  * jQuery language filter plugin.

+  *

+  * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,

+  * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland 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 General Public Licence 2.0 or later

+  * @licence MIT License

+  */

+ 

+ /**

+  * Usage: $( 'inputbox' ).languagefilter();

+  * The values for autocompletion is from the options.languages.

+  * The data is in the format of languagecode:languagename.

+  */

+ ( function ( $ ) {

+ 	'use strict';

+ 

+ 	var LanguageFilter, delay;

+ 

+ 	LanguageFilter = function ( element, options ) {

+ 		this.$element = $( element );

+ 		this.options = $.extend( {}, $.fn.languagefilter.defaults, options );

+ 		this.$element.addClass( 'languagefilter' );

+ 		this.resultCount = 0;

+ 		this.$suggestion = this.$element.parents().find( '#' + this.$element.data( 'suggestion' ) );

+ 		this.$clear = this.$element.parents().find( '#' + this.$element.data( 'clear' ) );

+ 		this.selectedLanguage = null;

+ 		this.init();

+ 		this.listen();

+ 	};

+ 

+ 	delay = ( function () {

+ 		var timer = 0;

+ 

+ 		return function ( callback, milliseconds ) {

+ 			clearTimeout( timer );

+ 			timer = setTimeout( callback, milliseconds );

+ 		};

+ 	}() );

+ 

+ 	LanguageFilter.prototype = {

+ 		init: function () {

+ 			this.search();

+ 		},

+ 

+ 		listen: function () {

+ 			this.$element.on( 'keypress', $.proxy( this.keyup, this ) )

+ 				.on( 'keyup', $.proxy( this.keyup, this ) );

+ 

+ 			if ( this.eventSupported( 'keydown' ) ) {

+ 				this.$element.on( 'keydown', $.proxy( this.keyup, this ) );

+ 			}

+ 

+ 			if ( this.$clear.length ) {

+ 				this.$clear.on( 'click', $.proxy( this.clear, this ) );

+ 			}

+ 

+ 			this.toggleClear();

+ 		},

+ 

+ 		keyup: function ( e ) {

+ 			var suggestion, query, languageFilter;

+ 

+ 			switch ( e.keyCode ) {

+ 			case 9: // Tab -> Autocomplete

+ 				suggestion = this.$suggestion.val();

+ 

+ 				if ( suggestion && suggestion !== this.$element.val() ) {

+ 					this.$element.val( suggestion );

+ 					e.preventDefault();

+ 					e.stopPropagation();

+ 				}

+ 				break;

+ 			case 13: // Enter

+ 				if ( !this.options.onSelect ) {

+ 					break;

+ 				}

+ 

+ 				// Avoid bubbling this 'enter' to background page elements

+ 				e.preventDefault();

+ 				e.stopPropagation();

+ 

+ 				query = $.trim( this.$element.val() ).toLowerCase();

+ 

+ 				if ( this.selectedLanguage ) {

+ 					// this.selectLanguage will be populated from a matching search

+ 					this.options.onSelect( this.selectedLanguage );

+ 				} else if ( this.options.languages[ query ] ) {

+ 					// Search is yet to happen (in timeout delay),

+ 					// but we have a matching language code.

+ 					this.options.onSelect( query );

+ 				}

+ 

+ 				break;

+ 			default:

+ 				languageFilter = this;

+ 

+ 				if ( e.which < 32 &&

+ 					e.which !== 8 // Backspace

+ 				) {

+ 					// ignore any ASCII control characters

+ 					break;

+ 				}

+ 

+ 				this.selectedLanguage = null;

+ 

+ 				delay( function () {

+ 					if ( !languageFilter.$element.val() ) {

+ 						languageFilter.clear();

+ 					} else {

+ 						languageFilter.options.$target.empty();

+ 						languageFilter.search();

+ 					}

+ 				}, 300 );

+ 

+ 				this.toggleClear();

+ 			}

+ 		},

+ 

+ 		/**

+ 		 * Clears the current search removing

+ 		 * clear buttons and suggestions.

+ 		 */

+ 		deactivate: function () {

+ 			this.$element.val( '' );

+ 

+ 			if ( !$.fn.uls.Constructor.prototype.isMobile() ) {

+ 				this.$element.focus();

+ 			}

+ 

+ 			this.toggleClear();

+ 			this.autofill();

+ 		},

+ 

+ 		/**

+ 		 * Clears the search and shows all languages

+ 		 */

+ 		clear: function () {

+ 			this.deactivate();

+ 			this.search();

+ 		},

+ 

+ 		/**

+ 		 * Toggles the visibility of clear icon depending

+ 		 * on whether there is anything to clear.

+ 		 */

+ 		toggleClear: function () {

+ 			if ( !this.$clear.length ) {

+ 				return;

+ 			}

+ 

+ 			if ( this.$element.val() ) {

+ 				this.$clear.show();

+ 			} else {

+ 				this.$clear.hide();

+ 			}

+ 		},

+ 

+ 		search: function () {

+ 			var langCode, scriptGroup, langNum, languagesInScript,

+ 				languages = $.uls.data.getLanguagesByScriptGroup( this.options.languages ),

+ 				query = $.trim( this.$element.val() );

+ 

+ 			this.resultCount = 0;

+ 			for ( scriptGroup in languages ) {

+ 				languagesInScript = languages[ scriptGroup ];

+ 				languagesInScript.sort( $.uls.data.sortByAutonym );

+ 				for ( langNum = 0; langNum < languagesInScript.length; langNum++ ) {

+ 					langCode = languagesInScript[ langNum ];

+ 					if ( query === '' || this.filter( langCode, query ) ) {

+ 						if ( this.resultCount === 0 ) {

+ 							// Autofill the first result.

+ 							this.autofill( langCode );

+ 						}

+ 

+ 						if ( query.toLowerCase() === langCode ) {

+ 							this.selectedLanguage = langCode;

+ 						}

+ 

+ 						if ( this.render( langCode ) ) {

+ 							this.resultCount++;

+ 						}

+ 					}

+ 				}

+ 			}

+ 

+ 			// Also do a search by search API

+ 			if ( !this.resultCount && this.options.searchAPI && query ) {

+ 				this.searchAPI( query );

+ 			} else {

+ 				this.resultHandler( query );

+ 			}

+ 		},

+ 

+ 		searchAPI: function ( query ) {

+ 			var languageFilter = this;

+ 

+ 			$.get( languageFilter.options.searchAPI, {

+ 				search: query

+ 			}, function ( result ) {

+ 				$.each( result.languagesearch, function ( code, name ) {

+ 					if ( languageFilter.resultCount === 0 ) {

+ 						// Autofill the first result.

+ 						languageFilter.autofill( code, name );

+ 					}

+ 

+ 					if ( languageFilter.options.languages[ code ] &&

+ 						languageFilter.render( code )

+ 					) {

+ 						languageFilter.resultCount++;

+ 					}

+ 				} );

+ 

+ 				languageFilter.resultHandler( query );

+ 			} );

+ 		},

+ 

+ 		/**

+ 		 * Handler method to be called once search is over.

+ 		 * Based on search result triggers resultsfound or noresults events

+ 		 * @param query string

+ 		 */

+ 		resultHandler: function ( query ) {

+ 			if ( this.resultCount === 0 ) {

+ 				this.$suggestion.val( '' );

+ 				this.$element.trigger( 'noresults.uls', query );

+ 			} else {

+ 				this.$element.trigger( 'resultsfound.uls', [ query, this.resultCount ] );

+ 			}

+ 		},

+ 

+ 		autofill: function ( langCode, languageName ) {

+ 			var autonym, userInput, suggestion;

+ 

+ 			if ( !this.$suggestion.length ) {

+ 				return;

+ 			}

+ 

+ 			if ( !this.$element.val() ) {

+ 				this.$suggestion.val( '' );

+ 				return;

+ 			}

+ 

+ 			this.selectedLanguage = langCode;

+ 			languageName = languageName || this.options.languages[ langCode ];

+ 

+ 			if ( !languageName ) {

+ 				return;

+ 			}

+ 

+ 			userInput = this.$element.val();

+ 			suggestion = userInput + languageName.substring( userInput.length, languageName.length );

+ 

+ 			if ( suggestion.toLowerCase() !== languageName.toLowerCase() ) {

+ 				// see if it was autonym match

+ 				autonym = $.uls.data.getAutonym( langCode ) || '';

+ 				suggestion = userInput + autonym.substring( userInput.length, autonym.length );

+ 

+ 				if ( suggestion !== autonym ) {

+ 					// Give up. It may be an ISO/script code match.

+ 					suggestion = '';

+ 				}

+ 			}

+ 

+ 			// Make sure that it is a visual prefix.

+ 			if ( !isVisualPrefix( userInput, suggestion ) ) {

+ 				suggestion = '';

+ 			}

+ 

+ 			this.$suggestion.val( suggestion );

+ 		},

+ 

+ 		render: function ( langCode ) {

+ 			var $target = this.options.$target;

+ 

+ 			if ( !$target ) {

+ 				return false;

+ 			}

+ 

+ 			return $target.append( langCode );

+ 		},

+ 

+ 		escapeRegex: function ( value ) {

+ 			return value.replace( /[\-\[\]{}()*+?.,\\\^$\|#\s]/g, '\\$&' );

+ 		},

+ 

+ 		/**

+ 		 * A search match happens if any of the following passes:

+ 		 * a) Language name in current user interface language

+ 		 * 'starts with' search string.

+ 		 * b) Language autonym 'starts with' search string.

+ 		 * c) ISO 639 code match with search string.

+ 		 * d) ISO 15924 code for the script match the search string.

+ 		 */

+ 		filter: function ( langCode, searchTerm ) {

+ 			// FIXME script is ISO 15924 code. We might need actual name of script.

+ 			var matcher = new RegExp( '^' + this.escapeRegex( searchTerm ), 'i' ),

+ 				languageName = this.options.languages[ langCode ];

+ 

+ 			return matcher.test( languageName ) ||

+ 				matcher.test( $.uls.data.getAutonym( langCode ) ) ||

+ 				matcher.test( langCode ) ||

+ 				matcher.test( $.uls.data.getScript( langCode ) );

+ 		},

+ 

+ 		eventSupported: function ( eventName ) {

+ 			var isSupported = eventName in this.$element;

+ 

+ 			if ( !isSupported ) {

+ 				this.$element.setAttribute( eventName, 'return;' );

+ 				isSupported = typeof this.$element[ eventName ] === 'function';

+ 			}

+ 

+ 			return isSupported;

+ 		}

+ 	};

+ 

+ 	$.fn.languagefilter = function ( option ) {

+ 		return this.each( function () {

+ 			var $this = $( this ),

+ 				data = $this.data( 'languagefilter' ),

+ 				options = typeof option === 'object' && option;

+ 

+ 			if ( !data ) {

+ 				$this.data( 'languagefilter', ( data = new LanguageFilter( this, options ) ) );

+ 			}

+ 

+ 			if ( typeof option === 'string' ) {

+ 				data[ option ]();

+ 			}

+ 		} );

+ 	};

+ 

+ 	$.fn.languagefilter.defaults = {

+ 		$target: null, // Where to append the results

+ 		searchAPI: null,

+ 		languages: null, // Languages as code:name format.

+ 		onSelect: null // Language select handler - like enter in filter textbox.

+ 	};

+ 

+ 	$.fn.languagefilter.Constructor = LanguageFilter;

+ 

+ 	/**

+ 	 * Check if a prefix is visually prefix of a string

+ 	 *

+ 	 * @param {string} prefix

+ 	 * @param {string} string

+ 	 */

+ 	function isVisualPrefix( prefix, string ) {

+ 		// Pre-base vowel signs of Indic languages. A vowel sign is called pre-base if

+ 		// consonant + vowel becomes [vowel][consonant] when rendered. Eg: ക + െ => കെ

+ 		var prebases = 'െേൈൊോൌெேைொோௌେୈୋୌિਿिিেৈোৌෙේෛොෝෞ';

+ 		return prebases.indexOf( string[ prefix.length ] ) <= 0;

+ 	}

+ }( jQuery ) );

@@ -0,0 +1,421 @@ 

+ /**

+  * Universal Language Selector

+  * Language category display component - Used for showing the search results,

+  * grouped by regions, scripts

+  *

+  * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,

+  * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland 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 General Public Licence 2.0 or later

+  * @licence MIT License

+  */

+ 

+ ( function ( $ ) {

+ 	'use strict';

+ 

+ 	var noResultsTemplate, LanguageCategoryDisplay;

+ 

+ 	noResultsTemplate = $( '<div>' ).addClass( 'uls-no-results-view hide' );

+ 	noResultsTemplate.append(

+ 		$( '<h2>' )

+ 			.attr( 'data-i18n', 'uls-no-results-found' )

+ 			.addClass( 'uls-no-results-found-title' )

+ 			.text( 'No results found' ),

+ 		$( '<div>' )

+ 			.attr( 'id', 'uls-no-found-more' )

+ 			.addClass( 'uls-no-found-more' )

+ 			.append(

+ 				$( '<div>' )

+ 					.addClass( '' )

+ 					.append(

+ 						$( '<p>' ).append(

+ 							$( '<span>' )

+ 								.attr( 'data-i18n', 'uls-search-help' )

+ 								.text( 'You can search by language name, script name, ISO code of language or you can browse by region.' )

+ 						)

+ 					)

+ 			)

+ 	);

+ 

+ 	LanguageCategoryDisplay = function ( element, options ) {

+ 		this.$element = $( element );

+ 		this.options = $.extend( {}, $.fn.lcd.defaults, options );

+ 		this.$element.addClass( 'uls-lcd' );

+ 		this.regionLanguages = {};

+ 		this.renderTimeout = null;

+ 		this.cachedQuicklist = null;

+ 

+ 		this.$element.append( $( noResultsTemplate ) );

+ 		this.$noResults = this.$element.children( '.uls-no-results-view' );

+ 

+ 		this.render();

+ 		this.listen();

+ 	};

+ 

+ 	LanguageCategoryDisplay.prototype = {

+ 		constructor: LanguageCategoryDisplay,

+ 

+ 		/**

+ 		 * Adds language to the language list.

+ 		 * @param {string} langCode

+ 		 * @param {string} [regionCode]

+ 		 * @return {boolean} Whether the language was added.

+ 		 */

+ 		append: function ( langCode, regionCode ) {

+ 			var lcd = this,

+ 				i, regions;

+ 

+ 			if ( !$.uls.data.languages[ langCode ] ) {

+ 				// Language is unknown or not in the list of languages for this context.

+ 				return false;

+ 			}

+ 

+ 			// Show everything in one region when there is only one column

+ 			if ( lcd.options.columns === 1 ) {

+ 				regions = [ 'WW' ];

+ 

+ 				// Languages are expected to be repeated in this case,

+ 				// and we only want to show them once

+ 				if ( $.inArray( langCode, this.regionLanguages.WW ) > -1 ) {

+ 					return true;

+ 				}

+ 			} else {

+ 				if ( regionCode ) {

+ 					regions = [ regionCode ];

+ 				} else {

+ 					regions = $.uls.data.getRegions( langCode );

+ 				}

+ 			}

+ 

+ 			for ( i = 0; i < regions.length; i++ ) {

+ 				this.regionLanguages[ regions[ i ] ].push( langCode );

+ 			}

+ 

+ 			// Work around the bad interface, delay rendering until we have got

+ 			// all the languages to speed up performance.

+ 			window.clearTimeout( this.renderTimeout );

+ 			this.renderTimeout = window.setTimeout( function () {

+ 				lcd.renderRegions();

+ 			}, 50 );

+ 

+ 			return true;

+ 		},

+ 

+ 		render: function () {

+ 			var $section, $quicklist,

+ 				lcd = this,

+ 				narrowMode = this.options.columns === 1,

+ 				regions = [],

+ 				regionNames = {

+ 					// These are fallback text when i18n library not present

+ 					WW: 'Worldwide',

+ 					SP: 'Special',

+ 					AM: 'America',

+ 					EU: 'Europe',

+ 					ME: 'Middle East',

+ 					AS: 'Asia',

+ 					AF: 'Africa',

+ 					PA: 'Pacific'

+ 				};

+ 

+ 			$quicklist = this.buildQuicklist();

+ 			regions.push( $quicklist );

+ 

+ 			if ( narrowMode && $quicklist.length ) {

+ 				regions.push( $( '<h3>' )

+ 					.attr( 'data-i18n', 'uls-region-all' )

+ 					.addClass( 'uls-lcd-region-title' )

+ 					.text( 'All languages' )

+ 				);

+ 			}

+ 

+ 			$.each( $.uls.data.regiongroups, function ( regionCode ) {

+ 				lcd.regionLanguages[ regionCode ] = [];

+ 

+ 				// Don't show the region unless it was enabled

+ 				if ( $.inArray( regionCode, lcd.options.showRegions ) === -1 ) {

+ 					return;

+ 				}

+ 

+ 				$section = $( '<div>' )

+ 					.addClass( 'uls-lcd-region-section hide' )

+ 					.attr( 'id', regionCode );

+ 

+ 				// Show a region heading, unless we are using a narrow ULS

+ 				if ( !narrowMode ) {

+ 					$section.append( $( '<h3>' )

+ 						.attr( 'data-i18n', 'uls-region-' + regionCode )

+ 						.addClass( 'uls-lcd-region-title' )

+ 						.text( regionNames[ regionCode ] )

+ 					);

+ 				}

+ 

+ 				regions.push( $section );

+ 			} );

+ 

+ 			lcd.$element.append( regions );

+ 

+ 			this.i18n();

+ 		},

+ 

+ 		/**

+ 		 * Renders a region and displays it if it has content.

+ 		 */

+ 		renderRegions: function () {

+ 			var languages,

+ 				lcd = this;

+ 

+ 			this.$noResults.addClass( 'hide' );

+ 			this.$element.find( '.uls-lcd-region-section' ).each( function () {

+ 				var $region = $( this ),

+ 					regionCode = $region.attr( 'id' );

+ 

+ 				if ( $region.is( '#uls-lcd-quicklist' ) ) {

+ 					return;

+ 				}

+ 

+ 				$region.children( '.uls-language-block' ).remove();

+ 

+ 				languages = lcd.regionLanguages[ regionCode ];

+ 				if ( !languages || languages.length === 0 ) {

+ 					$region.addClass( 'hide' );

+ 					return;

+ 				}

+ 

+ 				lcd.renderRegion(

+ 					$region,

+ 					languages,

+ 					lcd.options.itemsPerColumn,

+ 					lcd.options.columns

+ 				);

+ 				$region.removeClass( 'hide' );

+ 

+ 				lcd.regionLanguages[ regionCode ] = [];

+ 			} );

+ 

+ 		},

+ 

+ 		/**

+ 		 * Adds given languages sorted into rows and columns into given element.

+ 		 * @param {jQuery} $region Element to add language list.

+ 		 * @param {array} languages List of language codes.

+ 		 * @param {number} itemsPerColumn How many languages fit in a column.

+ 		 * @param {number} columnsPerRow How many columns fit in a row.

+ 		 */

+ 		renderRegion: function ( $region, languages, itemsPerColumn, columnsPerRow ) {

+ 			var columnsClasses, i, lastItem, currentScript, nextScript, force,

+ 				languagesCount = languages.length,

+ 				items = [],

+ 				columns = [],

+ 				rows = [];

+ 

+ 			if ( columnsPerRow === 1 ) {

+ 				columnsClasses = 'twelve columns';

+ 			} else if ( columnsPerRow === 2 ) {

+ 				columnsClasses = 'six columns';

+ 			} else {

+ 				columnsClasses = 'three columns';

+ 			}

+ 

+ 			if ( this.options.columns === 1 ) {

+ 				// For one-column narrow ULS, just render all the languages

+ 				// in one simple list without separators or script groups

+ 				for ( i = 0; i < languagesCount; i++ ) {

+ 					items.push( this.renderItem( languages[ i ] ) );

+ 				}

+ 

+ 				columns.push( $( '<ul>' ).addClass( columnsClasses ).append( items ) );

+ 				rows.push( $( '<div>' ).addClass( 'row uls-language-block' ).append( columns ) );

+ 			} else {

+ 				// For medium and wide ULS, clever column placement

+ 				for ( i = 0; i < languagesCount; i++ ) {

+ 					force = false;

+ 					nextScript = $.uls.data.getScriptGroupOfLanguage( languages[ i + 1 ] );

+ 

+ 					lastItem = languagesCount - i === 1;

+ 					// Force column break if script changes and column has more than one row already

+ 					if ( i === 0 ) {

+ 						currentScript = $.uls.data.getScriptGroupOfLanguage( languages[ i ] );

+ 					} else if ( currentScript !== nextScript && items.length > 1 ) {

+ 						force = true;

+ 					}

+ 					currentScript = nextScript;

+ 

+ 					items.push( this.renderItem( languages[ i ] ) );

+ 

+ 					if ( items.length >= itemsPerColumn || lastItem || force ) {

+ 						columns.push( $( '<ul>' ).addClass( columnsClasses ).append( items ) );

+ 						items = [];

+ 						if ( columns.length >= columnsPerRow || lastItem ) {

+ 							rows.push( $( '<div>' ).addClass( 'row uls-language-block' ).append( columns ) );

+ 							columns = [];

+ 						}

+ 					}

+ 				}

+ 			}

+ 

+ 			$region.append( rows );

+ 		},

+ 

+ 		/**

+ 		 * Creates dom node representing one item in language list.

+ 		 * @param {string} code Language code

+ 		 * @return {Element}

+ 		 */

+ 		renderItem: function ( code ) {

+ 			var a, name, autonym, li;

+ 

+ 			name = this.options.languages[ code ];

+ 			autonym = $.uls.data.getAutonym( code ) || name || code;

+ 

+ 			// Not using jQuery as this is performance hotspot

+ 			li = document.createElement( 'li' );

+ 			li.title = name;

+ 			li.setAttribute( 'data-code', code );

+ 

+ 			a = document.createElement( 'a' );

+ 			a.appendChild( document.createTextNode( autonym ) );

+ 			a.className = 'autonym';

+ 			a.lang = code;

+ 			a.dir = $.uls.data.getDir( code );

+ 

+ 

+ 			li.appendChild( a );

+ 			if ( this.options.languageDecorator ) {

+ 				this.options.languageDecorator( $( a ), code );

+ 			}

+ 			return li;

+ 		},

+ 

+ 		i18n: function () {

+ 			this.$element.find( '[data-i18n]' ).i18n();

+ 		},

+ 

+ 		/**

+ 		 * Adds quicklist as a region.

+ 		 */

+ 		quicklist: function () {

+ 			this.$element.find( '#uls-lcd-quicklist' ).removeClass( 'hide' );

+ 		},

+ 

+ 		buildQuicklist: function () {

+ 			var quickList, $quickListSection, $quickListSectionTitle;

+ 

+ 			if ( this.cachedQuicklist !== null ) {

+ 				return this.cachedQuicklist;

+ 			}

+ 

+ 			if ( $.isFunction( this.options.quickList ) ) {

+ 				this.options.quickList = this.options.quickList();

+ 			}

+ 

+ 			if ( !this.options.quickList.length ) {

+ 				this.cachedQuicklist = $( [] );

+ 				return this.cachedQuicklist;

+ 			}

+ 

+ 			// Pick only the first elements, because we don't have room for more

+ 			quickList = this.options.quickList;

+ 			quickList = quickList.slice( 0, 16 );

+ 			quickList.sort( $.uls.data.sortByAutonym );

+ 

+ 			$quickListSection = $( '<div>' )

+ 				.addClass( 'uls-lcd-region-section' )

+ 				.attr( 'id', 'uls-lcd-quicklist' );

+ 

+ 			$quickListSectionTitle = $( '<h3>' )

+ 				.attr( 'data-i18n', 'uls-common-languages' )

+ 				.addClass( 'uls-lcd-region-title' )

+ 				.text( 'Suggested languages' ); // This is placeholder text if jquery.i18n not present

+ 			$quickListSection.append( $quickListSectionTitle );

+ 

+ 			this.renderRegion(

+ 				$quickListSection,

+ 				quickList,

+ 				this.options.itemsPerColumn,

+ 				this.options.columns

+ 			);

+ 

+ 			$quickListSectionTitle.i18n();

+ 

+ 			this.cachedQuicklist = $quickListSection;

+ 			return this.cachedQuicklist;

+ 		},

+ 

+ 		show: function () {

+ 			if ( !this.regionDivs ) {

+ 				this.render();

+ 			}

+ 		},

+ 

+ 		empty: function () {

+ 			this.$element.find( '#uls-lcd-quicklist' ).addClass( 'hide' );

+ 		},

+ 

+ 		focus: function () {

+ 			this.$element.focus();

+ 		},

+ 

+ 		noResults: function () {

+ 			this.$noResults.removeClass( 'hide' );

+ 			if ( this.$noResults.find( '.uls-lcd-region-title' ).length ) {

+ 				return;

+ 			}

+ 

+ 			var $suggestions = this.buildQuicklist().clone();

+ 			$suggestions.find( 'h3' )

+ 				.data( 'i18n', 'uls-no-results-suggestion-title' )

+ 				.text( 'You may be interested in:' )

+ 				.i18n();

+ 			this.$noResults.find( 'h2' ).after( $suggestions.show() );

+ 		},

+ 

+ 		listen: function () {

+ 			var lcd = this;

+ 

+ 			if ( this.options.clickhandler ) {

+ 				this.$element.on( 'click', '.row li', function () {

+ 					lcd.options.clickhandler.call( this, $( this ).data( 'code' ) );

+ 				} );

+ 			}

+ 		}

+ 	};

+ 

+ 	$.fn.lcd = function ( option ) {

+ 		return this.each( function () {

+ 			var $this = $( this ),

+ 				data = $this.data( 'lcd' ),

+ 				options = typeof option === 'object' && option;

+ 

+ 			if ( !data ) {

+ 				$this.data( 'lcd', ( data = new LanguageCategoryDisplay( this, options ) ) );

+ 			}

+ 

+ 			if ( typeof option === 'string' ) {

+ 				data[ option ]();

+ 			}

+ 		} );

+ 	};

+ 

+ 	$.fn.lcd.defaults = {

+ 		languages: null,

+ 		showRegions: [ 'WW', 'AM', 'EU', 'ME', 'AF', 'AS', 'PA' ],

+ 		itemsPerColumn: 8,

+ 		// Other supported values are 1 and 2.

+ 		// Other values will have rendering issues.

+ 		columns: 4,

+ 		languageDecorator: null,

+ 		quickList: []

+ 	};

+ 

+ 	$.fn.lcd.Constructor = LanguageCategoryDisplay;

+ }( jQuery ) );

@@ -88,6 +88,11 @@ 

  .navbar-brand {

    padding: initial;

    height: initial;

+   padding: 12px;

+ }

+ 

+ .language-select {

+     padding: 16px 32px 8px 8px;

  }

  

  .nav > li  > a.hover{

@@ -0,0 +1,138 @@ 

+ .uls-trigger {

+ 	/* @embed */

+ 	background: transparent url('../_images/icon-language.png') no-repeat scroll left center;

+ 	/* @embed */

+ 	background-image: -webkit-linear-gradient(transparent, transparent), url('../_images/icon-language.svg');

+ 	/* @embed */

+ 	background-image: linear-gradient(transparent, transparent), url('../_images/icon-language.svg');

+ 	padding-left: 30px;

+ }

+ 

+ .uls-menu {

+ 	position: absolute;

+ 	z-index: 1000;

+ 	display: none;

+ 	margin-top: 1px;

+ 	/* Styling */

+ 	background-color: #ffffff;

+ 	border: 1px solid #ccc;

+ 	border: 1px solid rgba(0, 0, 0, 0.2);

+ 	-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;

+ }

+ 

+ .uls-wide {

+ 	min-width: 715px;

+ 	width: 45%;

+ }

+ 

+ .uls-medium {

+ 	min-width: 360px;

+ 	width: 30%;

+ }

+ 

+ /* Override the grid */

+ .uls-medium.grid .row {

+ 	min-width: 300px;

+ }

+ 

+ .uls-narrow {

+ 	min-width: 180px;

+ 	width: 20%;

+ }

+ 

+ /* Override the grid */

+ .uls-narrow.grid .row {

+ 	min-width: 150px;

+ }

+ 

+ .uls-search {

+ 	background-color: white;

+ 	padding: 5px 16px;

+ 	border-bottom-width: 1px;

+ 	border-bottom-style: solid;

+ 	border-bottom-color: #DDD;

+ }

+ 

+ .grid .uls-search {

+ 	padding-left: 0;

+ }

+ 

+ /* Make space for magnifying class on the front */

+ .uls-search-wrapper {

+ 	position: relative;

+ 	padding-left: 44px;

+ 	margin-right: 5px;

+ 	height: 32px;

+ }

+ 

+ .uls-search-label {

+ 	background: transparent url('../_images/search.png') no-repeat scroll right center;

+ 	background-image: -webkit-linear-gradient(transparent, transparent), url('../_images/search.svg');

+ 	/* @embed */

+ 	background-image: linear-gradient(transparent, transparent), url('../_images/search.svg');

+ 	background-size: 20px;

+ 	background-position: center center;

+ 	height: 32px;

+ 	width: 44px;

+ 	display: block;

+ 	position: absolute;

+ 	left: 0;

+ 	opacity: 0.8;

+ }

+ 

+ .uls-search-input-wrapper {

+ 	position: relative;

+ }

+ 

+ /* There are two input boxes. This class applies to both of them */

+ .uls-filterinput {

+ 	font-size: 16px;

+ 	height: 32px;

+ 	width: 100%;

+ 	/* For the custom clear (X) icon */

+ 	padding: 6px 25px 6px 0;

+ 

+ 	outline: none;

+ 	border: none;

+ 

+ 	display: block;

+ 	position: absolute;

+ 	top: 0;

+ 	left: 0;

+ }

+ 

+ /* This is the actual input */

+ .uls-languagefilter {

+ 	background-color: transparent;

+ 	border: none;

+ 	color: #333;

+ }

+ 

+ /* This is the shadow input box showing completion suggestions */

+ .uls-filtersuggestion {

+ 	background-color: white;

+ 	color: #888;

+ }

+ 

+ .uls-languagefilter-clear {

+ 	background: transparent url('../_images/clear.png') no-repeat scroll left center;

+ 	background-image: -webkit-linear-gradient(transparent, transparent), url('../_images/clear.svg');

+ 	/* @embed */

+ 	background-image: linear-gradient(transparent, transparent), url('../_images/clear.svg');

+ 	background-size: 15px;

+ 	cursor: pointer;

+ 	height: 15px;

+ 	width: 15px;

+ 

+ 	/* Vertical margins: (32 - 15) / 2 */

+ 	margin: 8.5px 5px;

+ 	position: absolute;

+ 	right: 0;

+ 	/* Make it appear above the input boxes */

+ 	z-index: 1;

+ }

@@ -0,0 +1,315 @@ 

+ /* Generated using Foundation http://foundation.zurb.com/docs/grid.php */

+ /* Global Reset & Standards ---------------------- */

+ .grid * {

+ 	-webkit-box-sizing: border-box;

+ 	-moz-box-sizing: border-box;

+ 	box-sizing: border-box;

+ }

+ 

+ /* Misc ---------------------- */

+ .grid .left {

+ 	float: left;

+ }

+ 

+ .grid .right {

+ 	float: right;

+ }

+ 

+ .grid .text-left {

+ 	text-align: left;

+ }

+ 

+ .grid .text-right {

+ 	text-align: right;

+ }

+ 

+ .grid .text-center {

+ 	text-align: center;

+ }

+ 

+ .grid .hide {

+ 	display: none;

+ }

+ 

+ .grid .highlight {

+ 	background: #ffff99;

+ }

+ 

+ /* The Grid ---------------------- */

+ .grid .row {

+ 	width: 100%;

+ 	max-width: none;

+ 	min-width: 600px;

+ 	margin: 0 auto;

+ }

+ 

+ .grid .row .row {

+ 	width: auto;

+ 	max-width: none;

+ 	min-width: 0;

+ 	margin: 0 -5px;

+ }

+ 

+ .grid .row.collapse .column,

+ .grid .row.collapse .columns {

+ 	padding: 0;

+ }

+ 

+ .grid .row .row {

+ 	width: auto;

+ 	max-width: none;

+ 	min-width: 0;

+ 	margin: 0 -5px;

+ }

+ 

+ .grid .row .row.collapse {

+ 	margin: 0;

+ }

+ 

+ .grid .column, .grid .columns {

+ 	float: left;

+ 	min-height: 1px;

+ 	padding: 0 5px;

+ 	position: relative;

+ }

+ 

+ .grid .column.centered, .grid .columns.centered {

+ 	float: none;

+ 	margin: 0 auto;

+ }

+ 

+ .grid .row .one {

+ 	width: 8.333%;

+ }

+ 

+ .grid .row .two {

+ 	width: 16.667%;

+ }

+ 

+ .grid .row .three {

+ 	width: 25%;

+ }

+ 

+ .grid .row .four {

+ 	width: 33.333%;

+ }

+ 

+ .grid .row .five {

+ 	width: 41.667%;

+ }

+ 

+ .grid .row .six {

+ 	width: 50%;

+ }

+ 

+ .grid .row .seven {

+ 	width: 58.333%;

+ }

+ 

+ .grid .row .eight {

+ 	width: 66.667%;

+ }

+ 

+ .grid .row .nine {

+ 	width: 75%;

+ }

+ 

+ .grid .row .ten {

+ 	width: 83.333%;

+ }

+ 

+ .grid .row .eleven {

+ 	width: 91.667%;

+ }

+ 

+ .grid .row .twelve {

+ 	width: 100%;

+ }

+ 

+ .grid .row .offset-by-one {

+ 	margin-left: 8.333%;

+ }

+ 

+ .grid .row .offset-by-two {

+ 	margin-left: 16.667%;

+ }

+ 

+ .grid .row .offset-by-three {

+ 	margin-left: 25%;

+ }

+ 

+ .grid .row .offset-by-four {

+ 	margin-left: 33.333%;

+ }

+ 

+ .grid .row .offset-by-five {

+ 	margin-left: 41.667%;

+ }

+ 

+ .grid .row .offset-by-six {

+ 	margin-left: 50%;

+ }

+ 

+ .grid .row .offset-by-seven {

+ 	margin-left: 58.333%;

+ }

+ 

+ .grid .row .offset-by-eight {

+ 	margin-left: 66.667%;

+ }

+ 

+ .grid .row .offset-by-nine {

+ 	margin-left: 75%;

+ }

+ 

+ .grid .row .offset-by-ten {

+ 	margin-left: 83.333%;

+ }

+ 

+ .grid .push-two {

+ 	left: 16.667%;

+ }

+ 

+ .grid .pull-two {

+ 	right: 16.667%;

+ }

+ 

+ .grid .push-three {

+ 	left: 25%;

+ }

+ 

+ .grid .pull-three {

+ 	right: 25%;

+ }

+ 

+ .grid .push-four {

+ 	left: 33.333%;

+ }

+ 

+ .grid .pull-four {

+ 	right: 33.333%;

+ }

+ 

+ .grid .push-five {

+ 	left: 41.667%;

+ }

+ 

+ .grid .pull-five {

+ 	right: 41.667%;

+ }

+ 

+ .grid .push-six {

+ 	left: 50%;

+ }

+ 

+ .grid .pull-six {

+ 	right: 50%;

+ }

+ 

+ .grid .push-seven {

+ 	left: 58.333%;

+ }

+ 

+ .grid .pull-seven {

+ 	right: 58.333%;

+ }

+ 

+ .grid .push-eight {

+ 	left: 66.667%;

+ }

+ 

+ .grid .pull-eight {

+ 	right: 66.667%;

+ }

+ 

+ .grid .push-nine {

+ 	left: 75%;

+ }

+ 

+ .grid .pull-nine {

+ 	right: 75%;

+ }

+ 

+ .grid .push-ten {

+ 	left: 83.333%;

+ }

+ 

+ .grid .pull-ten {

+ 	right: 83.333%;

+ }

+ 

+ /* Nicolas Gallagher's micro clearfix */

+ .grid .row {

+ 	*zoom: 1;

+ }

+ 

+ .grid .row:before, .grid .row:after {

+ 	content: "";

+ 	display: table;

+ }

+ 

+ .grid .row:after {

+ 	clear: both;

+ }

+ 

+ /* Block Grids ---------------------- */

+ /* These are 2-up, 3-up, 4-up and 5-up ULs, suited

+  for repeating blocks of content. Add 'mobile' to

+  them to switch them just like the layout grid

+  (one item per line) on phones

+ 

+  For IE7/8 compatibility block-grid items need to be

+  the same height. You can optionally uncomment the

+  lines below to support arbitrary height, but know

+  that IE7/8 do not support :nth-child.

+  -------------------------------------------------- */

+ .grid .block-grid {

+ 	display: block;

+ 	overflow: hidden;

+ 	padding: 0;

+ }

+ 

+ .grid .block-grid > li {

+ 	display: block;

+ 	height: auto;

+ 	float: left;

+ }

+ 

+ .grid .block-grid.two-up {

+ 	margin: 0 -15px;

+ }

+ 

+ .grid .block-grid.two-up > li {

+ 	width: 50%;

+ 	padding: 0 15px 15px;

+ }

+ 

+ /* .block-grid.two-up>li:nth-child(2n+1) {clear: left;} */

+ .grid .block-grid.three-up {

+ 	margin: 0 -12px;

+ }

+ 

+ .grid .block-grid.three-up > li {

+ 	width: 33.33%;

+ 	padding: 0 12px 12px;

+ }

+ 

+ /* .block-grid.three-up>li:nth-child(3n+1) {clear: left;} */

+ .grid .block-grid.four-up {

+ 	margin: 0 -10px;

+ }

+ 

+ .grid .block-grid.four-up > li {

+ 	width: 25%;

+ 	padding: 0 10px 10px;

+ }

+ 

+ /* .block-grid.four-up>li:nth-child(4n+1) {clear: left;} */

+ .grid .block-grid.five-up {

+ 	margin: 0 -8px;

+ }

+ 

+ .grid .block-grid.five-up > li {

+ 	width: 20%;

+ 	padding: 0 8px 8px;

+ }

@@ -0,0 +1,131 @@ 

+ /*

+  * Language Category Display (LCD) consists of multiple sections:

+  * - one to display when there are no search results (which might display suggested languages)

+  * - one for each region of the world, plus regions for world languages and suggested languages

+  * The regions consist of one or more rows (blocks) which consist of one-to-four columns. Each

+  * column is an ul element, and contains up to 8 li elements, each containing a link.

+  */

+ 

+ .uls-lcd {

+ 	height: 20em;

+ 	/* Work around Chrome bug where it places scrollbar on the left in

+ 	 * in RTL mode but actually reserves the place on the right side */

+ 	overflow-x: hidden;

+ 	overflow-y: auto;

+ 	width: auto;

+ 	background: #FCFCFC;

+ 	padding: 0 16px;

+ }

+ 

+ .uls-lcd-region-section {

+ 	margin-top: 10px;

+ }

+ 

+ .uls-lcd-region-title {

+ 	color: #777;

+ 	font-size: 14px;

+ 	padding-left: 28px;

+ }

+ 

+ /*

+  * We need to have this as a grid row to push rest of the content below it, but resetting

+  * padding and margin so that calculating them for children is easier.

+  */

+ .grid .uls-language-block.row {

+ 	padding: 0;

+ 	margin: 0;

+ }

+ 

+ /*

+  * Each block should have 16px padding on both sides. But because we already gave

+  * 16px for the whole menu, we need to remove it for first and last items the blocks.

+  */

+ .grid .uls-language-block > ul {

+ 	margin: 0 0 20px 0;

+ 	padding: 0 16px;

+ }

+ 

+ .grid .uls-language-block > ul:first-child {

+ 	padding-left: 0;

+ }

+ 

+ .grid .uls-language-block > ul:last-child {

+ 	padding-right: 0;

+ }

+ 

+ 

+ .uls-language-block > ul {

+ 	/*

+ 	 * We don't want any visible bullets in this list. Not by default anyway.

+ 	 * Using very unspecific selector here to allow other classes to override.

+ 	 * Bug because overflow: hidden is incompatible with bullets, also render

+ 	 * the bullets inside the list in case there should be any.

+ 	 */

+ 	list-style-image: none;

+ 	list-style-type: none;

+ }

+ 

+ .uls-language-block > ul > li {

+ 	cursor: pointer;

+ 	margin-left: 20px;

+ 	padding: 8px;

+ 	/*

+ 	 * The directionality (ltr/rtl) for each list item is set dynamically

+ 	 * as HTML attributes in JavaScript. Setting directionality also applies

+ 	 * alignment, but a list with mixed alignment is hard to read.

+ 	 * All items are therefore explicitly aligned to the left, including names

+ 	 * of right-to-left languages in left-to-right environment and vice versa.

+ 	 * As long as the directionality of the item is set correctly, the text

+ 	 * is readable.

+ 	 */

+ 	text-align: left;

+ }

+ 

+ .uls-language-block > ul > li:hover {

+ 	background-color: #eaeff7;

+ }

+ 

+ .uls-language-block a {

+ 	cursor: pointer;

+ 	text-decoration: none;

+ 	color: #3366bb;

+ 	font-size: 14px;

+ 	display: inline-block;

+ 	width: 100%;

+ 	overflow: hidden;

+ 	/*

+ 	 * Some languages have long names for various reasons and we still want

+ 	 * them to appear on one line.

+ 	 * To make it work correctly, the directionality must be set correctly

+ 	 * on the item level.

+ 	 */

+ 	text-overflow: ellipsis;

+ 	white-space: nowrap;

+ 	vertical-align: middle;

+ }

+ 

+ /* TODO: ugly hack that forces last matching search results to shift down.

+  * They should be hidden properly.

+  */

+ .uls-no-results-view {

+ 	height: 100%;

+ }

+ 

+ .uls-no-results-found-title {

+ 	font-size: 16px;

+ 	padding: 0 16px 0 28px;

+ 	border-bottom: none;

+ 	color: #555;

+ }

+ 

+ .uls-no-found-more {

+ 	padding: 0 16px 0 44px;

+ 	font-size: 0.9em;

+ 	background: #F8F8F8;

+ 	width: 100%;

+ 	margin-top: 1.6em;

+ 	line-height: 1.6em;

+ 	position: absolute;

+ 	bottom: 0;

+ 	left: 0;

+ }

@@ -0,0 +1,309 @@ 

+ @media only screen and (max-width: 767px) {

+ 

+ 	.uls-mobile.uls-menu {

+ 		width: 95%;

+ 		left: 2.5%;

+ 	}

+ 

+ 	.uls-mobile .uls-language-list {

+ 		-webkit-overflow-scrolling: touch;

+ 	}

+ 

+ 	.uls-mobile .uls-language-block {

+ 		padding-left: 15px !important;

+ 	}

+ 

+ 	.uls-mobile .uls-language-block ul {

+ 		min-height: 14em;

+ 	}

+ 

+ 	.uls-mobile .uls-language-block a {

+ 		font-size: 16px;

+ 		line-height: 1.7em;

+ 	}

+ 

+ 	.uls-mobile .row {

+ 		width: auto;

+ 		min-width: 0;

+ 		margin-left: 0;

+ 		margin-right: 0;

+ 	}

+ 

+ 	.uls-mobile .column,

+ 	.uls-mobile .columns {

+ 		width: auto !important;

+ 		float: none;

+ 	}

+ 

+ 	.uls-mobile .column:last-child,

+ 	.uls-mobile .columns:last-child {

+ 		float: none;

+ 	}

+ 

+ 	.uls-mobile [class*="column"] + [class*="column"]:last-child {

+ 		float: none;

+ 	}

+ 

+ 	.uls-mobile .column:before,

+ 	.uls-mobile .uls-mobile .columns:before,

+ 	.uls-mobile .column:after,

+ 	.columns:after {

+ 		content: "";

+ 		display: table;

+ 	}

+ 

+ 	.uls-mobile .column:after,

+ 	.uls-mobile .columns:after {

+ 		clear: both;

+ 	}

+ 

+ 	.uls-mobile .offset-by-one,

+ 	.uls-mobile .offset-by-two,

+ 	.uls-mobile .offset-by-three,

+ 	.uls-mobile .offset-by-four,

+ 	.uls-mobile .offset-by-five,

+ 	.uls-mobile .offset-by-six,

+ 	.uls-mobile .offset-by-seven,

+ 	.uls-mobile .offset-by-eight,

+ 	.uls-mobile .offset-by-nine,

+ 	.uls-mobile .offset-by-ten {

+ 		margin-left: 0 !important;

+ 	}

+ 

+ 	.uls-mobile .push-two,

+ 	.uls-mobile .push-three,

+ 	.uls-mobile .push-four,

+ 	.uls-mobile .push-five,

+ 	.uls-mobile .push-six,

+ 	.uls-mobile .push-seven,

+ 	.uls-mobile .push-eight,

+ 	.uls-mobile .push-nine,

+ 	.uls-mobile .push-ten {

+ 		left: auto;

+ 	}

+ 

+ 	.uls-mobile .pull-two,

+ 	.uls-mobile .pull-three,

+ 	.uls-mobile .pull-four,

+ 	.uls-mobile .pull-five,

+ 	.uls-mobile .pull-six,

+ 	.uls-mobile .pull-seven,

+ 	.uls-mobile .pull-eight,

+ 	.uls-mobile .pull-nine,

+ 	.uls-mobile .pull-ten {

+ 		right: auto;

+ 	}

+ 

+ 	/* Mobile 4-column Grid */

+ 	.uls-mobile .row .mobile-one {

+ 		width: 25% !important;

+ 		float: left;

+ 		padding: 0 4px;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-one:last-child {

+ 		float: right;

+ 	}

+ 

+ 	.uls-mobile .row.collapse .mobile-one {

+ 		padding: 0;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-two {

+ 		width: 50% !important;

+ 		float: left;

+ 		padding: 0 4px;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-two:last-child {

+ 		float: right;

+ 	}

+ 

+ 	.uls-mobile .row.collapse .mobile-two {

+ 		padding: 0;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-three {

+ 		width: 75% !important;

+ 		float: left;

+ 		padding: 0 4px;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-three:last-child {

+ 		float: right;

+ 	}

+ 

+ 	.uls-mobile .row.collapse .mobile-three {

+ 		padding: 0;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-four {

+ 		width: 100% !important;

+ 		float: left;

+ 		padding: 0 4px;

+ 	}

+ 

+ 	.uls-mobile .row .mobile-four:last-child {

+ 		float: right;

+ 	}

+ 

+ 	.uls-mobile .row.collapse .mobile-four {

+ 		padding: 0;

+ 	}

+ 

+ 	.uls-mobile .push-one-mobile {

+ 		left: 25%;

+ 	}

+ 

+ 	.uls-mobile .pull-one-mobile {

+ 		right: 25%;

+ 	}

+ 

+ 	.uls-mobile .push-two-mobile {

+ 		left: 50%;

+ 	}

+ 

+ 	.uls-mobile .pull-two-mobile {

+ 		right: 50%;

+ 	}

+ 

+ 	.uls-mobile .push-three-mobile {

+ 		left: 75%;

+ 	}

+ 

+ 	.uls-mobile .pull-three-mobile {

+ 		right: 75%;

+ 	}

+ }

+ 

+ /* Visibility Classes ---------------------- */

+ /* Standard (large) display targeting */

+ .uls-mobile .show-for-small,

+ .uls-mobile .show-for-medium,

+ .uls-mobile .show-for-medium-down,

+ .uls-mobile .hide-for-large,

+ .uls-mobile .hide-for-large-up,

+ .uls-mobile .show-for-xlarge {

+ 	display: none !important;

+ }

+ 

+ .uls-mobile .hide-for-xlarge,

+ .uls-mobile .show-for-large,

+ .uls-mobile .show-for-large-up,

+ .uls-mobile .hide-for-small,

+ .uls-mobile .hide-for-medium,

+ .uls-mobile .hide-for-medium-down {

+ 	display: block !important;

+ }

+ 

+ /* Very large display targeting */

+ @media only screen and (min-width: 1441px) {

+ 

+ 	.uls-mobile .hide-for-small,

+ 	.uls-mobile .hide-for-medium,

+ 	.uls-mobile .hide-for-medium-down,

+ 	.hide-for-large, .show-for-large-up,

+ 	.show-for-xlarge {

+ 		display: block !important;

+ 	}

+ 

+ 	.show-for-small,

+ 	.uls-mobile .show-for-medium,

+ 	.uls-mobile .show-for-medium-down,

+ 	.uls-mobile .show-for-large,

+ 	.uls-mobile .hide-for-large-up,

+ 	.uls-mobile .hide-for-xlarge {

+ 		display: none !important;

+ 	}

+ }

+ /* Medium display targeting */

+ @media only screen and (max-width: 1279px) and (min-width: 768px) {

+ 

+ 	.uls-mobile .hide-for-small,

+ 	.uls-mobile .show-for-medium,

+ 	.uls-mobile .show-for-medium-down,

+ 	.uls-mobile .hide-for-large,

+ 	.uls-mobile .hide-for-large-up,

+ 	.uls-mobile .hide-for-xlarge {

+ 		display: block !important;

+ 	}

+ 

+ 	.uls-mobile .show-for-small,

+ 	.uls-mobile .hide-for-medium,

+ 	.uls-mobile .hide-for-medium-down,

+ 	.uls-mobile .show-for-large,

+ 	.uls-mobile .show-for-large-up,

+ 	.uls-mobile .show-for-xlarge {

+ 		display: none !important;

+ 	}

+ }

+ /* Small display targeting */

+ @media only screen and (max-width: 767px) {

+ 

+ 	.uls-mobile .show-for-small,

+ 	.uls-mobile .hide-for-medium,

+ 	.uls-mobile .show-for-medium-down,

+ 	.uls-mobile .hide-for-large,

+ 	.uls-mobile .hide-for-large-up,

+ 	.uls-mobile .hide-for-xlarge {

+ 		display: block !important;

+ 	}

+ 	.uls-mobile .hide-for-small,

+ 	.uls-mobile .show-for-medium,

+ 	.uls-mobile .hide-for-medium-down,

+ 	.uls-mobile .show-for-large,

+ 	.uls-mobile .show-for-large-up,

+ 	.uls-mobile .show-for-xlarge {

+ 		display: none !important;

+ 	}

+ }

+ 

+ /* Orientation targeting */

+ .uls-mobile .show-for-landscape,

+ .uls-mobile .hide-for-portrait {

+ 	display: block !important;

+ }

+ 

+ .uls-mobile .hide-for-landscape,

+ .uls-mobile .show-for-portrait {

+ 	display: none !important;

+ }

+ 

+ @media screen and (orientation: landscape) {

+ 	.uls-mobile .show-for-landscape,

+ 	.uls-mobile .hide-for-portrait {

+ 		display: block !important;

+ 	}

+ 	.uls-mobile .hide-for-landscape,

+ 	.uls-mobile .show-for-portrait {

+ 		display: none !important;

+ 	}

+ }

+ 

+ @media screen and (orientation: portrait) {

+ 	.uls-mobile .show-for-portrait,

+ 	.uls-mobile .hide-for-landscape {

+ 		display: block !important;

+ 	}

+ 	.uls-mobile .hide-for-portrait,

+ 	.uls-mobile .show-for-landscape {

+ 		display: none !important;

+ 	}

+ }

+ 

+ /* Touch-enabled device targeting */

+ .uls-mobile .show-for-touch {

+ 	display: none !important;

+ }

+ 

+ .uls-mobile .hide-for-touch {

+ 	display: block !important;

+ }

+ 

+ .uls-mobile .touch .show-for-touch {

+ 	display: block !important;

+ }

+ 

+ .uls-mobile .touch .hide-for-touch {

+ 	display: none !important;

+ }

file modified
+32
@@ -9,6 +9,10 @@ 

    <!-- Bootstrap -->

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">

+   <link rel="stylesheet" href="<%= File.join(css_path, "jquery.uls.css") %>"><

+   <link rel="stylesheet" href="<%= File.join(css_path, "jquery.uls.grid.css") %>">

+   <link rel="stylesheet" href="<%= File.join(css_path, "jquery.uls.lcd.css") %>">

+   <link rel="stylesheet" href="<%= File.join(css_path, "jquery.uls.mobile.css") %>">

  

    <%= render("_templates/_css.html.erb", :css_path => css_path) %>

  
@@ -29,6 +33,9 @@ 

        <div class="navbar-header">

          <a class="navbar-brand" href="https://docs.fedoraproject.org/"><img alt="Fedora Documentation" src="<%= File.join(images_path, "fedora.svg") %>"></a>

        </div>

+       <div class="navbar-right language-select">

+         <span class="active uls-trigger">Select Language</span>

+       </div>

      </div>

    </div>

    <div class="container">
@@ -155,6 +162,12 @@ 

     <!-- Latest compiled and minified JavaScript -->

     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

     <script src="<%= File.join(javascripts_path, "bootstrap-offcanvas.js") %>" type="text/javascript"></script>

+    

+    <script type="text/javascript" src="<%= File.join(javascripts_path, "jquery.uls.data.js") %>"></script>

+    <script type="text/javascript" src="<%= File.join(javascripts_path, "jquery.uls.data.utils.js") %>"></script>

+    <script type="text/javascript" src="<%= File.join(javascripts_path, "jquery.uls.lcd.js") %>"></script>

+    <script type="text/javascript" src="<%= File.join(javascripts_path, "jquery.uls.languagefilter.js") %>"></script>

+    <script type="text/javascript" src="<%= File.join(javascripts_path, "jquery.uls.core.js") %>"></script>

     <script type="text/javascript">

      /*<![CDATA[*/

      $(document).ready(function() {
@@ -175,6 +188,25 @@ 

          $(this).parent().find("[id^='sgSpan']").toggleClass("fa-caret-right fa-caret-down");

        });

      });

+     

+ 	$( document ).ready( function() {

+ 		$( '.uls-trigger' ).uls( {

+ 			left: "80%",

+ 			onSelect : function( language ) {

+ 				url = window.location.href;

+ 				depth = "<%= site_home_path %>".split("/").length - 1;

+ 				split_url = url.split('/');

+ 				version = split_url[split_url.length - depth - 1].split('-')[0];

+ 				window.location.href = "<%= site_home_path %>".split("/index.html")[0] + "/"+version+"-"+language+"/"+ split_url.slice(split_url.length - depth, split_url.length);

+ 			},

+ 			languages: {

+ 			    'en': "English",

+ 			    'fr': "Français",

+ 		    }

+ 		    // <%= site_home_path %>

+ 		} );

+ 	} );

+     

      /*]]>*/

    </script>

  </body>