Editing Module:Template translation
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 22: | Line 22: | ||
case-insensitive; they are not "SupportedLanguages" for MediaWiki, so | case-insensitive; they are not "SupportedLanguages" for MediaWiki, so | ||
they are not "KnownLanguageTags" for MediaWiki). | they are not "KnownLanguageTags" for MediaWiki). | ||
To be more restrictive, we exclude | To be more restrictive, we exclude any character | ||
* that is not ASCII and not a lowercase letter, minus-hyphen, or digit, | * that is not ASCII and not a lowercase letter, minus-hyphen, or digit, | ||
or does not start by a letter or does not finish by a letter or digit; | or does not start by a letter or does not finish by a letter or digit; | ||
* or that has | * or that has more than 8 characters between hyphens; | ||
* or that has two hyphens. | * or that has two hyphens; | ||
* or with specific uses in template subpages and unusable as languages. | |||
--]] | --]] | ||
or subpage ~= "doc" | or string.find(subpage, "^[%l][%-%d%l]*[%d%l]$") ~= nil | ||
and string.find(subpage, "[%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l]") == nil | |||
and string.find(subpage, "%-%-") == nil | |||
and subpage ~= "doc" | |||
and subpage ~= "layout" | and subpage ~= "layout" | ||
and subpage ~= "sandbox" | and subpage ~= "sandbox" | ||
and subpage ~= "testcases" | and subpage ~= "testcases" | ||
then | |||
return subpage | return subpage | ||
end | end | ||
Line 45: | Line 43: | ||
end | end | ||
--[[Get the last subpage of | --[[Get the last subpage of the current page if it is a translation. | ||
]] | ]] | ||
function this. | function this.getLanguageSubpage() | ||
--[[This code does not work in all namespaces where the Translate tool works. | --[[This code does not work in all namespaces where the Translate tool works. | ||
-- It works in the main namespace on Meta because it allows subpages there | -- It works in the main namespace on Meta because it allows subpages there | ||
Line 79: | Line 58: | ||
-- bug of Meta-Wiki. The work-around is to split the full title and then | -- bug of Meta-Wiki. The work-around is to split the full title and then | ||
-- get the last titlepart. | -- get the last titlepart. | ||
local subpage = title.subpageText | local subpage = mw.title.getCurrentTitle().subpageText | ||
--]] | --]] | ||
local titleparts = mw.text.split(mw.title.getCurrentTitle().fullText, '/') | |||
local subpage = titleparts[#titleparts] | |||
return this.checkLanguage(subpage, '') | |||
end | end | ||
--[[Get the | --[[Get the first part of the language code of the subpage, before the '-'. | ||
]] | ]] | ||
function this.getMainLanguageSubpage() | function this.getMainLanguageSubpage() | ||
parts = mw.text.split(this. | parts = mw.text.split( this.getLanguageSubpage(), '-' ) | ||
return parts[1] | return parts[1] | ||
end | end | ||
Line 101: | Line 74: | ||
--[[Get the last subpage of the current frame if it is a translation. | --[[Get the last subpage of the current frame if it is a translation. | ||
Not used locally. | Not used locally. | ||
]] | |||
function this.getFrameLanguageSubpage(frame) | function this.getFrameLanguageSubpage(frame) | ||
local titleparts = mw.text.split(frame:getParent():getTitle(), '/') | |||
local subpage = titleparts[#titleparts] | |||
return this.checkLanguage(subpage, '') | |||
end | end | ||
--[[Get the language of the current page. Not used locally. | --[[Get the language of the current page. | ||
Not used locally. | |||
]] | |||
function this.getLanguage() | function this.getLanguage() | ||
local subpage = mw.title.getCurrentTitle().subpageText | local subpage = mw.title.getCurrentTitle().subpageText | ||
Line 113: | Line 89: | ||
end | end | ||
--[[Get the language of the current frame. Not used locally. | --[[Get the language of the current frame. | ||
Not used locally. | |||
]] | |||
function this.getFrameLanguage(frame) | function this.getFrameLanguage(frame) | ||
local titleparts = mw.text.split(frame:getParent():getTitle(), '/') | local titleparts = mw.text.split(frame:getParent():getTitle(), '/') | ||
Line 124: | Line 101: | ||
local message, title | local message, title | ||
local pagename = basepagename | local pagename = basepagename | ||
if (subpage or '') ~= '' then | if (subpage or '') ~= '' | ||
then | |||
pagename = pagename .. '/' .. subpage | pagename = pagename .. '/' .. subpage | ||
end | end | ||
Line 134: | Line 112: | ||
message = msg | message = msg | ||
end) | end) | ||
if valid and title ~= nil and (title.id or 0) ~= 0 then | if valid and title ~= nil and (title.id or 0) ~= 0 | ||
then | |||
return title | return title | ||
end | end | ||
Line 152: | Line 131: | ||
problem of self-recursion in TNT when translatable templates need themselves | problem of self-recursion in TNT when translatable templates need themselves | ||
to transclude other translable templates (such as Tnavbar). | to transclude other translable templates (such as Tnavbar). | ||
]] | |||
function this.getTranslatedTemplate(frame, withStatus) | function this.getTranslatedTemplate(frame, withStatus) | ||
local args = frame.args | local args = frame.args | ||
local pagename = args['template'] | local pagename = args['template'] | ||
--[[Check whether the pagename is actually in the Template namespace, or | --[[Check whether the pagename is actually in the Template namespace, or | ||
if we're transcluding a main-namespace page. | if we're transcluding a main-namespace page. | ||
(added for backward compatibility of Template:TNT) | (added for backward compatibility of Template:TNT) | ||
]] | ]] | ||
local namespace | local title | ||
if namespace ~= '' | local namespace = args['tntns'] or '' | ||
if (namespace ~= '') -- Checks for tntns parameter for custom ns. | |||
then | |||
title = this.title(namespace, pagename) -- Costly | title = this.title(namespace, pagename) -- Costly | ||
else -- Supposes that set page is in ns10. | else -- Supposes that set page is in ns10. | ||
namespace = 'Template' | namespace = 'Template' | ||
title = this.title(namespace, pagename) -- Costly | title = this.title(namespace, pagename) -- Costly | ||
if title.id == nil then -- not found in the Template namespace, assume the main namespace (for backward compatibility) | if title.id == nil | ||
then -- not found in the Template namespace, assume the main namespace (for backward compatibility) | |||
namespace = '' | namespace = '' | ||
title = this.title(namespace, pagename) -- Costly | title = this.title(namespace, pagename) -- Costly | ||
end | end | ||
end | end | ||
-- Get the last subpage and check if it matches a known language code. | -- Get the last subpage and check if it matches a known language code. | ||
local subpage = args['uselang'] or '' | local subpage = args['uselang'] or '' | ||
if subpage == '' then | if (subpage == '') | ||
subpage = this. | then | ||
subpage = this.getLanguageSubpage() | |||
end | end | ||
if subpage == '' then | if (subpage == '') | ||
then | |||
-- Check if a translation of the pagename exists in English | -- Check if a translation of the pagename exists in English | ||
local newtitle = this.title(namespace, pagename, 'en') -- Costly | local newtitle = this.title(namespace, pagename, 'en') -- Costly | ||
-- Use the translation when it exists | -- Use the translation when it exists | ||
if newtitle.id ~= nil then | if newtitle.id ~= nil | ||
then | |||
title = newtitle | title = newtitle | ||
end | end | ||
Line 186: | Line 173: | ||
-- Check if a translation of the pagename exists in that language | -- Check if a translation of the pagename exists in that language | ||
local newtitle = this.title(namespace, pagename, subpage) -- Costly | local newtitle = this.title(namespace, pagename, subpage) -- Costly | ||
if newtitle.id == nil then | if newtitle.id == nil | ||
then | |||
-- Check if a translation of the pagename exists in English | -- Check if a translation of the pagename exists in English | ||
newtitle = this.title(namespace, pagename, 'en') -- Costly | newtitle = this.title(namespace, pagename, 'en') -- Costly | ||
end | end | ||
-- Use the translation when it exists | -- Use the translation when it exists | ||
if newtitle.id ~= nil then | if newtitle.id ~= nil | ||
then | |||
title = newtitle | title = newtitle | ||
end | end | ||
Line 215: | Line 204: | ||
to return only the effective template name to expand externally, with | to return only the effective template name to expand externally, with | ||
template parameters also provided externally. | template parameters also provided externally. | ||
]] | |||
function this.renderTranslatedTemplate(frame) | function this.renderTranslatedTemplate(frame) | ||
local title, found = this.getTranslatedTemplate(frame, true) | local title, found = this.getTranslatedTemplate(frame, true) | ||
Line 226: | Line 215: | ||
return '[[' .. title .. ']]' | return '[[' .. title .. ']]' | ||
end | end | ||
-- Copy args pseudo-table to a proper table so we can feed it to expandTemplate. | -- Copy args pseudo-table to a proper table so we can feed it to expandTemplate. | ||
-- Then render the pagename. | -- Then render the pagename. | ||
Line 231: | Line 221: | ||
local pargs = (frame:getParent() or {}).args | local pargs = (frame:getParent() or {}).args | ||
local arguments = {} | local arguments = {} | ||
if (args['noshift'] or '') == '' then | if (args['noshift'] or '') == '' | ||
then | |||
for k, v in pairs(pargs) do | for k, v in pairs(pargs) do | ||
-- numbered args >= 1 need to be shifted | |||
local n = tonumber(k) or 0 | local n = tonumber(k) or 0 | ||
if n | if (n > 0) | ||
then | |||
if (n >= 2) | |||
then | |||
arguments[n - 1] = v | |||
end | |||
else | |||
arguments[k] = v | arguments[k] = v | ||
end | end | ||
end | end | ||
Line 250: | Line 246: | ||
arguments['uselang'] = args['uselang'] -- argument forwarded into parent frame | arguments['uselang'] = args['uselang'] -- argument forwarded into parent frame | ||
arguments['noshift'] = args['noshift'] -- argument forwarded into parent frame | arguments['noshift'] = args['noshift'] -- argument forwarded into parent frame | ||
return frame:expandTemplate{title = ':' .. title, args = arguments} | return frame:expandTemplate{title = ':' .. title, args = arguments} | ||
end | end | ||
Line 257: | Line 254: | ||
localized but at least TemplateSandbox substitutions will work properly. | localized but at least TemplateSandbox substitutions will work properly. | ||
Won't work with complex uses. | Won't work with complex uses. | ||
]] | |||
function this.mockTNT(frame) | function this.mockTNT(frame) | ||
local pargs = (frame:getParent() or {}).args | local pargs = (frame:getParent() or {}).args | ||
local arguments = {} | local arguments = {} | ||
for k, v in pairs(pargs) do | for k, v in pairs(pargs) do | ||
-- numbered args >= 1 need to be shifted | |||
local n = tonumber(k) or 0 | local n = tonumber(k) or 0 | ||
if n | if (n > 0) | ||
then | |||
if (n >= 2) | |||
then | |||
arguments[n - 1] = v | |||
end | |||
else | |||
arguments[k] = v | arguments[k] = v | ||
end | end | ||
end | end | ||
if not pargs[1] then | if not pargs[1] | ||
then | |||
return '' | return '' | ||
end | end |