Moduł:Lang: Różnice pomiędzy wersjami
m 1 wersja |
m 1 wersja |
||
(Nie pokazano 1 wersji utworzonej przez jednego użytkownika) | |||
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>") |
Aktualna wersja na dzień 11:37, 8 kwi 2022
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. en lub pl .
|
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. en lub ru .
|
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. en lub pl .
|
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. en lub pl .
|
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. en lub en 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