Jump to content
Toggle menu
  • 8 articles
  • 75 files
  • 7 users
  • 37.8K edits
Neodyland Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Multilingual description: Difference between revisions

From Neodyland Wiki
ko-kp is supported
remapped unsupported codes will now be tracked in category of "legacy languages codes" only when they conflict with another definition for the supported code to reduce maintenance
Line 92: Line 92:
     args = descriptions
     args = descriptions
     descriptions = {}
     descriptions = {}
    -- Remap legacy language codes if there's no conflict
     local remapped = false
     local remapped = false
     for cur, alt in pairs(remappedLanguages) do
     for cur, alt in pairs(remappedLanguages) do
         if args[cur] and not(mw.language.isSupportedLanguage(cur) and mw.language.isKnownLanguageTag(cur))
         if args[cur] and not(mw.language.isSupportedLanguage(cur) and mw.language.isKnownLanguageTag(cur))
                 and (mw.language.isSupportedLanguage(alt) and mw.language.isKnownLanguageTag(alt)) then
                 and (mw.language.isSupportedLanguage(alt) and mw.language.isKnownLanguageTag(alt)) then
            remapped = true
             if args[alt] == nil then -- only if this does not conflict
             if args[alt] == nil then -- only if this does not conflict
                 args[alt] = args[cur] -- set key for alternate known language
                 args[alt] = args[cur] -- set key for alternate known language
            else
                remapped = true -- signal only in case of conflict (legacy translation is discarded)
             end
             end
             args[cur] = nil -- unset the standard unknown key
             args[cur] = nil -- unset the standard unknown key
Line 155: Line 157:
         ro = 'RO',
         ro = 'RO',
         ['be-tarask'] = 'BE-TARASK',
         ['be-tarask'] = 'BE-TARASK',
        ['be-x-old'] = 'BE-X-OLD (deprecated)',
         dv = 'DV',
         dv = 'DV',
     }
     }
Line 169: Line 172:
     addDescription(expect, 'ro', 'RO') --[[română]]
     addDescription(expect, 'ro', 'RO') --[[română]]
     addDescription(expect, 'be-tarask', 'BE-TARASK') --[[беларуская (тарашкевіца)]]
     addDescription(expect, 'be-tarask', 'BE-TARASK') --[[беларуская (тарашкевіца)]]
    -- addDescription(expect, 'be-x-old', 'BE-X-OLD (deprecated)') --[[беларуская (тарашкевіца)]] -- discarded due to conflict
     addDescription(expect, 'rue', 'RUE') --[[русиньскый]]
     addDescription(expect, 'rue', 'RUE') --[[русиньскый]]
     addDescription(expect, 'ru', 'RU') --[[русский]]
     addDescription(expect, 'ru', 'RU') --[[русский]]

Revision as of 05:35, 10 March 2020

Module documentation[ create · purge ]
local p = {}

