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 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ếtInvalid 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 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ếtNo 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 -- 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
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ếtInvalid 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ếtMain 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
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 " ..
"\"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 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 = {}
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 ' ..
'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 = 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 (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ếtMissing 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ếtAction 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ếtAction 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ếtAction 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ếtAction 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ếtInvalid 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ếtNo 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ếtInvalid 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ếtInvalid 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ếtNo 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
-------------------------------------------------------------------------------

}