跳转到内容

User:BlackShadowG/SidebarTranslate.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

// 隐藏 id 为 'p-lang' 的元素
var plang = $('#p-lang').hide();

$(document).ready( function() {
	// 定义排序函数,根据文本内容按降序排序
	function sort( a, b ) {
		return ( $(b).text() ) < ( $(a).text() ) ? 1 : -1;
	}

	// 找到 'p-lang' 中的 ul 元素
	var plangUL = plang.find('ul');

	// 找到类名以 "interlanguage-link" 开头的 li 元素,并将其从 DOM 中移除
	var interwikis = plangUL.find('li[class^="interlanguage-link"]').detach();

	// 如果存在 interwikis 列表项
	if ( interwikis.length > 0 ) {
		// 导入外部样式表
		importStylesheet('User:BlackShadowG/SidebarTranslate.css');

		// 正则表达式,用于匹配语言名称
		var langReg = /(.*? – )?(.*)/;

		// Google 翻译链接前缀
		var gtPre = 'http://translate.google.com/translate?hl=zh-CN&sl=auto&tl=zh-CN&u=';

		// 特殊语言映射表
		var hardLangs = {
			'lumbaart': '伦巴第语', 
			'tarandíne': '塔伦蒂诺语', 
			'vèneto': '威尼斯语', 
			'Беларуская (тарашкевіца)': '白俄罗斯语(传统正写法)',
			'буряад': '布里亚特语', 
			'лакку': '拉克语'
		};

		// 支持 Google 翻译的语言列表
		var googleSupported = [ '南非荷兰语', '阿尔巴尼亚语', '阿拉伯语', '亚美尼亚语', '阿塞拜疆语', '巴斯克语', '白俄罗斯语', '孟加拉语', '保加利亚语', 
			'加泰罗尼亚语', '中文', '克罗地亚语', '捷克语', '丹麦语', '荷兰语', '英语', '世界语', '爱沙尼亚语', '菲律宾语', '芬兰语', 
			'法语', '加利西亚语', '格鲁吉亚语', '德语', '希腊语', '海地语', '克里奥尔语', '希伯来语', '印地语', '匈牙利语', '冰岛语', 
			'印度尼西亚语', '爱尔兰语', '意大利语', '日语',  '爪哇语', '卡纳达语', '韩语', '高棉语', '拉丁语', '拉脱维亚语', '立陶宛语', 
			'马其顿语', '马来语', '马耳他语', '马拉地语', '挪威语', '挪威语(博克马尔语)', '挪威尼诺斯克语', '波斯语', '波兰语', 
			'葡萄牙语', '罗马尼亚语', '俄语', '塞尔维亚语', '斯洛伐克语', '斯洛文尼亚语', '西班牙语', '斯瓦希里语', '瑞典语', '泰米尔语', 
			'泰卢固语', '泰语', '土耳其语', '乌克兰语', '乌尔都语', '越南语', '威尔士语', '意第绪语'];

		// 遍历每个 interwiki 链接
		interwikis.find('a').each( function() {
			var $this = $(this);  // 当前链接元素
			var origLangName = $this.text();  // 原始语言名称
			var langMatches = langReg.exec( $this.attr('title') );  // 从标题中提取语言名称

			if ( langMatches != null ) {
				// 根据提取的名称,确定新的语言名称
				var newLangName = (langMatches[2] in hardLangs) ? hardLangs[ langMatches[2] ] : langMatches[2];
				if ( $this.attr('hreflang') == 'be-x-old' ) newLangName = '白俄罗斯语(传统正写法)';  // 特殊处理

				var hrefs = $this.attr('href');  // 获取链接地址
				var origLangPre = (langMatches[1] == undefined) ? '' : langMatches[1];  // 前缀处理

				// 更新链接的文本和属性
				$this.text( newLangName ).removeAttr('lang style').attr( 'title', origLangPre + origLangName );

				// 确定 Google 翻译链接的颜色
				var unsup = ( googleSupported.indexOf(langMatches[2]) < 0 ) ? '#FA8540' : '#4085FA';

				// 创建新的 Google 翻译链接
				$('<a/>', {
					'text': 'G',
					'class': 'external gTrans',
					'target': '_blank',
					'href': gtPre + hrefs,
					'title': 'Google翻译:' + newLangName + '翻译成英文',
					'style': 'color:' + unsup + ';'
				}).insertAfter( $this ).before(' ');  // 插入到原链接之后

				// 如果链接文本长度超过 17 个字符,则进行换行处理
				if ( $this.text().length > 17 )  $this.html( $this.html().replace('-','- ').replace(' ', '<br />') );

				// 为 Google 翻译链接添加鼠标悬停事件处理
				$this.siblings('.gTrans').hover(
					function() { $(this).css( {'background-color': unsup, 'color': 'white'} ) },
					function() { $(this).css( {'background-color': 'transparent', 'color': unsup} ) }
				);

				// 为 li 元素添加鼠标悬停事件处理
				$this.parent('li').hover(
					function() { $(this).find('.gTrans').fadeIn(200).css('margin-left','0') },
					function() { $(this).find('.gTrans').fadeOut(100).css('margin-left','5px') }
				);
			}
		});

		// 对 interwikis 进行排序,并添加回 ul 中
		plangUL.prepend( interwikis.sort(sort) );
	}

	// 显示 id 为 'p-lang' 的元素
	plang.show();
});