置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:Lyrics

贴贴♀百科,万娘皆可贴的百科全书!转载请标注来源页面的网页链接,并声明引自贴贴百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

该模块提供了一种简便的创建大段带翻译歌词的方法。

该模板便会为您按照行一一对应的关系生成原文和译文的对照。在高分辨率情况下,这会是左右对齐的对照。在低分辨率,原文译文会各占一行。该模块对应的模板是{{LyricsKai}}。

若要在歌词中使用多种颜色来分辨不同的演唱者,请参考使用{{LyricsKai/colors}}。注意:不建议在只有单个演唱者的歌曲条目中使用该模板。

若歌词有多个翻译版本歌词,请参考使用{{LyricsKai/multi}}。

若需要全文添加罗马字,请参考使用{{LyricsKai/Roma}}。

若要实现当指针悬停于歌词上时改变歌词背景颜色,请参考使用{{LyricsKai/hover}}。

参数

该模板目前有以下参数

  • original: 歌词原文。
  • translated: 歌词译文。歌词原文和译文的行数需要匹配。
  • llang: 原文语言标签。不指定时默认为日语(ja)。请参考Help:语言标签
  • rlang: 译文语言标签。不指定是默认为中文(zh)。格式同上。
  • lstyle: 原文部分的样式。颜色等样式可以在这里指定。
  • rstyle: 译文部分的样式。颜色等样式可以在这里指定。
  • width:設計模板的寬度,默認為100%
  • containerstyle:对整个容器应用的样式。背景颜色等同时作用于原文和译文部分的样式可以在这里指定。

此外,还有与著作权标记相关的两个参数:

  • author: 词作者/歌曲版权所有者,如果在站内有条目的可以写成内链的形式。
  • override: 当且仅当值为“1”时隐藏著作权标记,请只在该模板被用于非歌词场合或重复标记时使用。

使用方法

※注意:如果你尝试更改样式(lstyle、rstyle、containerstyle),请注意使用半角冒号以及分号。

{{LyricsKai
|lstyle=color:左边字体颜色;
|rstyle=color:右边字体颜色;
|original=
原文
|translated=
译文
}}

背景颜色示例

上面一个例子示范了更改字体颜色,这个例子用于更改整个歌词部分的背景色。

{{LyricsKai
|containerstyle=background:背景颜色;
|original=
原文
|translated=
译文
}}

例子

U&I 是一个现成的使用{{LyricsKai}}的例子。

local p = {}

local getArgs = require('Module:Arguments').getArgs
local lang = require('Module:Lang')

function p._lyrics(args, hookTrigger, customArgs)
	local original = args.original or ''
	local translated = args.translated or ''
	if hookTrigger then
		original, translated = hookTrigger('preSplit', original, translated, customArgs)
	end

	--mw.text.split的效率太低啦,我愿称之为shit
	local orig = {}
	local iter = mw.ustring.gmatch(original..'\n', '([^\n]*)\n')
	for val in iter do
		table.insert(orig, val)
	end
	local tran = {}
	local iter = mw.ustring.gmatch(translated..'\n', '([^\n]*)\n')
	for val in iter do
		table.insert(tran, val)
	end

	local llang = args.llang or 'ja'
	local rlang = args.rlang or 'zh'
	local lstyle = args.lstyle or ''
	local rstyle = args.rstyle or ''

	local html = mw.html.create('div')
					:addClass('Lyrics')
					:css('width', args.width)
					:cssText(args.containerstyle or '')

	if ((args['hasRuby'] or '') ~= '') or (not args.colorsMode and (args.original or ''):find('<ruby')) then
		html:addClass('Lyrics-has-ruby')
	else
		html:addClass('Lyrics-no-ruby')
	end

	local hastran = true
	if #tran == 1 and tran[1] == '' then
		hastran = false
	else
		html:addClass('Lyrics-has-translate')
	end

	if hookTrigger then
		hookTrigger('preParse', orig, hastran and tran or false, customArgs)
	end

	local lines = {}
	local len = math.max(#orig, #tran)
	for i=1, len do
		local line = mw.html.create('div'):addClass('Lyrics-line')
			:tag('div')
				:addClass('Lyrics-original')
				:cssText(lstyle)
				:node(lang.wrap(orig[i] or '', llang))
				:done()
		if hastran then
			line:tag('div')
				:addClass('Lyrics-translated')
				:cssText(rstyle)
				:node(lang.wrap(tran[i] or '', rlang))
				:done()
		end
		table.insert(lines, tostring(line))
	end

	if hookTrigger then
		hookTrigger('postParse', lines, customArgs)
	end
	html:node(table.concat(lines))
	-- Clear the floating
	html:tag('div'):cssText('clear:both')
	html = tostring(html)

	if hookTrigger then
		html = hookTrigger('preOutput', html, customArgs)
	end

	local copyright = ''
	local frame = mw.getCurrentFrame()
	local LDC = frame:callParserFunction{ name = '#var', args = { 'LDC', '0' } }
	if LDC ~= '1' and args.override ~= '1' then
		copyright = '<small>本段落中所使用的歌词,其著作权属于' .. (args.author or '原著作权人') .. ',仅以介绍为目的引用。</small>'
	elseif LDC == '1' and args.override == '1' then
		copyright = frame:expandTemplate{ title = 'ac', args = { '不必要使用override参数的音乐条目' } }
	end
	local css = frame:extensionTag{ name = 'templatestyles', args = { src = 'Template:LyricsKai/styles.css' } }

	return copyright .. css .. html
end

function p.lyrics(frame)
	local args = getArgs(frame, {wrappers='Template:LyricsKai'})
	return p._lyrics(args)
end

return p