Moduł:Lang
local lang = {}
local function langData(code) if not code or (#code == 0) then -- brak kodu języka mw.log("Pusty kod języka: "..code); return end
local data = mw.loadData( 'Module:lang/data' )
-- bezbłędny kod local lang = data[code] if lang then return lang, code end
-- może kod jest podany dużymi literami lub ma spacje przed i po local lcode = mw.text.trim(string.lower(code)) -- dobre kody języka są tylko w ASCII lang = data[lcode] if lang then mw.log('kod "'..code..'" został zamieniony na "'..lcode..'"') return lang, lcode end
-- może kod jest podany z variantem local scode = string.match(lcode, "^([a-z]+)[_-]") lang = data[scode] if scode then mw.log('kod "'..code..'" został zinterpretowany jako "'..scode..'"') return lang, scode end
-- poddaje się mw.log('Nieznany kod języka: "'..code..'"'); return false, code end
function lang.istnieje(frame)
local languageData, code = langData(frame.args[1]) return languageData and code or nil
end
function lang.kursywa(frame)
local languageData, code = langData(frame.args[1]) return (languageData and (languageData.kursywa ~= false)) and "" or ""
end
lang["hasło"] = function(frame)
local languageData, _ = langData(frame.args[1]) return languageData['hasło']
end
lang["skrót"] = function(frame)
local languageData, _ = langData(frame.args[1]) return languageData['skrót'] or languageData['mianownik']
end
function lang.mianownik(frame)
local languageData, _ = langData(frame.args[1]) return languageData['mianownik']
end
lang["dopełniacz"] = function(frame)
local languageData, _ = langData(frame.args[1]) return languageData['dopełniacz']
end
function lang.miejscownik(frame)
local languageData, _ = langData(frame.args[1]) return languageData['miejscownik']
end
function list(frame, multi, showPL)
-- konwersja kodów języków na kod wiki text opisujący kody
local items = {} -- tabela na skonwertowane kody
-- flagi informujące, że na liście znajdują się podejrzane kody
local invalid = false -- nieznany kod języka
local warning = false -- język z listy częstych błędów
local hiddenpl = false -- ukryty język polski
local modified = false -- kod języka z automatyczną korektą
local duplicated = false -- wielokrotnie podany (prawie) taki sam kod języka
local args = frame.args;
if not args[1] then
-- brak argumentów sugeruje wywołanie z szablonu
local parent = frame:getParent()
if parent then
args = parent.args
end
end
if not args[1] then
return "Błąd! Brak kodu języka."
end
-- języki wpadające do
local warnings = {
ee = true,
am = true,
an = true,
ang = true,
ng = true,
kr = true,
se = true,
si = true
}
local formatLanguageItem = function(langCode, languageData)
local skrot = languageData['skrót'] or languageData['mianownik']
local nativeName = mw.language.fetchLanguageName(langCode)
if nativeName and #nativeName > 0 and langCode ~= "pl" then
return string.format("%s", languageData['hasło'], languageData['miejscownik'], nativeName, skrot)
else
return string.format("%s", languageData['hasło'], languageData['miejscownik'], skrot)
end
end
local parsedLanguages = {}
local countGood = 0 local formatItem = function(languageCode)
local languageData, langCode = langData(languageCode) if langCode and (languageCode ~= langCode) then modified = true end
if languageData then
if warnings[langCode] then
warning = true
end
local item = formatLanguageItem(langCode, languageData)
if parsedLanguages[langCode] then
duplicated = true
mw.log("Powtórne przywołanie języka ("..languageCode..")")
else
parsedLanguages[langCode] = item;
if (langCode == "pl") and not showPL then -- pomiń język polski hiddenpl = true mw.log("Ukrywam język polski") else table.insert(items, item) countGood = countGood + 1 end
end
elseif not langCode or #langCode == 0 then
if #items == 0 then
-- pierwszy kod nie może być pusty, reszta może, bo jest przekazywana jako pusta w szablonach cytowania
invalid = true
table.insert(items, "Błąd! Brak kodu języka.")
end
else
invalid = true
local item = string.format("Błąd! Nieznany kod języka: %s. Sprawdź listę kodów.", languageCode)
if parsedLanguages[languageCode] then
duplicated = true
mw.log("Powtórne przywołanie języka ("..languageCode..")")
else
parsedLanguages[languageCode] = item;
table.insert(items, item)
end
end
end
if args[2] or multi then
-- wiele argumentów sugeruje przekazywnie każdego kodu języka w oddzielnych argumentach
for i, v in ipairs(args) do
if #v > 0 then
formatItem(v)
end
end
else
-- jeden argument pozwala także wysłać wszystkie kody oddzielone spacją
for languageCode in string.gmatch(args[1], "%S+") do
formatItem(languageCode)
end
end
if #items == 0 then
if hiddenpl then
-- podano tylko język polski, który jest ukryty
else
-- pusta lista kodów invalid = true table.insert(items, "Błąd! Brak kodu języka.")
end end
-- ostateczne formatowanie wyniku
local result = {}
if #items > 0 then
if (countGood > 0) and hiddenpl then
-- przywracam język polski jeśli lista zawiera więcej niż jeden język
table.insert(items, 1, parsedLanguages.pl)
hiddenpl = false
end
table.insert(result, "(") table.insert(result, table.concat(items, " • ")) table.insert(result, ")") end
if mw.title.getCurrentTitle().namespace == 0 then
if warning then
table.insert(result, "")
end
if invalid then
table.insert(result, "")
end
if hiddenpl then
table.insert(result, "")
end
if modified or duplicated then
table.insert(result, "")
end
end
return table.concat(result, "")
end
function lang.lang(frame) return list(frame, true, true) end
lang["język"] = function(frame) return list(frame, false, true) end
return lang