--[==[
  Remap some "valid" language codes that are still unknown, but are known by another code
  in order to get a visible language name (and if possible, BCP47 conformance)!
--]==]
local remappedLanguages = {
    ['als'] = 'gsw', -- legacy broken codes (but known) to changed new code (also known, but conforming to BCP47); 'als' on Wikimedia for Norman conflicts with the standard 'als' which actually refers to an unrelated Albanian language
    ['bat-smg'] = 'sgs', -- legacy interwiki still supported, newer conforming code now supported as well in interwiki
    ['be-x-old'] = 'be-tarask', -- legacy interwiki still supported, newer conforming code now supported as well in interwiki
    ['bh'] = 'bho', -- legacy interwiki still supported but ambiguous as a family, newer code now supported as well in interwiki
    ['bu'] = 'my', -- legacy code from ISO 639 deprecated, newer code is prefered and used as interwiki
    ['fiu-vro'] = 'vro', -- legacy interwiki still supported, newer conforming code now supported as well in interwiki
    ['nrm'] = 'nrf', -- legacy broken codes (but known) to changed new code (also known, but conforming to BCP47); 'nrm' on Wikimedia for Norman conflicts with the standard 'nrm' which actually refers to an unrelated Narom language
    ['roa-rup'] = 'rup', -- code not conforming to BCP47 (legacy interwiki still supported, newer code supported as well), the new standard code should be used (and is now recognized as interwiki)
    ['roa-tara'] = 'nap-taran', -- code not conforming to BCP47 (continental variant of Napolitan), should be replaced by a conforming variant code
    ['simple'] = 'en', -- code not conforming to BCP47 (stylistic subset of standard English)
    ['zh-classical'] = 'lzh', -- code not conforming to BCP47, replaced by standard code also supported in interwiki
    ['zh-min-nan'] = 'nan', -- legacy BCP 47 code, valid but deprecated in favor of new code also supporte in interwiki
    ['zh-wuu'] = 'wuu', -- legacy BCP 47 code, valid but deprecated in favor of new code also supporte in interwiki
    ['zh-yue'] = 'yue', -- legacy BCP 47 code, valid but deprecated in favor of new code also supporte in interwiki

    -- standard BCP 47 codes that can still not be used in MediaWiki, and must be replaced for now by valid BCP 47 codes (ignoring the specific variant)

    ['en-us'] = 'en', -- both codes are conforming and supported, only the second one is known (there's no support for the US variant which is implicit, unlike variants in CA, GB, IN, ZA)
    ['fa-af'] = 'fa', -- both codes are conforming and supported, only the second one is known, actually means "Eastern Dari"
    ['fr-x-galo'] = 'fr', -- both codes are conforming and supported, only the second one is known
    ['ha-latn'] = 'ha', -- both codes are conforming and supported, only the second one is known, the Latin script is the default since the 1950's.
    ['ha-arab'] = 'ha', -- both codes are conforming and supported, only the second one is known, the Arabic script is historic, without clear orthography
    ['ko-kr'] = 'ko', -- both codes are conforming and supported, only the second one is known, regional variant used in South Korea (kr-kp for the variant in North Korea is supported)
    ['ku-latn'] = 'ku', -- both codes are conforming and supported, only the second one is known, the Latin script is the default since the 1950's
    ['ku-cyrl'] = 'ku', -- both codes are conforming and supported, only the second one is known, the Cyrillic script is still used
    ['no'] = 'nb', -- both codes are conforming and supported, but the 1st one is now used only for meaning the second one in MediaWiki
    ['prd'] = 'fa', -- both codes are conforming and supported, only the second one is known, prd is "Parsi-Dari"
    ['tgl'] = 'tl', -- both codes are conforming and supported, only the second one is known (but may have alternate forms written in the Tagal script and not Latin for modern Filipino)

    -- standard BCP 47 codes for variants that can still not be used in MediaWiki, and must be replaced for now by legacy codes, valid only in Wikimedia wikis but not conforming to BCP 47

    ['sr-cyrl'] = 'sr-ec', -- this alternate known code is non-standard and in fact not supported, but has a correct native name
    ['sr-latn'] = 'sr-el', -- same remark
}

-- kind is either 'deprecated' or 'unsupported'
local function addTracking(descriptions, kind)
    local categorize
    if kind == 'deprecated' then
        categorize = ' using deprecated language codes'
    else
        categorize = ' using unsupported language codes'
    end
    table.insert(descriptions, '[[Category:Multilingual descriptions' .. categorize .. ']]')
end

local sortedKnownLanguageTags = require('Module:Multilingual description/sort')
local dir = require('Module:Dir').select
local function addDescription(descriptions, lang, description, update)
    if type(description) == 'string' then
        if mw.text.trim(description):len() > 0 then
            table.insert(descriptions, mw.getCurrentFrame():expandTemplate{
                title = 'Ls',
                args = {
                    lang,
                    description,
                    dir = dir(lang, 'rtl', 'ltr'),
                    classes = 'description',
                    update = update
                }
            })
        end
    end
end

local function _mld(args)
    -- Shallow copy of arguments (because keys in args cannot be unset if args is hollow, in a parent frame outside Lua)
    -- DO NOT copy the metatable that exposes only a *read-only* interface with accessors to PHP arrays (mw.clone does NOT work)!
    local descriptions = {}
    for lang, description in pairs(args) do
        if type(lang) == 'string' and type(description) == 'string' then
            -- MediaWiki trims the names of named argument and their values, but does not remove HTML comments in these names
            -- (some Mld contain parameters like "| sk <!--Slovensko--> = ...") or "nowiki" tags.
            -- After removing them, we still need to trim the rest.
            lang = lang
                :gsub('<!%-%-.-%-%->', '')
                :gsub('<nowiki *>', ''):gsub('</nowiki *>', ''):gsub('<nowiki */>', '')
                :gsub('^%s*(.-)%s*$','%1')
            descriptions[lang] = description
                :gsub('<!%-%-.-%-%->', '')
                :gsub('<nowiki *>', ''):gsub('</nowiki *>', ''):gsub('<nowiki */>', '')
                :gsub('^%s*(.-)%s*$','%1')
        end
    end
    args = descriptions
    descriptions = {}
    -- Remap legacy language codes if there's no conflict
    local remapped = false
    for cur, alt in pairs(remappedLanguages) do
        if args[cur] and not(mw.language.isSupportedLanguage(cur) and mw.language.isKnownLanguageTag(cur))
                and (mw.language.isSupportedLanguage(alt) and mw.language.isKnownLanguageTag(alt)) then
            if args[alt] == nil then -- only if this does not conflict
                args[alt] = args[cur] -- set key for alternate known language
            else
                remapped = true -- signal only in case of conflict (legacy translation is discarded)
            end
            args[cur] = nil -- unset the standard unknown key
        end
    end
    -- First all known languages in order if they have description
    for _, lang in ipairs(sortedKnownLanguageTags) do
        if args[lang] ~= nil then
            addDescription(descriptions, lang, args[lang], nil)
            args[lang] = nil
        end
    end
    -- Append other unknown languages, but only if they are supported
    local unsupported = false
    for lang, description in pairs(args) do
        if mw.language.isSupportedLanguage(lang) then
            addDescription(descriptions, lang, description, nil)
        else
            addDescription(descriptions, lang, description, lang)
            unsupported = true
        end
    end
    if remapped then
        addTracking(descriptions, 'deprecated')
    end
    if unsupported then
        addTracking(descriptions, 'unsupported')
    end
--mw.logObject(descriptions)
    return table.concat(descriptions)
end

function p.mld(frame)
    local args = (frame:getParent() or {}).args or {}
    return _mld(args)
end

setmetatable(p, {quickTests = function()
    local input = {
        [1] = 'One?', -- discarded
        unsupported = 'What?', -- unsupported
        en = ' ', -- empty description after trimming (discarded)
        als = 'GSW', -- will be remapped
        ['en-gb '] = 'EN-GB', -- trimming at end
        ['en-ca <nowiki/>'] = 'EN-CA',
        [' de'] = 'DE', -- trimming at start
        [' fr '] = 'FR', -- trimming both ends
        rue = 'RUE',
        ru = 'RU',
        ko = 'KO',
        ja = 'JA',
        zh = 'ZH',
        he = 'HE',
        ur = 'UR',
        ar = 'AR',
        ro = 'RO',
        ['be-tarask'] = 'BE-TARASK',
        ['be-x-old'] = 'BE-X-OLD (deprecated)',
        dv = 'DV',
    }
    local expect = {}
    --[=[
    This is the exact order to expect according to native language names,
    and after discarding empty descriptions or unsupported language codes.
    --]=]
    addDescription(expect, 'gsw', 'GSW') --[[Alemannisch]] -- remapped
    addDescription(expect, 'en-gb', 'EN-GB') --[[British English]]
    addDescription(expect, 'en-ca', 'EN-CA') --[[Canadian English]]
    addDescription(expect, 'de', 'DE') --[[Deutsch]]
    addDescription(expect, 'fr', 'FR') --[[français]]
    addDescription(expect, 'ro', 'RO') --[[română]]
    addDescription(expect, 'be-tarask', 'BE-TARASK') --[[беларуская (тарашкевіца)]]
    -- addDescription(expect, 'be-x-old', 'BE-X-OLD (deprecated)') --[[беларуская (тарашкевіца)]] -- discarded due to conflict
    addDescription(expect, 'rue', 'RUE') --[[русиньскый]]
    addDescription(expect, 'ru', 'RU') --[[русский]]
    addDescription(expect, 'ko', 'KO') --[[한국어]]
    addDescription(expect, 'ja', 'JA') --[[日本語]]
    addDescription(expect, 'zh', 'ZH') --[[中文]]
    addDescription(expect, 'he', 'HE') --[[עברית]]
    addDescription(expect, 'ur', 'UR') --[[اردو]]
    addDescription(expect, 'ar', 'AR') --[[العربية]]
    addDescription(expect, 'dv', 'DV') --[[ދިވެހިބަސް]]
    addDescription(expect, 'unsupported', 'What?', 'unsupported')
    addTracking(expect, 'deprecated')
    addTracking(expect, 'unsupported')
    expect = table.concat(expect)
    local actual = _mld(input)
    if (actual ~= expect) then
        mw.log('expect:\n' .. expect)
        mw.log('actual:\n' .. actual)
        return false
    end
    return true
end})
--[==[ Type this to run tests in the Lua console:
=getmetatable(p).quickTests() -- should return true
--]==]
return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.