Модуль:Languages — Википедия

Документация

Этот модуль используется для генерации шаблонов серий {{lang-en}} и {{ref-en}} из модулей, а также для создания ссылки в шаблонах «Вавилона» (MediaWiki:Babel-portal). Список поддерживаемых языковых сокращений находится в Модуль:Languages/data.

Служебные категории модуля

Тесты

Все тесты успешно пройдены: 8

test_getRefHtml
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages | getRefHtmlFrame | }}
✔ {{#invoke:Languages | getRefHtmlFrame | xx }}
✔ {{#invoke:Languages | getRefHtmlFrame | en }} (англ.) (англ.)
✔ {{#invoke:Languages | getRefHtmlFrame | ru }} (рус.) (рус.)
test_getWikidataRefHtml
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages | getWikidataRefHtmlFrame | }}
✔ {{#invoke:Languages | getWikidataRefHtmlFrame | QNNN }}
✔ {{#invoke:Languages | getWikidataRefHtmlFrame | Q1860 }} (англ.) (англ.)
✔ {{#invoke:Languages | getWikidataRefHtmlFrame | Q7737 }} (рус.) (рус.)


Основные использования


-- Модуль для работы с языками ISO 639  -- загрузка модуля данных с таблицей языков local languages = mw.loadData('Module:Languages/data') local p = {}  -- Проверяет, пустой ли дан параметр local function isEmpty(s) 	return s == nil or s == '' end  -- вспомогательная функция, удаляет пробелы local function trimstr(s)   return (s:gsub("^%s*(.-)%s*$", "%1")) end  -- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки) local function get_lang_data(code)     local l = languages[code];     if l ~= nil then         return "[[" .. l[2] .. "|" .. l[1] .. "]]", code     elseif code ~= "" then         return code, ""     else         return "", ""     end end  function p.getRefHtmlFrame( frame ) 	return p.getRefHtml( trimstr( frame.args[1] ) ) end  function p.getRefHtml( code ) 	local l = languages[code]; 	if l == nil then 		mw.log( 'Language description for code ' .. code .. ' not found' )         return ""     else         return '<span class="ref-info" title="' .. l[ 2 ] .. '" style="cursor:help">(' .. l[ 1 ] .. ')</span>'     end end  function p.getWikidataRefHtmlFrame( frame ) 	return p.getWikidataRefHtml( trimstr( frame.args[1] ) ) end  function p.getWikidataRefHtml( wikidataItemId ) 	local codeByItemId = mw.loadData( "Module:Wikidata/Language-codes" ) 	local code = codeByItemId[ wikidataItemId ]; 	if code == nil then 		mw.log( 'Language code not found for ' .. wikidataItemId ) 		return "" 	end 	return p.getRefHtml( code ) end  -- принимает zh, возвращает аббревиатуру function p.abbr(frame) 	local code = trimstr( frame.args[1] ) 	if not isEmpty(code) then 		return (languages[code] and languages[code][1] or '') 	end end  -- принимает zh|我|tt|мин, возвращает название статьи из Module:Languages/data function p.name(frame) 	local code = trimstr( frame.args[1] ) 	if code ~= nil and code ~= '' then 		return (languages[code] and languages[code][2] or '') 	end end  -- принимает zh|我|tt|мин, возвращает список через запятую function p.list(frame)     local curr_lang = nil     local result = nil      for n, v in frame:argumentPairs() do 		local trimmed = trimstr(v) 		if curr_lang == nil then 		if trimmed ~= '' then 			-- если язык пропущен, оставим прошлый 			curr_lang = trimstr(v) 		end 		else 		if trimmed ~= '' then 			local link, lang_code = get_lang_data(curr_lang) 			local list_item 			if lang_code ~= '' then 				list_item = link .. "&nbsp;<span dir='auto' lang='" .. lang_code .. "'>" .. trimmed .. "</span>" 			else 				list_item = link .. " <span class='unknown-foreign-lang'>" .. trimmed .. "</span>".."[[Category:Википедия:Статьи с нераспознанным языком]]" 			end 			 			if result == nil then 				result = list_item 			else 				result = result .. ", " .. list_item 			end 		else 		-- Пустой текст — значит, текущий язык совпадает с следующим 		local link, lang_code = get_lang_data(curr_lang) 		if result == nil then 			result = link 		else 			result = result .. ", " .. link 		end 		end 		 		curr_lang = nil       end     end          -- просто #invoke:Languages|list|yue должно возвращать всё же ссылку без текста     if curr_lang ~= nil then         local link, lang_code = get_lang_data(curr_lang)         if result ~= nil then             result = result .. ", " .. link         else             result = link         end     end     return result end  -- принимает zh|tt, возвращает ref-zh, ref-tt function p.list_ref(frame) 	local result = '' 	local v = frame.args['в'] or nil 	local ref = nil  	if v then 		ref = '&nbsp;<span class="ref-info" style="cursor:help;" title="на %2%">&#091;%1%&#093;</span>' 	else 		ref = '&nbsp;<span class="ref-info" style="cursor:help;" title="на %2%">(%1%)</span>' 	end  	for x, lg in pairs( frame.args ) do 		local code = mw.ustring.lower(trimstr(lg)) 		if code ~= '' and code ~= 'в' then 			local l = languages[code] 			if l and l ~= nil then 				result = result .. mw.ustring.gsub(mw.ustring.gsub(ref, '%%2%%', p._transform_lang(code)), '%%1%%', l[1]) 			else 				if mw.title.new('ref-' .. code, 10).exists == false then 					code = 'und' 				end 				result = result .. frame:expandTemplate{ title = 'ref-' .. code } .. '[[Category:Википедия:Статьи с нераспознанным языком (ref)]]' 			end 		end 	end  	return result 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: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  return p