Moduł:Lang: Różnice pomiędzy wersjami
| m 1 wersja | pl>MarMi wiki  Moduł:Lang/data obsługuje więcej języków/wariantów, niż jest wersji jęz. Wikipedii | ||
| Linia 4: | Linia 4: | ||
| 	if not code or (#code == 0) then | 	if not code or (#code == 0) then | ||
| 		-- brak kodu języka | 		-- brak kodu języka | ||
| 		mw.log("Pusty kod języka: "..code); | 		--mw.log("Pusty kod języka: "..code); | ||
| 		return | 		return | ||
| 	end | 	end | ||
| 	local data = mw.loadData( 'Module:lang/data' ) | 	local data = mw.loadData( 'Module:lang/data' ) | ||
| 	-- bezbłędny kod | 	-- bezbłędny kod | ||
| 	local lang = data[code] | 	local lang = data[code] | ||
| Linia 20: | Linia 20: | ||
| 	lang = data[lcode] | 	lang = data[lcode] | ||
| 	if lang then | 	if lang then | ||
| 		mw.log('kod "'..code..'" został zamieniony na "'..lcode..'"') | 		--mw.log('kod "'..code..'" został zamieniony na "'..lcode..'"') | ||
| 		return lang, lcode | 		return lang, lcode | ||
| 	end | 	end | ||
| 	-- może kod jest podany z variantem | 	-- może kod jest podany z variantem | ||
| 	local scode = string.match( | 	local scode, vcode = string.match(code, "%s*([a-zA-Z]+)%-([^%s]+)%s*$") | ||
| 	if not scode then | |||
| 		scode, vcode = string.match(code, "%s*([a-zA-Z]+)_([^%s]+)%s*$") | |||
| 	end | |||
| 	if scode then | 	if scode then | ||
| 		mw.log('kod "'..code..'" został  | 		--mw.log('kod "'..code..'" został rozdzielony na "'..scode..'" i wariant "'..vcode..'"') | ||
| 		return lang, scode | 		lang = data[scode] | ||
| 		if not lang then | |||
| 			--mw.log('kod "'..scode..'" został zamieniony na "'..string.lower(scode)..'"') | |||
| 			scode = string.lower(scode) | |||
| 			lang = data[scode] | |||
| 		end | |||
| 		if lang then | |||
| 			-- test variant | |||
| 			if lang.warianty then | |||
| 				local lvcode = string.lower(vcode) | |||
| 				for k, v in pairs(lang.warianty) do | |||
| 					if (type(k) == "number") and (type(v) == "string") and (lvcode == string.lower(v)) then | |||
| 						--mw.log('kod "'..code..'" w formie kanonicznej "'..scode..'-'..v..'"') | |||
| 						return lang, scode, scode.."-"..v | |||
| 					elseif (type(k) == "string") and (type(v) == "table") and (lvcode == string.lower(k)) then | |||
| 						--mw.log('zindywizualizowany kod "'..code..'" w formie kanonicznej "'..scode..'-'..k..'"') | |||
| 						local fields = { "hasło", "mianownik", "dopełniacz", "miejscownik", "skrót" } | |||
| 						local vlang = {} | |||
| 						for _, f in ipairs(fields) do | |||
| 							vlang[f] = v[f] or lang[f] | |||
| 						end | |||
| 						return vlang, scode, scode.."-"..k | |||
| 					end | |||
| 				end | |||
| 			end | |||
| 			--mw.log('kod "'..code..'" z nieznanym wariantem') | |||
| 			return lang, scode | |||
| 		end | |||
| 	end | 	end | ||
| 	-- poddaje się | 	-- poddaje się | ||
| 	mw.log('Nieznany kod języka: "'..code..'"'); | 	--mw.log('Nieznany kod języka: "'..code..'"'); | ||
| 	return false, code | 	return false, code | ||
| end | end | ||
| function lang.istnieje(frame) | function lang.istnieje(frame) | ||
|      local languageData, code = langData(frame.args[1]) |      local languageData, code, _ = langData(frame.args[1]) | ||
|      return languageData and code or nil |      return languageData and code or nil | ||
| end | end | ||
| function lang.kursywa(frame) | function lang.kursywa(frame) | ||
|      local languageData, code = langData( | 	local langCode = frame.args[1] | ||
|      local languageData, code, _ = langData(langCode) | |||
|     if langCode and (langCode ~= code) and string.match(langCode, "^%a+%-[Ll][Aa][Tt][Nn]$") or string.match(langCode, "^%a+%-[Ll][Aa][Tt][Nn]%-") then | |||
|     	-- Latn script | |||
|     	return "''" | |||
|     end | |||
|      return (languageData and (languageData.kursywa ~= false)) and "''" or "" |      return (languageData and (languageData.kursywa ~= false)) and "''" or "" | ||
| end | end | ||
| lang["hasło"] = function(frame) | lang["hasło"] = function(frame) | ||
|      local languageData, _ = langData(frame.args[1]) |      local languageData, _, _ = langData(frame.args[1]) | ||
|      return languageData['hasło'] |      return languageData['hasło'] | ||
| end | end | ||
| lang["skrót"] = function(frame) | lang["skrót"] = function(frame) | ||
|      local languageData, _ = langData(frame.args[1]) |      local languageData, _, _ = langData(frame.args[1]) | ||
|      return languageData['skrót'] or languageData['mianownik'] |      return languageData['skrót'] or languageData['mianownik'] | ||
| end | end | ||
| function lang.mianownik(frame) | function lang.mianownik(frame) | ||
|      local languageData, _ = langData(frame.args[1]) |      local languageData, _, _ = langData(frame.args[1]) | ||
|      return languageData['mianownik'] |      return languageData['mianownik'] | ||
| end | end | ||
| lang["dopełniacz"] = function(frame) | lang["dopełniacz"] = function(frame) | ||
|      local languageData, _ = langData(frame.args[1]) |      local languageData, _, _ = langData(frame.args[1]) | ||
|      return languageData['dopełniacz'] |      return languageData['dopełniacz'] | ||
| end | |||
| lang["dopełniacz?"] = function(frame) | |||
|     local languageData, _, _ = langData(frame.args[1]) | |||
|     return languageData and languageData['dopełniacz'] or nil | |||
| end | end | ||
| function lang.miejscownik(frame) | function lang.miejscownik(frame) | ||
|      local languageData, _ = langData(frame.args[1]) |      local languageData, _, _ = langData(frame.args[1]) | ||
|      return languageData['miejscownik'] |      return languageData['miejscownik'] | ||
| end | |||
| lang["miejscownik?"] = function(frame) | |||
|     local languageData, _, _ = langData(frame.args[1]) | |||
|     return languageData and languageData['miejscownik'] or nil | |||
| end | end | ||
| Linia 85: | Linia 133: | ||
|      local args = frame.args; |      local args = frame.args; | ||
|      if not args[1] then |      if not args[1] then | ||
|          -- brak argumentów sugeruje wywołanie z szablonu |          -- brak argumentów sugeruje wywołanie z szablonu        	 | ||
|          local parent = frame:getParent() |          local parent = frame.getParent and frame:getParent() or nil | ||
|          if parent then |          if parent then | ||
|              args = parent.args |              args = parent.args | ||
| Linia 108: | Linia 156: | ||
|      } |      } | ||
|      local formatLanguageItem = function(langCode, languageData) |      local formatLanguageItem = function(langCode, languageData, alt) | ||
|     	local class = alt and "lang-link-warning" or ""  | |||
|     	if #class > 0 then | |||
|     		class = 'class="'..class..'"' | |||
|     	end | |||
|          local skrot = languageData['skrót'] or languageData['mianownik'] |          local skrot = languageData['skrót'] or languageData['mianownik'] | ||
|          local nativeName = mw.language.fetchLanguageName(langCode) |          local nativeName = mw.language.fetchLanguageName(langCode) | ||
|          if nativeName and #nativeName > 0 and langCode ~= "pl" then |          if nativeName and #nativeName > 0 and langCode ~= "pl" then | ||
|              return string.format(" |              return string.format("<abbr %s title=\"Treść w języku %s (%s)\">%s</abbr>", class, languageData['miejscownik'], nativeName, skrot) | ||
|          else |          else | ||
|              return string.format(" |              return string.format("<abbr %s title=\"Treść w języku %s\">%s</abbr>", class, languageData['miejscownik'], skrot) | ||
|          end |          end | ||
|      end |      end | ||
| Linia 122: | Linia 174: | ||
|      local formatItem = function(languageCode) |      local formatItem = function(languageCode) | ||
| 	    local languageData, langCode = langData(languageCode) | 	    local languageData, langCode, langTag = langData(languageCode) | ||
| 	    local altFormat = false | |||
| 	    if langCode and (languageCode ~= langCode) then | 	    if langCode and (languageCode ~= langCode) then | ||
| 	    	modified =  | 	    	altFormat = languageCode ~= langTag | ||
| 	    	modified = modified or altFormat | |||
| 	    end | 	    end | ||
| Linia 132: | Linia 186: | ||
|              end |              end | ||
|   			local item = formatLanguageItem(langCode, languageData) |   			local item = formatLanguageItem(langCode, languageData, altFormat) | ||
|   			if parsedLanguages[langCode] then |   			if parsedLanguages[langCode] then | ||
|   				duplicated = true |   				duplicated = true | ||
|   				mw.log("Powtórne przywołanie języka ("..languageCode..")") |   				--mw.log("Powtórne przywołanie języka ("..languageCode..")") | ||
|   			else |   			else | ||
|   				parsedLanguages[langCode] = item; |   				parsedLanguages[langCode] = item; | ||
| Linia 141: | Linia 195: | ||
| 					-- pomiń język polski | 					-- pomiń język polski | ||
| 					hiddenpl = true | 					hiddenpl = true | ||
| 					mw.log("Ukrywam język polski") | 					--mw.log("Ukrywam język polski") | ||
| 				else | 				else | ||
| 	 				table.insert(items, item) | 	 				table.insert(items, item) | ||
| Linia 155: | Linia 209: | ||
|          else |          else | ||
|              invalid = true |              invalid = true | ||
|              local item = string.format("<span style=\"color:red\">'''Błąd! Nieznany kod języka: %s. Sprawdź [[ |              local item = string.format("<span style=\"color:red\">'''Błąd! Nieznany kod języka: %s. Sprawdź [[Moduł:Lang/data|listę kodów]].'''</span>", languageCode) | ||
|   			if parsedLanguages[languageCode] then |   			if parsedLanguages[languageCode] then | ||
|   				duplicated = true |   				duplicated = true | ||
|   				mw.log("Powtórne przywołanie języka ("..languageCode..")") |   				--mw.log("Powtórne przywołanie języka ("..languageCode..")") | ||
|   			else |   			else | ||
|   				parsedLanguages[languageCode] = item; |   				parsedLanguages[languageCode] = item; | ||
| Linia 200: | Linia 254: | ||
|      	end |      	end | ||
| 	    table.insert(result,  | 	    table.insert(result, '<span class="lang-list') | ||
| 	    if (#items == 1) and parsedLanguages.pl then | |||
| 	    	table.insert(result, " tylko-pl") | |||
| 	    end | |||
| 	    table.insert(result, '">(') | |||
| 	    table.insert(result, table.concat(items, " • ")) | 	    table.insert(result, table.concat(items, " • ")) | ||
| 	    table.insert(result, ")</span>") | 	    table.insert(result, ")</span>") | ||
Wersja z 11:53, 7 wrz 2021
Moduł techniczny do obsługi kodów językowych.
istnieje
Funkcja sprawdzająca czy dla podanego kodu języka istnieje wpis w module danych z danymi opisowymi. Jeśli dane istnieją, to wynikiem jest rozpoznany kod języka, w przeciwnym razie funkcja zwraca pusty tekst.
parametry
| Pole | Do czego służy? | Jak wypełnić? | 
|---|---|---|
| 1 | Kod języka | Np. enlubpl. | 
przykłady
| wywołanie | efekt | 
|---|---|
| {{#if:{{#invoke:lang|istnieje|en}}|tak|nie}} | tak | 
| {{#if:{{#invoke:lang|istnieje}}|tak|nie}} | nie | 
| {{#if:{{#invoke:lang|istnieje|xxxx}}|tak|nie}} | nie | 
| {{#invoke:lang|istnieje|pl}} | pl | 
| {{#invoke:lang|istnieje|pl-PL}} | pl | 
| {{#invoke:lang|istnieje|uuuu}} | |
| {{#if:{{#invoke:lang|istnieje|}}|tak|nie}} | nie | 
| {{#if:{{#invoke:lang|istnieje}}|tak|nie}} | nie | 
| {{#ifeq:{{#invoke:lang|istnieje|en}}|en|tak|nie}} | tak | 
| {{#ifeq:{{#invoke:lang|istnieje|xxx}}|xxx|tak|nie}} | nie | 
| {{#ifeq:{{#invoke:lang|istnieje|}}||tak|nie}} | tak | 
kursywa
Funkcja zwracająca wikikod kursywy ('') jeśli język o podanym kodzie zapisywany jest łacińskim alfabetem. Wspiera ona działanie szablonu {{w języku}}.
parametry
| Pole | Do czego służy? | Jak wypełnić? | 
|---|---|---|
| 1 | Kod języka | Np. enlubru. | 
przykłady
| wywołanie | efekt | 
|---|---|
| i{{#invoke:lang|kursywa|en}}i | ii | 
| i{{#invoke:lang|kursywa|ru}}i | ii | 
| {{#invoke:lang|kursywa|en}}{{j|en|Hello}}{{#invoke:lang|kursywa|en}} | Hello | 
| {{#invoke:lang|kursywa|ru}}{{j|ru|привет}}{{#invoke:lang|kursywa|ru}} | привет | 
hasło, skrót, mianownik, dopełniacz, miejscownik
Funkcje zwracające opis stowarzyszony z podanym kodem języka odpowiednio:
- hasło
- Zwraca nazwę artykułu w Wikipedii, który opisuje język o zadanym kodzie.
- skrót
- Skrót nazwy języka, jeśli istnieje, w przeciwnym razie mianownik nazwy języka.
- mianownik
- Nazwa języka w mianowniku.
- dopełniacz
- Nazwa języka w dopełniaczu.
- miejscownik
- Nazwa języka w miejscowniku.
Funkcja wymaga prawidłowego kodu języka, tj. niepustego wyniku z funkcji istnieje, w przeciwnym razie generuje błąd skryptu.
parametry
| Pole | Do czego służy? | Jak wypełnić? | 
|---|---|---|
| 1 | Kod języka | Np. enlubpl. | 
przykłady
| wywołanie \ X | en | pl | aa | pl_PL | 
|---|---|---|---|---|
| [[{{#invoke:lang|hasło|X}}]] | język angielski | język polski | język afar | język polski | 
| {{#invoke:lang|skrót|X}} | ang. | pol. | afar | pol. | 
| {{#invoke:lang|mianownik|X}} | angielski | polski | afar | polski | 
| {{#invoke:lang|dopełniacz|X}} | angielskiego | polskiego | afar | polskiego | 
| {{#invoke:lang|miejscownik|X}} | angielskim | polskim | afar | polskim | 
lang
Funkcja konwertująca kody języka zgodnie z definicją w szablonie {{lang}}. Pomija w wyświetlaniu kod języka polskiego.
parametry
| Pole | Do czego służy? | Jak wypełnić? | 
|---|---|---|
| 1..N | Kod języka | Np. enlubpl. | 
przykłady
| wywołanie | efekt | 
|---|---|
| {{#invoke:lang|lang|en}} | (ang.) | 
| {{#invoke:lang|lang|X}} | (Błąd! Nieznany kod języka: X. Sprawdź listę kodów.) | 
| {{#invoke:lang|lang|}} | (Błąd! Brak kodu języka.) | 
| {{#invoke:lang|lang}} | Błąd! Brak kodu języka. | 
| {{#invoke:lang|lang|en|pl|ru|it|ee|roa-rup|zh-min-nan|be-x-old|tum|de|et|hak|xal|ilo|id|ia|ie}} | (ang. • pol. • ros. • wł. • ewe • arum. • minnański • biał. (tar.) • tumbuka • niem. • est. • hakka • kałm. • ilokański • indonez. • interlingua • occidental) | 
język
Funkcja konwertująca kody języka zgodnie z definicją w szablonie {{lang}}. Pomija w wyświetlaniu kod języka polskiego.
parametry
| Pole | Do czego służy? | Jak wypełnić? | 
|---|---|---|
| 1 | Kody języków oddzielone odstępami | Np. enluben pl de. | 
przykłady
| wywołanie | efekt | 
|---|---|
| {{#invoke:lang|język|en}} | (ang.) | 
| {{#invoke:lang|język|X}} | (Błąd! Nieznany kod języka: X. Sprawdź listę kodów.) | 
| {{#invoke:lang|język|}} | (Błąd! Brak kodu języka.) | 
| {{#invoke:lang|język}} | Błąd! Brak kodu języka. | 
| {{#invoke:lang|język|en pl ru it ee roa-rup zh-min-nan be-x-old tum de et hak xal ilo id ia ie}} | (ang. • pol. • ros. • wł. • ewe • arum. • minnański • biał. (tar.) • tumbuka • niem. • est. • hakka • kałm. • ilokański • indonez. • interlingua • occidental) | 
Błędy
Błędy należy zgłaszać na stronie Wikipedia:Kawiarenka/Kwestie techniczne.
Zobacz też
- Pomoc:Interwiki
- Module:lang/data
- Kategoria:Częste błędy kodu w szablonie lang
- Kategoria:Nierozpoznany kod języka w szablonie lang
- Kategoria:Szablon lang z ukrytym językiem polskim
- Kategoria:Szablon lang z kodem języka wymagającym poprawki
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, vcode = string.match(code, "%s*([a-zA-Z]+)%-([^%s]+)%s*$")
	if not scode then
		scode, vcode = string.match(code, "%s*([a-zA-Z]+)_([^%s]+)%s*$")
	end
	
	if scode then
		--mw.log('kod "'..code..'" został rozdzielony na "'..scode..'" i wariant "'..vcode..'"')
		lang = data[scode]
		if not lang then
			--mw.log('kod "'..scode..'" został zamieniony na "'..string.lower(scode)..'"')
			scode = string.lower(scode)
			lang = data[scode]
		end
		
		if lang then
			-- test variant
			if lang.warianty then
				local lvcode = string.lower(vcode)
				for k, v in pairs(lang.warianty) do
					if (type(k) == "number") and (type(v) == "string") and (lvcode == string.lower(v)) then
						--mw.log('kod "'..code..'" w formie kanonicznej "'..scode..'-'..v..'"')
						return lang, scode, scode.."-"..v
					elseif (type(k) == "string") and (type(v) == "table") and (lvcode == string.lower(k)) then
						--mw.log('zindywizualizowany kod "'..code..'" w formie kanonicznej "'..scode..'-'..k..'"')
						local fields = { "hasło", "mianownik", "dopełniacz", "miejscownik", "skrót" }
						local vlang = {}
						for _, f in ipairs(fields) do
							vlang[f] = v[f] or lang[f]
						end
						return vlang, scode, scode.."-"..k
					end
				end
			end
		
			--mw.log('kod "'..code..'" z nieznanym wariantem')
			return lang, scode
		end
	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 langCode = frame.args[1]
    local languageData, code, _ = langData(langCode)
    if langCode and (langCode ~= code) and string.match(langCode, "^%a+%-[Ll][Aa][Tt][Nn]$") or string.match(langCode, "^%a+%-[Ll][Aa][Tt][Nn]%-") then
    	-- Latn script
    	return "''"
    end
    
    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
lang["dopełniacz?"] = function(frame)
    local languageData, _, _ = langData(frame.args[1])
    return languageData and languageData['dopełniacz'] or nil
end
function lang.miejscownik(frame)
    local languageData, _, _ = langData(frame.args[1])
    return languageData['miejscownik']
end
lang["miejscownik?"] = function(frame)
    local languageData, _, _ = langData(frame.args[1])
    return languageData and languageData['miejscownik'] or nil
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 and frame:getParent() or nil
        if parent then
            args = parent.args
        end
    end
    if not args[1] then
        return "<span style=\"color:red\">'''Błąd! Brak kodu języka.'''</span>"
    end
    
    -- języki wpadające do [[Kategoria:Częste błędy kodu w szablonie lang]]
    local warnings = {
    	ee = true,
    	am = true,
    	an = true,
    	ang = true,
    	ng = true,
    	kr = true,
    	se = true,
    	si = true
    }
    
    local formatLanguageItem = function(langCode, languageData, alt)
    	local class = alt and "lang-link-warning" or "" 
    	if #class > 0 then
    		class = 'class="'..class..'"'
    	end
        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("<abbr %s title=\"Treść w języku %s (%s)\">%s</abbr>", class, languageData['miejscownik'], nativeName, skrot)
        else
            return string.format("<abbr %s title=\"Treść w języku %s\">%s</abbr>", class, languageData['miejscownik'], skrot)
        end
    end
	local parsedLanguages = {}
    local countGood = 0
    
    local formatItem = function(languageCode)
	    local languageData, langCode, langTag = langData(languageCode)
	    local altFormat = false
	    if langCode and (languageCode ~= langCode) then
	    	altFormat = languageCode ~= langTag
	    	modified = modified or altFormat
	    end
    	if languageData then
    		if warnings[langCode] then
                warning = true
            end
 
 			local item = formatLanguageItem(langCode, languageData, altFormat)
 			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, "<span style=\"color:red\">'''Błąd! Brak kodu języka.'''</span>")
            end
        else
            invalid = true
            local item = string.format("<span style=\"color:red\">'''Błąd! Nieznany kod języka: %s. Sprawdź [[Moduł:Lang/data|listę kodów]].'''</span>", 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, "<span style=\"color:red\">'''Błąd! Brak kodu języka.'''</span>")
        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, '<span class="lang-list')
	    if (#items == 1) and parsedLanguages.pl then
	    	table.insert(result, " tylko-pl")
	    end
	    
	    table.insert(result, '">(')
	    table.insert(result, table.concat(items, " • "))
	    table.insert(result, ")</span>")
	end
    if mw.title.getCurrentTitle().namespace == 0 then
        if warning then
            table.insert(result, "[[Kategoria:Częste błędy kodu w szablonie lang]]")
        end
        if invalid then
            table.insert(result, "[[Kategoria:Nierozpoznany kod języka w szablonie lang]]")
        end
        if hiddenpl then
            table.insert(result, "[[Kategoria:Szablon lang z ukrytym językiem polskim]]")
        end
        if modified or duplicated then
            table.insert(result, "[[Kategoria:Szablon lang z kodem języka wymagającym poprawki]]")
        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

