<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://haritonov.wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ALanguages</id>
		<title>Модуль:Languages - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://haritonov.wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ALanguages"/>
		<link rel="alternate" type="text/html" href="https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Languages&amp;action=history"/>
		<updated>2026-05-01T05:53:51Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Languages&amp;diff=1618&amp;oldid=prev</id>
		<title>QBA-bot: Изменил уровень защиты Модуль:Languages: критический шаблон или модуль (добавление защиты от переименований) ([Редактирование=только администраторы] (бессрочно) [Переименование=только администраторы] (бессрочно))</title>
		<link rel="alternate" type="text/html" href="https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Languages&amp;diff=1618&amp;oldid=prev"/>
				<updated>2019-04-25T13:31:46Z</updated>
		
		<summary type="html">&lt;p&gt;Изменил уровень защиты &lt;a href=&quot;/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Languages&quot; title=&quot;Модуль:Languages&quot;&gt;Модуль:Languages&lt;/a&gt;: критический шаблон или модуль (добавление защиты от переименований) ([Редактирование=только администраторы] (бессрочно) [Переименование=только администраторы] (бессрочно))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Модуль для работы с языками ISO 639&lt;br /&gt;
&lt;br /&gt;
-- загрузка модуля данных с таблицей языков&lt;br /&gt;
local languages = mw.loadData('Module:Languages/data')&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Проверяет, пустой ли дан параметр&lt;br /&gt;
local function isEmpty(s)&lt;br /&gt;
	return s == nil or s == ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- вспомогательная функция, удаляет пробелы&lt;br /&gt;
local function trimstr(s)&lt;br /&gt;
  return (s:gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки)&lt;br /&gt;
