Модуль:Мовы
Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:Мовы/Дакумэнтацыя
-- Модуль для працы з мовамі ISO 639
-- загрузка модулю зьвестак з табліцай моваў
local languages = mw.loadData('Модуль:Мовы/зьвесткі')
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( "Модуль:Вікізьвесткі/коды_моваў" )
local code = codeByItemId[ wikidataItemId ];
if code == nil then
mw.log( 'Ня знойдзены моўны код для ' .. 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|мін, вяртае назву артыкулу з Модуль:Мовы/зьвесткі
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 .. " <span dir='auto' lang='" .. lang_code .. "'>" .. trimmed .. "</span>"
else
list_item = link .. " <span class='unknown-foreign-lang'>" .. trimmed .. "</span>".."[[Катэгорыя:Вікіпэдыя:Артыкулы зь нераспазнанай мовай]]"
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 = ' <span class="ref-info" style="cursor:help;" title="на %2%">[%1%]</span>'
else
ref = ' <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 } .. '[[Катэгорыя:Вікіпэдыя:Артыкулы зь нераспазнанай мовай]]'
end
end
end
return result
end
-- Выводзіць назву мовы ў месным склоне
function p._transform_lang(code)
if isEmpty(languages[code]) then return '<невядомы код ' .. code .. '>' 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,'be-tarask')
):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