مندرجات کا رخ کریں

ماڈیول:Lang

آزاد دائرۃ المعارف، ویکیپیڈیا سے
Documentation icon دستاویز [تخلیق]
local p = {}
-- Ensure the data module exists at this path
local lang_data = require('Module:لغات/بيانات')

-- Helper function to clean up names
local function gsubname(temp, the)
    local fi
    if the and the ~= '' then
        local s = string.gsub(temp, " ", " ")
        s = "" .. s
        fi = s 
    else
        fi = temp 
    end
    return fi
end

-- Forward declaration of getname to allow LatnCyrl to call it
local getname

local function LatnCyrl(code, al, number, returnnil)
    code = code:lower()
    number = (number or 0) + 1
    local e = string.sub(code, -5)
    local s = string.gsub(code, e, '')
    local d = getname(s, '', number)
    local er
    if d and d ~= '' then
        if (e == '-latn' or e == '-cyrl' or e == '-arab') then
            local f = ''
            if e == '-latn' then f = 'لاطینی '
            elseif e == '-cyrl' then f = 'سیریلی '
            elseif e == '-arab' then f = 'عربی '
            end
            er = f .. d
        end
    end
    local co
    if returnnil and returnnil ~= '' then co = '' else co = code end
    if not er then return co else return gsubname(er, al) end
end

local function getcode(code)
    local s = string.gsub(code, ' ', '')
    for k, v in pairs(lang_data) do
        for i, r in pairs(v) do
            if (s == r or s == k) then 
                return v.name
            end
        end
    end
    return nil
end

-- Defining getname locally for internal use
getname = function(co, al, number, returnnil)
    number = (number or 0) + 1
    if number and number > 3 then return nil end
    if not co or co == '' then return '' end
    local code = string.gsub(co, ' ', '')
    local fi = ''
    if code and code ~= '' then
        local val = getcode(code) 
        if val and val ~= '' then 
            fi = gsubname(val, al)
        else
            fi = LatnCyrl(code, al, number, returnnil)
        end
    end
    return fi
end

-- Exporting getname to the public table p
p.getname = getname
p.getcode = getcode

local function goo(name)
    for ss, v in pairs(lang_data) do
        if (name == getname(ss, 't') or name == getname(ss, '')) then 
            return ss
        else
            for q, codee in pairs(v) do
                if (name == getname(codee, 't') or name == getname(codee, '')) then 
                    return codee
                elseif (name == getname(ss .. '-cyrl', 't') or name == getname(ss .. '-cyrl', '')) then 
                    return ss .. '-cyrl'
                elseif (name == getname(ss .. '-latn', 't') or name == getname(ss .. '-latn', '')) then 
                    return ss .. '-latn'
                elseif (name == getname(ss .. '-arab', 't') or name == getname(ss .. '-arab', '')) then 
                    return ss .. '-arab'
                end
            end
        end
    end
    return nil
end

p['اسم لغة'] = function ( frame )
    local na = frame.args[1]
    if not na or na == '' then return '' end
    local code = getname(frame.args[1], frame.args[2], 0, frame.args['nil'])
    return frame:preprocess(code)
end

p['قالب رمز لغة'] = function ( frame )
    local lange = frame.args[1]
    local text = frame.args[2]
    local c = getname(frame.args[1], 't')
    if lange and lange ~= '' then
        lange = string.gsub(lange, ' ', '')
        lange = lange:lower()
        local textout = mw.text.tag('span', {lang = lange}, text)
        local cat_p = 'زمرہ:مضامین جن میں '
        local cat_p2 = ' زبان کا متن شامل ہے'
        local cate = ''
        if lange == 'ur' or lange == 'urd' then 
            cate = '' 
        else
            cate = '[[' .. cat_p .. (c or lange) .. cat_p2 .. ']]'
        end
        return textout .. cate
    else
        return ''
    end
end

p['رمز لغة'] = function ( frame )
    local na = frame.args[1]
    if na and na ~= '' then
        return goo(na) or goo(gsubname(na, 't')) or ''
    else
        return ''
    end
end

p['قائمة'] = function ( frame )
    local list = mw.html.create("table")
    list:addClass("wikitable sortable collapsible")
    local head = list:tag("tr")
    head:tag("th"):wikitext("رمز")
    head:tag("th"):wikitext("تضمين قالب")
    head:tag("th"):wikitext("ربط")
    head:tag("th"):wikitext("نام")
    head:tag("th"):wikitext("التحويلات")
    
    for o, nam in pairs(lang_data) do
        local temp = nam.name or ''
        local row = list:tag("tr")
        local oo = row:tag("td")
        local r = row:tag("td")
        local th = row:tag("td")
        local ss = row:tag("td")
        local rr = row:tag("td")
        
        local rsr = '{{اسم آيزو 639 ' .. o .. '}}'
        local er = '[[سانچہ:اسم آيزو 639 ' .. o .. ']]'
        local dd = "\n[[زبان " .. temp .. "]]"
        local ooo = 'زبان ' .. gsubname(temp, 'r')
        
        oo:tag("span"):wikitext(er)
        r:tag("span"):wikitext(frame:preprocess(rsr))
        th:tag("span"):wikitext(dd)
        ss:tag("span"):wikitext(ooo)
        
        for k, v in pairs(nam) do
            if v and v ~= '' and k ~= "name" then 
                rr:tag("code"):wikitext(tostring(v))
                rr:tag("span"):wikitext(' - ') 
            end
        end
    end
    return tostring(list)
end

-- Internal function for Module:Nihongo to format native language text (e.g. Kanji)
local function _lang(args)
    local code = args[1] or args.code or 'ja'
    local text = args[2] or args.text or ''
    if text == '' then return '' end
    return mw.text.tag('span', {lang = code}, text)
end

p._lang = _lang

-- Internal function for Module:Nihongo to format transliteration (e.g. Romaji)
local function _xlit(args)
    local text = args[2] or args[1] or args.text or ''
    local code = args.code or 'ja'
    if text == '' then return '' end
    return mw.text.tag('i', {lang = code .. '-Latn'}, text)
end

p._xlit = _xlit

-- Internal function callable from other Lua modules (like Module:Nihongo)
local function _langx(args)
    local lange       = args[1] or args.lang or args.code or ''
    local text        = args[2] or args.text or ''
    local translit    = args[3] or args.translit or ''
    local translation = args[4] or args.translation or args.lit or args.label or ''

    if lange == '' then return text end

    lange = string.gsub(lange, ' ', ''):lower()

    local lang_name = (lang_data.lang_name and lang_data.lang_name[lange]) or getname(lange, 't') or lange
    local textout = mw.text.tag('span', {lang = lange}, text)
    local result = textout

    if translit and translit ~= '' then
        result = result .. '، ' .. mw.text.tag('i', {}, translit)
    end

    if translation and translation ~= '' then
        result = result .. ' (' .. translation .. ')'
    end

    return result
end

p._langx = _langx

-- Wrapper for template calls
p.langx = function( frame )
    local args = frame.args
    if not args[1] or args[1] == '' then
        args = frame:getParent().args
    end
    return _langx(args)
end

return p