Перейти к содержанию

Модуль:Languages

Материал из Мегавики — свободной энциклопедии

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

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

Тесты

60 тестов провалено.

test_01_compare_live_sandbox_name
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|name|en}} Английский язык Английский язык
N {{#invoke:Languages|name|en | mode = en}} English Английский язык
N {{#invoke:Languages|name|EN}} Английский язык
N {{#invoke:Languages|name|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода.
test_02_compare_live_sandbox_abbr
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|abbr|en}} англ. англ.
N {{#invoke:Languages|abbr|EN}} англ.
N {{#invoke:Languages|abbr|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода.
test_03_compare_live_sandbox_list
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|list|}}
✔ {{#invoke:Languages|list|xx}} xx xx
✔ {{#invoke:Languages|list|en}} англ. англ.
N {{#invoke:Languages|list|en | ru | fr}} англ. ru, фр. англ. ru, фр.
✔ {{#invoke:Languages|list|en | }} англ. англ.
test_04_compare_live_sandbox_list_ref
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|list_ref|en}}  (англ.)  (англ.)
N {{#invoke:Languages|list_ref|en | mode = iso}}  (en)  (англ.) (неопр.)
N {{#invoke:Languages|list_ref|en | ru | join = 1}}  (англ., рус.)  (англ.) (рус.) (неопр.)
N {{#invoke:Languages|list_ref|en | в = 1}}  [англ.]  [англ.] (неопр.)
N {{#invoke:Languages|list_ref|en | ru | brackets = [] | join = 1}}  [англ., рус.] Ошибка Lua на строке 145: attempt to index a nil value.
N {{#invoke:Languages|list_ref|en | brackets = ()}}  (англ.)  (англ.) (неопр.)
N {{#invoke:Languages|list_ref|en | brackets = none}}  англ.  (англ.) (неопр.)
N {{#invoke:Languages|list_ref|xx}}  (неопр.)  (неопр.)
N {{#invoke:Languages|list_ref|xx | includeNbsp = false}} (неопр.)  (неопр.) (неопр.)
✔ {{#invoke:Languages|list_ref|}}
N {{#invoke:Languages|list_ref|en | includeNbsp = false}} (англ.)  (англ.) (неопр.)
N {{#invoke:Languages|list_ref|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода.  (неопр.) (неопр.)
test_05_compare_live_sandbox_transform
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|transform|en | form = l2}} английский язык Ошибка скрипта: Функции «transform» не существует.
N {{#invoke:Languages|transform|en | form = l3}} английского языка Ошибка скрипта: Функции «transform» не существует.
N {{#invoke:Languages|transform|en | form = l4}} английском языке Ошибка скрипта: Функции «transform» не существует.
N {{#invoke:Languages|transform|en | mode = en}} English Ошибка скрипта: Функции «transform» не существует.
N {{#invoke:Languages|transform|en | mode = iso}} en Ошибка скрипта: Функции «transform» не существует.
N {{#invoke:Languages|transform|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода. Ошибка скрипта: Функции «transform» не существует.
test_06_compare_live_sandbox_transform_proposial
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|transform_lang|}} <неизвестный код >
N {{#invoke:Languages|transform_lang|xx}} <неизвестный код xx>
N {{#invoke:Languages|transform_lang|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода. <неизвестный код xx>
✔ {{#invoke:Languages|transform_lang|en}} английском языке английском языке
✔ {{#invoke:Languages|transform_lang|ru}} русском языке русском языке
✔ {{#invoke:Languages|transform_lang|zh-hans}} упрощённом варианте китайского языка упрощённом варианте китайского языка
test_07_compare_live_sandbox_transform_genitive
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|transform_lang_genitive|}} Ошибка скрипта: Функции «transform_lang_genitive» не существует.
N {{#invoke:Languages|transform_lang_genitive|xx}} Ошибка скрипта: Функции «transform_lang_genitive» не существует.
N {{#invoke:Languages|transform_lang_genitive|xx | error = 1}} Неизвестный языковой код: xx. Обратитесь на специальную страницу для добавления данного кода. Ошибка скрипта: Функции «transform_lang_genitive» не существует.
N {{#invoke:Languages|transform_lang_genitive|en}} английского языка Ошибка скрипта: Функции «transform_lang_genitive» не существует.
N {{#invoke:Languages|transform_lang_genitive|ru}} русского языка Ошибка скрипта: Функции «transform_lang_genitive» не существует.
N {{#invoke:Languages|transform_lang_genitive|zh-hans}} упрощённого варианта китайского языка Ошибка скрипта: Функции «transform_lang_genitive» не существует.
test_08_compare_live_sandbox_getWikidata
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|getWikidataRefHtmlFrame|Q1860}} (англ.) (англ.)
N {{#invoke:Languages|getWikidataRefHtmlFrame|Q7737}} (рус.) (рус.)
N {{#invoke:Languages|getWikidataRefHtmlFrame|QNNN | error = 1}} Неизвестный Wikidata ID: QNNN
test_09_alias_categorization_abbr
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|abbr|en}} англ. англ.
N {{#invoke:Languages|abbr|pem}} коми-перм.[[Category:Википедия:Статьи с использованием алиасов языковых кодов]]
N {{#invoke:Languages|abbr|sr-ec}} серб. (кир.)[[Category:Википедия:Статьи с использованием алиасов языковых кодов]]
N {{#invoke:Languages|abbr|ru-ru}} рус.
test_11_alias_categorization_name
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|name|en}} Английский язык Английский язык
N {{#invoke:Languages|name|pem}} Коми-пермяцкий язык[[Category:Википедия:Статьи с использованием алиасов языковых кодов]]
N {{#invoke:Languages|name|sr-ec}} Сербский язык (кириллицей)[[Category:Википедия:Статьи с использованием алиасов языковых кодов]]
test_12_alias_categorization_list_ref
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|list_ref|en}} &nbsp;<small class="ref-info" title="на английском языке">(англ.)</small> &nbsp;<span class="ref-info" style="cursor:help;" title="на английском языке">(англ.)</span>
N {{#invoke:Languages|list_ref|pem}} &nbsp;<small class="ref-info" title="на коми-пермяцком языке">(коми-перм.)</small>[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] &nbsp;<small class="ref-info" style="cursor:help;" title="на коми-пермяцком языке">(коми-перм.)</small>[[Category:Мегавики:Статьи с нераспознанным языком (ref)]]
N {{#invoke:Languages|list_ref|en | pem | join = 1}} &nbsp;<small class="ref-info" title="на английском языке, коми-пермяцком языке">(англ., коми-перм.)</small>[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] &nbsp;<span class="ref-info" style="cursor:help;" title="на английском языке">(англ.)</span>&nbsp;<small class="ref-info" style="cursor:help;" title="на коми-пермяцком языке">(коми-перм.)</small>[[Category:Мегавики:Статьи с нераспознанным языком (ref)]]&nbsp;<small class="ref-info" style="cursor:help;" title="на неопределённом языке">(неопр.)</small>[[Category:Мегавики:Статьи с нераспознанным языком (ref)]]
test_13_alias_categorization_transform
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|transform|en | form = l2}} английский язык <strong class="error"><span class="scribunto-error mw-scribunto-error-9af1f7a6">Ошибка скрипта: Функции «transform» не существует.</span></strong>
N {{#invoke:Languages|transform|pem | form = l2}} коми-пермяцкий язык[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] <strong class="error"><span class="scribunto-error mw-scribunto-error-9af1f7a6">Ошибка скрипта: Функции «transform» не существует.</span></strong>
N {{#invoke:Languages|transform|pem | form = l3}} коми-пермяцкого языка[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] <strong class="error"><span class="scribunto-error mw-scribunto-error-9af1f7a6">Ошибка скрипта: Функции «transform» не существует.</span></strong>
N {{#invoke:Languages|transform|sr-ec | form = l4}} сербском языке (кириллицей)[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] <strong class="error"><span class="scribunto-error mw-scribunto-error-9af1f7a6">Ошибка скрипта: Функции «transform» не существует.</span></strong>
test_14_alias_categorization_transform_lang
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|transform_lang|en}} английском языке английском языке
N {{#invoke:Languages|transform_lang|pem}} коми-пермяцком языке[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] &lt;неизвестный код pem&gt;
test_15_alias_categorization_transform_genitive
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|transform_lang_genitive|en}} английского языка <strong class="error"><span class="scribunto-error mw-scribunto-error-7606afbe">Ошибка скрипта: Функции «transform_lang_genitive» не существует.</span></strong>
N {{#invoke:Languages|transform_lang_genitive|pem}} коми-пермяцкого языка[[Category:Википедия:Статьи с использованием алиасов языковых кодов]] <strong class="error"><span class="scribunto-error mw-scribunto-error-7606afbe">Ошибка скрипта: Функции «transform_lang_genitive» не существует.</span></strong>
test_16_alias_categorization_list
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|list|en}} [[Английский язык|англ.]] [[Английский язык|англ.]]
N {{#invoke:Languages|list|pem}} [[Коми-пермяцкий язык|коми-перм.]][[Category:Википедия:Статьи с использованием алиасов языковых кодов]] pem
N {{#invoke:Languages|list|en | test | pem}} [[Английский язык|англ.]]&nbsp;<span dir='auto'style='font-style:italic'lang='en'>test</span>, [[Коми-пермяцкий язык|коми-перм.]][[Category:Википедия:Статьи с использованием алиасов языковых кодов]] [[Английский язык|англ.]]&nbsp;<span dir='auto' lang='en'>test</span>, pem
test_17_no_categorization_for_normal_codes
Тест Ожидаемое значение Фактическое значение
✔ {{#invoke:Languages|abbr|en}} англ. англ.
✔ {{#invoke:Languages|abbr|ru}} рус. рус.
✔ {{#invoke:Languages|abbr|de}} нем. нем.
✔ {{#invoke:Languages|abbr|fr}} фр. фр.
✔ {{#invoke:Languages|abbr|ja}} яп. яп.
✔ {{#invoke:Languages|abbr|zh}} кит. кит.
test_18_variant_abbr
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|abbr|en-GB}} брит. англ.
N {{#invoke:Languages|abbr|ru-RU}} рус.
N {{#invoke:Languages|abbr|lv-LV}} латыш.
✔ {{#invoke:Languages|abbr|be-tarask}} тарашк. тарашк.
N {{#invoke:Languages|abbr|ru-UA}} рус.
test_19_italics
Тест Ожидаемое значение Фактическое значение
N {{#invoke:Languages|list|en | test}} [[Английский язык|англ.]]&nbsp;<span dir='auto'style='font-style:italic'lang='en'>test</span> [[Английский язык|англ.]]&nbsp;<span dir='auto' lang='en'>test</span>
N {{#invoke:Languages|list|el | test}} [[Греческий язык|греч.]]&nbsp;<span dir='auto'style='font-style:italic'lang='el'>test</span> [[Греческий язык|греч.]]&nbsp;<span dir='auto' lang='el'>test</span>
N {{#invoke:Languages|list|zh | test}} [[Китайский язык|кит.]]&nbsp;<span dir='auto'lang='zh'>test</span> [[Китайский язык|кит.]]&nbsp;<span dir='auto' lang='zh'>test</span>
N {{#invoke:Languages|list|zh-hans | test}} [[Упрощённый китайский язык|кит. упр.]]&nbsp;<span dir='auto'style='font-style:italic'lang='zh-hans'>test</span> [[Упрощённый китайский язык|кит. упр.]]&nbsp;<span dir='auto' lang='zh-hans'>test</span>


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



-- Модуль для работы с языками 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