Модуль:Languages
Материал из HARITONOV
Версия от 13:31, 25 апреля 2019; QBA-bot (обсуждение) (Изменил уровень защиты Модуль:Languages: критический шаблон или модуль (добавление защиты от переименований) ([Редактирование=только администраторы] (бессрочно) [Переименование=только администраторы] (бессрочно)))
Для документации этого модуля может быть создана страница Модуль:Languages/doc
-- Модуль для работы с языками 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( 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 "" else 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="font-size:85%; cursor:help; color:#888;">(' .. l[ 1 ] .. ')</span>' end end 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 .. " <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 -- Выводит название языка в предложном падеже 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,'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 -- Проверяет существование страницы и является ли она перенаправлением 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 — версия статьи', page) else t = 'Версия статьи' end t = t .. string.format(' «%s» на %s', 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