---- INTRO: (!!! DO NOT RENAME THIS PAGE !!!)-- This module allows any template or module to be copy/pasted between-- wikis without any translation changes. All translation text is stored-- in the global Data:*.tab pages on Commons, and used everywhere.---- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules---- ATTENTION:-- Please do NOT rename this module - it has to be identical on all wikis.-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT-- Please do not modify it anywhere else, as it may get copied and override your changes.-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT---- DESCRIPTION:-- The "msg" function uses a Commons dataset to translate a message-- with a given key (e.g. source-table), plus optional arguments-- to the wiki markup in the current content language.-- Use lang=xx to set language. Example:---- {{#invoke:TNT | msg-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->-- | source-table <!-- uses a translation message with id = "source-table" -->-- | param1 }} <!-- optional parameter -->------ The "doc" function will generate the <templatedata> parameter documentation for templates.-- This way all template parameters can be stored and localized in a single Commons dataset.-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.---- {{#invoke:TNT | doc | Graph:Lines }}-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab-- if the current page is Template:Graph:Lines/doc--localp={}locali18nDataset='I18n/Module:TNT.tab'-- Forward declaration of the local functionslocalsanitizeDataset,loadData,link,formatMessagefunctionp.msg(frame)localdataset,idlocalparams={}locallang=nilfork,vinpairs(frame.args)doifk==1thendataset=mw.text.trim(v)elseifk==2thenid=mw.text.trim(v)elseiftype(k)=='number'thenparams[k-2]=mw.text.trim(v)elseifk=='lang'andv~='_'thenlang=mw.text.trim(v)endendreturnformatMessage(dataset,id,params,lang)end-- Identical to p.msg() above, but used from other lua modules-- Parameters: name of dataset, message key, optional arguments-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')functionp.format(dataset,key,...)localcheckType=require('libraryUtil').checkTypecheckType('format',1,dataset,'string')checkType('format',2,key,'string')returnformatMessage(dataset,key,{...})end-- Identical to p.msg() above, but used from other lua modules with the language param-- Parameters: language code, name of dataset, message key, optional arguments-- Example with 2 params: formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')functionp.formatInLanguage(lang,dataset,key,...)localcheckType=require('libraryUtil').checkTypecheckType('formatInLanguage',1,lang,'string')checkType('formatInLanguage',2,dataset,'string')checkType('formatInLanguage',3,key,'string')returnformatMessage(dataset,key,{...},lang)end-- Obsolete function that adds a 'c:' prefix to the first param.-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'functionp.link(frame)returnlink(frame.args[1])endfunctionp.doc(frame)localdataset='Templatedata/'..sanitizeDataset(frame.args[1])returnframe:extensionTag('templatedata',p.getTemplateData(dataset))..formatMessage(i18nDataset,'edit_doc',{link(dataset)})endfunctionp.getTemplateData(dataset)-- TODO: add '_' parameter once lua starts reindexing properly for "all" languageslocaldata=loadData(dataset)localnames={}for_,fieldinipairs(data.schema.fields)dotable.insert(names,field.name)endlocalnumOnly=truelocalparams={}localparamOrder={}for_,rowinipairs(data.data)dolocalnewVal={}localname=nilforpos,columnNameinipairs(names)doifcolumnName=='name'thenname=row[pos]elsenewVal[columnName]=row[pos]endendifnamethenif((type(name)~="number")and((type(name)~="string")ornotstring.match(name,"^%d+$")))thennumOnly=falseendparams[name]=newValtable.insert(paramOrder,name)endend-- Work around json encoding treating {"1":{...}} as an [{...}]ifnumOnlythenparams['zzz123']=''endlocaljson=mw.text.jsonEncode({params=params,paramOrder=paramOrder,description=data.description,})ifnumOnlythenjson=string.gsub(json,'"zzz123":"",?',"")endreturnjsonend-- Local functionssanitizeDataset=function(dataset)ifnotdatasetthenreturnnilenddataset=mw.text.trim(dataset)ifdataset==''thenreturnnilelseifstring.sub(dataset,-4)~='.tab'thenreturndataset..'.tab'elsereturndatasetendendloadData=function(dataset,lang)dataset=sanitizeDataset(dataset)ifnotdatasetthenerror(formatMessage(i18nDataset,'error_no_dataset',{}))end-- Give helpful error to thirdparties who try and copy this module.ifnotmw.extornotmw.ext.dataornotmw.ext.data.getthenerror(string.format([['''Missing JsonConfig extension, or not properly configured;Cannot load https://commons.wikimedia.org/wiki/Data:%s.See https://www.mediawiki.org/wiki/Extension:JsonConfig#Supporting_Wikimedia_templates''']],dataset))endlocaldata=mw.ext.data.get(dataset,lang)ifdata==falsethenifdataset==i18nDatasetthen-- Prevent cyclical callserror('Missing Commons dataset '..i18nDataset)elseerror(formatMessage(i18nDataset,'error_bad_dataset',{link(dataset)}))endendreturndataend-- Given a dataset name, convert it to a title with the 'commons:data:' prefixlink=function(dataset)return'c:Data:'..mw.text.trim(datasetor'')endformatMessage=function(dataset,key,params,lang)for_,rowinpairs(loadData(dataset,lang).data)dolocalid,msg=unpack(row)ifid==keythenlocalresult=mw.message.newRawMessage(msg,unpack(paramsor{}))returnresult:plain()endendifdataset==i18nDatasetthen-- Prevent cyclical callserror('Invalid message key "'..key..'"')elseerror(formatMessage(i18nDataset,'error_bad_msgkey',{key,link(dataset)}))endendreturnp