Dokumentation för denna modul finns på /dok (redigera), /test


Syfte redigera

Modulens syfte är att bistå andra moduler med språkinformation. Att konvertera mellan språk och språkkod, ge information om sorteringsregler för olika språk och ge information om vilket skript språket använder.

Varning redigera

Den här modulen används av alla uppslagssidor. Efter varje redigering här eller på Modul:lang/data måste åtminstone 3 test genomföras (samtyck till "Rensa denna sidas cache?"):

Undersidor redigera

Den här modulen innehåller flera undersidor: Special:PrefixIndex/Modul:lang/

Användning redigera

Den här modulen används av andra moduler (till exempel Modul:tagg). Det går inte att anropa den direkt från mallar eftersom den förväntar sig "nakna" värden (oftast sträng), medan mallar "förpackar" alla parametrar i en tabell. Det finns en liten hjälpmodul Modul:langfortemplate som kan anropas från mallar och ger åtkomst till funktioner "getCode", "getLanguage" och "getLanguageUCFirst".

local lang = require("Modul:lang")

local swedish_language_code = lang.getCode("Svenska")
local finnish_language_name = lang.getLanguage("fi")
local finnish_language_name_first_letter_capitalized = lang.getLanguageUCFirst("fi")
local swedish_sort_rules_table = lang.getSortRules("sv")
local is_svenska_a_language_name = (lang.getCode("svenska")~="xx")
local is_sv_a_language_code = lang.hasLanguage("sv")
local is_h_smi_a_language_including_etymology_code = lang.hasLanguage("h_smi","alsoetym")

Specifikation redigera

Koder reserverade för etymologi redigera

Extra parameter styr hantering av dessa koder:

  • string "alsoetym" för att inkludera alla koder dvs också etymologiska såsom "h-smi"
  • string "onlyetym" för att inkludera enbart etymologiska koder såsom "h-smi"
  • annars inkluderas enbart koder som inte är etymologiska

Påverkade funktioner är "hasLanguage", "getCode", "getLanguage", "getLanguageUCFirst" och "exportList".

Lista över funktioner redigera

hasLanguage
(används mycket av Modul:gammalstavning Modul:categorize m.m.)
Den här funktionen är den prefererade metoden att reda på ifall en språkkod är känd.
1= språkkod, är skiftlägeskänslig och måste vara skriven med gemener
2= extra parameter för etymologiska koder
Returnerar ett booleskt värde för om språkobjektet kan hittas för språket.
Default-värde: false.
getCode
(används av Modul:cat-etym, i sin tur av Mall:kategorinavigering-härledningar)
1= språknamn, inte skiftlägeskänsligt
2= extra parameter för etymologiska koder
Returnerar språkkoden.
Default-värde: "xx".
getLanguage
(används mycket av Modul:categorize m.m.)
1= språkkod, är skiftlägeskänslig och måste vara skriven med gemener
2= extra parameter för etymologiska koder
Returnerar språknamnet, alla gemener.
Default-värde: "okänt språk".
getLanguageUCFirst
(används mycket av Modul:categorize m.m.)
1= språkkod, är skiftlägeskänslig och måste vara skriven med gemener
2= extra parameter för etymologiska koder
Returnerar språknamnet, versaliserad första bokstav, resterande gemener.
Default-värde: "Okänt språk".
getSortRules
(används av Modul:sort)
1= Språkkod, är skiftlägeskänslig och måste vara skriven med gemener
Returnerar sorteringsreglerna språket, se nedan.
Default-värde: {}.
getSortRulesAsString
används ej
getScriptCode
används ej, data saknas för närvarande, så funktionen kommer alltid att returnera defaultvärdet.
1= Språkkod, är skiftlägeskänslig och måste vara skriven med gemener
Returnerar skriften för språket.
Default-värde: "".
isObviouslyInvalid
(används av Modul:tagg)
1= Språkkod, är skiftlägeskänslig och måste vara skriven med gemener
Returnerar ett booleskt värde som är "true" ifall koden är uppenbarligen ogiltig enligt vissa kriterier, beror inte på Modul:lang/data, "--" är giltig men "xx" är ogiltig, på så sätt kan moduler undvika märkiga felmeddelanden som okänd språkkod "svenska" till förmån för uppenbarligen ogiltig språkkod "svenska"
getEntryName
(används av Modul:link och Modul:sidnamn)
1= Språkkod, är skiftlägeskänslig och måste vara skriven med gemener
2= Ordet med (eller utan) diakriter
Returnerar ordet utan diakriter (lämpligt som sidnamn och vanliga länkar, med diakriter på fetstilsrad, i översättningar och i grammatiktabeller)
exportList
(används av Modul:catsummer)
1= extra parameter för etymologiska koder
Returnerar en tabell med kända språkkod ("--" ingår, "xx" ingår EJ)

