Difference between revisions of "Module:Template translation"

m
no 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()
    -- Get the last subpage of the current page if it is a translation
     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)
    -- Get the last subpage of the current frame if it is a translation
     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()
    -- Get the language of the current page
     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)
    -- Get the language of the current 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.checkLanguage(subpage,default)
--[[If on a translation subpage (like Foobar/de), this function renders
     --[[Check first if there's an apostrophe, because they break the isKnownLanguageTag
    a given template in the same language, if the translation is available.
         function. This test does not work with regexps, use plain search instead (no need
    Otherwise, the template is rendered in its default language, without
         to use Unicode parser, apostrophes can only appear isolated as one byte in UTF-8).
    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 (string.find(subpage, "'", 1, true) == nil)
    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
         -- Return the subpage only if it is a valid language code.
         -- Check if a translation of the pagename exists in that language; if so, put it in langcode
         if (mw.language.isKnownLanguageTag(subpage))
         local translation = mw.title.new(pagename .. '/' .. subpage, namespace) -- Costly
        if (translation.id ~= 0)
         then
         then
             return subpage
             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
     -- Otherwise there's currently no known language subpage
     return frame:expandTemplate{title = namespace .. ':' .. pagename .. '/' .. langcode, args = arguments}
    return default
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']
Anonymous user