Bước tới nội dung

Mô đun:Article history/config

Bách khoa toàn thư mở Wikipedia
---------------------------------------------------------------------------------              Configuration data for [[Module:Article history]]-------------------------------------------------------------------------------local lang = mw.language.getContentLanguage()local Category = require('Module:Article history/Category')--------------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------------- Makes a link to a template page surrounded by double curly braces. A-- workalike for the {{tl}} template.local function makeTemplateLink(s)	local openb = mw.text.nowiki('{{')	local closeb = mw.text.nowiki('}}')	return string.format('%s[[Template:%s|%s]]%s', openb, s, s, closeb)end-- Gets the Good Article topic for the given key. Uses-- [[Module:Good article topics]].local function getGoodArticleTopic(key)	if not key then		return nil	end	return require('Module:Good article topics')._main(key)end-- Returns the Good Article page link and display value for a given Good Article-- key. If the key wasn't valid, the default Good Article page and display value-- is returned instead.local function getGoodArticleTopicLink(key)	local topic = getGoodArticleTopic(key)	local link, display	if topic then		link = 'Wikipedia:Bài viết tốt/' .. topic		display = 'bài viết tốt bên chủ điểm ' .. topic	else		link = 'Wikipedia:Bài viết tốt'		display = 'bài viết tốt'	end	return link, displayend-- Wrapper function for mw.language:formatDate, going through pcall to catch-- invalid input errors.local function getDate(format, date)	local success, result = pcall(lang.formatDate, lang, format, date)	if success then		return result	endend-- Gets the date in the format YYYYMMDD, as a number. Months and dates are-- zero-padded. Results from this function are intended to be used in date-- calculations.local function getYmdDate(date)	date = getDate('Ymd', date)	if date then		return tonumber(date)	else		return nil	endend-- Gets the date in the format Month d, YYYY.local function getLongDate(date)	return getDate('j F, Y', date)end-- Returns true if the given page is an existing title, and false or nil-- otherwiselocal function titleExists(page)	local success, title = pcall(mw.title.new, page)	return success and title.existsend-- Returns a truthy value if a date parameter for the given prefix has been-- provided by the user.local function isActiveDatedObject(articleHistoryObj, prefix)	local args = articleHistoryObj.args	local prefixArgs = articleHistoryObj.prefixArgs	return args[prefix .. 'date'] or prefixArgs[prefix]end-- Returns a date as formatted by getLongDate. If the date is invalid, it raises-- an error using param as the parameter name containing the invalid date.local function validateDate(param, date, articleHistoryObj)	local longDate = getLongDate(date)	if longDate then		return longDate	else		articleHistoryObj:raiseError(			string.format(				"invalid date '%s' detected in parameter '%s'",				tostring(date),				param			),			'Bản mẫu:Lịch sử bài viết#Invalid date'		)	endend-- Generates a data table for a date-related notice such as DYK and ITN. prefix-- is the parameter prefix for that notice type (e.g. "dyk"), and suffixes is-- an array of parameter suffixes in addition to "date" that is used by that-- notice type (e.g. "entry" for the "dykentry" and "dyk2entry" parameters).local function makeDateData(articleHistoryObj, prefix, suffixes)	local args = articleHistoryObj.args	local prefixArgs = articleHistoryObj.prefixArgs	-- Sanity checks	if prefixArgs[prefix] then		for _, t in ipairs(prefixArgs[prefix]) do			if not t.date then				articleHistoryObj:raiseError(					string.format(						"an argument starting with '%s%d' was detected, " ..							"but no '%s%ddate' parameter was specified",						prefix, t[1],						prefix, t[1]					),					'Bản mẫu:Lịch sử bài viết#No date parameter'				)			end		end	end	local data = {}	-- Organise the input	local function addData(sep)		local t = {}		local argPrefix = prefix .. sep		do			local key = argPrefix .. 'date'			t.date = validateDate(key, args[key], articleHistoryObj)			t.month, t.day, t.year = t.date:match('(%a+) (%d+), (%d+)')			t.day = tonumber(t.day)			t.year = tonumber(t.year)			t.ymdDate = getYmdDate(t.date)		end		for _, suffix in ipairs(suffixes) do			local key = argPrefix .. suffix			t[suffix] = args[key]		end		t.argPrefix = argPrefix		data[#data + 1] = t	end	if args[prefix .. 'date'] then		addData('')	end	if prefixArgs[prefix] then		for _, prefixData in ipairs(prefixArgs[prefix]) do			addData(tostring(prefixData[1]))		end	end	if #data < 1 then		error(string.format(			"no data items found for prefix '%s' and parameter checks failed'",			tostring(prefix)		))	end	return dataend-- This makes the text for Main Page features such as DYKs and ITNs for the-- dates contained in dateData (made with the makeDateData function).-- The parameter $1 in the blurb will be replaced with the list of dates.local function makeDateText(dateData, blurb, wantBold)	local bold = wantBold and "'''" or ""	local dates, doneLinks = {}, {}	for i, t in ipairs(dateData) do		local date		if t.link and not doneLinks[t.link] then			date = string.format('[[%s|%s]]', t.link, t.date)			doneLinks[t.link] = true		else			date = t.date		end		dates[i] = bold .. date .. bold	end	local dateList = mw.text.listToText(dates, ', ', ', and ')	return mw.message.newRawMessage(blurb, dateList):plain()endreturn {---------------------------------------------------------------------------------                             CONFIG TABLE START---------------------------------------------------------------------------------------------------------------------------------------------------------------- Statuses-- Configuration for possible current statuses of the article.--------------------------------------------------------------------------------- The statuses table contain configuration tables for possible current statuses-- of the article.-- Each table can have the following fields:---- id: the main ID for the status. This should be the same as the configuration--    table key.-- aliases: a table of ID aliases that can be used to access the config table.-- icon: The status icon.-- iconSize: The icon size, including "px" suffix. The default is defined in--    defaultStatusIconSize.-- iconSmallSize: The icon size if we are outputting a small template. The--    default is defined in defaultSmallStatusIconSize.-- iconMultiSize: The icon size if we are outputting multiple status rows. The--    default is defaultSmallStatusIconSize.-- text: The status text. This may be a string or a function. If it is a--    function, it takes an article history object as input, and should return--    the text string. If it is a string, it can have the following parameters:--    $1 - The full page name of the article or subject page--    $2 - The page name without the namespace name-- categories: The categories set by the status. This may be an array of--    category names, or a function. If it is a function, it takes an article--    history object as the first parameter, and the current status object as--    the second parameter, and should return an array of category objects.-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or--    a function, or true. If it is a function it takes an article history--    object as the first parameter, and should output the icon filename. If it--    is true, it uses the value of icon. If it is nil then no notice bar icon--    will be displayed.-- noticeBarIconCaption: the caption to use for the notice bar icon. The status--    name is used by default. This can be a string or a function. If it is a--    function, it takes an article history object as its first parameter, and--    should return the caption text. If this is absent, the icon caption is--    used instead.-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.--    The default is set by defaultNoticeBarIconSize.statuses = {	FA = {		id = 'FA',		name = 'Bài viết chọn lọc',		aliases = {'BVCL', 'CL'},		icon = 'Symbol star gold.svg',		text = function (articleHistoryObj)			local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local actions = articleHistoryObj:getActionObjects()			local link			for i = #actions, 1, -1 do				local actionObj = actions[i]				if actionObj.id == 'FAC' then					link = actionObj.link					break				end			end			link = link or 'Wikipedia:Ứng cử viên bài viết chọn lọc/' .. articlePage			local text = "'''%s''' là một [[Wikipedia:Bài viết chọn lọc|bài viết chọn lọc]] của Wikipedia tiếng Việt. " ..				"Bài viết, hoặc một phiên bản trước đây, đã được cộng đồng '''''[[%s|bình chọn]]''''' " ..				"là một trong những bài có chất lượng xuất sắc và tiêu biểu nhất của Wikipedia tiếng Việt. " ..				"Nếu bạn có thể cập nhật hoặc nâng cao chất lượng của bài viết hơn nữa, [[Wikipedia:Hãy táo bạo|xin mời bạn!]]"			return string.format(text, articlePage, link)		end,		-- categories = {'Bài viết chọn lọc'}	},	FFA = {		id = 'FFA',		name = 'Bài viết chọn lọc cũ',		aliases = {'BVMSCL', 'BVBRSCL'},		icon = 'Symbol star gold-stroked.svg',		iconSize = '48px',		text = "'''$1''' là một [[Wikipedia:Bài viết chọn lọc cũ|bài viết chọn lọc cũ]]. " ..			"Xin vui lòng xem liên kết bên dưới mục Cột mốc của bài viết để đọc thêm trang đề cử gốc " ..			"(đối với bài cũ hơn, kiểm tra [[Wikipedia:Ứng cử viên bài viết chọn lọc/Thành công|phần lưu trữ]]) " ..			"và biết tại sao bài viết bị rút sao chọn lọc.",			"and why it was removed.",		categories = {'Bài viết mất sao chọn lọc'}	},	FFAC = {		id = 'FFAC',		name = 'Ứng cử viên bài viết chọn lọc không thành công',		aliases = {'FACFAILED', 'UCVTB', 'UCVCLTB', 'UCVBVCLTB'},		icon = 'Symbol unsupport star gold.svg',		text = "'''$1''' đã từng là [[Wikipedia:Ứng cử viên bài viết chọn lọc|ứng cử viên bài viết chọn lọc]]. " ..			"Xin mời xem liên kết phía dưới mục Cột mốc của bài viết để biết tại sao " ..			"đề cử không thành công. Đối với ứng cử viên khác, vui lòng xem mục " ..			"[[Wikipedia:Ứng cử viên bài viết chọn lọc/Không thành công|lưu trữ]].",		categories = {'Ứng cử viên bài chọn lọc không thành công'}	},	FL = {		id = 'FL',		name = 'Danh sách chọn lọc',		aliases = {'DSCL'},		icon = 'Symbol star gold.svg',		iconSize = '48px',		text = function (articleHistoryObj)			local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local actions = articleHistoryObj:getActionObjects()			local link			for i = #actions, 1, -1 do				local actionObj = actions[i]				if actionObj.id == 'FLC' then					link = actionObj.link					break				end			end			link = link or 'Wikipedia:Ứng cử viên danh sách chọn lọc/' .. articlePage			local text = "'''%s''' là một [[Wikipedia:Danh sách chọn lọc|danh sách chọn lọc]], và " ..				"đã được [[Wikipedia:Thành viên|cộng đồng Wikipedia tiếng Việt]] '''''[[%s|bình chọn]]''''' là một trong những " ..				"[[Wikipedia:Danh sách|danh sách]] có chất lượng xuất sắc và tiêu biểu nhất của Wikipedia tiếng Việt. " ..				"Nếu bạn có thể cập nhật hoặc nâng cao hơn nữa chất lượng của bài viết, [[Wikipedia:Hãy táo bạo|xin mời bạn!]]"			return string.format(text, articlePage, link)		end,		categories = {'Danh sách chọn lọc'}	},	FFL = {		id = 'FFL',		name = 'Danh sách chọn lọc cũ',		aliases = {'DSMSCL'},		icon = 'Symbol star gold-stroked.svg',		text = "'''$1''' là một [[Wikipedia:Danh sách chọn lọc cũ|danh sách chọn lọc cũ]]. " ..			"Xin vui lòng xem liên kết bên dưới mục Cột mốc của bài viết để đọc thêm trang đề cử gốc " ..			"và biết tại sao bài viết bị rút sao danh sách chọn lọc. Nếu bài viết được cải thiện để đáp ứng lại " ..			"[[Wikipedia:Tiêu chuẩn danh sách chọn lọc|tiêu chuẩn danh sách chọn lọc]], bạn có thể " ..			"[[Wikipedia:Ứng cử viên danh sách chọn lọc|tái đề cử]] bài viết " ..			"trở lại [[Wikipedia:Featured list|danh sách chọn lọc]]."	},	FFLC = {		id = 'FFLC',		name = 'Ứng cử viên danh sách chọn lọc không thành công',		aliases = {'UCDSCL-TB'},		icon = 'Symbol unsupport star gold.svg',		iconCaption = 'Former FLC',		text = "'''$1''' đã từng là [[Wikipedia:Ứng cử viên danh sách chọn lọc|ứng cử viên danh sách chọn lọc]]. " ..			"Xin mời xem liên kết phía dưới mục Cột mốc của bài viết để biết tại sao đề cử không thành công. " ..			"Sau khi các phiếu phản đối được giải quyết hết, bạn có thể " ..			"[[Wikipedia:Ứng cử viên danh sách chọn lọc|tái đề cử]] " ..			"bài viết để đạt được chất lượng danh sách chọn lọc.",		categories = {'Ứng cử viên danh sách chọn lọc thất bại'}	},	['FFA/GA'] = {		id = 'FFA/GA',		aliases = {'BVMSCL/BVT', 'BVBRSCL/BVT', 'giáng sao'},		name = 'Bài viết chọn lọc cũ, hiện tại là bài viết tốt',		isMulti = true,		statuses = {'FFA', 'GA'}	},	['FFAC/GA'] = {		id = 'FFAC/GA',		aliases = {'UCVCLTB/BVT', 'UCVBVCLTB/BVT', 'UCVTB/BVT'},		name = 'Ứng cử viên bài viết chọn lọc không thành công, hiện tại là bài viết tốt',		isMulti = true,		statuses = {'FFAC', 'GA'}	},	GA = {		id = 'GA',		name = 'Bài viết tốt',		aliases = {'BVT', 'BVCLC', 'CLC'},		icon = 'Symbol_star_2ca02c.svg',		iconSize = '40px',		iconMultiSize = '25px',		text = function (articleHistoryObj)			local link, display = getGoodArticleTopicLink(articleHistoryObj.args.topic)			local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local text = "'''%s''' là một '''''[[%s|%s]]''''' của Wikipedia tiếng Việt. " ..			    "Bài viết, hoặc một phiên bản trước đây, đã được cộng đồng " ..				"[[Wikipedia:Ứng cử viên bài viết tốt|bình chọn]] là bài chất lượng cao " ..				"dựa trên [[Wikipedia:Tiêu chuẩn bài viết tốt|tiêu chuẩn bài viết tốt]]. " ..				"Nếu bạn có thể cập nhật hoặc nâng cao hơn nữa, [[Wikipedia:Hãy táo bạo|xin mời bạn!]]"			return string.format(text, articlePage, link, display)		end,	--	categories = function (articleHistoryObj)	--		local ret = {}	--		local title = articleHistoryObj.currentTitle	--		if title.namespace == 1 then			--	ret[#ret + 1] = Category.new('Bài viết chất lượng tốt')			--	ret[#ret + 1] = Category.new('Wikipedia CD Selection-GAs')	--			local topic = getGoodArticleTopic(articleHistoryObj.args.topic)	--			if topic then	--				ret[#ret + 1] = Category.new(			--			'Bài viết tốt của chủ điểm ' .. topic,		--				title.text		--			)		--		else			--		ret[#ret + 1] = Category.new(			--			'Bài viết tốt không có tham số chủ điểm',			--			title.text			--		)		--		end		--	end		--	return ret	--	end	},	FGAN = {		id = 'FGAN',		name = 'Ứng cử viên bài viết tốt không thành công',		aliases = {'FAILEDGA', 'UCVBVTTB'},		icon = 'Symbol unsupport star 2ca02c.svg',		text = function (articleHistoryObj)			local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local link, display = getGoodArticleTopicLink(articleHistoryObj.args.topic)			local text = "'''%s''' đã từng là ứng cử viên '''''[[%s|%s]]''''', " ..				"nhưng không đáp ứng [[Wikipedia:Tiêu chuẩn bài viết tốt|tiêu chuẩn bài viết tốt]] " ..				"ở thời điểm đó. Mời xem trang đề cử để biết cách cải thiện bài viết. " ..				"Nếu như vấn đề đã được giải quyết, bạn có thể " ..				"[[Wikipedia:Ứng cử viên bài viết tốt|tái đề cử]] bài viết."			return string.format(text, articlePage, link, display)		end,		categories = {'Ứng cử viên bài tốt không thành công'}	},	DGA = {		id = 'DGA',		name = 'Bài viết tốt đã bị rút sao',		aliases = {'DELISTEDGA', 'BVMSBVT'},		icon = 'Symbol star green-2ca02c-stroked.svg',		iconCaption = 'Bài viết tốt đã bị rút sao',		text = function (articleHistoryObj)			local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local link, display = getGoodArticleTopicLink(articleHistoryObj.args.topic)			local text = "'''%s''' đã từng là một '''''[[%s|%s]]''''', nhưng do thông tin " ..				"trong bài đã lỗi thời hoặc tiêu chuẩn bài viết tốt đã nâng cao qua thời gian nên cộng đồng đã quyết định rút sao " ..				"và gỡ nó khỏi danh sách. Nếu có thể, xin bạn hãy đọc những góp ý và giúp cải thiện bài viết nhằm đáp ứng " ..				"[[Wikipedia:Tiêu chuẩn bài viết tốt|tiêu chuẩn của bài viết tốt]]. " ..				"Sau khi những vấn đề đã được giải quyết, bạn có thể " ..				"[[Wikipedia:Ứng cử viên bài viết tốt|tái đề cử]] bài viết."			return string.format(text, articlePage, link, display)		end,		categories = {'Bài viết mất sao tốt'}	},	FFT = {		id = 'FFT',		name = 'Một phần của chủ điểm chọn lọc cũ',		icon = 'Symbol star gold-stroked.svg',		iconCaption = 'Chủ điểm chọn lọc cũ',		text = "Bài viết này là một phần của " ..			"''[[Wikipedia:Chủ điểm chọn lọc cũ|chủ điểm chọn lọc cũ]]''. " ..			"Nếu như bài viết được cải thiện lại để đạt " ..			"[[Wikipedia:Tiêu chuẩn chủ điểm chọn lọc|tiêu chuẩn chủ điểm chọn lọc]] " ..			"thì bạn có thể [[Wikipedia:Ứng cử viên chủ điểm chọn lọc|đề cử lại]] " ..			"chủ điểm để trở thành [[Wikipedia:Chủ điểm chọn lọc|Chủ điểm chọn lọc]]."	},	FFTC = {		id = 'FFTC',		name = 'Ứng cử viên cổng thông tin chọn lọc không thành công',		icon = 'Symbol unsupport star gold.svg',		text = "Bài viết này là một phần của " ..			"[[Wikipedia:Ứng cử viên chủ điểm chọn lọc|ứng cử viên chủ điểm chọn lọc]] ''cũ''. " ..			"Xin vui lòng xem liên kết bên dưới mục Cột mốc của bài viết để biết tại sao " ..			"đề cử không thành công."	},	FPO = {		id = 'FPO',		name = 'Cổng thông tin chọn lọc',		icon = 'Symbol_star_gold.svg',		text = "'''Cổng thông tin $2''' là một [[Wikipedia:Cổng thông tin chọn lọc|cổng thông tin chọn lọc]], " ..			"được cộng đồng Wikipedia tiếng Việt " ..			"'''''[[Wikipedia:Ứng cử viên cổng thông tin chọn lọc/Cổng thông tin:$2|bình chọn]]''''' " ..			"là một trong những cổng thông tin xuất sắc nhất trên [[Wikipedia tiếng Việt]]. " ..			"Nếu bạn có thể cập nhật hoặc nâng cao hơn nữa chất lượng của cổng thông tin " ..			"mà không làm xáo trộn công trình trước đó, xin cứ tự do đóng góp.",		categories = function (articleHistoryObj)			return {Category.new(				'Cổng thông tin chọn lọc',				articleHistoryObj.currentTitle.text			)}		end	},	FFPO = {		id = 'FFPO',		name = 'Cổng thông tin chọn lọc cũ',		icon = 'Symbol star gold-stroked.svg',		text = "Cổng thông tin này là một [[Wikipedia:Cổng thông tin chọn lọc cũ|cổng thông tin chọn lọc cũ]]. " ..			"Xin vui lòng xem liên kết bên dưới Cột mốc của cổng thông tin để đọc " ..			"trang đề cử cũ và biết tại sao nó bị rút sao.",		categories = function (articleHistoryObj)			return {Category.new(				'Cổng thông tin chọn lọc cũ',				articleHistoryObj.currentTitle.text			)}		end	},	FFPOC = {		id = 'FFPOC',		name = 'Ứng cử viên cổng thông tin chọn lọc không thành công',		icon = 'Symbol unsupport star gold.svg',		text = "Cổng thông tin này đã '''''từng là một''''' " ..			"[[Wikipedia:Ứng cử viên cổng thông tin chọn lọc|ứng cử viên cổng thông tin chọn lọc]]. " ..			"Xin vui lòng xem liên kết bên dưới Cột mốc của cổng thông tin để đọc " ..			"trang đề cử cũ và biết tại sao đề cử không thành công.",		categories = function (articleHistoryObj)			return {Category.new(				'Wikipedia featured portal candidates (contested)',				articleHistoryObj.currentTitle.text			)}		end	},	PR = {		-- Peer review is a valid current status, but it doesn't trigger a		-- header row.		id = 'PR',		name = 'Đã bình duyệt',		aliases = {'bình duyệt'},		noticeBarIcon = 'Nuvola apps kedit.svg'	},	NA = {		-- A valid current status, but doesn't trigger a header row.		id = 'NA',		noticeBarIcon = 'Nuvola apps kedit.svg'	},	-- The following are invalid statuses.	FAC = {		id = 'FAC',		text = function (articleHistoryObj)			articleHistoryObj:raiseError(				string.format(					'use the template %s to nominate an article for Featured article status',					makeTemplateLink('fac')				),				'Bản mẫu:Lịch sử bài viết#Featured article candidates'			)		end	},	FAR = {		id = 'FAR',		text = function (articleHistoryObj)			articleHistoryObj:raiseError(				string.format(					'use the template %s to nominate an article for Featured article review',					makeTemplateLink('FAR')				),				'Bản mẫu:Lịch sử bài viết#Featured article review'			)		end	},	STUB = {		id = 'STUB',		aliases = {'START', 'B', 'A', 'sơ khai', 'sơ khởi', 'C'},		text = function (articleHistoryObj)			local currentStatusParam = articleHistoryObj.cfg.currentStatusParam			articleHistoryObj:raiseError(				string.format(					"do not use '%s' as value of the '%s' parameter; these " ..						'assessments are the responsibility of individual ' ..						'WikiProjects',					articleHistoryObj.args[currentStatusParam],					currentStatusParam				),				'Bản mẫu:Lịch sử bài viết#WikiProject assessments'			)		end	},},-- This function allows the generation of custom status ID. It takes an-- articleHistory object as the first parameter, and should output the status-- ID.getStatusIdFunction = function (articleHistoryObj)	-- Get the status ID. The status code is the code passed in from the	-- arguments, and the ID is the value contained in the config.	local statusCode = articleHistoryObj.args[articleHistoryObj.cfg.currentStatusParam]	local statusId = articleHistoryObj:getStatusIdForCode(statusCode)	-- Check for former featured articles.	if statusId ~= 'FA'		and statusId ~= 'FL'		and statusId ~= 'FFA'		and statusId ~= 'FFL'		and statusId ~= 'FFA/GA'	then		local ffaObj		local actions = articleHistoryObj:getActionObjects()		for i = #actions, 1, -1 do			local actionObj = actions[i]			if actionObj.id == 'FAR' and actionObj.resultId == 'demoted' then				ffaObj = actionObj				break			end		end		if ffaObj then			if not statusId then				articleHistoryObj:raiseError(					'former featured articles should have a current status',					'Bản mẫu:Lịch sử bài viết#Former featured articles'				)			elseif statusId == 'GA' then				statusId = 'FFA/GA'			elseif statusId == 'DGA' then				statusId = 'FFA'			else				articleHistoryObj:raiseError(					string.format(						"'%s' không phải là trạng thái hiện tại hợp lệ của bài viết chọn lọc cũ",						tostring(statusCode)					),					'Bản mẫu:Lịch sử bài viết#Former featured articles'				)			end		end	end	return statusIdend,--------------------------------------------------------------------------------- Notices--------------------------------------------------------------------------------- The notices table contains configuration tables for notices about the article-- that are unrelated to its current status.-- Each configuration table can have the following fields:---- id: the main ID for the notice. This should be the same as the configuration--    table key.-- isActive: a function that should return a truthy value if the notice should--    be displayed, and a falsy value if not. (Falsy values are false and nil,--    and truthy values are everything else.) The function takes an article--    history object as its first parameter.-- makeData: a function that should return a table of data to be used by other--    functions in this notice configuration table. It can be accessed using--    noticeObj:getData().-- icon: the filename of the notice icon, minus the "File:" prefix.-- iconCaption: the icon caption.-- iconSize: The icon size, including "px" suffix. The default is defined in--    defaultIconSize.-- iconSmallSize: The icon size if we are outputting a small template. The--    default is defined in defaultSmallIconSize.-- text: The notice text. This may be a string or a function. If it is a--    function, it takes an article history object as the first parameter, and--    the current notice object as the second parameter, and should return the--    text string.-- categories: The categories set by the notice. This may be an array of--    category names, or a function. If it is a function, it takes an article--    history object as the first parameter, and the current notice object as--    the second parameter, and should return an array of category objects.-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or--    a function, or true. If it is a function it takes an article history--    object as the first parameter, and should output the icon filename. If it--    is true, it uses the value of icon. If it is nil then no notice bar icon--    will be displayed.-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be--    a string or a function. If it is a function, it takes an article history--    object as its first parameter, and should return the caption text. If this--    is absent, the icon caption is used instead.-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.--    The default is set by defaultNoticeBarIconSize.notices = {	{		id = 'FT',		isActive = function (articleHistoryObj)			local args = articleHistoryObj.args			local prefixArgs = articleHistoryObj.prefixArgs			-- ftmain is included here because it leads to better error			-- messages than leaving it out, even though ftmain by itself is			-- invalid.			return args.ftname or args.ftmain or prefixArgs.ft		end,		makeData = function (articleHistoryObj)			local args = articleHistoryObj.args			local prefixArgs = articleHistoryObj.prefixArgs			local data = {}			local getTopicStatus = require('Module:FeaturedTopicSum').status			local yesno = require('Module:Yesno')			local function makeTopicData(name, isMain, paramNum)				if name then					return {						name = name,						isMain = yesno(isMain) or false,						status = getTopicStatus(name),						paramNum = paramNum					}				elseif isMain then					local num = paramNum and tostring(paramNum) or ''					articleHistoryObj:raiseError(						string.format(							"parameter 'ft%smain' is set, but no featured " ..								"topic name is set in parameter 'ft%sname'",							num, num						),						'Bản mẫu:Lịch sử bài viết#Featured topic names'					)				else					return nil				end			end			data[#data + 1] = makeTopicData(args.ftname, args.ftmain)			if prefixArgs.ft then				for _, t in ipairs(prefixArgs.ft) do					if t[1] > 1 then -- we use args.ftname instead of args.ft1name						data[#data + 1] = makeTopicData(t.name, t.main, t[1])					end				end			end			-- Check for rogue ft.. parameters			if #data < 1 then				articleHistoryObj:raiseError(					"a parameter starting with 'ft' was detected, but no " ..						"featured topic names were specified; " ..						"please check the parameter names",					'Bản mẫu:Lịch sử bài viết#Featured topic names'				)			end			-- Find if one of the topics is featured.			local isInFeaturedTopic = false			for _, topic in ipairs(data) do				if topic.status == 'FT' then					isInFeaturedTopic = true					break				end			end			data.isInFeaturedTopic = isInFeaturedTopic			return data		end,		icon = function (articleHistoryObj, noticeObj)			local data = noticeObj:getData(articleHistoryObj)			if not data then				return nil			end			if data.isInFeaturedTopic then				return 'Cscr-featuredtopic.svg'			else				return 'Support cluster.svg'			end		end,		iconCaption = function (articleHistoryObj, noticeObj)			local data = noticeObj:getData(articleHistoryObj)			if not data then				return nil			end			if data.isInFeaturedTopic then				return 'Featured topic star'			else				return 'Good topic star'			end		end,		iconSize = '48px',		iconSmallSize = '30px',		text = function (articleHistoryObj, noticeObj)			local data = noticeObj:getData(articleHistoryObj)			if not data then				return nil			end			local article = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local firstBlurb = "'''%s''' là %s '''[[Wikipedia:Chủ điểm chọn lọc/%s|%s]]''', %s."			local otherBlurb = "Nó cũng là %s '''[[Wikipedia:Chủ điểm chọn lọc/%s|%s]]''', %s."			local finalBlurb = "%s được bình chọn lọc một trong loạt " ..				"bài viết xuất sắc nhất được cộng đồng thành viên Wikipedia viết nên. " ..				"Nếu bạn có thể cập nhật hoặc cải thiện %s, [[Wikipedia:Hãy táo bạo|xin mời bạn!]]"			local main = 'bài viết chính của'			local notMain = 'một phần của'			local featuredLink = 'một [[Wikipedia:Chủ điểm chọn lọc|chủ điểm chọn lọc]]'			local featuredNoLink = 'một chủ điểm chọn lọc'			local goodLink = 'một [[Wikipedia:Chủ điểm tốt|chủ điểm tốt]]'			local goodNoLink = 'một chủ điểm tốt'			local thisSingular = 'Đây là'			local thisPlural = 'Đây là'			local itSingular = 'nó'			local itPlural = 'chúng'			local hasFeaturedLink = false			local hasGoodLink = false			local text = {}			-- First topic			do				local topic = data[1]				local link				if topic.status == 'FT' then					link = featuredLink					hasFeaturedLink = true				else					link = goodLink					hasGoodLink = true				end				text[#text + 1] = string.format(					firstBlurb,					article,					topic.isMain and main or notMain,					topic.name,					topic.name,					link				)			end			-- Other topics			for i = 2, #data do				local topic = data[i]				local link				if topic.status == 'FT' then					if hasFeaturedLink then						link = featuredNoLink					else						link = featuredLink						hasFeaturedLink = true					end				else					if hasGoodLink then						link = goodNoLink					else						link = goodLink						hasGoodLink = true					end				end				text[#text + 1] = string.format(					otherBlurb,					topic.isMain and main or notMain,					topic.name,					topic.name,					link				)			end			-- Final blurb			do				local isPlural = #data > 1				text[#text + 1] = string.format(					finalBlurb,					isPlural and thisPlural or thisSingular,					isPlural and itPlural or itSingular				)			end			return table.concat(text, ' ')		end,		categories = function (articleHistoryObj, noticeObj)			local data = noticeObj:getData(articleHistoryObj)			if not data then				return nil			end			local status = articleHistoryObj:getStatusId()			local article = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText			local cats = {}			local function addCat(cat, sort)				cats[#cats + 1] = Category.new(cat, sort)			end			-- Page-wide status categories			if status == 'FA' or status == 'BVCL' then				addCat('Bài viết thuộc chủ điểm chọn lọc đạt chất lượng BVCL')			elseif status == 'FL' or status == 'DSCL' then				addCat('Bài viết thuộc chủ điểm chọn lọc đạt chất lượng DSCL')			elseif status == 'FFA/GA' or status == 'GA' or status == 'BVT' then				addCat('Bài viết thuộc chủ điểm chọn lọc đạt chất lượng BVT')			else				addCat('Bài viết thuộc chủ điểm chọn lọc chưa đánh giá chất lượng')			end			-- Topic-specific status categories			local function addTopicCats(catFormat)				for _, topic in ipairs(data) do					addCat(string.format(catFormat, topic.name))				end			end			if status == 'FA' or status == 'FL' or status == 'BVCL' or status == 'DSCL' then				addTopicCats('Nội dung chọn lọc của chủ điểm chọn lọc %s')			elseif status == 'FFA/GA' or 'GA' or status == 'BVT' then				addTopicCats('Nội dung tốt của chủ điểm chọn lọc %s')			else				addTopicCats('Chủ điểm chọn lọc %s')			end			-- Importance categories			local hasTop, hasHigh, hasMid, hasLow -- These check for dupes			for _, topic in ipairs(data) do				local cat, sort				if topic.status == 'FT' then					if topic.isMain and not hasTop then						cat = 'Bài viết thuộc chủ điểm chọn lọc đặc biệt quan trọng'						sort = topic.name .. ' ' .. article						hasTop = true					elseif not topic.isMain and not hasHigh then						cat = 'Bài viết thuộc chủ điểm chọn lọc rất quan trọng'						hasHigh = true					end				else					if topic.isMain and not hasMid then						cat = 'Bài viết thuộc chủ điểm chọn lọc khá quan trọng'						sort = topic.name .. ' ' .. article						hasMid = true					elseif not topic.isMain and not hasLow then						cat = 'Bài viết thuộc chủ điểm chọn lọc ít quan trọng'						hasLow = true					end				end				if cat then					addCat(cat, sort)				end			end			return cats		end	},	-- Main page date	{		id = 'MAINDATE',		isActive = function (articleHistoryObj)			local args = articleHistoryObj.args			local status = articleHistoryObj:getStatusId()			return args.maindate or status == 'FA' or status == 'FL' or status == 'BVCL' or status == 'DSCL'		end,		makeData = function (articleHistoryObj)			local args = articleHistoryObj.args			local status = articleHistoryObj:getStatusId()			local data = {}			local function validateMainDate(argName, dataName, dataTimestampName)				data[dataName] = args[argName]				if data[dataName] then					data[dataTimestampName] = getYmdDate(data[dataName])					if not data[dataTimestampName] then						articleHistoryObj:raiseError(							string.format(								"invalid date '%s' detected in parameter '%s'",								data[dataName],								argName							),							'Bản mẫu:Lịch sử bài viết#Invalid date'						)					end				end			end			validateMainDate('maindate', 'mainDate', 'mainDateTimestamp')			if data.mainDate then				validateMainDate('maindate2', 'mainDate2', 'mainDate2Timestamp')				if data.mainDate2 and data.mainDateTimestamp >= data.mainDate2Timestamp then					articleHistoryObj:raiseError(						"the date in the 'maindate' parameter must be earlier than the date in the 'maindate2' parameter",						'Bản mẫu:Lịch sử bài viết#Main Page date order'					)				end			end			data.currentTimestamp = getYmdDate()			-- Whether the page is a list or not for the purposes of the Main			-- Page. The first Today's Featured List was on 13 June 2011, so			-- lists that were featured before then count as articles.			data.isList = (status == 'FL' or status == 'FFL')				and (not data.mainDate or data.mainDateTimestamp >= 20110613)			return data		end,		icon = 'Wikipedia-logo-v2.svg',		iconCaption = 'Main Page trophy',		text = function (articleHistoryObj, noticeObj)			local data = noticeObj:getData(articleHistoryObj)			if not data or not data.mainDate then				return nil			end			-- Build the blurb for all the possible combinations of past,			-- present and future appearances of maindate and maindate2.			local pagetype = data.isList and 'Danh sách' or 'Bài viết'			local mainDateLong = getLongDate(data.mainDate)			local mainDate2Long = data.mainDate2 and getLongDate(data.mainDate2)			local todaysFA = pagetype .. " chọn lọc"			local function makeFeaturedLink(date, display)				return string.format(					"[[Wikipedia:%s chọn lọc/%s|%s]]",					pagetype,					date,					display or date				)			end			local function isPast(timestamp)				return timestamp < data.currentTimestamp			end			local function isCurrent(timestamp)				return timestamp == data.currentTimestamp			end			local function isFuture(timestamp)				return timestamp > data.currentTimestamp			end			if data.mainDate2 then				if isPast(data.mainDateTimestamp) then					if isPast(data.mainDate2Timestamp) then						return string.format(							"Bài viết này từng được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s vào %s, và vào %s.",							todaysFA,							makeFeaturedLink(mainDateLong),							makeFeaturedLink(mainDate2Long)						)					elseif isCurrent(data.mainDate2Timestamp) then						return string.format(							"Bài viết này hiện đang được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s, và cũng từng được lên lại vào %s.",							makeFeaturedLink(mainDate2Long, todaysFA),							makeFeaturedLink(mainDateLong)						)					else						return string.format(							"Bài viết này từng được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s vào %s, và sẽ được lên lại vào %s.",							todaysFA,							makeFeaturedLink(mainDateLong),							makeFeaturedLink(mainDate2Long)						)					end				elseif isCurrent(data.mainDateTimestamp) then					if isFuture(data.mainDate2Timestamp) then						return string.format(							"Bài viết này hiện đang được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s, và sẽ được lên lại vào %s.",							makeFeaturedLink(mainDateLong, todaysFA),							makeFeaturedLink(mainDate2Long)						)					else						return nil					end				else					if isFuture(data.mainDate2Timestamp) then						return string.format(							"Bài viết này sẽ được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s vào %s, và được lên lại vào %s.",							todaysFA,							makeFeaturedLink(mainDateLong),							makeFeaturedLink(mainDate2Long)						)					else						return nil					end				end			else				if isPast(data.mainDateTimestamp) then					return string.format(						"Bài viết này đã từng được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s vào %s.",						makeFeaturedLink(mainDateLong, todaysFA),						mainDateLong					)				elseif isCurrent(data.mainDateTimestamp) then					return string.format(						"Bài viết này hiện đang được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s.",						makeFeaturedLink(mainDateLong, todaysFA),						mainDateLong					)				else					return string.format(						"Bài viết này sẽ được lên [[Trang Chính]] Wikipedia tiếng Việt ở mục %s vào %s.",						makeFeaturedLink(mainDateLong, todaysFA),						mainDateLong					)				end			end		end,	--	categories = function (articleHistoryObj, noticeObj)	--		local data = noticeObj:getData(articleHistoryObj)	--		if not data then	--			return nil	--		end	--		local status = articleHistoryObj:getStatusId()	--		local cats = {}----			local pagetype = data.isList and 'Danh sách' or 'Bài viết'--			if data.mainDate and data.mainDateTimestamp <= data.currentTimestamp then--				cats[#cats + 1] = Category.new(string.format(--					'%s chọn lọc được lên trang chính',--					pagetype--				))--				if data.mainDate2 and data.mainDate2Timestamp <= data.currentTimestamp then--					cats[#cats + 1] = Category.new(string.format(--						'%s chọn lọc được lên trang chính hai lần',--						pagetype--					))--				else--					cats[#cats + 1] = Category.new(string.format(--						'%s chọn lọc được lên trang chính một lần',--						pagetype--					))--				end--			elseif status == 'FA' or status == 'FL' or data.mainDate then--				cats[#cats + 1] = Category.new(string.format(--					'%s chọn lọc chưa được lên trang chính',--					pagetype--				))--			end--			return cats--		end	}},--------------------------------------------------------------------------------- Actions--------------------------------------------------------------------------------- The actions table contains configuration tables for actions such as featured-- article candidacies and peer review, etc.-- Each configuration table can have the following fields:---- id: the main ID for the action. This should be the same as the configuration--    table key.-- name: the name of the action. This can be a string or a function. If it is--    a function, it takes an article history object as its first parameter and--    the action object as its second parameter, and should return the name.-- results: a table of possible results for the action. Keys in the table should--    be a result ID, e.g. "promoted" or "kept", and values should be a subtable--    with the following fields:--    id: the result ID. This should be the same as the table key. It will--        also define a possible input value for the action's result parameter.--    text: the displayed result text. This may be a string or a function. If it--        is a function, it takes an article history object as the first--        parameter and the current action object as the second parameter, and--        should return the result string.--    aliases: an array of result ID aliases. Each of these will define a valid--        value for the action's result parameter.-- text: The action text. This may be a string or a function. If it is a--    function, it takes an article history object as the first parameter and--    the current action object as the second parameter, and should return the--    text string.-- categories: The categories set by the notice. This may be an array of--    category names, or a function. If it is a function, it takes an article--    history object as the first parameter and the current action object as the--    second parameter, and should return an array of category objects.-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or--    a function, or true. If it is a function it takes an article history--    object as the first parameter, and should output the icon filename. If it--    is true, it uses the value of icon. If it is nil then no notice bar icon--    will be displayed.-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be--    a string or a function. If it is a function, it takes an article history--    object as its first parameter, and should return the caption text. If this--    is absent, the icon caption is used instead.-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.--    The default is set by defaultNoticeBarIconSize.actions = {	FAC = {		id = 'FAC',		name = 'Ứng cử viên bài viết chọn lọc',		aliases = {'UCVBVCL'},		results = {			promoted = {				id = 'promoted',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'thành công'}			},			['not promoted'] = {				id = 'not promoted',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'thất bại', 'không thành công'}			}		}	},	FAR = {		id = 'FAR',		name = 'Đề nghị rút sao bài viết chọn lọc',		aliases = {'FARC', 'RSBVCL'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			demoted = {				id = 'demoted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'remove', 'removed', 'rút sao'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge'}			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			local result = actionObj.resultId			if result == 'demoted' or result == 'merged' then				local status = articleHistoryObj:getStatusId()				local sortKey = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText				if status == 'FA' or status == 'FL' or status == 'BVCL' or status == 'DSCL' then					sortKey = '#' .. sortKey				end				ret[#ret + 1] = Category.new(					'Bài viết mất sao chọn lọc',					sortKey				)			end			return ret		end	},	BP = {		id = 'BP',		name = 'Bài viết xuất sắc',		aliases = {'BVXS'},		results = {			nominated = {				id = 'nominated',				text = 'Được đề cử',				aliases = {'pass', 'promoted', 'nom', 'đề cử', 'được đề cử'}			}		}	},	RBP = {		id = 'RBP',		name = 'Làm mới bài viết xuất sắc',		aliases = {'LMBVXS'},		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'pass', 'passed', 'keep', 'giữ', 'thông qua'}			},			['not kept'] = {				id = 'not kept',				text = 'Không giữ',				aliases = {'fail', 'failed', 'remove', 'removed', 'demoted', 'gỡ', 'xóa', 'không giữ'}			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			if actionObj.resultId == 'not kept' then				ret[#ret + 1] = Category.new(					'Bài viết xuất sắc cũ',					articleHistoryObj.currentTitle.text				)			end			return ret		end	},	FLC = {		id = 'FLC',		name = 'Ứng cử viên danh sách chọn lọc',		aliases = {'UCVDSCL'},		results = {			promoted = {				id = 'promoted',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'thành công'}			},			['not promoted'] = {				id = 'not promoted',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'thất bại', 'không thành công'}			}		}	},	FLR = {		id = 'FLR',		name = 'Đề nghị rút sao danh sách chọn lọc',		aliases = {'RSDSCL'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			demoted = {				id = 'demoted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'remove', 'removed', 'rút sao'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			local result = actionObj.resultId			if result == 'demoted' or result == 'merged' then				local sortKey				if articleHistoryObj:getStatusId() == 'FL' then					sortKey = '#' .. articleHistoryObj.currentTitle.subjectPageTitle.prefixedText				else					sortKey = articleHistoryObj.currentTitle.text				end				ret[#ret + 1] = Category.new(					'Danh sách mất sao chọn lọc',					sortKey				)			end			return ret		end	},	FTC = {		id = 'FTC',		name = 'Ứng cử viên chủ điểm chọn lọc',		aliases = {'UCVCDCL'},		results = {			promoted = {				id = 'promoted',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'thành công'}			},			['not promoted'] = {				id = 'not promoted',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'thất bại', 'không thành công'}			}		}	},	FTR = {		id = 'FTR',		name = 'Đề nghị rút sao chủ điểm chọn lọc',		aliases = {'RSCDCL'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			demoted = {				id = 'demoted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'remove', 'removed', 'rút sao'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			}		}	},	FPOC = {		id = 'FPOC',		name = 'Ứng cử viên cổng thông tin chọn lọc',		aliases = {'UCVCTTCL'},		results = {			promoted = {				id = 'promoted',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'thành công'}			},			['not promoted'] = {				id = 'not promoted',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'thất bại', 'không thành công'}			}		}	},	FPOR = {		id = 'FPOR',		name = 'Đề nghị rút sao cổng thông tin chọn lọc',		aliases = {'RSCTTCL'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			demoted = {				id = 'demoted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'remove', 'removed', 'rút sao'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			}		}	},	GAN = {		id = 'GAN',		name = 'Ứng cử viên bài viết tốt',		aliases = {'GAC', 'UCVBVT'},		results = {			listed = {				id = 'listed',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'promoted', 'thành công'}			},			['not listed'] = {				id = 'not listed',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'not promoted', 'thất bại', 'không thành công'}			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			if actionObj.resultId == 'not listed' then				local status = articleHistoryObj:getStatusId()				if status ~= 'FA'					and status ~= 'GA'					and status ~= 'FFA'				then					ret[#ret + 1] = Category.new(						'Ứng cử viên bài viết tốt cũ',						articleHistoryObj.currentTitle.text					)				end			end			return ret		end	},	GAR = {		id = 'GAR',		name = 'Đề nghị rút sao bài viết tốt',		aliases = {'RSBVT'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			delisted = {				id = 'delisted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'rút sao'}			},			listed = {				id = 'listed',				text = 'Gắn sao'			},			['not listed'] = {				id = 'not listed',				text = 'Không gắn sao'			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			if actionObj.resultId == 'delisted' then				local status = articleHistoryObj:getStatusId()				if status ~= 'FA'					and status ~= 'GA'				then					ret[#ret + 1] = Category.new(						'Bài viết mất sao tốt',						articleHistoryObj.currentTitle.text					)				end			end		end	},	GTC = {		id = 'GTC',		name = 'Ứng cử viên chủ điểm tốt',		aliases = {'UCVCDT'},		results = {			promoted = {				id = 'promoted',				text = 'Đề cử thành công',				aliases = {'pass', 'passed', 'thành công'}			},			['not promoted'] = {				id = 'not promoted',				text = 'Đề cử không thành công',				aliases = {'fail', 'failed', 'thất bại', 'không thành công'}			}		}	},	GTR = {		id = 'GTR',		name = 'Đề nghị rút sao chủ điểm tốt',		aliases = {'RSCDT'},		results = {			kept = {				id = 'kept',				text = 'Giữ sao',				aliases = {'pass', 'passed', 'keep', 'giữ sao'}			},			demoted = {				id = 'demoted',				text = 'Rút sao',				aliases = {'fail', 'failed', 'remove', 'removed', 'rút sao'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			}		}	},	PR = {		id = 'PR',		name = 'Bình duyệt',		aliases = {'bình duyệt', 'BD'},		results = {			reviewed = {				id = 'reviewed',				text = 'Đã bình duyệt',				aliases = {'_BLANK'}			},			['not reviewed'] = {				id = 'not reviewed',				text = 'Chưa được bình duyệt',			}		},	--	categories = {'Old requests for peer review'}	},	WPR = {		id = 'WPR',		name = function (articleHistoryObj, actionObj)			local names = {				approved = 'Phiên bản được duyệt trong dự án',				copyedited = 'Hiệp hội biên tập bản sao',				collaboration = 'Hợp tác dự án',				maindate = "Bài viết chọn lọc"			}			local result = actionObj.resultId			return result and names[result] or 'Bình duyệt trong dự án'		end,		results = {			approved = {				id = 'approved',				text = function(articleHistoryObj, actionObj)					if actionObj.oldid then						local url = mw.uri.fullUrl(							articleHistoryObj.currentTitle.prefixedText,							{diff = 'cur', oldid = actionObj.oldid}						)						return string.format(							'[%s %s]',							tostring(url),							'Diff to current version'						)					else						error(string.format(							"No oldid detected for the approved version; " ..								"please set the 'action%doldid' parameter " ..								"or give the 'action%dresult' parameter a " ..								"different value.",							actionObj.paramNum,							actionObj.paramNum						))					end				end,				aliases = {'approved version'}			},			copyedited = {				id = 'copyedited',				text = 'Đã được chỉnh sửa bản sao',				aliases = {'copyedit', 'proofread', 'chỉnh sửa bản sao'}			},			maindate = {				id = 'maindate',				text = 'Trang Chính'			},			collaborated = {				id = 'collaborated',				text = 'Đã được hợp tác',				aliases = {'cotw', 'collaboration', 'hợp tác'}			},			reviewed = {				id = 'reviewed',				text = 'Đã được kiểm tra',				aliases = {'_BLANK'}			}		},		categories = function (articleHistoryObj, actionObj)			local ret = {}			local result = actionObj.resultId			if result == 'copyedited' then				-- ret[1] = Category.new('Articles copy edited by the Guild of Copy Editors')			end			return ret		end	},	WAR = {		id = 'WAR',		name = 'Bình duyệt chất lượng A trong dự án',		results = {			approved = {				id = 'approved',				text = 'Duyệt',				aliases = {'pass', 'passed', 'thành công', 'duyệt'}			},			['not approved'] = {				id = 'not approved',				text = 'Chưa được duyệt',				aliases = {'fail', 'failed', 'not reviewed', 'thất bại', 'không thành công', 'chưa được duyệt'}			},			reviewed = {				id = 'reviewed',				text = 'Đã được kiểm tra',				aliases = {'_BLANK'}			},			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'keep', 'giữ'}			},			demoted = {				id = 'demoted',				text = 'Hạ chất lượng',				aliases = {'demote', 'hạ chất lượng'}			}		}	},	AFD = {		id = 'AFD',		name = 'Biểu quyết xoá bài',		aliases = {'BQXB'},		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'withdrawn', 'keep', 'giữ'}			},			deleted = {				id = 'deleted',				text = 'Xóa',				aliases = {'delete', 'xóa'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			},			['no consensus'] = {				id = 'no consensus',				text = 'Không có đồng thuận'			},			['speedily kept'] = {				id = 'speedily kept',				text = 'Giữ nhanh',				aliases = {'speedy keep', 'giữ nhanh'}			},			['speedily deleted'] = {				id = 'speedily deleted',				text = 'Xóa nhanh',				aliases = {'speedy delete', 'xóa nhanh'}			},			redirected = {				id = 'redirected',				text = 'Đổi hướng',				aliases = {'redirect', 'đổi hướng'}			},			renamed = {				id = 'renamed',				text = 'Di chuyển',				aliases = {'rename', 'move', 'moved', 'di chuyển', 'đổi tên'}			},		}	},	MFD = {		id = 'MFD',		name = 'Biểu quyết xóa trang thuộc không gian khác',		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'withdrawn', 'keep', 'giữ'}			},			deleted = {				id = 'deleted',				text = 'Xóa',				aliases = {'delete', 'xóa'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			},			['no consensus'] = {				id = 'no consensus',				text = 'Không có đồng thuận'			},			['speedily kept'] = {				id = 'speedily kept',				text = 'Giữ nhanh',				aliases = {'speedy keep', 'giữ nhanh'}			},			['speedily deleted'] = {				id = 'speedily deleted',				text = 'Xóa nhanh',				aliases = {'speedy delete', 'xóa nhanh'}			},			redirected = {				id = 'redirected',				text = 'Đổi hướng',				aliases = {'redirect', 'đổi hướng'}			},			renamed = {				id = 'renamed',				text = 'Di chuyển',				aliases = {'rename', 'move', 'moved', 'di chuyển', 'đổi tên'}			},		}	},	TFD = {		id = 'TFD',		name = 'Biểu quyết xóa thể loại, bản mẫu và mô đun',		aliases = {'CFD'},		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'withdrawn', 'keep', 'giữ'}			},			deleted = {				id = 'deleted',				text = 'Xóa',				aliases = {'delete', 'xóa'}			},			merged = {				id = 'merged',				text = 'Gộp',				aliases = {'merge', 'gộp'}			},			['no consensus'] = {				id = 'no consensus',				text = 'Không có đồng thuận'			},			['speedily kept'] = {				id = 'speedily kept',				text = 'Giữ nhanh',				aliases = {'speedy keep', 'giữ nhanh'}			},			['speedily deleted'] = {				id = 'speedily deleted',				text = 'Xóa nhanh',				aliases = {'speedy delete', 'xóa nhanh'}			},			redirected = {				text = 'Đổi hướng',				aliases = {'redirect', 'đổi hướng'}			},			renamed = {				id = 'renamed',				text = 'Di chuyển',				aliases = {'rename', 'move', 'moved', 'di chuyển', 'đổi tên'}			},		}	},	CSD = {		id = 'CSD',		name = 'Đề nghị xóa nhanh',		aliases = {'TCXN', 'XN', 'DNXN', 'SPEEDY'},		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'withdrawn', 'keep', 'giữ'}			},			deleted = {				id = 'deleted',				text = 'Xóa nhanh',				aliases = {'delete', 'speedily deleted', 'speedy delete', 'xóa', 'xóa nhanh'}			},			['speedily kept'] = {				id = 'speedily kept',				text = 'Giữ nhanh',				aliases = {'speedy keep', 'giữ nhanh'}			},			redirected = {				id = 'redirected',				text = 'Đổi hướng',				aliases = {'redirect', 'đổi hướng'}			},			prod = {				id = 'prod',				text = 'Chuyển thành đề nghị xóa trang',				aliases = {'prodded', 'đề nghị'}			},			afd = {				id = 'afd',				text = 'Chuyển đến [[WP:BQXB|biểu quyết xoá bài]]',				aliases = {'afded', 'bqxb', 'biểu quyết'}			},			renamed = {				id = 'renamed',				text = 'Di chuyển',				aliases = {'rename', 'move', 'moved', 'di chuyển', 'đổi tên'}			},		}	},	PROD = {		id = 'PROD',		name = 'Đề nghị xóa trang',		aliases = {'DNXT', 'Proposed deletion'},		results = {			kept = {				id = 'kept',				text = 'Giữ',				aliases = {'withdrawn', 'keep', 'giữ'}			},			deleted = {				id = 'deleted',				text = 'Xóa',				aliases = {'delete', 'xóa'}			},			['speedily kept'] = {				id = 'speedily kept',				text = 'Giữ nhanh',				aliases = {'speedy keep', 'giữ nhanh'}			},			['speedily deleted'] = {				id = 'speedily deleted',				text = 'Xóa nhanh',				aliases = {'speedy delete', 'xóa nhanh'}			},			redirected = {				id = 'redirected',				text = 'Đổi hướng',				aliases = {'redirect', 'đổi hướng'}			},			afd = {				id = 'afd',				text = 'Chuyển đến [[WP:BQXB|biểu quyết xoá bài]]',				aliases = {'afded', 'bqxb', 'biểu quyết'}			},			renamed = {				id = 'renamed',				text = 'Di chuyển',				aliases = {'rename', 'move', 'moved', 'di chuyển', 'đổi tên'}			},		}	},	DRV = {		id = 'DRV',		name = 'Biểu quyết phục hồi trang',		aliases = {'BQPHT', 'PH'},		results = {			endorsed = {				id = 'endorsed',				text = 'Phục hồi',				aliases = {'endorse', 'phục hồi'}			},			relisted = {				id = 'relisted',				text = 'Phục hồi',				aliases = {'relist'}			},			overturned = {				id = 'overturned',				text = 'Không phục hồi',				aliases = {'overturn', 'không phục hồi'}			},			['no consensus'] = {				id = 'no consensus',				text = 'Không có đồng thuận',				aliases = {'không có đồng thuận'}			}		}	}},--------------------------------------------------------------------------------- Collapsible notices--------------------------------------------------------------------------------- The collapsibleNotices table contains configuration tables for notices that-- go in the collapsible part of the template, underneath the actions.-- Each configuration table can have the following fields:---- id: the main ID for the notice. This should be the same as the configuration--    table key.-- isActive: a function that should return a truthy value if the notice should--    be displayed, and a falsy value if not. (Falsy values are false and nil,--    and truthy values are everything else.) The function takes an article--    history object as its first parameter.-- makeData: a function that should return a table of data to be used by other--    functions in this notice configuration table. It can be accessed using--    noticeObj:getData().-- icon: the filename of the notice icon, minus the "File:" prefix.-- iconCaption: the icon caption.-- iconSize: The icon size, including "px" suffix. The default is defined in--    defaultIconSize.-- iconSmallSize: The icon size if we are outputting a small template. The--    default is defined in defaultSmallIconSize.-- text: The notice text. This may be a string or a function. If it is a--    function, it takes an article history object as the first parameter, and--    the current collapsible notice object as the second parameter, and should--    return the text string.-- categories: The categories set by the notice. This may be an array of--    category names, or a function. If it is a function, it takes an article--    history object as the first parameter, and the current collapsible notice--    object as the second parameter, and should return an array of category--    objects.-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or--    a function, or true. If it is a function it takes an article history--    object as the first parameter, and should output the icon filename. If it--    is true, it uses the value of icon. If it is nil then no notice bar icon--    will be displayed.-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be--    a string or a function. If it is a function, it takes an article history--    object as its first parameter, and should return the caption text. If this--    is absent, the icon caption is used instead.-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.--    The default is set by defaultNoticeBarIconSize.collapsibleNotices = {	-- DYK	{		id = 'DYK',		icon = 'Symbol question.svg',		aliases = {'BCB'},		iconCaption = 'Bạn có biết?',		iconSmallSize = '15px',		noticeBarIcon = true,		isActive = function (articleHistoryObj)			return isActiveDatedObject(articleHistoryObj, 'dyk')		end,		makeData = function (articleHistoryObj)			return makeDateData(articleHistoryObj, 'dyk', {'entry', 'nom'})		end,		text = function (articleHistoryObj, collapsibleNoticeObj)			local data = collapsibleNoticeObj:getData(articleHistoryObj)			if not data then				return nil			end			for _, t in ipairs(data) do				local raPage = 'Wikipedia:Recent additions/' ..					getDate('Y/F#j F Y', t.date)				if not titleExists(raPage) then					raPage = 'Wikipedia:Recent additions'				end				t.link = raPage			end			local fact = 'ý trong bài viết này'			if data[1].nom then				fact = '[[' .. data[1].nom .. '|' .. fact .. ']]'			end			local blurb = "Một " .. fact .. " đã được đưa lên " ..				"[[Trang Chính]] Wikipedia tiếng Việt trong mục " ..				"''\"[[Wikipedia:Bạn có biết|Bạn có biết]]\"'' " ..				"của tuần từ $1."			return makeDateText(data, blurb, true)		end,		collapsibleText = function (articleHistoryObj, collapsibleNoticeObj)			local data = collapsibleNoticeObj:getData(articleHistoryObj)			if not data then				return nil			end			local ctext = {}			if #data == 1 and data[1].entry then				ctext[#ctext + 1] = string.format(					"Nội dung như sau: ''Bạn có biết %s''",					data[1].entry				)			else				local entries = {}				local lastEntryDate				for _, t in ipairs(data) do					entries[#entries + 1] = t.entry					lastEntryDate = t.date				end				if #entries == 1 then					ctext[#ctext + 1] = string.format(						"Nội dung của %s như sau: ''Bạn có biết %s''",						lastEntryDate, entries[1]					)				elseif #entries > 1 then					ctext[#ctext + 1] = 'Nội dung như sau:\n'					local list = mw.html.create('ul')					for _, t in ipairs(data) do						if t.entry then							list:tag('li'):wikitext(string.format(								"%s: ''Bạn có biết %s''",								t.date, t.entry							))						end					end					ctext[#ctext + 1] = tostring(list)				end			end			if #ctext > 0 then				return table.concat(ctext)			else				return nil			end		end,		categories = function (articleHistoryObj, collapsibleNoticeObj)			local cats = {}			local status = articleHistoryObj:getStatusId()			local cat			if status == 'FA' or status == 'BVCL' then				cat = 'Bài viết chọn lọc mục Bạn có biết'			elseif status == 'FL' or status == 'DSCL' then				cat = 'Danh sách chọn lọc mục Bạn có biết'			elseif status == 'GA' or status == 'FFA/GA' or status == 'BVT' then				cat = 'Bài viết tốt mục Bạn có biết'			else				cat = 'Bài viết mục Bạn có biết'			end			cats[1] = Category.new(cat)			return cats		end	},	-- ITN	{		id = 'ITN',		isActive = function (articleHistoryObj)			return isActiveDatedObject(articleHistoryObj, 'itn')		end,		makeData = function (articleHistoryObj)			return makeDateData(articleHistoryObj, 'itn', {'link'})		end,		icon = 'Globe current.svg',		iconCaption = 'Tin tức Wikipedia',		noticeBarIcon = true,		noticeBarIconSize = '20px',		text = function (articleHistoryObj, collapsibleNoticeObj)			local data = collapsibleNoticeObj:getData(articleHistoryObj)			if not data then				return nil			end			local dates = {}			for _, t in ipairs(data) do				local date = {}				if t.link then					date.link = t.link				elseif t.ymdDate >= 20090101 then					date.link = string.format(						'Wikipedia:ITN archives/%d/%s',						t.year,						t.month					)				elseif t.ymdDate >= 20050101 then					date.link = string.format(						'Portal:Current events/%d %s %d',						t.year,						t.month,						t.day					)				end				date.date = t.date				dates[#dates + 1] = date			end			local intro			if #data > 1 then				intro = 'Nhiều tin tức trong bài này'			else				intro = 'Một tin tức trong bài này'			end			local blurb = intro ..				" đã xuất hiện trên [[Trang Chính]] Wikipedia trong mục " ..				"''\"[[Bản mẫu:Tin tức|Tin tức]]\"'' vào $1."			return makeDateText(dates, blurb)		end,		categories = function (articleHistoryObj, collapsibleNoticeObj)			local cats = {}			cats[1] = Category.new('Bài viết mục Tin tức Wikipedia')			return cats		end	},	-- On This Day	{		id = 'OTD',		aliases = {'NNNX'},		isActive = function (articleHistoryObj)			return isActiveDatedObject(articleHistoryObj, 'otd')		end,		makeData = function (articleHistoryObj)			return makeDateData(articleHistoryObj, 'otd', {'link', 'oldid'})			-- TODO: remove 'link' after it is no longer needed for tracking		end,		icon = 'Nuvola apps date.svg',		iconCaption = 'Ngày này năm xưa',		noticeBarIcon = true,		noticeBarIconSize = '20px',		text = function (articleHistoryObj, collapsibleNoticeObj)			local data = collapsibleNoticeObj:getData(articleHistoryObj)			if not data then				return nil			end			local dates = {}			for _, t in ipairs(data) do				local date = {}				date.date = t.date				date.link = t.link				if t.oldid then					-- TODO: Move this inside the main module					local oldid = tonumber(t.oldid)					if oldid and						math.floor(oldid) == oldid and						oldid > 0 and						oldid < math.huge					then						-- If the oldid is valid, it takes precedence over						-- explicit links.						date.link = 'Special:PermaLink/' .. t.oldid					else						collapsibleNoticeObj:addWarning(							string.format(								"invalid oldid '%s' detected in parameter '%s'; " ..									"if an oldid is specified it must be a positive integer",								t.oldid,								t.argPrefix .. 'oldid'							),							'Bản mẫu:Lịch sử bài viết#Invalid oldid'						)					end				end				dates[#dates + 1] = date			end			local intro			if #data > 1 then				intro = 'Nhiều sự kiện có trong bài viết này'			else				intro = 'Một sự kiện có trong bài viết này'			end			local blurb = intro ..				"  đã xuất hiện trên [[Trang Chính]] trong mục " ..				"''\"[[Wikipedia:Ngày này năm xưa|Ngày này năm xưa]]\"'' " ..				"vào ngày $1."			return makeDateText(dates, blurb)		end,		categories = function (articleHistoryObj, collapsibleNoticeObj)			local cats = {}			cats[1] = Category.new('Bài viết mục Ngày này năm xưa')			local data = collapsibleNoticeObj:getData(articleHistoryObj)			if data then				for _, t in ipairs(data) do					if t.link then						cats[#cats + 1] = Category.new(							'Article history templates with linked otd dates'						)						break					end				end			end			return cats		end	},	-- Article Collaboration and Improvement Drive	{		id = 'ACID',		isActive = function (articleHistoryObj)			return articleHistoryObj.args.aciddate		end,		icon = 'Article Collaboration and Improvement Drive.svg',		iconCaption = 'Article Collaboration and Improvement Drive',		noticeBarIcon = true,		noticeBarIconSize = '20px',		text = function (articleHistoryObj)			local args = articleHistoryObj.args			local blurb = 'This article was on the ' ..				'[[WP:ACID|Article Collaboration and Improvement Drive]] ' ..				'for the week of %s.'			local date = validateDate('aciddate', args.aciddate)			return string.format(blurb, date)		end	},	-- League of Copy Editors	{		id = 'LOCE',		isActive = function (articleHistoryObj)			return articleHistoryObj.args.loceNotAnActiveOption		end,		icon = 'LoCiconRevised.png',		iconCaption = 'League of Copyeditors',		iconSize = '25px',		noticeBarIcon = true,		text = 'Bài viết này, hay một phần của bài, được [[WP:GOCE|các thành viên trong Hiệp hội biên tập bản sao]] ' ..			'điều chỉnh về mặt văn phong, ngữ pháp và định dạng nhằm đáp ứng đầy đủ [[WP:CNBS|tiêu chuẩn Wikipedia]].'	}},--------------------------------------------------------------------------------- Notice bar icons--------------------------------------------------------------------------------- This table holds configuration tables for notice bar icons that don't appear-- as part of a row. Other notice bar icons are handled in the statuses,-- notices, actions, and collapsibleNotices tables.-- It accepts the following fields:-- isActive: a function that should return a truthy value if the notice should--    be displayed, and a falsy value if not. (Falsy values are false and nil,--    and truthy values are everything else.) The function takes an article--    history object as its first parameter.-- icon: the filename of the notice bar icon, minus the "File:" prefix.noticeBarIcons = {	-- Peer review, or NA status	{		isActive = function (articleHistoryObj)			local status = articleHistoryObj:getStatusId()			-- @XXX: This is what the template does, but we should take into			-- account peer review actions as well.			return not status or status == 'PR' or status == 'NA'		end,		icon = 'Nuvola apps kedit.svg'	},	-- Wikipedia 1.0	{		isActive = function (articleHistoryObj)			return articleHistoryObj.args['v1.0NotAnActiveOption']		end,		icon = 'WP1 0 Icon.svg'	}},--------------------------------------------------------------------------------- Extra categories--------------------------------------------------------------------------------- This table contains categories that don't appear as part of a row. It is an-- array of functions; each function takes an article history object as input-- and must return an array of category objects as output.extraCategories = {	-- Four award	function (articleHistoryObj)		local yesno = require('Module:Yesno')		local ret = {}		local isFour = yesno(articleHistoryObj.args.four)		if isFour then			ret[#ret + 1] = Category.new('Wikipedia four award articles')		elseif isFour == false then			ret[#ret + 1] = Category.new('Wikipedia articles rejected for Four awards')		elseif articleHistoryObj:getStatusId() == 'FA' then			local isDYK = false			for _, obj in ipairs(articleHistoryObj:getCollapsibleNoticeObjects()) do				if obj.id == 'DYK' then					isDYK = true					break				end			end			if isDYK then				for _, obj in ipairs(articleHistoryObj:getActionObjects()) do					if obj.id == 'GAN' and obj.resultId == 'listed' then						ret[#ret + 1] = Category.new('Possible Wikipedia four award articles')						break					end				end			end		end		return ret	end,	-- Deletion to Quality award	function (articleHistoryObj)		local ret = {}		local status = articleHistoryObj:getStatusId()		if status == 'FA' or status == 'FL' or status == 'GA' or status == 'BVCL' or status == 'DSCL' or status == 'BVT' then			local iAfd = 0			local hasAfd = false			local actionObjects = articleHistoryObj:getActionObjects()			for i, obj in ipairs(actionObjects) do				if obj.id == 'AFD' then					iAfd = i					hasAfd = true					break				end			end			if hasAfd then				local function hasNomination(id, result)					for i = iAfd + 1, #actionObjects do						local obj = actionObjects[i]						if obj.id == id and obj.resultId == result then							return true						end					end					return false				end				if status == 'GA' and hasNomination('GAN', 'listed') or					status == 'FL' and hasNomination('FLC', 'promoted') or					status == 'FA' and hasNomination('FAC', 'promoted')				then					ret[#ret + 1] = Category.new('Deletion to Quality Award candidates')				end			end		end		return ret	end,	-- Track small banners	function (articleHistoryObj)		local ret = {}		if articleHistoryObj.isSmall then			table.insert(ret, Category.new('Small article history templates'))		end		return ret	end,},--------------------------------------------------------------------------------- Parameters--------------------------------------------------------------------------------- The parameter values used to generate the page actions. These are used as-- Lua patterns, so any of the magic characters *+-.^$%[] should be escaped-- with a preceding % symbol.actionParamPrefix = 'action',actionParamSuffixes = {	[''] = 'code',	date = 'date',	link = 'link',	result = 'resultCode',	oldid = 'oldid'},-- The parameter used to set the current status.currentStatusParam = 'currentstatus',--------------------------------------------------------------------------------- Other settings--------------------------------------------------------------------------------- If this number or fewer of collapsible rows are present (including actions-- and collapsible notices) they will not be collapsed. If this is set to the-- string "all", all rows will always be visible. Otherwise, the input must be-- a number. The default is three rows.uncollapsedRows = 3,-- The default size for icons. The default is 30px.defaultIconSize = '30px',-- The default size for icons for small templates. The default is 15px.defaultSmallIconSize = '15px',-- The default size for status icons. The default is 50px.defaultStatusIconSize = '50px',-- The default size for status icons for small templates. The default is 30px.defaultSmallStatusIconSize = '30px',-- The default size for notice bar icons. The default is 15px.defaultNoticeBarIconSize = '15px',-- The default size for collapsible status icons. The default is 50px.defaultCollapsibleNoticeIconSize = '20px',-- The default size for collapsible status icons for small templates. The-- default is 30px.defaultSmallCollapsibleNoticeIconSize = '20px',--------------------------------------------------------------------------------- Messages-------------------------------------------------------------------------------msg = {-- The heading for the collapsible table of actions if we are in the main-- namespace or the talk namespace.['milestones-header'] = 'Cột mốc của bài viết',-- The heading for the collapsible table of actions if we are in a different-- namespace.-- $1 - the subject namespace name.['milestones-header-other-ns'] = 'Cột mốc của $1',-- The milestones date header.['milestones-date-header'] = 'Ngày',-- The milestones process header.['milestones-process-header'] = 'Quá trình',-- The milestones result header.['milestones-result-header'] = 'Kết quả',-- The format to display the action dates in. The syntax is the same as the-- #time parser function.['action-date-format'] = 'j F, Y',-- The category to use if any errors are detected.['error-category'] = 'Article history templates with errors',-- Define boilerplate text for error messages and warnings, both with and-- without help links.-- $1 - the error message-- $2 - a link to a help page and section for the error['error-message-help'] = 'Lỗi: $1 ([[$2|trợ giúp]]).',['error-message-nohelp'] = 'Lỗi: $1.',['warning-help'] = 'Cảnh báo: $1 ([[$2|trợ giúp]]).',['warning-nohelp'] = 'Cảnh báo: $1.',-- Error for row objects that should output notice bar icons but for which no-- icon values could be found.['row-error-missing-icon'] = "notice bar icon config set to 'true' but no " ..	'image could be found',-- A help link for row-error-missing-icon['row-error-missing-icon-help'] = 'Bản mẫu:Lịch sử bài viết#Missing icon',-- Error for action objects that aren't passed a code.-- $1 - the parameter name for the code['action-error-no-code'] = "no action code found in the '$1' parameter; " ..	"please add a code or remove other parameters starting with '$1'",-- A help link for action-error-no-code['action-error-no-code-help'] = 'Bản mẫu:Lịch sử bài viết#Action codes',-- Error for action objects that are passed an invalid code.-- $1 - the code that the user input-- $2 - the parameter name for the code['action-error-invalid-code'] = "invalid action code '$1' passed to the '$2' parameter",-- A help link for action-error-invalid-code['action-error-invalid-code-help'] = 'Bản mẫu:Lịch sử bài viết#Action codes',-- Error for action objects with blank result parameters, where result-- parameters are required for the action's ID.-- $1 - the action ID-- $2 - the result parameter name['action-error-blank-result'] = "the '$1' action requires a result code; " ..	"please add a result code to parameter '$2'",-- A help link for action-error-blank-result['action-error-blank-result-help'] = 'Bản mẫu:Lịch sử bài viết#Action results',-- Error for action objects with invalid result parameters.-- $1 - the result code that the user input-- $2 - the action ID-- $3 - the result parameter name['action-error-invalid-result'] = "invalid result '$1' for action '$2' " ..	"detected in parameter '$3'",-- A help link for action-error-invalid-result['action-error-invalid-result-help'] = 'Bản mẫu:Lịch sử bài viết#Action results',-- Warning for action objects with invalid dates.-- $1 - the date input by the user-- $2 - the date parameter name['action-warning-invalid-date'] = "invalid date '$1' detected in parameter '$2'",-- A help link for action-warning-invalid-date['action-warning-invalid-date-help'] = 'Bản mẫu:Lịch sử bài viết#Invalid date',-- Error for action objects with no dates.-- $1 - the parameter number-- $2 - the date parameter name-- $3 - the action parameter name['action-warning-no-date'] = "no date specified for action $1; " ..	"please add a date to parameter '$2' or remove the other parameters " ..	"beginning with '$3'",-- A help link for action-warning-no-date['action-warning-no-date-help'] = 'Bản mẫu:Lịch sử bài viết#No date',-- The text to display in place of the action date if it is missing.['action-date-missing'] = '?',-- Error for action objects with invalid oldids.-- $1 - the oldid input by the user-- $2 - the oldid parameter name['action-warning-invalid-oldid'] = "invalid oldid '$1' detected in parameter '$2'; " ..	"if an oldid is specified it must be a positive integer",-- A help link for action-warning-invalid-oldid['action-warning-invalid-oldid-help'] = 'Bản mẫu:Lịch sử bài viết#Invalid oldid',-- Error for invalid current status codes.-- $1 - the code input by the user['articlehistory-warning-invalid-status'] = "'$1' is not a valid status code",-- A help link for articlehistory-warning-invalid-status['articlehistory-warning-invalid-status-help'] = 'Bản mẫu:Lịch sử bài viết#Invalid status',-- Warning for invocations that specify a current status without specifying any-- actions.['articlehistory-warning-status-no-actions'] = "a current status was supplied " ..	'without any actions',-- A help link for articlehistory-warning-status-no-actions['articlehistory-warning-status-no-actions-help'] = 'Bản mẫu:Lịch sử bài viết#No actions',-- The text to display the current status at the bottom of the collapsible-- table.-- $1 - the current status name['status-blurb'] = "Trạng thái hiện tại: '''$1'''",-- The text to display at the bottom of the collapsible table if the current-- status is unknown.['status-unknown'] = '?',}---------------------------------------------------------------------------------                              CONFIG TABLE END-------------------------------------------------------------------------------}