Sorteringsregler redigera

Så länge som inte annat anges, sorteras sidor i kategorierna efter sidnamn (utan eventuellt namnrymdsprefix) i den ordning som Unicode bestämmer, dvs efter codepoint-värden. Det innebär exempelvis att "ä och ö" sorteras före "å" (tabell), vilket inte är rätt för svenska uppslag. För andra språk gäller andra regler. Sorteringsreglerna för respektive språk anges i en lista bestående av element på formen "enstaka tecken eller en sekvens av tecken att sortera som något annat>hur tecknet eller tecknen ska sorteras istället". För att ange hur tecken ska sorteras relativt andra tecken, används tecknen ~, ¡, °, ² och ³
  • a~ betyder "sortera efter a"
  • a¡ betyder "sortera efter a~"
  • a° betyder "sortera efter a¡"
  • a² betyder "sortera efter a°"
  • a³ betyder "sortera efter a²"
Så här ser t.ex. sorteringsreglerna ut för svenska: {"å>z~", "ä>z¡", "ö>z°", "ü>y", "æ>z¡", "ø>z°"}.
Ibland kan det vara två eller till och med tre tecken som sorteras ihop som ett tecken, t.ex. i ungerska: {"cs>c~", "dz>d~", "dzs>d¡", "gy>g~", "ly>l~", "ny>n~", "ö>o~", "sz>s~", "ty>t~", "ü>u~", "zs>z~", "ő>o~", "ű>u~"}.

Skrifter redigera

Denna funktion avser exempelvis funktionalitet som för närvarande finns i {{ö}} och {{ö+}} genom sin skrift=-parameter som i sin tur anropar skriftmallarna (som inleds med ett plustecken i Kategori:Wiktionary:Grafiska mallar). Modul:lang/data är inte försedd med den här informationen ännu.

Tester redigera

All tests passed. (refresh)

