Модуль:Languages: различия между версиями

Материал из Тептар — свободной энциклопедии
Перейти к навигации Перейти к поиску
(Новая страница: «-- Модуль для работы с языками ISO 639 -- загрузка модуля данных с таблицей языков local languages = mw...»)
 
Нет описания правки
 
Строка 31: Строка 31:
end
end


function p.getRefHtml( wikidataItemId )
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 codeByItemId = mw.loadData( "Module:Wikidata/Language-codes" )
local code = codeByItemId[ wikidataItemId ];
local code = codeByItemId[ wikidataItemId ];
Строка 37: Строка 51:
mw.log( 'Language code not found for ' .. wikidataItemId )
mw.log( 'Language code not found for ' .. wikidataItemId )
return ""
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
return p.getRefHtml( code )
end
end


Строка 119: Строка 126:
-- принимает zh|tt, возвращает ref-zh, ref-tt
-- принимает zh|tt, возвращает ref-zh, ref-tt
function p.list_ref(frame)
function p.list_ref(frame)
    local result = ''
local result = ''
    local v = frame.args['в'] or nil
local v = frame.args['в'] or nil
local ref = nil
local ref = nil


Строка 129: Строка 136:
end
end


    for x, lg in pairs( frame.args ) do
for x, lg in pairs( frame.args ) do
local code = trimstr(lg)
local code = trimstr(lg)
if code ~= '' and code ~= 'в' then
if code ~= '' and code ~= 'в' then
Строка 136: Строка 143:
result = result .. mw.ustring.gsub(mw.ustring.gsub(ref, '%%2%%', p._transform_lang(code)), '%%1%%', l[1])
result = result .. mw.ustring.gsub(mw.ustring.gsub(ref, '%%2%%', p._transform_lang(code)), '%%1%%', l[1])
else
else
if mw.title.new('ref-' .. code, 10).exists == false then
code = 'und'
end
result = result .. frame:expandTemplate{ title = 'ref-' .. code } .. '[[Category:Тептар:Статьи с нераспознанным языком (ref)]]'
result = result .. frame:expandTemplate{ title = 'ref-' .. code } .. '[[Category:Тептар:Статьи с нераспознанным языком (ref)]]'
end
end
end
end
    end
end


    return result
return result
end
end


Строка 174: Строка 184:
function p.transform_lang(frame)
function p.transform_lang(frame)
return p._transform_lang(trimstr(frame.args[1]))
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 style="color:red; font-weight:bold;" 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
end


return p
return p

Текущая версия от 11:02, 12 февраля 2022

Этот модуль используется в шаблоне {{l6e}} при создании собственно языковых ссылок путём конструкции {{#invoke:Languages|list|множество языков}}. За более подробной документацией насчёт работы шаблона следует идти в его документацию. Список поддерживаемых языковых сокращений находится в Модуль:Languages/data.

Также модуль используется для различных преобразований кодов языков.

Служебные категории модуля[править код]

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

Служебные категории модуля[править код]

Тесты[править код]

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

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 = 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