Bu modul uchun Modul:Languages/doc nomli hujjat sahifasini yaratishingiz mumkin

-- Tillar bilan ishlash uchun modul
local languages = mw.loadData('Module:Languages/data')
local p = {}

p.codes = {
    ab = 'abx.',
	av = 'avar.',
	ady = 'adig.',
	az = 'ozar.',
	sq = 'alb.',
	am = 'amx.',
	en = 'ingl.',
	ar = 'arab.',
	arc = 'aram.',
	hy = 'arm.',
	as = 'assam.',
	aa = 'afar.',
	af = 'afrik.',
	ace = 'аch.',
	eu = 'bask.',
	ba = 'boshq.',
	be = 'belor.',
	bn = 'beng.',
	my = 'birm.',
	bg = 'bulgʻ.',
	bs = 'bosn.',
	br = 'bret.',
	bug = 'bug.',
	cy = 'vall.',
	war = 'var.',
	hu = 'moj.',
	vo = 'vol.',
	wo = 'volof',
	vi = 'vyet.',
	haw = 'hav.',
	gl = 'galis.',
	nl = 'niderl.',
	el = 'yun.',
	ka = 'gurji',
	gu = 'guj.',
	da = 'dan.',
	grc = 'qad. yun.',
	dng = 'dung.',
	zu = 'zulu',
	he = 'ivr.',
	yi = 'idish',
	inh = 'ingush.',
	id = 'indon.',
	ia = 'interl.',
	ik = 'inuit',
	ga = 'irl.',
	is = 'isl.',
	es = 'isp.',
	it = 'ital.',
	yo = 'yoruba',
	kk = 'qoz.',
	xal = 'qalm.',
	kn = 'kann.',
	kaa = 'qoraqalp.',
	krl = 'karel',
	ca = 'kat.',
	ks = 'kashm.',
	qu = 'kechua',
	ky = 'qirgʻ.',
	zh = 'xit.',
	kv = 'komi',
	kg = 'kongo',
	cop = 'kopt.',
	ko = 'kor.',
	crh = 'qrim-tat.',
	ku = 'kurd',
	km = 'khmer',
	lo = 'laos',
	la = 'lot.',
	lv = 'latish',
	lez = 'lezg.',
	lt = 'lit.',
	mk = 'maked.',
	mg = 'malag.',
	ms = 'malay',
	ml = 'malayalam',
	mt = 'malta',
	mi = 'maori',
	mr = 'marathi',
	mo = 'mold.',
	mn = 'moʻgʻ.',
	nv = 'navaxo',
	de = 'olm.',
	yrk = 'nen.',
	ne = 'nepal',
	nog = 'noʻgʻ.',
	no = 'norv.',
	oc = 'oks.',
	fa = 'fors',
	pl = 'pol.',
	pt = 'port.',
	ps = 'pushtu',
	ro = 'rum.',
	ru = 'rus.',
	sa = 'sanskr.',
	ceb = 'seb.',
	so = 'somal.',
	sr = 'serb.',
	sk = 'slovak',
	sl = 'sloven',
	sog = 'soʻgʻd.',
	sw = 'suahili',
	tg = 'toj.',
	th = 'tay',
	tt = 'tat.',
	te = 'telugu',
	tyv = 'tuv.',
	tr = 'tur.',
	udm = 'udm.',
	uz = 'oʻzb.',
	ug = 'uygʻ.',
	uk = 'ukr.',
	ur = 'urdu',
	fi = 'fin',
	fr = 'fr.',
	hi = 'hindi',
	chg = 'chagʻat.',
	ce = 'chech.',
	cs = 'chex',
	cv = 'chuvash',
	sv = 'shved',
	evn = 'evenk',
	eo = 'esper.',
	et = 'est.',
	sah = 'yoqut',
	ja = 'yap.'
}