Text Expected Actual
test_01_has_language:
Passed mut.hasLanguage("sv") true true
Passed mut.hasLanguage("xx") false false
Passed mut.hasLanguage("xyz") false false
Text Expected Actual
test_02_get_code_reverse_query:
Passed mut.getCode("sv") xx xx
Passed mut.getCode("sV") xx xx
Passed mut.getCode("svenska") sv sv
Passed mut.getCode("Svenska") sv sv
Passed mut.getCode("Älvdalska") ovd ovd
Passed mut.getCode("ESPERANTO") eo eo
Passed mut.getCode("norska") xx xx
Passed mut.getCode("norska","alsoetym") h-nor h-nor
Passed mut.getCode("samiska","onlyetym") h-smi h-smi
Passed mut.getCode("engelska","onlyetym") xx xx
Text Expected Actual
test_03_get_language:
Passed mut.getLanguage("sv") svenska svenska
Passed mut.getLanguage("sV") okänt språk okänt språk
Passed mut.getLanguage("svenska") okänt språk okänt språk
Passed mut.getLanguage("Svenska") okänt språk okänt språk
Passed mut.getLanguage("ovd") älvdalska älvdalska
Passed mut.getLanguageUCFirst("ovd") Älvdalska Älvdalska
Passed mut.getLanguage("nn") nynorska nynorska
Passed mut.getLanguage("h-nor") okänt språk okänt språk
Passed mut.getLanguage("h-nor","alsoetym") norska norska
Text Expected Actual
test_04_get_script:
Text Expected Actual
test_05_get_sort_rules:
Passed mut.getSortRules("sv") {"å>z~", "ä>z¡", "ö>z°", "ü>y", "æ>z¡", "ø>z°"} {"å>z~", "ä>z¡", "ö>z°", "ü>y", "æ>z¡", "ø>z°"}
Passed mut.getSortRules("xx") {} {}
Passed mut.getSortRules("notfound") {} {}
Text Expected Actual
test_06_is_obviously_invalid:
Passed mut.isObviouslyInvalid("sv") false false
Passed mut.isObviouslyInvalid("Sv") true true
Passed mut.isObviouslyInvalid("jav") false false
Passed mut.isObviouslyInvalid("ido") true true
Passed mut.isObviouslyInvalid("xx") true true
Passed mut.isObviouslyInvalid("--") false false
Passed mut.isObviouslyInvalid("a") true true
Passed mut.isObviouslyInvalid("zh-min-nan") false false
Passed mut.isObviouslyInvalid("zh-min+nan") true true
Passed mut.isObviouslyInvalid("zh-min-n-n") true true
Passed mut.isObviouslyInvalid("zuh-min-nan") true true
Passed mut.isObviouslyInvalid("h-smi") false false
Passed mut.isObviouslyInvalid("lak") false false
Passed mut.isObviouslyInvalid("spanska") true true
Passed mut.isObviouslyInvalid("indonesiska") true true
Text Expected Actual
test_07_get_entry_name:
Passed mut.getEntryName("ab", "а-бҳәа́") а-бҳәа а-бҳәа
Passed mut.getEntryName("la", "abdērītānus") abderitanus abderitanus
Passed mut.getEntryName("lt", "abãtė") abatė abatė
Passed mut.getEntryName("lt", "abažū̃ras") abažūras abažūras
Passed mut.getEntryName("se", "boaš'šu") boaššu boaššu
Passed mut.getEntryName("ru", "автомотри́са") автомотриса автомотриса
Passed mut.getEntryName("sr", "ја̏се̄н") јасен јасен
Passed mut.getEntryName("zu", "dlâla") dlala dlala
Passed mut.getEntryName("zu", "ī́sele") isele isele
Text Expected Actual
test_08_get_entry_name_rtl:
Passed mut.getEntryName("ur", "آدرنیہ,") آدرنیہ آدرنیہ
Passed mut.getEntryName("ur", "آزمودہ,") آزمودہ آزمودہ
Passed mut.getEntryName("ur", "آشچریہ,") آشچریہ آشچریہ
Passed mut.getEntryName("he", "אֵין") אין אין
Passed mut.getEntryName("he", "אֵינְסוֹף") אינסוף אינסוף
Passed mut.getEntryName("he", "יֵשׁ") יש יש
Passed mut.getEntryName("he", "עֶצֶם") עצם עצם
Passed mut.getEntryName("he", "אִם וְרַק אִם") אם ורק אם אם ורק אם
Passed mut.getEntryName("ar", "أَرِسْطُو") أرسطو أرسطو
Passed mut.getEntryName("ar", "إِبِيقُورِيّ") إبيقوري إبيقوري
Passed mut.getEntryName("ar", "اِخْتِيَار") اختيار اختيار
Passed mut.getEntryName("ar", "تَعَدُّدُ الْقُدَماءِ") تعدد القدماء تعدد القدماء
Passed mut.getEntryName("ar", "تَنْوِير") تنوير تنوير


local export = {}
local lang_both = mw.loadData("Modul:lang/data")
lang_objects	= lang_both[1]
lang_reversed	= lang_both[2]

local function ucFirst(str)
	return mw.ustring.gsub(str, "^%l", mw.ustring.upper)
end

function export.hasLanguage(lng_code, scope_string)
	local lang_obj = lang_objects[lng_code] or {} -- risk of type "nil"
	local code_is_valid = (type(lang_obj.name)=="string") -- preliminary verdict
	local is_etym_only_code = not (not lang_obj.nolemma) -- make sure to get boolean
	local take_etym_code = (scope_string=="alsoetym") or (scope_string=="onlyetym")
	local take_lemma_code = not (scope_string=="onlyetym")
	if (is_etym_only_code and (not take_etym_code)) or ((not is_etym_only_code) and (not take_lemma_code)) then
		code_is_valid = false
	end
	return code_is_valid
end

function export.getCode(lng_name, scope_string)
	local lowercase_lng_name = mw.ustring.lower(lng_name)
	local found_code = lang_reversed[lowercase_lng_name] or "xx" -- preliminary verdict
	if not export.hasLanguage(found_code, scope_string) then
		found_code = "xx"
	end
	return found_code
end

