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

Модуль:languages

Эта страница бессрочно защищена от изменения
Материал из Викисловаря
Документация

Модуль предназначен для форматирования списка переводов. Этот модуль используется в шаблоне {{перев-блок}}.

Описание функций и параметров

  • list — функция форматирования списка переводов.
    Принимает в качестве параметров коды языков, а в качестве значений параметров строки переводов.

Используемые модули

Таблица кодов языков содержится в модуле languages/data. Каждая строка таблицы задаёт параметры необходимые для формирования названия языка. Строка состоит из двух частей разделённых знаком равно. Слева указывается имя параметра в двойных кавычках и квадратных скобках, а справа в фигурных скобках в двойных кавычках через запятую: код языка, название языка, индекс и уточнение. Например

  ["ith.lat"] = { "ith", "Ифкуиль", "и", "(лат.)" },

Для строки выше будет сформирована строка:

Индексы могут принимать значения:

  • в — восстановленные языки
  • и — искусственные языки
  • р — реконструированные языки
  • ф — фантастические языки
  •  — мёртвые языки
-- Модуль для создания списка переводов по языкам
 
-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:languages/data");
local p = {};

-- вспомогательная функция, удаляет пробелы
local function trimstr(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"));
end

local function formatLang(code, name, index, extention)
	local result = '';
    local margin = '';
	result = result .. "* [[" .. mw.ustring.lower(name) .. "#Русский|" .. name .. "]]";
	if index ~= nil and index ~= "" then
		local indexes = {
		["в"] = "восстановленный язык",
		["и"] = "искусственный язык",
		["р"] = "реконструированный язык",
		["ф"] = "фантастический язык",
		["†"] = "мёртвый язык"
		}
		local title = indexes[index] or '';
		if title ~= '' then
			title = " title='" .. title .. "'";
		end
		result = result .. "<sup style='color:#66C033'" .. title .. ">" .. index .. "</sup>";
		margin = ';margin-left: -5px';
	end
	if code ~= nil and code ~= "" then
	result = result .. "<sub style='color:#33C066" .. margin .. "'>" .. code .. "</sub>";
	end
	if extention ~= nil and extention ~= "" then
	result = result .. " " .. extention;
	end
	return result;
end

function p.list(frame)
  local result = "";
  local names = {};
  local nnames = {};
  local key = "";
  local cnt = 0;
  local demo = frame.args['demo'];
  if demo ~= nil and demo ~= "" then
    for code,v in pairs(languages) do
      key = v[2];
      if v[4] ~= nil and v[4] ~= "" then
        key = key .. v[4];
      end
      table.insert(nnames, key);
      names[key] = { code = v[1], name = v[2], index = v[3],  extention = v[4], value =  code};
      cnt = cnt +1;
    end; 
  else
    for code,value in pairs(frame:getParent().args) do
      if type(code)=='string' then 
        local trimmed = trimstr(code);
        local v = trimstr(value);
        local l = languages[trimmed];
        if l ~= nil and l ~= "" and v ~= nil and v ~= "" then
          key = l[2];
          if l[4] ~= nil and l[4] ~= "" then
            key = key .. l[4];
          end
          table.insert(nnames, key);
          names[key] = { code = l[1], name = l[2], index = l[3],  extention = l[4], value = v};
          cnt = cnt +1;
        end
      end
    end
  end
  if cnt > 0 then
    table.sort(nnames);
    for i, key in ipairs(nnames) do
      local v = names[key];    
      result = result .. formatLang(v.code, v.name, v.index, v.extention);
      result = result .. ': <span lang="' .. v.code .. '">' .. v.value .. '</span>\n';
    end
  end
  return result
end

function p.ref(frame)
	local result = "";
	local args = frame.args;
	if args[1] == nil then
		args = frame:getParent().args;
	end
	local code = args[1];
	if type(code) == 'string' then
		local trimmed = trimstr(code);
		local l = languages[trimmed];
		if l ~= nil then
			result = result .. formatLang(l[1], l[2], l[3], l[4]);
		end
	end
	if result == '' then
		result = tostring(code);
	end
	return result;
end

return p