local function get_lang_data(code)&lt;br /&gt;
    local l = languages[code];&lt;br /&gt;
    if l ~= nil then&lt;br /&gt;
        return &amp;quot;[[&amp;quot; .. l[2] .. &amp;quot;|&amp;quot; .. l[1] .. &amp;quot;]]&amp;quot;, code&lt;br /&gt;
    elseif code ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return code, &amp;quot;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getRefHtmlFrame( frame )&lt;br /&gt;
	return p.getRefHtml( trimstr( frame.args[1] ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getRefHtml( wikidataItemId )&lt;br /&gt;
	local codeByItemId = mw.loadData( &amp;quot;Module:Wikidata/Language-codes&amp;quot; )&lt;br /&gt;
	local code = codeByItemId[ wikidataItemId ];&lt;br /&gt;
	if code == nil then&lt;br /&gt;
		mw.log( 'Language code not found for ' .. wikidataItemId )&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
    	local l = languages[code];&lt;br /&gt;
		if l == nil then&lt;br /&gt;
			mw.log( 'Language description for code ' .. code .. ' not found' )&lt;br /&gt;
	        return &amp;quot;&amp;quot;&lt;br /&gt;
	    else&lt;br /&gt;
	        return '&amp;lt;span class=&amp;quot;ref-info&amp;quot; title=&amp;quot;' .. l[ 2 ] .. '&amp;quot; style=&amp;quot;font-size:85%; cursor:help; color:#888;&amp;quot;&amp;gt;(' .. l[ 1 ] .. ')&amp;lt;/span&amp;gt;'&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- принимает zh, возвращает аббревиатуру&lt;br /&gt;
function p.abbr(frame)&lt;br /&gt;
	local code = trimstr( frame.args[1] )&lt;br /&gt;
	if not isEmpty(code) then&lt;br /&gt;
		return (languages[code] and languages[code][1] or '')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- принимает zh|我|tt|мин, возвращает название статьи из Module:Languages/data&lt;br /&gt;
function p.name(frame)&lt;br /&gt;
	local code = trimstr( frame.args[1] )&lt;br /&gt;
	if code ~= nil and code ~= '' then&lt;br /&gt;
		return (languages[code] and languages[code][2] or '')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- принимает zh|我|tt|мин, возвращает список через запятую&lt;br /&gt;
function p.list(frame)&lt;br /&gt;
    local curr_lang = nil&lt;br /&gt;
    local result = nil&lt;br /&gt;
&lt;br /&gt;
    for n, v in frame:argumentPairs() do&lt;br /&gt;
		local trimmed = trimstr(v)&lt;br /&gt;
		if curr_lang == nil then&lt;br /&gt;
		if trimmed ~= '' then&lt;br /&gt;
			-- если язык пропущен, оставим прошлый&lt;br /&gt;
			curr_lang = trimstr(v)&lt;br /&gt;
		end&lt;br /&gt;
		else&lt;br /&gt;
		if trimmed ~= '' then&lt;br /&gt;
			local link, lang_code = get_lang_data(curr_lang)&lt;br /&gt;
			local list_item&lt;br /&gt;
			if lang_code ~= '' then&lt;br /&gt;
				list_item = link .. &amp;quot;&amp;amp;nbsp;&amp;lt;span dir='auto' lang='&amp;quot; .. lang_code .. &amp;quot;'&amp;gt;&amp;quot; .. trimmed .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				list_item = link .. &amp;quot; &amp;lt;span class='unknown-foreign-lang'&amp;gt;&amp;quot; .. trimmed .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;..&amp;quot;[[Category:Википедия:Статьи с нераспознанным языком]]&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if result == nil then&lt;br /&gt;
				result = list_item&lt;br /&gt;
			else&lt;br /&gt;
				result = result .. &amp;quot;, &amp;quot; .. list_item&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
		-- Пустой текст — значит, текущий язык совпадает с следующим&lt;br /&gt;
		local link, lang_code = get_lang_data(curr_lang)&lt;br /&gt;
		if result == nil then&lt;br /&gt;
			result = link&lt;br /&gt;
		else&lt;br /&gt;
			result = result .. &amp;quot;, &amp;quot; .. link&lt;br /&gt;
		end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		curr_lang = nil&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- просто #invoke:Languages|list|yue должно возвращать всё же ссылку без текста&lt;br /&gt;
    if curr_lang ~= nil then&lt;br /&gt;
        local link, lang_code = get_lang_data(curr_lang)&lt;br /&gt;
        if result ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;, &amp;quot; .. link&lt;br /&gt;
        else&lt;br /&gt;
            result = link&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Выводит название языка в предложном падеже&lt;br /&gt;
function p._transform_lang(code)&lt;br /&gt;
	if isEmpty(languages[code]) then return '&amp;amp;lt;неизвестный код ' .. code .. '&amp;amp;gt;' end&lt;br /&gt;
    if languages[code][3] then return languages[code][3] end&lt;br /&gt;
    local ln = mw.ustring.lower(&lt;br /&gt;
        languages[code] and languages[code][2]&lt;br /&gt;
        or mw.language.fetchLanguageName(code,'ru')&lt;br /&gt;
     ):gsub('%s+язык%s+',  ' '):gsub('%s*%(?язык%)?%s*',  '')&lt;br /&gt;
    if not ln then return 'языке с ISO-кодом '..code..' (?)' end&lt;br /&gt;
    if ln:match('.*лингва$') then return ln:gsub('а$','е') end&lt;br /&gt;
    if mw.ustring.match(ln,'[сц]кий$') or ln:match('ный$') or mw.ustring.match(ln,'[сц]кий%s%b()$') or ln:match('ный%s%b()$')&lt;br /&gt;
    then&lt;br /&gt;
        ln = mw.ustring.gsub(&lt;br /&gt;
            mw.ustring.gsub(ln, 'н([ыи])й(%A)', function(y,s) return (y=='ы' and 'ном' or 'нем')..s end)&lt;br /&gt;
                :gsub('ный$', 'ном'),&lt;br /&gt;
            '([сц]к)ий(%A)', '%1ом%2'&lt;br /&gt;
        ):gsub('ский$', 'ском'):gsub('цкий$', 'цком');&lt;br /&gt;
        if ln:match('%)$') and not (ln:match('ом%)$') or ln:match('нем%)$')) -- «языке» перед уточнением, если оно не склоняется&lt;br /&gt;
        then &lt;br /&gt;
            local r,s=ln:gsub('(%s)(%b())$','%1языке%1%2');&lt;br /&gt;
            if s==1 then return r end&lt;br /&gt;
        end&lt;br /&gt;
        return ln..' языке'&lt;br /&gt;
    else&lt;br /&gt;
        return 'языке '..ln&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.transform_lang(frame)&lt;br /&gt;
	return p._transform_lang(trimstr(frame.args[1]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Проверяет существование страницы и является ли она перенаправлением&lt;br /&gt;
local function getTitle(page)&lt;br /&gt;
	local success, result = pcall(function()&lt;br /&gt;
		local title = mw.title.new(page)&lt;br /&gt;
		return { title.exists, title.isRedirect }&lt;br /&gt;
	end)&lt;br /&gt;
	return success and result or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вспомогательная функция для {{Не переведено 5}}: выводит шаблон&lt;br /&gt;
function p._newIW(title, text, lang, page, state, nocat)&lt;br /&gt;
	local mwlang = mw.getContentLanguage()&lt;br /&gt;
	local origPage = page&lt;br /&gt;
	&lt;br /&gt;
	-- Изображения для старой функции показа статуса&lt;br /&gt;
	local states = {&lt;br /&gt;
		['ИС'] = {'Википедия:Избранные статьи','Избранная статья','Small Skew Star SVG.svg'},&lt;br /&gt;
		['ХС'] = {'Википедия:Хорошие статьи','Хорошая статья','Blue star unboxed.svg'},&lt;br /&gt;
		['ИСП'] = {'Википедия:Избранные списки и порталы','Избранный список','Purple star unboxed.svg'}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- Категории для шаблона&lt;br /&gt;
	local categoryErrors = '[[Категория:Википедия:Статьи с некорректно заполненным шаблоном Не переведено]]'&lt;br /&gt;
	local categoryExists = '[[Категория:Википедия:Статьи с неактуальным шаблоном Не переведено]]'&lt;br /&gt;
	local categoryRedirect = '[[Категория:Википедия:Запросы на замену перенаправлений переводами]]'&lt;br /&gt;
	&lt;br /&gt;
	-- Проверяет существование параметров и заменяет их на альтернативные&lt;br /&gt;
	if isEmpty(text) then&lt;br /&gt;
		text = title&lt;br /&gt;
	end&lt;br /&gt;
	if isEmpty(lang) then&lt;br /&gt;
		lang = &amp;quot;en&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if isEmpty(page) then&lt;br /&gt;
		page = title&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Создаёт шаблон&lt;br /&gt;
	if title ~= '{{{1}}}' then&lt;br /&gt;
		local this = mw.title.getCurrentTitle()&lt;br /&gt;
		local titleObj = getTitle(title)&lt;br /&gt;
		local ifExists, ifRedirect&lt;br /&gt;
		local type = ''&lt;br /&gt;
		local s = ''&lt;br /&gt;
		&lt;br /&gt;
		local langName = ''&lt;br /&gt;
		if lang ~= 'd' then&lt;br /&gt;
			if isEmpty(languages[lang]) then&lt;br /&gt;
				if this.namespace == 0 and isEmpty(nocat) then&lt;br /&gt;
					s = s .. categoryErrors&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				langName = ' data-lang-name=&amp;quot;' .. (languages[lang][1] and languages[lang][1] or '???') .. '&amp;quot;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Проверяет, не ограничен ли лимит вызовов функции&lt;br /&gt;
		if titleObj ~= nil then&lt;br /&gt;
			ifExists = titleObj[1]&lt;br /&gt;
			ifRedirect = titleObj[2]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Показывает ссылку на редирект или красную ссылку&lt;br /&gt;
		local class = (ifExists and (ifRedirect and ' iw--redirect' or ' iw--exists') or '')&lt;br /&gt;
		s = s .. string.format('&amp;lt;span class=&amp;quot;iw%s plainlinks&amp;quot; data-title=&amp;quot;%s&amp;quot; data-lang=&amp;quot;%s&amp;quot;' .. langName .. '&amp;gt;', class, mwlang:ucfirst(title), lang)&lt;br /&gt;
		&lt;br /&gt;
		if ifRedirect then&lt;br /&gt;
			if this.namespace == 0 and isEmpty(nocat) then&lt;br /&gt;
				s = s .. categoryRedirect&lt;br /&gt;
			end&lt;br /&gt;
			s = s .. string.format('[%s %s]', tostring(mw.uri.fullUrl(title,'redirect=no')), text)&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. string.format('[[%s|%s]]', title, text)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Показывает ссылку на иноязычную статью или предложение убрать шаблон&lt;br /&gt;
		if ifExists and not ifRedirect then&lt;br /&gt;
			s = s .. '&amp;lt;sup class=&amp;quot;iw__notice noprint&amp;quot;&amp;gt;[[Шаблон:Не переведено 5#Если существует статья|'&lt;br /&gt;
				  .. '&amp;lt;span style=&amp;quot;color:red; font-style:normal; font-weight:bold;&amp;quot; title=&amp;quot;Уберите шаблон «Не переведено 5» из статьи '&lt;br /&gt;
				  .. 'и замените его простой вики-ссылкой&amp;quot;&amp;gt;?!&amp;lt;/span&amp;gt;]]&amp;lt;/sup&amp;gt;'&lt;br /&gt;
			if this.namespace == 0 and isEmpty(nocat) then&lt;br /&gt;
				s = s .. categoryExists&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Создаёт всплывающую подсказку&lt;br /&gt;
			local t = ''&lt;br /&gt;
			if lang == 'd' then&lt;br /&gt;
				t = string.format('Страница статьи «%s» в Викиданных', mwlang:ucfirst(title))&lt;br /&gt;
				page = page .. '#sitelinks-wikipedia'&lt;br /&gt;
			else&lt;br /&gt;
				if not isEmpty(origPage) then&lt;br /&gt;
					t = string.format('%s — версия статьи', page)&lt;br /&gt;
				else&lt;br /&gt;
					t = 'Версия статьи'&lt;br /&gt;
				end&lt;br /&gt;
				t = t .. string.format(' «%s» на %s', mwlang:ucfirst(title), p._transform_lang(lang))&lt;br /&gt;
			end&lt;br /&gt;
		&lt;br /&gt;
			-- Создаёт примечание о перенаправлении&lt;br /&gt;
			local aster = ''&lt;br /&gt;
			if ifRedirect then&lt;br /&gt;
				aster = '&amp;lt;sup class=&amp;quot;iw__notice noprint&amp;quot; style=&amp;quot;font-style:normal; font-weight:normal; margin:0 0 0 1px;&amp;quot;&amp;gt;'&lt;br /&gt;
						.. '[[Шаблон:Не переведено 5#Если существует перенаправление|'&lt;br /&gt;
						.. '&amp;lt;span title=&amp;quot;Замените перенаправление статьёй либо уберите шаблон «Не переведено 5»&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;]]'&lt;br /&gt;
						.. '&amp;lt;/sup&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		&lt;br /&gt;
			-- Выводит ссылку на иноязычную страницу&lt;br /&gt;
			s = s .. '&amp;lt;sup class=&amp;quot;iw__note noprint&amp;quot; style=&amp;quot;font-style:normal; font-weight:normal;&amp;quot;&amp;gt;' ..&lt;br /&gt;
					string.format('[[:%s:%s|&amp;lt;span class=&amp;quot;iw__tooltip&amp;quot; title=&amp;quot;%s&amp;quot;&amp;gt;[%s]&amp;lt;/span&amp;gt;]]&amp;lt;/sup&amp;gt;', lang, page, t, lang) ..&lt;br /&gt;
					aster&lt;br /&gt;
				  &lt;br /&gt;
			-- Выводит статус иноязычной страницы&lt;br /&gt;
			if not isEmpty(state) and not isEmpty(states[state]) then&lt;br /&gt;
				s = s .. string.format('&amp;lt;sup class=&amp;quot;iw__status noprint&amp;quot; style=&amp;quot;margin:0 0 0 1px;&amp;quot;&amp;gt;[[Файл:%s|8px|link=%s|%s]]&amp;lt;/sup&amp;gt;',&lt;br /&gt;
						states[state][3], states[state][1], states[state][2])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return s .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		-- Если нет обязательного параметра, выводит красный текст&lt;br /&gt;
		local htmlerror = require('Module:Error').error&lt;br /&gt;
		return htmlerror{'Укажите название страницы.'}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вспомогательная функция для {{Не переведено 5}}: выводит подстановку шаблона&lt;br /&gt;
function p._substIW(title, text)&lt;br /&gt;
	local s = '[[' .. title&lt;br /&gt;
	if not isEmpty(text) and title ~= text then&lt;br /&gt;
		s = s .. '|' .. text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return s .. ']]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Выводит {{Не переведено 5}}&lt;br /&gt;
function p.getIW(frame)&lt;br /&gt;
	local mwlang = mw.getContentLanguage()&lt;br /&gt;
	&lt;br /&gt;
	local f = frame.args&lt;br /&gt;
	local title = f.title&lt;br /&gt;
	local text = f.text&lt;br /&gt;
	local lang = mwlang:lc(f.lang)&lt;br /&gt;
	local page = f.page&lt;br /&gt;
	local state = f.state&lt;br /&gt;
	local nocat = f.nocat&lt;br /&gt;
	&lt;br /&gt;
	if not mw.isSubsting() then&lt;br /&gt;
		return p._newIW(title, text, lang, page, state, nocat)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._substIW(title, text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>QBA-bot</name></author>	</entry>

	</feed>