MediaWiki:Gadget-WiktionaryInterwikiLinks.js
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 );
} );
}
} );
})();