<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-ChangesByLanguage.js</id>
	<title>MediaWiki:Gadget-ChangesByLanguage.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-ChangesByLanguage.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-ChangesByLanguage.js&amp;action=history"/>
	<updated>2026-04-10T15:03:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-ChangesByLanguage.js&amp;diff=475091&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-ChangesByLanguage.js&amp;diff=475091&amp;oldid=prev"/>
		<updated>2025-11-04T17:53:59Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:53, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-ChangesByLanguage.js&amp;diff=475090&amp;oldid=prev</id>
		<title>wikt&gt;This, that and the other: make the gadget aware of the &quot;new&quot; recent changes</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-ChangesByLanguage.js&amp;diff=475090&amp;oldid=prev"/>
		<updated>2024-01-17T04:58:37Z</updated>

		<summary type="html">&lt;p&gt;make the gadget aware of the &amp;quot;new&amp;quot; recent changes&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;( [ &amp;quot;Recentchanges&amp;quot;, &amp;quot;Watchlist&amp;quot;, &amp;quot;Recentchangeslinked&amp;quot; ] ).indexOf( mw.config.get( &amp;quot;wgCanonicalSpecialPageName&amp;quot; ) ) !== -1 &amp;amp;&amp;amp; $( function () {&lt;br /&gt;
	var diffLinksSelector = &amp;quot;.mw-changeslist .special li &amp;gt; .mw-changeslist-line-inner &amp;gt; a:first-child, .mw-enhanced-rc .mw-title + a, .mw-enhanced-rc-nested a[tabindex] + a&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	var getRevisions = ( function () {&lt;br /&gt;
		var revRequests = {}, pRequests = {};&lt;br /&gt;
		&lt;br /&gt;
		function sendRequests( requests, isPageid ) {&lt;br /&gt;
			var pendingReqs = [];&lt;br /&gt;
			$.each( requests, function ( i, req ) {&lt;br /&gt;
				if ( !req.status ) {&lt;br /&gt;
					pendingReqs.push( i );&lt;br /&gt;
					req.status = 1;&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			for ( var i = 0; i &amp;lt; pendingReqs.length; i += 50 ) {&lt;br /&gt;
				var query = {&lt;br /&gt;
					action: &amp;#039;query&amp;#039;,&lt;br /&gt;
					prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
					rvprop: &amp;#039;content|ids&amp;#039;,&lt;br /&gt;
					maxage:  60 * 60 * 12,&lt;br /&gt;
					smaxage: 60 * 60 * 12&lt;br /&gt;
				};&lt;br /&gt;
				&lt;br /&gt;
				query[ isPageid ? &amp;#039;pageids&amp;#039; : &amp;#039;revids&amp;#039; ] = pendingReqs.slice( i, i + 50 ).join( &amp;#039;|&amp;#039; );&lt;br /&gt;
				( new mw.Api() ).get( query ).done( function ( results ) {&lt;br /&gt;
					$.each( results.query.pages, function ( id, revision ) {&lt;br /&gt;
						$.each( revision.revisions, function ( i, rev ) {&lt;br /&gt;
							var rid = isPageid ? id : rev.revid,&lt;br /&gt;
								result = requests[ rid ].result =&lt;br /&gt;
									rev[ &amp;#039;*&amp;#039; ];&lt;br /&gt;
							requests[ rid ].status = 2;&lt;br /&gt;
							$.each( requests[ rid ], function ( i, callback ) {&lt;br /&gt;
								callback( result );&lt;br /&gt;
							} );&lt;br /&gt;
						} );&lt;br /&gt;
					} );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return function getRevisions( id, callback, isPageid ) {&lt;br /&gt;
			if ( id ) {&lt;br /&gt;
				var requests = isPageid ? pRequests : revRequests,&lt;br /&gt;
					req = requests[ id ] || ( requests[ id ] = [] );&lt;br /&gt;
				if ( callback ) {&lt;br /&gt;
					if ( !req.status || req.status === 1 ) {&lt;br /&gt;
						req.push( callback );&lt;br /&gt;
					} else {&lt;br /&gt;
						callback( req.result );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				sendRequests( pRequests, true );&lt;br /&gt;
				sendRequests( revRequests, false );&lt;br /&gt;
			}&lt;br /&gt;
			return getRevisions;&lt;br /&gt;
		};&lt;br /&gt;
	} )();&lt;br /&gt;
	&lt;br /&gt;
	function getSection( content, language ) {&lt;br /&gt;
		var start = content.indexOf( &amp;#039;==&amp;#039; + language + &amp;#039;==&amp;#039; ),&lt;br /&gt;
			end = content.substr( start ).search( /$|\n==[^=]/ );&lt;br /&gt;
		if ( start === -1 ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		} else {&lt;br /&gt;
			return content&lt;br /&gt;
				.substr( start, end )&lt;br /&gt;
				// Don&amp;#039;t count a new section being added below as a change.&lt;br /&gt;
				.replace( /[\n \-]+$/g, &amp;#039;&amp;#039; )&lt;br /&gt;
				// Filter out translations sections.&lt;br /&gt;
				.replace( /(\{\{(?:check)?trans-top[^\}]*\}\})[\s\S]*?(?=\{\{(?:check)?trans-bottom\}\})/g, &amp;#039;$1&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function getTranslations( content, language ) {&lt;br /&gt;
		var t = content&lt;br /&gt;
			.match( new RegExp( &amp;#039;\n[\\*\\:]+\\s*&amp;#039; + language + &amp;#039;: [^\n]+&amp;#039;, &amp;#039;g&amp;#039; ) );&lt;br /&gt;
		return t ? t.join( &amp;#039;\n&amp;#039; ) : &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function getLanguage() {&lt;br /&gt;
		return languageData&lt;br /&gt;
			.split( /\s*[,|]\s*/g)&lt;br /&gt;
			// Remove empty strings&lt;br /&gt;
			.filter( function ( x ) { return x; } );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function hideFiltered() {&lt;br /&gt;
		if ( !languages || !languages.length ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		$( diffLinksSelector ).each( function( i, diffLink ) {&lt;br /&gt;
			var href = diffLink.href,&lt;br /&gt;
				oldid = mw.util.getParamValue( &amp;quot;oldid&amp;quot;, href ),&lt;br /&gt;
				curid = mw.util.getParamValue( &amp;quot;diff&amp;quot;, href ),&lt;br /&gt;
				title = mw.util.getParamValue( &amp;quot;title&amp;quot;, href );&lt;br /&gt;
			&lt;br /&gt;
			if ( title &amp;amp;&amp;amp; !title.includes( &amp;quot;:&amp;quot; ) &amp;amp;&amp;amp; oldid &amp;amp;&amp;amp; curid ) {&lt;br /&gt;
				getRevisions( curid );&lt;br /&gt;
				getRevisions( oldid, function ( oldRevision ) {&lt;br /&gt;
					getRevisions( curid, function ( curRevision ) {&lt;br /&gt;
						var show = languages.some( function ( language ) {&lt;br /&gt;
							var oldSection = getSection( oldRevision, language ),&lt;br /&gt;
								newSection = getSection( curRevision, language );&lt;br /&gt;
							if ( oldSection !== newSection ) {&lt;br /&gt;
								return true;&lt;br /&gt;
							} else if ( getTranslations( oldRevision, language ) !== getTranslations( curRevision, language ) ) {&lt;br /&gt;
								return true;&lt;br /&gt;
							}&lt;br /&gt;
						} );&lt;br /&gt;
						if ( !show ) {&lt;br /&gt;
							diffLink.parentNode.parentNode.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
						}&lt;br /&gt;
					} );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		&lt;br /&gt;
		// Newly created pages, without diff links.&lt;br /&gt;
		$( &amp;#039;.newpage&amp;#039; ).prev().prev().each( function ( i, histLink ) {&lt;br /&gt;
			var href = histLink.href,&lt;br /&gt;
				curid = mw.util.getParamValue( &amp;quot;curid&amp;quot;, href );&lt;br /&gt;
			getRevisions( curid, function ( curRevision ) {&lt;br /&gt;
				var show = languages.some( function ( language ) {&lt;br /&gt;
					if ( getSection( curRevision, language ) || getTranslations( curRevision, language ) ) {&lt;br /&gt;
						return true;&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( !show ) {&lt;br /&gt;
					histLink.parentNode.parentNode.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
			}, true );&lt;br /&gt;
		} );&lt;br /&gt;
		// Send the API requests.&lt;br /&gt;
		getRevisions();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function showAll() {&lt;br /&gt;
		$( &amp;#039;.mw-changeslist .special li&amp;#039; ).show();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Settings&lt;br /&gt;
	var options = document.querySelector( &amp;quot;#mw-watchlist-options, .rcoptions, .mw-rcfilters-head&amp;quot; ),&lt;br /&gt;
		optionsDiv = document.createElement( &amp;quot;div&amp;quot; ),&lt;br /&gt;
		input, &lt;br /&gt;
		languages,&lt;br /&gt;
		languageData,&lt;br /&gt;
		isEnhanced = $( &amp;#039;.mw-enhanced-rc, .mw-rcfilters-head&amp;#039; ).length;&lt;br /&gt;
	if ( options ) {&lt;br /&gt;
		options.appendChild( document.createElement( &amp;quot;hr&amp;quot; ) ).style.margin = &amp;quot;8px 0&amp;quot;;&lt;br /&gt;
		if ( isEnhanced ) {&lt;br /&gt;
			// If &amp;quot;Enhanced recent changes&amp;quot; is enabled, this script doesn&amp;#039;t work.&lt;br /&gt;
			optionsDiv.appendChild(&lt;br /&gt;
				document.createTextNode( &amp;#039;(The &amp;quot;Recent changes by language&amp;quot; gadget requires the &amp;quot;Use non-JavaScript interface&amp;quot; preference to be ON and the &amp;quot;Group changes by page&amp;quot; preference to be OFF.)&amp;#039; )&lt;br /&gt;
			);&lt;br /&gt;
			options.appendChild( optionsDiv );&lt;br /&gt;
		} else {&lt;br /&gt;
			optionsDiv.appendChild( document.createTextNode( &amp;#039;Languages: &amp;#039; ) );&lt;br /&gt;
			input = optionsDiv.appendChild( document.createElement( &amp;#039;input&amp;#039; ) );&lt;br /&gt;
			languageData = ( input.value = ( localStorage[ &amp;#039;YR-rcbl&amp;#039; ] || &amp;#039;&amp;#039; ) );&lt;br /&gt;
			languages = getLanguage();&lt;br /&gt;
			input.onkeydown = input.onkeyup = function ( e ) {&lt;br /&gt;
				languageData = localStorage[ &amp;#039;YR-rcbl&amp;#039; ] = this.value;&lt;br /&gt;
				if ( e.keyCode === 13 &amp;amp;&amp;amp; e.type === &amp;#039;keydown&amp;#039; ) {&lt;br /&gt;
					languages = getLanguage();&lt;br /&gt;
					showAll();&lt;br /&gt;
					hideFiltered();&lt;br /&gt;
					e.preventDefault &amp;amp;&amp;amp; e.preventDefault();&lt;br /&gt;
					return false;&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
			input.onblur = function () {&lt;br /&gt;
				languageData = localStorage[ &amp;#039;YR-rcbl&amp;#039; ] = this.value;&lt;br /&gt;
				languages = getLanguage();&lt;br /&gt;
				showAll();&lt;br /&gt;
				hideFiltered();&lt;br /&gt;
			};&lt;br /&gt;
			options.appendChild( optionsDiv );&lt;br /&gt;
			&lt;br /&gt;
			// Run&lt;br /&gt;
			hideFiltered();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
} );&lt;/div&gt;</summary>
		<author><name>wikt&gt;This, that and the other</name></author>
	</entry>
</feed>