p.articles = {
	ab = 'Abxaz tili',
	av = 'Avar tili',
	ady = 'Adigey tili',
	az = 'Ozarbayjon tili',
	sq = 'Alban tili',
	am = 'Amxar tili',
	en = 'Ingliz tili',
	ar = 'Arab tili',
	arc = 'Aramey tili',
	hy = 'Arman tili',
	as = 'Assam tili',
	aa = 'Afar tili',
	af = 'Afrikaans',
	ace = 'Achex tili',
	ban = 'Bali tili',
	eu = 'Bask tili',
	ba = 'Boshqir tili',
	be = 'Belorus tili',
	bn = 'Bengal tili',
	my = 'Birma tili',
	bg = 'Bulgʻor tili',
	bs = 'Bosniya tili',
	br = 'Breton tili',
	bug = 'Bug tili',
	bua = 'Buryat tili',
	cy = 'Vallon tili',
	war = 'Varay',
	hu = 'Mojar tili',
	vep = 'Veps tili',
	vo = 'Volapuk',
	wo = 'Volof tili',
	vi = 'Vyetnam tili',
	haw = 'Havayi tili',
	gag = 'Gagauz tili',
	gl = 'Galis tili',
	nl = 'Golland tili',
	el = 'Yunon tili',
	ka = 'Gurji tili',
	gu = 'Gujarati',
	da = 'Daniya tili',
	grc = 'Qadimgi yunon tili',
	dng = 'Dungan tili',
	zu = 'Zulu',
	he = 'Ivrit',
	yi = 'Idish tili',
	inh = 'Ingush tili',
	id = 'Indoneziya tili',
	ia = 'Interlingva',
	ik = 'Inupiak',
	ga = 'Irland tili',
	is = 'Island tili',
	es = 'Ispan tili',
	it = 'Italyan tili',
	yo = 'Yoruba',
	kk = 'Qozoq tili',
	xal = 'Qalmiq tili',
	kn = 'Kannada',
	kaa = 'Qoraqalpoq tili',
	krl = 'Karel tili',
	ca = 'Katalan tili',
	ks = 'Kashmiri',
	qu = 'Kechua (tili)',
	ky = 'Qirgʻiz tili',
	zh = 'Xitoy tili',
	kg = 'Kongo (til)',
	cop = 'Kopt tili',
	ko = 'Koreys tili',
	co = 'Korsika tili',
	crh = 'Qrim-tatar tili',
	ku = 'Kurd tili',
	km = 'Khmer tili',
	lo = 'Laos tili',
	la = 'Lotin tili',
	lv = 'Latish tili',
	lez = 'Lezgi tili',
	ln = 'Lingala',
	lt = 'Litva tili',
	mk = 'Makedon tili',
	mg = 'Malagasi tili',
	ms = 'Malay tili',
	ml = 'Malayalam',
	dv = 'Maldiv tili',
	mt = 'Malta tili',
	mi = 'Maori (til)',
	mr = 'Marathi (til)',
	mo = 'Moldav tili',
	mn = 'Moʻgʻul tili',
	nv = 'Navaxo (til)',
	na = 'Nauru tili',
	de = 'Olmon tili',
	yrk = 'Nenets tili',
	ne = 'Nepal tili',
	nog = 'Noʻgʻoy tili',
	no = 'Norveg tili',
	oc = 'Oksitan tili',
	fa = 'Fors tili',
	pal = 'Pahlaviy tili',
	pl = 'Polyak tili',
	pol = 'Polyak tili',
	pt = 'Portugal tili',
	ps = 'Pushtu',
	rw = 'Ruanda (til)',
	ro = 'Rumin tili',
	ru = 'Rus tili',
	sm = 'Samoa tili',
	sa = 'Sanskrit',
	ceb = 'Sebuano',
	sr = 'Serb tili',
	sk = 'Slovak tili',
	sl = 'Sloven tili',
	sog = 'Soʻgʻd tili',
	sw = 'Suahili',
	su = 'Sundan tili',
	tl = 'Tagal tili',
	tg = 'Tojik tili',
	ty = 'Taiti tili',
	tah = 'Taiti tili',
	th = 'Tay tili',
	tly = 'Talish tili',
	ta = 'Tamil tili',
	tt = 'Tatar tili',
	tw = 'Chvi',
	te = 'Telugu (til)',
	to = 'Tonga tili',
	tyv = 'Tuva tili',
	tr = 'Turk tili',
	udm = 'Udmurt tili',
	uz = 'Oʻzbek tili',
	ug = 'Uygʻur tili',
	uk = 'Ukrain tili',
	ur = 'Urdu',
	fo = 'Farer tili',
	fj = 'Fiji (til)',
	fi = 'Fin tili',
	fr = 'Fransuz tili',
	fy = 'Friz tili',
	kjh = 'Xakas tili',
	kca = 'Xanti tili',
	hi = 'Hindi',
	chg = 'Chagʻatoy tili',
	chr = 'Cheroki (til)',
	ce = 'Chechen tili',
	cs = 'Chex tili',
	cv = 'Chuvash tili',
	chv = 'Chuvash tili',
	ckt = 'Chukotka tili',
	sv = 'Shved tili',
	sn = 'Shona (til)',
	sco = 'Shotland tili',
	gd = 'Kelt tili',
	sux = 'Shumer tili',
	evn = 'Evenk tili',
	myv = 'Erzan tili',
	eo = 'Esperanto',
	et = 'Eston tili',
	jv = 'Yava tili',
	sah = 'Yoqut tili',
	ja = 'Yapon tili'
}

