Модуль:Language

{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Цей модуль використовується {{wikt-lang}} та {{wt}}. Він створений на основі шаблонів {{з}} та {{п}} і пов’язаних з ними модулями Вікісловнику. Він має функцію посилання на вікісловник, яка надсилає на потрібний розділ записів, а також застосовує правильне форматування мови та курсів. Функція теґування мови робить майже те ж саме, що й {{lang}}, за винятком того, що курсив не може бути налаштований та категорії не додаються.

Модуль використовує Модуль:Language/data для отримання назви коду мови, а також для виконання необхідних замін імен записів (наприклад, видалення макронів з латинських імен записів). На жаль, ці дані не виймаються автоматично з модулів мовних даних вікісловника. Для кодів мов, які не мають значення name в цьому модулі, назва мови вилучається за допомогою mw.language.fetchLanguage. Якщо mw.language.fetchLanguage не отримує правильну назву мови (або взагалі будь-яку назву мови), будь ласка, додайте її до Модуль:language/data, і аналогічно, якщо не генерується правильна назва запису, будь ласка, додайте заміни назв записів у модуль.

Приклади

[ред. код]
* {{#invoke:Language|wikt|en|language}} * {{#invoke:Language|wikt|en|language|languages}} * {{#invoke:Language|wikt|fr|bourguignon}} * {{#invoke:Language|wikt|la|homō}} * {{#invoke:Language|wikt|grc|δημοκρατίᾱ}} * {{#invoke:Language|wikt|uk|мова}} * {{#invoke:Language|wikt|ar|العَرَبِيَّة}} * {{#invoke:Language|wikt|fa|فارسی}} * {{#invoke:Language|wikt|ine-x-proto|*h₂enǵʰ-}}

Невірні коди

[ред. код]
* {{#invoke:Language|wikt|EN|language}} * {{#invoke:Language|wikt|En|language|languages}} * {{#invoke:Language|wikt|La|homō}} * {{#invoke:Language|wikt|Grc|δημοκρατίᾱ}} * {{#invoke:Language|wikt|Ru|язы́к}} * {{#invoke:Language|wikt|Ar|العَرَبِيَّة}} * {{#invoke:Language|wikt|Fa|فارسی}}

Помилки

[ред. код]
* {{#invoke:Language|wikt|en-Latin|language}}
  • language [Latin не є допустимим кодом сценарію.]

Категорії відстеження

[ред. код]
require('strict') local m_data = mw.loadData("Модуль:Language/data") local langData = m_data.languages or m_data  local p = {}  local function ifNotEmpty(value) 	if value == "" then 		return nil 	else 		return value 	end end  local function makeLinkedName(languageCode) 	local data = langData[languageCode] 	local article = data["article"] 	local name = data["Wikipedia_name"] or data["name"] 	return "[[" .. article .. "|" .. name .. "]]:&nbsp;" end  local function makeEntryName(word, languageCode) 	local data = langData[languageCode] 	local ugsub = mw.ustring.gsub 	word = tostring(word) 	if word == nil then 		error("Функція makeEntryName вимагає рядкового аргументу") 	elseif word == "" then 		return "" 	else 		-- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping. 		word = word:gsub("\'\'\'", "") 		word = word:gsub("\'\'", "") 		if data == nil then 			return word 		else 			local replacements = data and data["replacements"] 			if replacements == nil then 				return word 			else 				-- Decompose so that the diacritics of characters such 				-- as á can be removed in one go. 				-- No need to compose at the end, because the MediaWiki software 				-- will handle that. 				if replacements.decompose then 					word = mw.ustring.toNFD(word) 					for i, from in ipairs(replacements.from) do 						word = ugsub( 							word, 							from, 							replacements.to and replacements.to[i] or "") 					end 				else 					for regex, replacement in pairs(replacements) do 						word = ugsub(word, regex, replacement) 					end 				end 				return word 			end 		end 	end end  p.makeEntryName = makeEntryName  local function fixScriptCode(firstLetter, threeLetters) 	return string.upper(firstLetter) .. string.lower(threeLetters) end  local function getCodes(codes, text) 	local languageCode, scriptCode, invalidCode 	local errorText 	if codes == nil or codes == "" then 		errorText = 'код мови або сценарію не надається' 	elseif codes:find("^%a%a%a?$") or codes:find("^%a%a%a?%-%a%a%a%a$") then 		-- A three- or two-letter lowercase sequence at beginning of first parameter 		languageCode = 			codes:find("^%a%a%a?") and ( 				codes:match("^(%l%l%l?)") 				or codes:match("^(%a%a%a?)") 					:gsub("(%a%a%a?)", string.lower, 1) 			) 		-- One uppercase and three lowercase letters at the end of the first parameter 		scriptCode = 			codes:find("%a%a%a%a$") and ( 				codes:match("(%u%l%l%l)$") 				or gsub( 					codes:match("(%a%a%a%a)$"), 					"(%a)(%a%a%a)", 					fixScriptCode, 					1 				) 			) 	elseif codes:find("^%a%a%a?%-%a%a%a?$") 	or codes:find("^%a%a%a%-%a%a%a%-%a%a%a$") then 		languageCode = codes 	 	-- Private-use subtag: x followed by one or more sequences of 1-8 lowercase 	-- letters separated by hyphens. This only allows for one sequence, as it is 	-- needed for proto-languages such as ine-x-proto (Proto-Indo-European). 	elseif codes:find("^%a%a%a?%-x%-%a%a?%a?%a?%a?%a?%a?%a?$") then 		languageCode, scriptCode = 			codes:match("^(%a%a%a%-x%-%a%a?%a?%a?%a?%a?%a?%a?)%-?(.*)$") 		if not languageCode then 			errorText = '<code>'..codes..'</code> не є дійсним кодом мови або сценарію.' 		elseif scriptCode ~= "" and not scriptCode:find("%a%a%a%a") then 			errorText = '<code>'..scriptCode..'</code> не є допустимим кодом сценарію.' 		else 			scriptCode = scriptCode:gsub( 				"(%a)(%a%a%a)", 				fixScriptCode, 				1 			) 		end 	elseif codes:find("^%a%a%a?") then 		languageCode, invalidCode = codes:match("^(%a%a%a?)%-?(.*)") 		languageCode = string.lower(languageCode) 		errorText = '<code>'..invalidCode..'</code> не є допустимим кодом сценарію.' 	elseif codes:find("%-?%a%a%a%a$") then 		invalidCode, scriptCode = codes:match("(.*)%-?(%a%a%a%a)$") 		scriptCode = gsub( 			scriptCode, 			"(%a)(%a%a%a)", 			fixScriptCode 		) 		errorText = '<code>'..invalidCode..'</code> не є дійсним кодом мови.' 	else 		errorText = '<code>'..codes..'</code> не є дійсним кодом мови або сценарію.' 	end 	if not scriptCode or scriptCode == "" then 		scriptCode = require("Модуль:Unicode data").is_Latin(text) and "Latn" or "unknown" 	end 	if errorText then 		errorText = ' <span style="font-size: smaller">[' .. errorText .. ']</span>' 	else 		errorText = "" 	end 	languageCode = m_data.redirects[languageCode] or languageCode 	return languageCode, scriptCode, errorText end  local function tag(text, languageCode, script, italics) 	local data = langData[languageCode] 	-- Use Wikipedia code if it has been given: for instance, 	-- Proto-Indo-European has the Wiktionary code "ine-pro" but the Wikipedia 	-- code "ine-x-proto". 	languageCode = data and data.Wikipedia_code or languageCode 	 	local italicize = script == "Latn" and italics 	 	if not text then text = "[text?]" end 	 	local textDirectionMarkers = { "", "", "" } 	if data and data["direction"] == "rtl" then 		textDirectionMarkers = { ' dir="rtl"', '&rlm;', '&lrm;' } 	end 	 	local out = { textDirectionMarkers[2] } 	if italicize then 		table.insert(out, "<i lang=\"" .. languageCode .. "\"" .. textDirectionMarkers[1] .. ">" .. text .. "</i>") 	else 		table.insert(out, "<span lang=\"" .. languageCode .. "\"" .. textDirectionMarkers[1] .. ">" .. text .. "</span>") 	end 	table.insert(out, textDirectionMarkers[3]) 	 	return table.concat(out) end    function p.lang(frame) 	local parent = frame:getParent() 	local args = parent.args[1] and parent.args or frame.args 	 	local codes = args[1] and mw.text.trim(args[1]) 	local text = args[2] or error("Вкажіть текст у другому параметрі") 	 	local languageCode, scriptCode, errorText = getCodes(codes, text) 	 	local italics = args.italics or args.i or args.italic 	italics = not (italics == "n" or italics == "-" or italics == "no") 	 	return tag(text, languageCode, scriptCode, italics) .. errorText end  local function linkToWiktionary(entry, linkText, languageCode) 	local data = langData[languageCode] 	local name 	if languageCode then 		if data and data.name then 			name = data.name 		else 			-- On other languages' wikis, use mw.getContentLanguage():getCode(), 			-- or replace 'en' with that wiki's language code. 			name = mw.language.fetchLanguageName(languageCode, 'uk') 			if name == "" then 				error("Назва коду мови " .. ("%q"):format(languageCode or nil) 					.. " не може бути отримано за допомогою mw.language.fetchLanguageName, " 					.. "тому воно має бути додано до [[Модуль:Language/data]]") 			end 		end 		if entry:sub(1, 1) == "*" then 			if name ~= "" then 				entry = "Реконструкція:" .. name .. "/" .. entry:sub(2) 			else 				error("Назва мови порожня") 			end 		elseif data and data.type == "reconstructed" then 			mw.log("Реконструйована мова без зірочки:", languageCode, name, entry) 			local frame = mw.getCurrentFrame() 			-- Track reconstructed entries with no asterisk by transcluding 			-- a nonexistent template. This technique is used in Wiktionary: 			-- see [[wikt:Модуль:debug]]. 			-- [[Special:WhatLinksHere/tracking/wikt-lang/reconstructed with no asterisk]] 			pcall(frame.expandTemplate, frame, 				{ title = 'tracking/wikt-lang/reconstructed with no asterisk' }) 			if name ~= "" then 				entry = "Реконструкція:" .. name .. "/" .. entry 			else 				error("Назва мови порожня") 			end 		elseif data and data.type == "appendix" then 			if name ~= "" then 				entry = "Додаток:" .. name .. "/" .. entry 			else 				error("Назва мови порожня") 			end 		end 		if entry and linkText then 			return "[[wikt:" .. entry .. "#" .. name .. "|" .. linkText .. "]]" 		else 			error("linkToWiktionary потрібен запис у вікісловнику або текст посилання, або те й інше разом") 		end 	else 		return "[[wikt:" .. entry .. "|" .. linkText .. "]]" 	end end  function p.wiktlang(frame) 	local parent = frame:getParent() 	local args = parent.args[1] and parent.args or frame.args 	 	local codes = args[1] and mw.text.trim(args[1]) 	local word1 = ifNotEmpty(args[2]) 	local word2 = ifNotEmpty(args[3]) 	 	if not args[2] then 		error("Потрібен параметр 2") 	end 	 	local languageCode, scriptCode, errorText = getCodes(codes, word2 or word1) 	 	local italics = args.italics or args.i 	italics = not (italics == "n" or italics == "-") 	 	local entry, linkText 	if word2 and word1 then 		entry = makeEntryName(word1, languageCode) 		linkText = word2 	elseif word1 then 		entry = makeEntryName(word1, languageCode) 		linkText = word1 	end 	 	local out 	if languageCode and entry and linkText then 		out = tag(linkToWiktionary(entry, linkText, languageCode), languageCode, scriptCode, italics) 	elseif entry and linkText then 		out = linkToWiktionary(entry, linkText) 	else 		out = '<span style="font-size: smaller;">[text?]</span>' 	end 	 	if out and errorText then 		return out .. errorText 	else 		return errorText or error("Функція wiktlang нічого не генерує") 	end end  function p.wikt(frame) 	local parent = frame:getParent() 	local args = parent.args[1] and parent.args or frame.args 	 	local codes = args[1] and mw.text.trim(args[1]) 	local word1 = ifNotEmpty(args[2]) 	local word2 = ifNotEmpty(args[3]) 	 	if not word1 then 		error("Вкажіть слово у параметрі 2.") 	end 	 	local languageCode, scriptCode, errorText = getCodes(codes, word1) 	 	local entry, linkText 	if word2 and word1 then 		entry = makeEntryName(word1, languageCode) 		linkText = word2 	elseif word1 then 		entry = makeEntryName(word1, languageCode) 		linkText = word1 	end 	 	local out 	if languageCode and entry and linkText then 		out = linkToWiktionary(entry, linkText, languageCode)  	elseif entry and linkText then 		out = linkToWiktionary(entry, linkText) 	else 		out = '<span style="font-size: smaller;">[text?]</span>' 	end 	 	if out and errorText then 		return out and out .. errorText 	else 		return errorText or error("Функція wikt нічого не генерує") 	end end  return p