function export.getLanguage(lng_code, scope_string)
	local lang_obj = {}
	local lang_name = ''
	if export.hasLanguage(lng_code, scope_string) then
		lang_obj = lang_objects[lng_code] or {} -- risk of type "nil"
		lang_name = lang_obj.name or "okänt språk" -- risk of type "nil"
	else
		lang_name = "okänt språk"
	end
	return lang_name
end

function export.getLanguageUCFirst(lng_code, scope_string)
	return ucFirst(export.getLanguage(lng_code, scope_string))
end

function export.getSortRules(lng_code)
	local lang_obj = lang_objects[lng_code] or {sort_rules = {}}
	local sort_rules = lang_obj.sort_rules or {}
	return sort_rules
end

--intended temp function for {{kategorilistenavigering}} until it has its own module but never used
function export.getSortRulesAsString(frame)
	local lng_code = frame.args[1]
	local sort_rules = {}
	for k,v in ipairs(export.getSortRules(lng_code)) do
		sort_rules[#sort_rules + 1] = v
	end
	return table.concat(sort_rules, ",")
end

function export.getScriptCode(lng_code)
	local lang_obj = lang_objects[lng_code] or {script = ""}
	local script = lang_obj.script or ""
	return script
end

local const_is_banned = {}
const_is_banned = {'by','dc','sh','ll','jp','xx','art','cmn','deu','eng','epo','fra','gem','ger','gmq-bot','ido','lat','por','rus','spa','swe','tup','zxx'}

-- "en.wiktionary.org/wiki/Wiktionary:Language_treatment" excluded languages
-- "en.wikipedia.org/wiki/Spurious_languages"
-- "iso639-3.sil.org/code/art" only valid in ISO 639-2
-- "iso639-3.sil.org/code/zxx" "No linguistic content"

function export.isObviouslyInvalid (incoming_code)
	local var_temp = 0
	local code_is_bad = false -- pre-assume good
	local numchiiar = 0
	local code_length = 0
	local found_dashes = 0
	local consecutive_chars = 0
	local numindeex = 0
	incoming_code = incoming_code or ""
	while (true) do -- fake outer loop
		code_length = string.len (incoming_code)
		if ((code_length<2) or (code_length>10)) then
			code_is_bad = true -- here "spanska" will pass whereas "indonesiska" gets caught
			break -- invalid length
		end--if
		while (true) do
			if (numindeex==code_length) then
				break
			end--if
			numchiiar = string.byte (incoming_code,(numindeex+1),(numindeex+1))
			if (numchiiar==45) then -- dash "-"
				consecutive_chars = 0
				found_dashes = found_dashes + 1
				if (found_dashes==3) then
					code_is_bad = true
					break -- more than 2 dashes
				end--if
			else
				if ((numchiiar<97) or (numchiiar>122)) then
					code_is_bad = true
					break -- not lowercase ASCII letter
				end--if
				consecutive_chars = consecutive_chars + 1
				if (consecutive_chars==4) then
					code_is_bad = true
					break -- here even "spanska" gets caught but "lak" and "ido" still pass
				end--if
			end--if -- (numchiiar==45) else branch
			numindeex = numindeex + 1 -- ZERO-based
		end--while
		if (code_is_bad) then
			break
		end--if
		numindeex = 0
		while (true) do
			var_temp = const_is_banned[numindeex+1]
			if (type(var_temp)~="string") then
				break -- end of table
			end--if
			if (incoming_code==var_temp) then
				code_is_bad = true -- here "ido" gets caught
				break -- banned code
			end--if
			numindeex = numindeex + 1 -- ZERO-based
		end--while
		break
	end--while
	return code_is_bad
end

function export.getEntryName(lng_code, text)
	local lang_obj = lang_objects[lng_code] or {} -- risk of nil
	local entry_name_rules = lang_obj.entry_name or {from = {}, to = {}}

	for i, from in ipairs(entry_name_rules.from) do
		local to = entry_name_rules.to[i] or ""
		text = mw.ustring.gsub(text, from, to)
	end

	return text
end

function export.exportList(scope_string)
	local list_of_codes = {}
	for lng_code, unused_var in pairs(lang_objects) do
		if export.hasLanguage(lng_code, scope_string) then
			list_of_codes [#list_of_codes+1] = lng_code
		end
	end
	return list_of_codes
end

return export