MediaWiki:Gadget-WiktionaryInterwikiLinks.js

From Wikimedia Incubator

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * This script adds interwiki links to Wiktionary in the sidebar on pages
 * for Wiktionary incubators (pages starting with Wt/) in the main namespace.
 * It puts the Wiktionaries for languages in the user's Babel box first.
 * 
 * @author Nikki
 * @author Jon Harald Søby
 * @license CC0-1.0
 * @version 1.0.1 (2022-09-20)
 */

(function() {
	if (
		mw.config.get( 'wgNamespaceNumber' ) !== 0 ||
		mw.config.get( 'wgWmincTestwikiProject' ) !== 't' ||
		!mw.config.get( 'wgWmincRealPagename' ) ||
		mw.config.get( 'wgAction' ) !== 'view'
	) {
		return;
	}
	
	// Remove the "Add interlanguage links" link, as it serves no purpose
	$( 'li.wb-langlinks-link' ).remove();
	
	// The API query only includes pages on other domains.
	// To avoid having to do a second query to find out whether
	// the page exists on the API's domain, we can instead take
	// advantage of aa.wiktionary.org being a closed wiki with no pages.
	var api = new mw.ForeignApi( 'https://aa.wiktionary.org/w/api.php' );
	
	var babel = mw.config.get( 'wgULSBabelLanguages' ) || [];
	var lemma = mw.config.get( 'wgWmincRealPagename' );
	
	function sort_languages( a, b ) {
		// Put Wiktionary links for languages in the user's Babel box first
		if ( babel.includes( a.lang ) && !babel.includes( b.lang ) )
			return -1;
		if ( babel.includes( b.lang ) && !babel.includes( a.lang ) )
			return 1;
	
		// Then sort alphabetically by language code
		return a.lang.toLocaleLowerCase().localeCompare( b.lang.toLocaleLowerCase() );
	}
	
	// Add OOUI's pending class as a visual hint that the element will change
	$( '#p-lang, #p-lang-btn' ).addClass( 'oo-ui-pendingElement-pending' );
	
	api.get( {
		'action': 'parse',
		'prop': 'langlinks',
		'text': '',
		'title': lemma,
	} ).then( function ( data ) {
		
		if ( !data.parse.langlinks.length ) {
			$( '#p-lang, #p-lang-btn' ).removeClass( 'oo-ui-pendingElement-pending' );
			return;
		}
		
		if ( mw.config.get( 'skin' ) === 'vector-2022' ) {
			new mw.Api().loadMessagesIfMissing( [
				'vector-language-button-label',
				'vector-language-button-aria-label',
				'interlanguage-link-title'
			] ).then( function() {
				$( '#p-lang-btn' )	
					.removeClass( [ 'mw-portlet-empty',  'oo-ui-pendingElement-pending' ] )
					.addClass( [ 'mw-portlet', 'mw-portlet-lang' ] );
				$( '#p-lang-btn-checkbox' )
					.attr( 'aria-label', mw.message( 'vector-language-button-aria-label', mw.language.convertNumber( data.parse.langlinks.length ) ).text() );
				$( '#p-lang-btn-label .vector-menu-heading-label, #p-lang-btn-sticky-header span:last-of-type' )
					.text( mw.message( 'vector-language-button-label', mw.language.convertNumber( data.parse.langlinks.length ) ).text() );
				$.each( data.parse.langlinks.sort( sort_languages ), function( i, v ) {
					var $li = $( '<li>' )
						.addClass( 'interlanguage-link interwiki-' + v.lang + ' mw-list-item' );
					var $langlink = $( '<a>' )
						.addClass( 'interlanguage-link-target' )
						.attr( 'href', v.url )
						.attr( 'title', mw.message( 'interlanguage-link-title', v[ '*' ], v.langname ).text() )
						.attr( 'hreflang', v.lang )
						.attr( 'lang', v.lang )
						.html( '<span>' + v.autonym + '</span>' )
						.appendTo( $li );
					$( '#p-lang-btn ul.vector-menu-content-list' ).append( $li );
				} );
			} );
		} else {
			$( '#p-lang' ).removeClass( 'oo-ui-pendingElement-pending' );
			$( '#p-lang ul.vector-menu-content-list' ).empty();
			$.each( data.parse.langlinks.sort( sort_languages ), function ( i, v ) {
				var autonym = v.autonym;
				if ( v.lang !== 'ka' ) {
					autonym = autonym.charAt( 0 ).toUpperCase() + autonym.slice( 1 );
				}
				mw.util.addPortletLink( 'p-lang', v.url, autonym );
			} );
		}
	} );
})();