-- boʻsh joy oʻchirish uchun
function p.trimstr(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"))
end

-- til kodini oladi, ishorat qaytaradi
function p.getlink(code)
    if p.articles[code] ~= nil and p.codes[code] ~= nil then
        return "[[" .. p.articles[code] .. "|" .. p.codes[code] .. "]]"
    elseif p.codes[code] ~= nil then
        return p.codes[code]
    else
        return ""
    end
end

-- argument qabul qiladi, vergul bilan qaytaradi
function p.list(frame)
    local curr_lang = nil
    local result = nil

    for n, v in frame:argumentPairs() do
      local trimmed = p.trimstr(v)
      if curr_lang == nil then
          if trimmed ~= '' then
              -- til boʻlmasa, eskisini qoldiradi
              curr_lang = p.trimstr(v)
          end
      else
          if trimmed ~= '' then
              local list_item = p.getlink(curr_lang) .. " <span lang='" .. curr_lang .. "'>" .. trimmed .. "</span>"
          
              if result == nil then
                  result = list_item
              else
                  result = result .. ", " .. list_item
              end
          else
              -- Boʻsh matn - demak, joriy til eski tilga mos
              if result == nil then
                  result = p.getlink(curr_lang)
              else
                  result = result .. ", " .. p.getlink(curr_lang)
              end
          end
          
          curr_lang = nil
      end
    end
    
    -- shunchaki #invoke:Languages|list|yue matnsiz ishorat qaytaradi
    if curr_lang ~= nil then
        if result ~= nil then
            result = result .. ", " .. p.getlink(curr_lang)
        else
            result = p.getlink(curr_lang)
        end
    end
    return result
end

-- Проверяет, пустой ли дан параметр
local function isEmpty(s)
	return s == nil or s == ''
end

-- Выводит название языка в предложном падеже
function p._transform_lang(code)
	if isEmpty(languages[code]) then return '&lt;неизвестный код ' .. code .. '&gt;' end
    if languages[code][3] then return languages[code][3] end
    local ln = mw.ustring.lower(
        languages[code] and languages[code][2]
        or mw.language.fetchLanguageName(code,'ru')
     ):gsub('%s+язык%s+',  ' '):gsub('%s*%(?язык%)?%s*',  '')
    if not ln then return 'языке с ISO-кодом '..code..' (?)' end
    if ln then return ln end
    if ln:match('.*лингва$') then return ln:gsub('а$','е') end
    if mw.ustring.match(ln,'[сц]кий$') or ln:match('ный$') or mw.ustring.match(ln,'[сц]кий%s%b()$') or ln:match('ный%s%b()$')
    then
        ln = mw.ustring.gsub(
            mw.ustring.gsub(ln, 'н([ыи])й(%A)', function(y,s) return (y=='ы' and 'ном' or 'нем')..s end)
                :gsub('ный$', 'ном'),
            '([сц]к)ий(%A)', '%1ом%2'
        ):gsub('ский$', 'ском'):gsub('цкий$', 'цком');
        if ln:match('%)$') and not (ln:match('ом%)$') or ln:match('нем%)$')) -- «языке» перед уточнением, если оно не склоняется
        then 
            local r,s=ln:gsub('(%s)(%b())$','%1языке%1%2');
            if s==1 then return r end
        end
        return ln..' языке'
    else
        return 'языке '..ln
    end
end

function p.transform_lang(frame)
	return p._transform_lang(trimstr(frame.args[1]))
end

-- Проверяет существование страницы и является ли она перенаправлением
local function getTitle(page)
	local success, result = pcall(function()
		local title = mw.title.new(page)
		return { title.exists, title.isRedirect }
	end)
	return success and result or nil
end

-- Вспомогательная функция для {{Не переведено 5}}: выводит шаблон
function p._newIW(title, text, lang, page, state, nocat)
	local mwlang = mw.getContentLanguage()
	local origPage = page
	
	-- Изображения для старой функции показа статуса
	local states = {
		['ИС'] = {'Википедия:Избранные статьи','Избранная статья','Small Skew Star SVG.svg'},
		['ХС'] = {'Википедия:Хорошие статьи','Хорошая статья','Blue star unboxed.svg'},
		['ИСП'] = {'Википедия:Избранные списки и порталы','Избранный список','Purple star unboxed.svg'}
	}
	
	-- Категории для шаблона
	local categoryErrors = '[[Категория:Википедия:Статьи с некорректно заполненным шаблоном Не переведено]]'
	local categoryExists = '[[Категория:Википедия:Статьи с неактуальным шаблоном Не переведено]]'
	local categoryRedirect = '[[Категория:Википедия:Запросы на замену перенаправлений переводами]]'
	
	-- Проверяет существование параметров и заменяет их на альтернативные
	if isEmpty(text) then
		text = title
	end
	if isEmpty(lang) then
		lang = "en"
	end
	if isEmpty(page) then
		page = title
	end
	
	-- Создаёт шаблон
	if title ~= '{{{1}}}' then
		local this = mw.title.getCurrentTitle()
		local titleObj = getTitle(title)
		local ifExists, ifRedirect
		local type = ''
		local s = ''
		
		local langName = ''
		if lang ~= 'd' then
			if isEmpty(languages[lang]) then
				if this.namespace == 0 and isEmpty(nocat) then
					s = s .. categoryErrors
				end
			else
				langName = ' data-lang-name="' .. (languages[lang][1] and languages[lang][1] or '???') .. '"'
			end
		end
		
		-- Проверяет, не ограничен ли лимит вызовов функции
		if titleObj ~= nil then
			ifExists = titleObj[1]
			ifRedirect = titleObj[2]
		end
		
		-- Показывает ссылку на редирект или красную ссылку
		local class = (ifExists and (ifRedirect and ' iw--redirect' or ' iw--exists') or '')
		s = s .. string.format('<span class="iw%s plainlinks" data-title="%s" data-lang="%s"' .. langName .. '>', class, mwlang:ucfirst(title), lang)
		
		if ifRedirect then
			if this.namespace == 0 and isEmpty(nocat) then
				s = s .. categoryRedirect
			end
			s = s .. string.format('[%s %s]', tostring(mw.uri.fullUrl(title,'redirect=no')), text)
		else
			s = s .. string.format('[[%s|%s]]', title, text)
		end
		
		-- Показывает ссылку на иноязычную статью или предложение убрать шаблон
		if ifExists and not ifRedirect then
			s = s .. '<sup class="iw__notice noprint">[[Шаблон:Не переведено 5#Если существует статья|'
				  .. '<span style="color:red; font-style:normal; font-weight:bold;" title="Уберите шаблон «Не переведено 5» из статьи '
				  .. 'и замените его простой вики-ссылкой">?!</span>]]</sup>'
			if this.namespace == 0 and isEmpty(nocat) then
				s = s .. categoryExists
			end
		else
			-- Создаёт всплывающую подсказку
			local t = ''
			if lang == 'd' then
				t = string.format('Страница статьи «%s» в Викиданных', mwlang:ucfirst(title))
				page = page .. '#sitelinks-wikipedia'
			else
				if not isEmpty(origPage) then
					t = string.format('%s — maqolasi', page)
				else
					t = 'Maqola'
				end
				t = string.format(' «%s» maqolasining %sdagi versiyasi', mwlang:ucfirst(title), p._transform_lang(lang))
			end
		
			-- Создаёт примечание о перенаправлении
			local aster = ''
			if ifRedirect then
				aster = '<sup class="iw__notice noprint" style="font-style:normal; font-weight:normal; margin:0 0 0 1px;">'
						.. '[[Шаблон:Не переведено 5#Если существует перенаправление|'
						.. '<span title="Замените перенаправление статьёй либо уберите шаблон «Не переведено 5»">*</span>]]'
						.. '</sup>'
			end
		
			-- Выводит ссылку на иноязычную страницу
			s = s .. '<sup class="iw__note noprint" style="font-style:normal; font-weight:normal;">' ..
					string.format('[[:%s:%s|<span class="iw__tooltip" title="%s">[%s]</span>]]</sup>', lang, page, t, lang) ..
					aster
				  
			-- Выводит статус иноязычной страницы
			if not isEmpty(state) and not isEmpty(states[state]) then
				s = s .. string.format('<sup class="iw__status noprint" style="margin:0 0 0 1px;">[[Файл:%s|8px|link=%s|%s]]</sup>',
						states[state][3], states[state][1], states[state][2])
			end
		end
		
		return s .. '</span>'
	else
		-- Если нет обязательного параметра, выводит красный текст
		local htmlerror = require('Module:Error').error
		return htmlerror{'Укажите название страницы.'}
	end
end

-- Вспомогательная функция для {{Не переведено 5}}: выводит подстановку шаблона
function p._substIW(title, text)
	local s = '[[' .. title
	if not isEmpty(text) and title ~= text then
		s = s .. '|' .. text
	end
	
	return s .. ']]'
end

-- Выводит {{Не переведено 5}}
function p.getIW(frame)
	local mwlang = mw.getContentLanguage()
	
	local f = frame.args
	local title = f.title
	local text = f.text
	local lang = mwlang:lc(f.lang)
	local page = f.page
	local state = f.state
	local nocat = f.nocat
	
	if not mw.isSubsting() then
		return p._newIW(title, text, lang, page, state, nocat)
	end
	
	return p._substIW(title, text)
end
 
return p