User:Hardwigg/show-more-languages.js

From Wikidata
Jump to navigation Jump to search

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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
 * Creates a portlet link (listed under 'Tools' in the sidebar) that prompts you
 * to add more languages to the languages list view.
 * 
 * To use, add the following line to your common.js:
 * mw.loader.load( '//www.wikidata.org/w/index.php?title=User:Hardwigg/show-more-languages.js&action=raw&ctype=text/javascript', 'text/javascript' );
 * 
 * To automatically load some languages, define the following variable *before*
 * loading the script:
 * window['show-more-languages.alwaysShow'] = 'en,fr';
 */
(function() {
	/** Adds a language to the entitytermsforlanguagelistview
	  *
	  * @param {string} lang language code
	  */
	function showLanguage(lang) {	
	    if ($('.wikibase-entitytermsforlanguagelistview.wb-edit').length) {
	        console.warn('Cannot show more languages while editing.');
	        mw.notify('Cannot show more languages while editing the languages listview.');
	        return;
	    }
	    if ($('.wikibase-entitytermsforlanguageview-' + lang).length) {
	        console.warn(lang + ' is already listed.');
	        mw.notify(lang + ' is already listed.');
	        return;
	    }
	    if (typeof($.uls.data.languages[lang]) == 'undefined') {
	        console.warn(lang + ' is not a recognized language.');
	        mw.notify(lang + ' is not a recognized language.');
	        return;
	    }
	
		var ev = $('.wikibase-entityview').data().entityview;
		if (!ev) return; // frontend code not ready
		var fingerprint = ev.options.value.getFingerprint();
	
		$('.wikibase-entitytermsforlanguagelistview-listview').data().listview.addItem({
			language: lang,
			label: fingerprint.getLabelFor( lang )
				|| new wb.datamodel.Term( lang, '' ),
			description: fingerprint.getDescriptionFor( lang )
				|| new wb.datamodel.Term( lang, '' ),
			aliases: fingerprint.getAliasesFor( lang )
				|| new wb.datamodel.MultiTerm( lang, [] )
		});
	}
	
	/** Add a language(s) to the entitytermsforlanguagelistview
	  *
	  * @param {string} [langs] comma-seprated string of language codes. If absent, prompts the user.
	  */
	function showMoreLanguages(langs) {
	    if ($('.wikibase-entitytermsforlanguagelistview.wb-edit').length) {
	        console.warn('Cannot show more languages while editing.');
	        mw.notify('Cannot show more languages while editing the languages listview.');
	        return;
	    }
	    if (!arguments.length) {
	        langs = prompt('Enter csv of language codes.\nEx: "en,fr,sq"', localStorage['show-more-languages.lastLanguage'] || '');
	        if (!langs) { // the cancelled
	            return;
	        }
	    }
	    langs = langs.replace(/\s/g, ''); // ignore whitespace
	    localStorage['show-more-languages.lastLanguage'] = langs;
	
	    langs = langs.split(',');
	    for(var i = 0; i < langs.length; ++i) {
	        showLanguage(langs[i]);
	    }
	}
	
	function init() {
		var nameSpaceNum = mw.config.get('wgNamespaceNumber');
		if (nameSpaceNum !== 0 && nameSpaceNum !== 120) { // Not on entity/property page
			return;
		}
		
		// create portletLink
		var portletLink = mw.util.addPortletLink(
			'p-tb',
			'javascript:;',
			'Show more languages',
			'p-show-more-languages'
		);
		$(portletLink).on('click', function() { showMoreLanguages(); } );
		// $(portletLink).on('dblclick', function() { showMoreLanguages(localStorage['show-more-languages.lastLanguage']); });
		
		// load languages which are always wanted
		if(window['show-more-languages.alwaysShow']) {
			showMoreLanguages(window['show-more-languages.alwaysShow']);
		}
	}
  
  	if (mw.config.get('wgNamespaceNumber') !== 0 && mw.config.get('wgNamespaceNumber') != 120) return;
	init();
})();