Module:Template translation: Difference between revisions
From Test Wiki
Content deleted Content added
m 1 revision imported: https://www.mediawiki.org/wiki/Special:Export/Template:Done |
m 1 revision imported |
||
| (3 intermediate revisions by 3 users not shown) | |||
| 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 |
||
| ⚫ | |||
* 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 ~= "buttons" |
|||
and subpage ~= "sandbox" |
and subpage ~= "sandbox" |
||
and subpage ~= "testcase" |
|||
and subpage ~= "testcases" |
and subpage ~= "testcases" |
||
and string.find(subpage, "^[%l][%-%d%l]*[%d%l]$") ~= nil |
|||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
return subpage |
return subpage |
||
end |
end |
||
| Line 43: | Line 45: | ||
end |
end |
||
--[[Get the last subpage of |
--[[Get the last subpage of an arbitrary page if it is a translation. |
||
To be used from templates. |
|||
]] |
]] |
||
function this.getLanguageSubpage() |
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. |
|||
| ⚫ | |||
| ⚫ | |||
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( |
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()) |
|||
local subpage = titleparts[#titleparts] |
|||
return this.checkLanguage(subpage, '') |
|||
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. |
||
--]] |
|||
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 |
||
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 |
||
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 (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 |
if title.id == nil then -- not found in the Template namespace, assume the main namespace (for backward compatibility) |
||
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 |
||
| ⚫ | |||
then |
|||
| ⚫ | |||
end |
end |
||
if |
if subpage == '' then |
||
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 |
||
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 |
||
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 |
||
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 |
||
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 |
||
then |
|||
| ⚫ | |||
| ⚫ | |||
arguments[n - 1] = v |
|||
end |
|||
else |
|||
arguments[k] = v |
arguments[k] = v |
||
elseif n >= 2 then -- numbered args >= 2 need to be shifted |
|||
| ⚫ | |||
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 |
||
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] |
if not pargs[1] then |
||
then |
|||
return '' |
return '' |
||
end |
end |
||