<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pttlink.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-LanguageSelect.js</id>
	<title>MediaWiki:Gadget-LanguageSelect.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pttlink.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-LanguageSelect.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.pttlink.org/index.php?title=MediaWiki:Gadget-LanguageSelect.js&amp;action=history"/>
	<updated>2026-04-21T11:13:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://wiki.pttlink.org/index.php?title=MediaWiki:Gadget-LanguageSelect.js&amp;diff=6224&amp;oldid=prev</id>
		<title>Kg7qin: Created page with &quot;/** * to benefit of :Template:Multilingual description * * Implements language selection for multilingual elements * * WARNING: DON'T RELY ON COMMONS-STUFF. THIS SCRIPT IS...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.pttlink.org/index.php?title=MediaWiki:Gadget-LanguageSelect.js&amp;diff=6224&amp;oldid=prev"/>
		<updated>2022-01-21T10:49:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;/** * to benefit of &lt;a href=&quot;/wiki/Template:Multilingual_description&quot; title=&quot;Template:Multilingual description&quot;&gt;Template:Multilingual description&lt;/a&gt; * * Implements language selection for multilingual elements * * WARNING: DON&amp;#039;T RELY ON COMMONS-STUFF. THIS SCRIPT IS...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
* to benefit of [[:Template:Multilingual description]]&lt;br /&gt;
*&lt;br /&gt;
* Implements language selection for multilingual elements&lt;br /&gt;
*&lt;br /&gt;
* WARNING: DON'T RELY ON COMMONS-STUFF. THIS SCRIPT IS FOREIGN-USED&lt;br /&gt;
* THE SCRIPT IS ALSO USED BY SOME GADGETS THAT LOAD CONTENT DYNAMICALLY&lt;br /&gt;
*&lt;br /&gt;
* In certain environments, it's not feasible to neatly box away each&lt;br /&gt;
* different language into its own section of the site. By marking elements&lt;br /&gt;
* multilingual, you can emulate this behavior by only displaying the&lt;br /&gt;
* message in the user's language. This reduces the &amp;quot;Tower of Babel&amp;quot; effect.&lt;br /&gt;
*&lt;br /&gt;
* @author Edward Z. Yang (Ambush Commander), Rewritten by DieBuche&lt;br /&gt;
*/&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*global mediaWiki:false, jQuery:false, wpAvailableLanguages:false*/&lt;br /&gt;
/*jshint curly:false*/&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
'use strict';&lt;br /&gt;
&lt;br /&gt;
var multilingual, commonsUserLanguage = mw.config.get('wgUserLanguage');&lt;br /&gt;
multilingual = window.multilingual = {&lt;br /&gt;
	/* Configuration: */&lt;br /&gt;
&lt;br /&gt;
	// the cookie name we use to stash the info.&lt;br /&gt;
	cookie: 'commonswiki_language_js',&lt;br /&gt;
&lt;br /&gt;
	// link to the language select page&lt;br /&gt;
	helpUrl: '//meta.wikimedia.org/wiki/Meta:Language_select',&lt;br /&gt;
&lt;br /&gt;
	// how many languages are required to collapse&lt;br /&gt;
	langCountThreshold: 4,&lt;br /&gt;
&lt;br /&gt;
	// The element that's children should be checked&lt;br /&gt;
	$p: $('#mw-content-text'),&lt;br /&gt;
&lt;br /&gt;
	// How to add the selector?&lt;br /&gt;
	method: 'prepend',&lt;br /&gt;
&lt;br /&gt;
	// To which element should the selector be added (reset in $(document).ready())&lt;br /&gt;
	$OuterContainer: $(),&lt;br /&gt;
&lt;br /&gt;
	// strings that are part of the widgets&lt;br /&gt;
	stringHelp: {&lt;br /&gt;
		'ar': 'اختيار اللغة',&lt;br /&gt;
		'be-tarask': 'Выбар мовы',&lt;br /&gt;
		'be-x-old': 'Выбар мовы',&lt;br /&gt;
		'bn': 'ভাষা নির্বাচন:',&lt;br /&gt;
		'ceb': 'Pagpili og pinulongan',&lt;br /&gt;
		'cs': 'Výběr jazyka:',&lt;br /&gt;
		'da': 'Vælg sprog:',&lt;br /&gt;
		'de': 'Sprachauswahl:',&lt;br /&gt;
		'en': 'Language select:',&lt;br /&gt;
		'et': 'Keelevalik:',&lt;br /&gt;
		'eo': 'Lingvoelekto:',&lt;br /&gt;
		'es': 'Seleccionar idioma:',&lt;br /&gt;
		'fa': 'انتخاب زبان:',&lt;br /&gt;
		'fr': 'Sélecteur de langue&amp;amp;nbsp;:',&lt;br /&gt;
		'gl': 'Selección de lingua:',&lt;br /&gt;
		'hu': 'Nyelvválasztás:',&lt;br /&gt;
		'hr': 'Odabir jezika:',&lt;br /&gt;
		'it': 'Seleziona lingua:',&lt;br /&gt;
		'ko': '언어 선택:',&lt;br /&gt;
		'mk': 'Јазик:',&lt;br /&gt;
		'ml': 'ഭാഷ തിരഞ്ഞെടുക്കുക:',&lt;br /&gt;
		'mwl': 'Scuolha de la lhéngua:',&lt;br /&gt;
		'nap': 'Sciglie na lengua:', &lt;br /&gt;
		'nds': 'Spraakutwahl:',&lt;br /&gt;
		'nl': 'Taal:',&lt;br /&gt;
		'pl': 'Wybierz język:',&lt;br /&gt;
		'pt': 'Seleção do idioma:',&lt;br /&gt;
		'pt-br': 'Seleção do idioma:',&lt;br /&gt;
		'ru': 'Выбор языка:',&lt;br /&gt;
		'sv': 'Välj språk:',&lt;br /&gt;
		'tl': 'Pumili ng wika',&lt;br /&gt;
		'tr': 'Dil seçimi:',&lt;br /&gt;
		'zh-hans': '语言选择'&lt;br /&gt;
	},&lt;br /&gt;
	stringShowAll: {&lt;br /&gt;
		'ar': 'عرض الكل',&lt;br /&gt;
		'be-tarask': 'Паказаць усе',&lt;br /&gt;
		'be-x-old': 'Паказаць усе',&lt;br /&gt;
		'bn': 'সব দেখান',&lt;br /&gt;
		'ceb': 'Ipakita tanan',&lt;br /&gt;
		'cs': 'Zobrazit všechny',&lt;br /&gt;
		'da': 'Vis alle',&lt;br /&gt;
		'de': 'Alle anzeigen',&lt;br /&gt;
		'en': 'Show all',&lt;br /&gt;
		'eo': 'ĉiuj',&lt;br /&gt;
		'es': 'Mostrar todos',&lt;br /&gt;
		'et': 'Näita kõiki',&lt;br /&gt;
		'fa': 'نمایش همه',&lt;br /&gt;
		'fr': 'Toutes les langues',&lt;br /&gt;
		'gl': 'Mostrar todas',&lt;br /&gt;
		'hu': 'Mutasd mind',&lt;br /&gt;
		'hr': 'prikaži sve',&lt;br /&gt;
		'it': 'Mostra tutte',&lt;br /&gt;
		'ko': '모두 보기',&lt;br /&gt;
		'mk': 'Сите',&lt;br /&gt;
		'ml': 'എല്ലാം',&lt;br /&gt;
		'mwl': 'Amostrar todos',&lt;br /&gt;
		'nap': 'Vire tutte',&lt;br /&gt;
		'nds': 'All wiesen',&lt;br /&gt;
		'nl': 'Toon alles',&lt;br /&gt;
		'pl': 'Pokaż wszystkie',&lt;br /&gt;
		'pt': 'Mostrar todos',&lt;br /&gt;
		'pt-br': 'Mostrar todos',&lt;br /&gt;
		'ru': 'Показать все',&lt;br /&gt;
		'sv': 'Visa alla',&lt;br /&gt;
		'tl': 'Ipakita ang lahat',&lt;br /&gt;
		'tr': 'Tümünü göster',&lt;br /&gt;
		'zh-hans': '全部显示'&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/* Code: */&lt;br /&gt;
&lt;br /&gt;
	// autodetects a browser language&lt;br /&gt;
	getBrowserLanguage: function () {&lt;br /&gt;
		return navigator.userLanguage || navigator.language || navigator.browserLanguage;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// sets a new language to the cookie&lt;br /&gt;
	setCookieLanguage: function (language) {&lt;br /&gt;
		$.cookie(this.cookie, language, {&lt;br /&gt;
			expires: 100,&lt;br /&gt;
			path: '/'&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// deletes the cookie&lt;br /&gt;
	deleteCookieLanguage: function (language) {&lt;br /&gt;
		$.cookie(this.cookie, null, {&lt;br /&gt;
			path: '/'&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	// grabs the ISO 639 language code based&lt;br /&gt;
	// on either the browser or a supplied cookie&lt;br /&gt;
	getLanguage: function () {&lt;br /&gt;
		var language = '';&lt;br /&gt;
&lt;br /&gt;
		// Priority:&lt;br /&gt;
		//  1. Cookie&lt;br /&gt;
		//  2. wgUserLanguage global variable&lt;br /&gt;
		//  3. Browser autodetection&lt;br /&gt;
		// grab according to cookie&lt;br /&gt;
		language = $.cookie(this.cookie);&lt;br /&gt;
&lt;br /&gt;
		// grab according to wgUserLanguage if user is logged in&lt;br /&gt;
		if (!language &amp;amp;&amp;amp; commonsUserLanguage &amp;amp;&amp;amp; !mw.user.isAnon()) {&lt;br /&gt;
			language = commonsUserLanguage;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// grab according to browser if none defined&lt;br /&gt;
		if (!language) language = this.getBrowserLanguage();&lt;br /&gt;
&lt;br /&gt;
		// inflexible: can't accept multiple languages&lt;br /&gt;
		// remove dialect/region code, leaving only the ISO 639 code&lt;br /&gt;
		// language = language.replace(/(-.*)+/, '');&lt;br /&gt;
		return language;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// build widget for changing the language cookie&lt;br /&gt;
	buildWidget: function (language) {&lt;br /&gt;
&lt;br /&gt;
		this.$container = $('&amp;lt;div/&amp;gt;');&lt;br /&gt;
		this.$container.attr('id', 'langselectorcontainer');&lt;br /&gt;
		// link to language select description page&lt;br /&gt;
		this.$container.html('&amp;lt;a href=&amp;quot;' + this.helpUrl + '&amp;quot; class=&amp;quot;ls_link&amp;quot;&amp;gt;' + this.stringHelpText + '&amp;lt;/a&amp;gt; ');&lt;br /&gt;
		this.$select = $('&amp;lt;select/&amp;gt;');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		var seen = {};&lt;br /&gt;
		this.mls.find('[lang]').each(function () {&lt;br /&gt;
			var lang = $(this).attr('lang');&lt;br /&gt;
			if (!seen[lang]) {&lt;br /&gt;
				seen[lang] = true;&lt;br /&gt;
				var verboseLang = lang;&lt;br /&gt;
				if (window.wpAvailableLanguages) verboseLang = wpAvailableLanguages[lang] || lang;&lt;br /&gt;
				multilingual.$select.append($('&amp;lt;option&amp;gt;', {&lt;br /&gt;
					text: verboseLang,&lt;br /&gt;
					value: lang&lt;br /&gt;
				}));&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		this.$select.prepend('&amp;lt;option value=&amp;quot;showall&amp;quot;&amp;gt;' + this.stringShowallText + '&amp;lt;/option&amp;gt;');&lt;br /&gt;
		this.$select.attr('id', 'langselector');&lt;br /&gt;
		this.$select.val(this.getLanguage());&lt;br /&gt;
		this.$select.change(function () {&lt;br /&gt;
			multilingual.setCookieLanguage($('#langselector').val());&lt;br /&gt;
			multilingual.apply($('#langselector').val());&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		this.$container.append(this.$select);&lt;br /&gt;
		// Finally insert the select using the specified method to the specified OuterContainer to the DOM-tree&lt;br /&gt;
		this.$OuterContainer[this.method](this.$container);&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// main body of the function&lt;br /&gt;
	init: function () {&lt;br /&gt;
		if (typeof ls_enable !== 'undefined') return;&lt;br /&gt;
&lt;br /&gt;
		//disabling the gadget on special pages&lt;br /&gt;
		if (mw.config.get('wgNamespaceNumber') &amp;lt; 0) return;&lt;br /&gt;
&lt;br /&gt;
		// only activated in view , purge, historysubmit or submit mode&lt;br /&gt;
		if (-1 === $.inArray(mw.config.get('wgAction'), ['view', 'purge', 'edit', 'historysubmit', 'submit'])) return;&lt;br /&gt;
&lt;br /&gt;
		// Fire an event just before doing anything: This allows gadgets to first adjust the variables and then run it&lt;br /&gt;
		$(document).triggerHandler('scriptLoaded', ['Multilingual description', multilingual]);&lt;br /&gt;
&lt;br /&gt;
		var language = this.getLanguage();&lt;br /&gt;
		this.stringHelpText = (this.stringHelp[language] || this.stringHelp[commonsUserLanguage.split('-')[0]] || this.stringHelp.en);&lt;br /&gt;
		this.stringShowallText = (this.stringShowAll[language] || this.stringShowAll[commonsUserLanguage.split('-')[0]] || this.stringShowAll.en);&lt;br /&gt;
&lt;br /&gt;
		//try to find loose {{en|...}} and wrap them in a .multilingual&lt;br /&gt;
		//Select all blockelement.description[lang] which have at least one of their kind preceding them.&lt;br /&gt;
		var blockElements = ['div', 'table'];&lt;br /&gt;
		$.each(blockElements, function (i, be) {&lt;br /&gt;
			multilingual.$p.find(be + '.description[lang]+' + be + '.description[lang]').each(function () {&lt;br /&gt;
				var $this = $(this);&lt;br /&gt;
				//Already in a multiling, nothing to do here;&lt;br /&gt;
				if ($this.parent().hasClass('multilingual')) return;&lt;br /&gt;
				var group = $(this).prevUntil(':not(' + be + '.description[lang])').add($(this)).add($(this).nextUntil(':not(' + be + '.description[lang])'));&lt;br /&gt;
				//Check how many associating language &amp;lt;blocks&amp;gt; exist&lt;br /&gt;
				if (group.length &amp;lt; multilingual.langCountThreshold) {&lt;br /&gt;
					return true;&lt;br /&gt;
				}&lt;br /&gt;
				group.wrapAll('&amp;lt;div class=&amp;quot;multilingual&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// grab an array of multilingual elements&lt;br /&gt;
		this.mls = multilingual.$p.find('.multilingual');&lt;br /&gt;
&lt;br /&gt;
		// Only build form if there are MLDs on page.&lt;br /&gt;
		if (!this.mls.length) return;&lt;br /&gt;
&lt;br /&gt;
		this.buildWidget();&lt;br /&gt;
		this.apply(this.getLanguage());&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	apply: function (language) {&lt;br /&gt;
		// if language is blank, delete the cookie and then recalculate&lt;br /&gt;
		if (!language) {&lt;br /&gt;
			this.deleteCookieLanguage();&lt;br /&gt;
			language = this.getLanguage();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		this.mls.each(function () {&lt;br /&gt;
			// Cache selector&lt;br /&gt;
			var $ml = $(this);&lt;br /&gt;
&lt;br /&gt;
			if ($ml.parent('[class^=&amp;quot;image_annotation_content&amp;quot;]').length) return true;&lt;br /&gt;
&lt;br /&gt;
			var id = $ml.attr('id');&lt;br /&gt;
			if (id === 'bodyContent' || id === 'wikiPreview' || id === 'LangTableLangs') return true;&lt;br /&gt;
&lt;br /&gt;
			var $reqLang = $ml.find('[lang=&amp;quot;' + language + '&amp;quot;]');&lt;br /&gt;
&lt;br /&gt;
			if ($reqLang.length) {&lt;br /&gt;
				$ml.children('[lang][lang!=&amp;quot;' + language + '&amp;quot;]').hide();&lt;br /&gt;
				$ml.children('[lang=&amp;quot;' + language + '&amp;quot;]').show();&lt;br /&gt;
			} else {&lt;br /&gt;
				$ml.children('[lang]').show();&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Depends on 'site' (what we need for wpAvailableLanguages) and user (ls_enable variable)&lt;br /&gt;
// These dependencies must remain here because other wikis use the raw script&lt;br /&gt;
mw.loader.using(['jquery.cookie', 'mediawiki.user', 'mediawiki.util', 'site', 'user'], function () {&lt;br /&gt;
	$(document).ready(function () {&lt;br /&gt;
		if ($('#file').length) {&lt;br /&gt;
			multilingual.method = 'append';&lt;br /&gt;
			multilingual.$OuterContainer = $('#file');&lt;br /&gt;
		} else {&lt;br /&gt;
			multilingual.method = 'prepend';&lt;br /&gt;
			multilingual.$OuterContainer = mw.util.$content;&lt;br /&gt;
		}&lt;br /&gt;
		multilingual.init();&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kg7qin</name></author>
	</entry>
</feed>