Module:Template translation: Difference between revisions
Jump to navigation
Jump to search
m (1 revision imported: https://www.mediawiki.org/wiki/Special:Export/Template:Done) |
m (Changed protection settings for "Module:Template translation": High-risk template or module (more info) ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))) |
||
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 tags | ||
* for specific uses in template subpages and unusable as language tags; | |||
* 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 more than 8 characters between hyphens; | * or that has subtags with more than 8 characters between hyphens; | ||
* or that has two hyphens | * or that has two hyphens. | ||
--]] | --]] | ||
or | or subpage ~= "doc" | ||
and subpage ~= "layout" | and subpage ~= "layout" | ||
and subpage ~= "button" | |||
and subpage ~= "buttons" | |||
and subpage ~= "sandbox" | and subpage ~= "sandbox" | ||
and subpage ~= "testcase" | |||
and subpage ~= "testcases" | and subpage ~= "testcases" | ||
then | and 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 then | |||
return subpage | return subpage | ||
end | end | ||
Line 43: | Line 45: | ||
end | end | ||
--[[Get the last subpage of the | --[[Get the last subpage of an arbitrary page if it is a translation. | ||
To be used from templates. | |||
]] | |||
function this.getLanguageSubpage(frame) | |||
local title = frame and frame.args[1] | |||
if not title or title == '' then | |||
title = mw.title.getCurrentTitle() | |||
end | |||
return this._getLanguageSubpage(title) | |||
end | |||
--[[Get the last subpage of an arbitrary page if it is a translation. | |||
To be used from Lua. | |||
]] | ]] | ||
function this. | function this._getLanguageSubpage(title) | ||
if type(title) == 'string' then | |||
title = mw.title.new(title) | |||
end | |||
if not title then | |||
-- invalid title | |||
return nil | |||
end | |||
--[[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 58: | Line 79: | ||
-- 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 = | local subpage = title.subpageText | ||
--]] | --]] | ||
local titleparts = mw.text.split(title.fullText, '/') | |||
local subpage = titleparts[#titleparts] | |||
return this.checkLanguage(subpage, '') | |||
end | |||
--[[Get the last subpage of the current page if it is a translation. | |||
]] | |||
function this.getCurrentLanguageSubpage() | |||
return this._getLanguageSubpage(mw.title.getCurrentTitle()) | |||
end | end | ||
--[[Get the first part of the language code of the subpage, before 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.getCurrentLanguageSubpage(), '-') | ||
return parts[1] | return parts[1] | ||
end | end | ||
Line 74: | Line 101: | ||
--[[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) | ||
return this._getLanguageSubpage(frame:getParent():getTitle()) | |||
end | end | ||
--[[Get the language of the current page. | --[[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 89: | Line 113: | ||
end | end | ||
--[[Get the language of the current frame. | --[[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 101: | Line 124: | ||
local message, title | local message, title | ||
local pagename = basepagename | local pagename = basepagename | ||
if (subpage or '') ~= '' | if (subpage or '') ~= '' then | ||
pagename = pagename .. '/' .. subpage | pagename = pagename .. '/' .. subpage | ||
end | end | ||
Line 112: | Line 134: | ||
message = msg | message = msg | ||
end) | end) | ||
if valid and title ~= nil and (title.id or 0) ~= 0 | if valid and title ~= nil and (title.id or 0) ~= 0 then | ||
return title | return title | ||
end | end | ||
Line 131: | Line 152: | ||
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 title | local namespace, title = args['tntns'] or '' | ||
if namespace ~= '' then -- Checks for tntns parameter for custom ns. | |||
if | |||
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 | 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 | if subpage == '' then | ||
subpage = this.getCurrentLanguageSubpage() | |||
subpage = this. | |||
end | end | ||
if | 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 | if newtitle.id ~= nil then | ||
title = newtitle | title = newtitle | ||
end | end | ||
Line 173: | Line 186: | ||
-- 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 | 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 | if newtitle.id ~= nil then | ||
title = newtitle | title = newtitle | ||
end | end | ||
Line 204: | Line 215: | ||
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 215: | Line 226: | ||
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 221: | Line 231: | ||
local pargs = (frame:getParent() or {}).args | local pargs = (frame:getParent() or {}).args | ||
local arguments = {} | local arguments = {} | ||
if (args['noshift'] or '') == '' | if (args['noshift'] or '') == '' then | ||
for k, v in pairs(pargs) do | for k, v in pairs(pargs) do | ||
local n = tonumber(k) or 0 | local n = tonumber(k) or 0 | ||
if | if n <= 0 then -- unnumbered args | ||
arguments[k] = v | arguments[k] = v | ||
elseif n >= 2 then -- numbered args >= 2 need to be shifted | |||
arguments[n - 1] = v | |||
end | end | ||
end | end | ||
Line 246: | Line 250: | ||
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 254: | Line 257: | ||
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 | ||
local n = tonumber(k) or 0 | local n = tonumber(k) or 0 | ||
if | if n <= 0 then -- unnumbered args | ||
arguments[k] = v | arguments[k] = v | ||
elseif n >= 2 then -- numbered args >= 2 need to be shifted | |||
arguments[n - 1] = v | |||
end | end | ||
end | end | ||
if not pargs[1] | if not pargs[1] then | ||
return '' | return '' | ||
end | end |