MediaWiki:Gadget-interlangSearch.js

来自Minecraft Wiki
Violine1101留言 | 贡献2024年12月1日 (日) 13:43的版本 (Update from main using #Synchronizer
跳转到导航 跳转到搜索
其他语言中

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:前往菜单 → 设置(Mac为Opera → 选项),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
const i18n = {
	de: {
		suggest: 'Siehe auch die Seiten passend zu „$1“ in anderssprachigen Wikis.',
		langlink: 'Diese Seite existiert als „$1“ in diesem Wiki.',
		section: ' (Abschnitt $1)',
		language: ' ($1)'
	},
	en: {
		suggest: 'See also pages matching "$1" from other language wikis.',
		langlink: 'This page exists as "$1" on this wiki!',
		section: ' (section $1)',
		language: ' ($1)'
	},
	es: {
		suggest: 'Mira también páginas que coinciden con "$1" en wikis de otros idiomas.',
		langlink: '¡Esta página existe como "$1" en esta wiki!',
		section: ' (sección $1)',
		language: ' ($1)'
	},
	nl: {
		suggest: 'Zoek naar pagina\'s die overeenkomen met "$1" op anderstalige wiki\'s',
		langlink: 'Deze pagina bestaat als "$1" op deze wiki!',
		section: ' (gedeelte $1)',
		language: ' ($1)'
	},
	pt: {
		suggest: 'Veja também páginas correspondentes a "$1" nas wikis de outros idiomas.',
		langlink: 'Esta página existe como "$1" nessa wiki!',
		section: ' (seção $1)',
		language: ' ($1)'
	},
	th: {
		suggest: 'ดูเพิ่มหน้าที่ตรงกับ "$1" จากวิกิภาษาอื่น',
		langlink: 'หน้านี้มีอยู่ใน "$1" บนวิกิแห่งนี้!',
		section: ' (ส่วน $1)',
		language: ' ($1)'
	}
};

mw.loader.using( [
	'mediawiki.util',
	'mediawiki.api',
	'mediawiki.ForeignApi',
	'ext.gadget.global-utils'
] ).then( function(require) {
	const globalUtils = require( 'ext.gadget.global-utils' );

	const config = mw.config.get( [
		'wgCanonicalSpecialPageName',
		'searchTerm',
		'wgUserId',
		'wgUserLanguage',
		'wgContentLanguage'
	] );

	if ( config.wgCanonicalSpecialPageName !== 'Search' || $('.searchresults a.mw-nextlink').length ) return;

	const searchTerm = config.searchTerm.trim();
	if ( !searchTerm ) return;

	const wikis = Object.values( globalUtils.wikis ).filter( wiki => wiki.url !== config.wgServer );
	const currentWiki = config.wgContentLanguage;
	const i18nLang = globalUtils.localization( i18n );
	
	Promise.allSettled( wikis.map(checkWiki) ).then( function(results) {
		var pages = [];
		results.forEach( function(result, i) {
			if ( result.status !== 'fulfilled' ) return;
			var query = result.value.query;
			var page = query.pages[0];
			if ( page.missing || page.invalid ) return;
			pages.push( {
				wiki: wikis[i],
				title: ( query.converted ? query.converted[0].from : page.title ),
				section: ( query.redirects && query.redirects[0].tofragment ),
				langlink: ( page.langlinks && page.langlinks[0].title )
			} );
		} );
		if ( !pages.length ) return;
		
		$('.searchresults .mw-search-visualclear:last-of-type').before(
			$('<div class="mw-search-visualclear">'),
			$('<div class="searchdidyoumean">').text(mw.format(i18nLang.suggest, searchTerm)).css('margin-top', '32px'),
			$('<ul class="mw-search-results">').css('margin-top', '24px').append( pages.map( function(page) {
				return $('<li class="mw-search-result">').append(
					$('<div class="mw-search-result-heading">').append(
						$('<a>').attr('href', page.wiki.url + mw.util.getUrl(page.title)).attr('title', page.title + ' – ' + page.wiki.name).append(
							mw.html.escape(page.title).replace(searchTerm, '<span class="searchmatch">' + searchTerm + '</span>')
						),
						( page.section ? $('<span class="searchalttitle">').append(
							mw.html.escape(i18nLang.section.split('$1')[0]),
							$('<a>').attr('href', page.wiki.url + mw.util.getUrl(page.title + '#' + page.section)).attr('title', page.title + ' – ' + page.wiki.name).append(
								mw.html.escape(page.section).replace(searchTerm, '<span class="searchmatch">' + searchTerm + '</span>')
							).css('font-size', 'unset'),
							mw.html.escape(i18nLang.section.split('$1')[1])
						) : '' ),
						$('<span class="searchalttitle">').text(mw.format(i18nLang.language, page.wiki.name))
					),
					( page.langlink ? $('<div class="searchresult">').append(
						mw.html.escape(i18nLang.langlink.split('$1')[0]),
						$('<a class="searchmatch">').attr('href', mw.util.getUrl(page.langlink)).attr('title', page.langlink.split('#')[0]).text(page.langlink).css('font-size', 'unset'),
						mw.html.escape(i18nLang.langlink.split('$1')[1])
					) : '' )
				);
			} ) )
		);
	} );
	
	function checkWiki(wiki) {
		return new mw.ForeignApi( wiki.url + '/api.php', {
			anonymous: true
		} ).get( {
			action: 'query',
			redirects: true,
			converttitles: true,
			titles: [searchTerm],
			prop: 'langlinks',
			lllang: currentWiki,
			formatversion: 2,
			requestid: 'gadget-interlangSearch'
		} );
	}
} );