Difference between revisions of "Module:Template translation"
Jump to navigation
Jump to search
m
Module:Template translation (view source)
Revision as of 13:38, 28 December 2013
, 13:38, 28 December 2013no edit summary
>Seb35 (add some other "helper" functions and factorise one; I checked the code on a local wiki and here on Meta; the new functions can be used to autotranslate templates) |
>Verdy p m |
||
Line 1: | Line 1: | ||
local this = {} | local this = {} | ||
function this.checkLanguage(subpage, default) | |||
--[[Check first if there's an apostrophe, because they break the isKnownLanguageTag | |||
function. This test does not work with regexps, use plain search instead (no need | |||
to use Unicode parser, apostrophes can only appear isolated as one byte in UTF-8). | |||
]] | |||
if (string.find(subpage, "'", 1, true) == nil) | |||
then | |||
-- Return the subpage only if it is a valid language code. | |||
if (mw.language.isKnownLanguageTag(subpage)) | |||
then | |||
return subpage | |||
end | |||
end | |||
-- Otherwise there's currently no known language subpage | |||
return default | |||
end | |||
--[[Get the last subpage of the current page if it is a translation. | |||
]] | |||
function this.getLanguageSubpage() | function this.getLanguageSubpage() | ||
local subpage = mw.title.getCurrentTitle().subpageText | local subpage = mw.title.getCurrentTitle().subpageText | ||
return this.checkLanguage(subpage,'') | return this.checkLanguage(subpage, '') | ||
end | end | ||
--[[Get the last subpage of the current frame if it is a translation. | |||
Not used locally. | |||
]] | |||
function this.getFrameLanguageSubpage(frame) | function this.getFrameLanguageSubpage(frame) | ||
local titleparts = mw.text.split(frame:getParent():getTitle(), '/') | |||
local titleparts = mw.text.split(frame:getParent():getTitle(),'/') | |||
local subpage = titleparts[#titleparts] | local subpage = titleparts[#titleparts] | ||
return this.checkLanguage(subpage,'') | return this.checkLanguage(subpage, '') | ||
end | end | ||
--[[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 | ||
return this.checkLanguage(subpage,mw.language.getContentLanguage():getCode()) | return this.checkLanguage(subpage, mw.language.getContentLanguage():getCode()) | ||
end | end | ||
--[[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(),'/') | |||
local subpage = titleparts[#titleparts] | local subpage = titleparts[#titleparts] | ||
return this.checkLanguage(subpage,mw.language.getContentLanguage():getCode()) | return this.checkLanguage(subpage, mw.language.getContentLanguage():getCode()) | ||
end | end | ||
function this. | --[[If on a translation subpage (like Foobar/de), this function renders | ||
--[[Check | a given template in the same language, if the translation is available. | ||
Otherwise, the template is rendered in its default language, without | |||
modification. | |||
This is aimed at replacing the current implementation of Template:TNT. | |||
]] | |||
function this.renderTranslatedTemplate(frame) | |||
local args = frame.args | |||
local pagename = args['template'] | |||
--[[Check whether the pagename is actually in the Template namespace, or | |||
if we're transcluding a main-namespace page. | |||
(added for backward compatibility of Template:TNT) | |||
]] | ]] | ||
if ( | local namespace = 'Template' | ||
if (args['namespace'] ~= '') -- Checks for namespace parameter for custom ns. | |||
then | |||
namespace = args['namespace'] | |||
else -- Supposes that set page is in ns10. | |||
local templateFullTitle = mw.title.new(pagename, namespace) -- Costly | |||
if (templateFullTitle.id == 0) | |||
then -- not found in the Template namespace, assume the main namespace | |||
namespace = '' | |||
end | |||
end | |||
-- Get the last subpage and check if it matches a known language code. | |||
local langcode = 'en' -- Default language subpage to render. | |||
local subpage = this.getLanguageSubpage() | |||
if (subpage ~= '') | |||
then | then | ||
-- | -- Check if a translation of the pagename exists in that language; if so, put it in langcode | ||
local translation = mw.title.new(pagename .. '/' .. subpage, namespace) -- Costly | |||
if (translation.id ~= 0) | |||
then | then | ||
langcode = subpage | |||
end | |||
end | |||
-- Copy args pseudo-table to a proper table so we can feed it to expandTemplate. | |||
-- Then render the pagename. | |||
local arguments = {} | |||
for k, v in pairs((frame:getParent() or {}).args) do | |||
-- numbered args >= 1 need to be shifted | |||
local n = tonumber(k) or 0 | |||
if (n > 0) | |||
then | |||
if (n >= 2) | |||
then | |||
arguments[n - 1] = v | |||
end | |||
else | |||
arguments[k] = v | |||
end | end | ||
end | end | ||
return frame:expandTemplate{title = namespace .. ':' .. pagename .. '/' .. langcode, args = arguments} | |||
end | end | ||
Line 50: | Line 115: | ||
This is aimed at replacing the current implementation of Template:TNT. | This is aimed at replacing the current implementation of Template:TNT. | ||
]] | ]] | ||
function this.renderTranslatedTemplateDebug(frame) | |||
local args = frame.args | |||
local pagename = args['template'] | |||
--[[Check whether the pagename is actually in the Template namespace, or | |||
if we're transcluding a main-namespace page. | |||
(added for backward compatibility of Template:TNT) | |||
]] | |||
local title | |||
local namespace = args['namespace'] or '' | |||
if (namespace ~= '') -- Checks for namespace parameter for custom ns. | |||
then | |||
title = mw.title.new(pagename, namespace) -- Costly | |||
else -- Supposes that set page is in ns10. | |||
title = mw.title.new(pagename, 'Template') -- Costly | |||
if (title.id == 0) | |||
then -- not found in the Template namespace, assume the main namespace (for backward compatibility) | |||
namespace = '' | |||
title = mw.title.new(pagename, namespace) -- Costly | |||
end | |||
end | |||
-- Get the last subpage and check if it matches a known language code. | |||
local langcode = 'en' -- Default language subpage to render. | |||
local subpage = this.getLanguageSubpage() | |||
if (subpage ~= '') | |||
then | |||
-- Check if a translation of the pagename exists in that language; if so, put it in langcode | |||
local title = mw.title.new(title.prefixedText .. '/' .. subpage) -- Costly | |||
if (title.id == 0) | |||
then | |||
langcode = subpage | |||
end | |||
end | |||
-- Copy args pseudo-table to a proper table so we can feed it to expandTemplate. | |||
-- Then render the pagename. | |||
local arguments = {} | |||
for k, v in pairs((frame:getParent() or {}).args) do | |||
-- numbered args >= 1 need to be shifted | |||
local n = tonumber(k) or 0 | |||
if (n > 0) | |||
then | |||
if (n >= 2) | |||
then | |||
arguments[n - 1] = v | |||
end | |||
else | |||
arguments[k] = v | |||
end | |||
end | |||
return frame:expandTemplate{title = title, args = arguments} | |||
-- return frame:expandTemplate{title = namespace .. ':' .. pagename .. '/' .. langcode, args = arguments} | |||
end | |||
function this.renderTranslatedTemplate(frame) | function this.renderTranslatedTemplate(frame) | ||
local template = frame.args['template'] | local template = frame.args['template'] |