<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.seulengroupe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATranslation</id>
	<title>Module:Translation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.seulengroupe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATranslation"/>
	<link rel="alternate" type="text/html" href="https://www.seulengroupe.com/index.php?title=Module:Translation&amp;action=history"/>
	<updated>2026-04-18T18:54:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://www.seulengroupe.com/index.php?title=Module:Translation&amp;diff=648&amp;oldid=prev</id>
		<title>pzwiki&gt;Faalagorn: Add Vietnamese</title>
		<link rel="alternate" type="text/html" href="https://www.seulengroupe.com/index.php?title=Module:Translation&amp;diff=648&amp;oldid=prev"/>
		<updated>2026-02-04T09:03:21Z</updated>

		<summary type="html">&lt;p&gt;Add Vietnamese&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Args = require(&amp;#039;Module:Args&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local TranslationCache = nil -- caches translations from getPageTable()&lt;br /&gt;
&lt;br /&gt;
-- language codes&lt;br /&gt;
local languages = {&lt;br /&gt;
    af = true,          -- Afrikaans&lt;br /&gt;
    ca = true,          -- Catalan&lt;br /&gt;
    cs = true,          -- Czech&lt;br /&gt;
    de = true,          -- German&lt;br /&gt;
    es = true,          -- Spanish&lt;br /&gt;
    fr = true,          -- French&lt;br /&gt;
    hu = true,          -- Hungarian&lt;br /&gt;
    it = true,          -- Italian&lt;br /&gt;
    ja = true,          -- Japanese&lt;br /&gt;
    ko = true,          -- Korean&lt;br /&gt;
    nl = true,          -- Dutch&lt;br /&gt;
    no = true,          -- Norwegian&lt;br /&gt;
    pl = true,          -- Polish&lt;br /&gt;
    pt = true,          -- Portuguese&lt;br /&gt;
    [&amp;quot;pt-br&amp;quot;] = true,   -- Brazilian Portuguese&lt;br /&gt;
    ru = true,          -- Russian&lt;br /&gt;
    th = true,          -- Thai&lt;br /&gt;
    tr = true,          -- Turkish&lt;br /&gt;
    uk = true,          -- Ukrainian&lt;br /&gt;
    vi = true,          -- Vietnamese&lt;br /&gt;
    [&amp;quot;zh-hans&amp;quot;] = true, -- Chinese (Simplified)&lt;br /&gt;
    [&amp;quot;zh-hant&amp;quot;] = true  -- Chinese (Traditional)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- returns the languages table&lt;br /&gt;
function p.getLanguages()&lt;br /&gt;
    return languages&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- checks if a language code exists&lt;br /&gt;
function p.langExist(frame)&lt;br /&gt;
    local args = Args.getArgs(frame)&lt;br /&gt;
    local lang = Args.get(args[1])&lt;br /&gt;
    return (lang and languages[string.lower(lang)]) and &amp;#039;true&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- lists all the languages with a configurable output&lt;br /&gt;
function p.listLanguages(frame)&lt;br /&gt;
    local args = frame and frame.args or {}&lt;br /&gt;
    local wrap = args.wrap&lt;br /&gt;
    local mode = args.mode or &amp;#039;sep&amp;#039;&lt;br /&gt;
    local sep = args.sep or &amp;#039;, &amp;#039;&lt;br /&gt;
&lt;br /&gt;
    local f = (frame and frame.preprocess) and frame or mw.getCurrentFrame()&lt;br /&gt;
&lt;br /&gt;
    local list = {}&lt;br /&gt;
    for code in pairs(languages) do&lt;br /&gt;
        local item&lt;br /&gt;
        if wrap and wrap ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            item = wrap&lt;br /&gt;
            item = item:gsub(&amp;quot;%%s&amp;quot;, code)&lt;br /&gt;
            local name = f:preprocess(&amp;quot;{{#language:&amp;quot; .. code .. &amp;quot;}}&amp;quot;)&lt;br /&gt;
            item = item:gsub(&amp;quot;%%lang%%&amp;quot;, name)&lt;br /&gt;
        else&lt;br /&gt;
            item = code&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(list, item)&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(list)&lt;br /&gt;
&lt;br /&gt;
    if mode == &amp;#039;list&amp;#039; then&lt;br /&gt;
        return &amp;#039;* &amp;#039; .. table.concat(list, &amp;#039;\n* &amp;#039;)&lt;br /&gt;
    else&lt;br /&gt;
        return table.concat(list, sep)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns the subpage of the current page if it&amp;#039;s a valid language code&lt;br /&gt;
-- core logic&lt;br /&gt;
function p._getLangSubpage(lang, slash)&lt;br /&gt;
    local code = string.lower(lang or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    if not languages[code] then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    elseif slash == false then&lt;br /&gt;
        return lang&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;/&amp;#039; .. lang&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
-- template wrapper&lt;br /&gt;
function p.getLangSubpage(frame)&lt;br /&gt;
    local args = Args.getArgs(frame)&lt;br /&gt;
    local raw1 = args[1]&lt;br /&gt;
    &lt;br /&gt;
    -- legacy noslash for backwards compatibility&lt;br /&gt;
    local isLegacyNoSlash = (type(raw1) == &amp;#039;string&amp;#039; and raw1:lower() == &amp;#039;noslash&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- determine language&lt;br /&gt;
    local lang = isLegacyNoSlash and mw.title.getCurrentTitle().subpageText or Args.get(raw1, mw.title.getCurrentTitle().subpageText)&lt;br /&gt;
    &lt;br /&gt;
    -- determine slash&lt;br /&gt;
    local slash&lt;br /&gt;
    if isLegacyNoSlash then&lt;br /&gt;
        slash = false&lt;br /&gt;
    elseif args.slash ~= nil then&lt;br /&gt;
    	slash = args.slash ~= false -- default true unless explicitly &amp;quot;false&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        slash = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p._getLangSubpage(lang, slash)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- generates a link, linking to the appropriate language subpage&lt;br /&gt;
-- core logic&lt;br /&gt;
function p._makeLink(page, label, lang, section)&lt;br /&gt;
    local code = string.lower(lang or &amp;#039;&amp;#039;)&lt;br /&gt;
    local suffix = languages[code] and (&amp;#039;/&amp;#039; .. lang) or &amp;#039;&amp;#039;&lt;br /&gt;
    local sectionPart = section and (&amp;#039;#&amp;#039; .. section) or &amp;#039;&amp;#039;&lt;br /&gt;
    local link = &amp;#039;[[&amp;#039; .. page .. suffix .. sectionPart&lt;br /&gt;
    if label then link = link .. &amp;#039;|&amp;#039; .. label end&lt;br /&gt;
    return link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
-- template wrapper&lt;br /&gt;
function p.makeLink(frame)&lt;br /&gt;
    local args = Args.getArgs(frame)&lt;br /&gt;
    local page    = Args.get(args[1], &amp;#039;&amp;#039;)&lt;br /&gt;
    local label   = Args.get(args[2])&lt;br /&gt;
    local lang    = Args.get(args[3])&lt;br /&gt;
    local section = Args.get(args[&amp;quot;#&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
    if not lang then&lt;br /&gt;
        local subpage = mw.title.getCurrentTitle().subpageText&lt;br /&gt;
        if languages[string.lower(subpage or &amp;#039;&amp;#039;)] then&lt;br /&gt;
            lang = subpage&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p._makeLink(page, label, lang, section)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- get a translation&lt;br /&gt;
-- NOTE: WIP DO NOT USE&lt;br /&gt;
function p.getTranslation(frame)&lt;br /&gt;
    local args = Args.getArgs(frame)&lt;br /&gt;
    local key = Args.get(args[1])&lt;br /&gt;
    local pageName = Args.get(args[2])&lt;br /&gt;
&lt;br /&gt;
    if not key then&lt;br /&gt;
        return &amp;#039;Missing key&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local tableData = p.getPageTable(pageName)&lt;br /&gt;
&lt;br /&gt;
    if tableData.error then&lt;br /&gt;
        return tableData.error&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return tableData[key] or &amp;#039;Missing translation: &amp;#039; .. key&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- get a page table in json format wrapped in: &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; ... &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-- NOTE: WIP DO NOT USE&lt;br /&gt;
function p.getPageTable(pageName)&lt;br /&gt;
    if TranslationCache then&lt;br /&gt;
        return TranslationCache&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    pageName = pageName or &amp;#039;User:Vaileasys/sandbox&amp;#039; --TODO: add a proper fallback page&lt;br /&gt;
&lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title then&lt;br /&gt;
        return { error = &amp;#039;Invalid page name.&amp;#039; }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content then&lt;br /&gt;
        return { error = &amp;#039;No content found or page does not exist.&amp;#039; }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- matches: &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; ... &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
    local raw = content:match(&amp;#039;&amp;lt;syntaxhighlight%s+lang=&amp;quot;json&amp;quot;%s*&amp;gt;(.-)&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;)&lt;br /&gt;
    if not raw then&lt;br /&gt;
        return { error = &amp;#039;No &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt; block found.&amp;#039; }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- remove trailing commas&lt;br /&gt;
    raw = raw:gsub(&amp;#039;,%s*}&amp;#039;, &amp;#039;}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    -- parse json format&lt;br /&gt;
    local parsed = mw.text.jsonDecode(raw)&lt;br /&gt;
    if not parsed or type(parsed) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
        return { error = &amp;#039;Failed to decode JSON.&amp;#039; }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    TranslationCache = parsed&lt;br /&gt;
    return parsed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>pzwiki&gt;Faalagorn</name></author>
	</entry>
</feed>