Mô đun:Article history/config

-------------------------------------------------------------------------------
--              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  template.
local function makeTemplateLink(s)
	local openb = mw.text.nowiki()
	return string.format('%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, display
end
-- 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
	end
end
-- 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
	end
end
-- 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
-- otherwise
local function titleExists(page)
	local success, title = pcall(mw.title.new, page)
	return success and title.exists
end
-- 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 argsprefix .. 'date' or prefixArgsprefix
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'
		)
	end
end
-- 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 prefixArgsprefix then
		for _, t in ipairs(prefixArgsprefix) 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, t1,
						prefix, t1
					),
					'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, argskey, 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
			tsuffix = argskey
		end
		t.argPrefix = argPrefix
		data#data + 1 = t
	end
	if argsprefix .. 'date' then
		addData()
	end
	if prefixArgsprefix then
		for _, prefixData in ipairs(prefixArgsprefix) do
			addData(tostring(prefixData1))
		end
	end
	if #data  1 then -- we use args.ftname instead of args.ft1name
						data#data + 1 = makeTopicData(t.name, t.main, t1)
					end
				end
			end
			-- Check for rogue ft.. parameters
			if #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)
				datadataName = argsargName
				if datadataName then
					datadataTimestampName = getYmdDate(datadataName)
					if not datadataTimestampName then
						articleHistoryObj:raiseError(
							string.format(
								"invalid date '%s' detected in parameter '%s'",
								datadataName,
								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(
					"%s",
					pagetype,
					date,
					display or date
				)
			end
			local function isPast(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  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
			cats1 = 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 " ..
				"\"Tin tức\" vào $1."
			return makeDateText(dates, blurb)
		end,
		categories = function (articleHistoryObj, collapsibleNoticeObj)
			local cats = {}
			cats1 = 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  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 " ..
				"\"Ngày này năm xưa\" " ..
				"vào ngày $1."
			return makeDateText(dates, blurb)
		end,
		categories = function (articleHistoryObj, collapsibleNoticeObj)
			local cats = {}
			cats1 = 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 ' ..
				'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 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 đủ 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 = actionObjectsi
						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 (trợ giúp).',
'error-message-nohelp' = 'Lỗi: $1.',
'warning-help' = 'Cảnh báo: $1 (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
-------------------------------------------------------------------------------
}