Модуль:Languages

Материал из Arma Project Wiki
Перейти к: навигация, поиск
(i) Документация

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

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

Тесты

Ошибка скрипта: Нет такого модуля, как «Languages/tests».


Во избежание поломок страниц, использующих данный модуль, желательно экспериментировать в Песочнице для модулей.

-- Модуль для работы с языками ISO 639

-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:Languages/data")
local p = {}

-- вспомогательная функция, удаляет пробелы
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|我|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 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

-- Выводит название языка в предложном падеже
local function transform_lang(code)
    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

-- Проверяет, пустой ли дан параметр
local function isEmpty(s)
	return s == nil or s == ''
end

function p.getIW(frame) -- {{Не переведено 5}}
	local redirect = require('Module:Redirect')
	local f = frame.args
	local title = f.title
	local text = f.text
	local lang = f.lang
	local page = f.page
	local state = f.state
	local nocat = f.nocat
	
	-- Изображения для старой функции показа статуса
	local states = {
		['ИС'] = {'Википедия:Избранные статьи','Избранная статья','Small Skew Star SVG.svg'},
		['ХС'] = {'Википедия:Хорошие статьи','Хорошая статья','Blue star unboxed.svg'},
		['ИСП'] = {'Википедия:Избранные списки и порталы','Избранный список','Purple star unboxed.svg'}
	}
	
	-- Категории для шаблона
	local categoryExists = '[[Категория:Википедия:Статьи с неактуальным шаблоном Не переведено]]'
	local categoryReplace = '[[Категория:Википедия:Запросы на замену перенаправлений переводами]]'
	
	-- Проверяет существование параметров и заменяет их на альтернативные
	if isEmpty(text) then
		text = title
	end
	if isEmpty(lang) then
		lang = "en"
	end
	if isEmpty(page) then
		page = title
	end
	
	-- Создаёт шаблон
	if title then
		local this = mw.title.getCurrentTitle()
		local type = ''
		local s = ''
		
		-- Показывает ссылку на редирект или красную ссылку
		s = s .. '<span class="iw plainlinks" data-title="' .. title .. '">'
		if redirect.luaIsRedirect(title) then
			if this.namespace == '0' and not(nocat) then
				s = s .. categoryReplace
			end
			s = s .. '[' .. tostring(mw.uri.fullUrl(title,'redirect=no')) .. ' ' .. text .. ']'
		else
			s = s .. '[[' .. title .. '|' .. text .. ']]'
		end
		
		-- Показывает ссылку на иноязычную статью или предложение убрать шаблон
		if  mw.title.new(title).exists and not redirect.luaIsRedirect(title) then
			s = s .. '<sup class="noprint">[[Шаблон:Не переведено 5#Если страница существует|'
				  .. '<span style="color:red; font-weight:bold;" title="Уберите шаблон «Не переведено 5» из статьи '
				  .. 'и замените его простой вики-ссылкой">?!</span>]]</sup>'
			if this.namespace == '0' and not(nocat) then
				s = s .. categoryExists
			end
		else
			-- Создаёт всплывающую подсказку
			local t = ''
			if lang == 'd' then
				t = 'Страница статьи «' .. title .. '» в Викиданных'
			else
				if f.page then
					t = page .. ' — версия статьи'
				else
					t = 'Версия статьи'
				end
				t = t .. ' «' .. title .. '» на ' .. transform_lang(lang)
			end
			
			-- Создаёт примечание о перенаправлении
			local aster = ''
			if redirect.luaIsRedirect(title) then
				aster = '<sup class="noprint" style="margin:0 0 0 1px;">'
						.. '[[Шаблон:Не переведено 5#Если существует перенаправление|'
						.. '<span title="Замените перенаправление статьёй либо уберите шаблон «Не переведено 5»">*</span>]]'
						.. '</sup>'
			end
		
			-- Выводит ссылку на иноязычную страницу
			s = s .. '<sup class="noprint" style="font-style:normal; font-weight:normal;">[[:' .. lang .. ':' .. page
				  .. '|<span title="' .. t .. '">[' .. lang .. ']]]</sup>'
				  .. aster
				  
			-- Выводит статус иноязычной страницы
			if not isEmpty(state) then
				s = s .. '<sup class="noprint" style="margin:0 0 0 1px;">'
					  .. '[[Файл:' .. states[state][3] .. '|8px|link=' .. states[state][1] .. '|' .. states[state][2] .. ']]'
					  .. '</sup>'
			end
		end
		
		return s
	end
end
 
return p