Modül:diller

Vikisözlük sitesinden
Gezinti kısmına atla Arama kısmına atla
[Düzenle] [Tazele] Template-info.svg Modül belgelemesi

Bu modül, dillerin objelerini çağırmaya yarar.


local cikart = {}

local find = mw.ustring.find

--[=[	This function checks for things that could plausibly be a language code:
		two or three lowercase letters, two or three groups of three lowercase
		letters with hyphens between them. If such a pattern is not found,
		it is likely the editor simply forgot to enter a language code. ]=]

function cikart.err(dilKodu, param, yazi)
	local sirallar = { "ilk", "ikinci", "üçüncü", "dördüncü" }
	
	local paramType = type(param)
	if paramType == "number" then
		siral = sirallar[param]
		param = siral .. ' parametre'
	elseif paramType == "string" then
		param = 'parametre "' .. param .. '"'
	else
		error("Parametre adı "
				.. (paramType == "table" and "bir tablo" or tostring(param))
				.. ", ama ya bir sayı ya da bir string olmalı.")
	end
	
	-- Can use string.find because language codes only contain ASCII.
	if not dilKodu or dilKodu == "" then
		error("Belirlenmiş " .. param .. " (" .. (yazi or "dil kodu") .. ") eksik.", 2)
	elseif dilKodu:find("^%l%l%l?$")
			or dilKodu:find("^%l%l%l%-%l%l%l$")
			or dilKodu:find("^%l%l%l%-%l%l%l%-%l%l%l$") then
		error("Dil kodu \"" .. dilKodu .. "\" geçersiz.", 2)
	else
		error("Lütfen " .. param .. " kısmına bir " .. (yazi or "dil kodu") .. " girin.", 2)
	end
end

local Dil = {}

function Dil:getirKod()
	return self._kod
end


function Dil:getirAsilAd()
	return self._rawData[1] or self._rawData.asilAd
end


function Dil:getirCeviri()
	return self._rawData.ceviri_modulu
end


function Dil:getirDigerAdlari()
	return self._rawData.digerAdlari or {}
end


function Dil:getirTip()
	return self._rawData.tip or "düzenli"
end


function Dil:getirVikimedyaDilleri()
	if not self._vikimedyaDilNesneleri then
		local m_vikimedya_dilleri = require("Modül:vikimedya dilleri")
		self._vikimedyaDilNesneleri = {}
		local vikimedya_kodlari = self._rawData.vikimedya_kodlari or {self._kod}
		
		for _, wdilkodu in ipairs(vikimedya_kodlari) do
			table.insert(self._vikimedyaDilNesneleri, m_vikimedya_dilleri.getByCode(wdilkodu))
		end
	end
	
	return self._vikimedyaDilNesneleri
end


function Dil:getirVikipediMaddesi()
	if self._rawData.vikipedi_maddesi then
		return self._rawData.vikipedi_maddesi 
	elseif self._vikipedi_maddesi then
		return self._vikipedi_maddesi
	elseif self:getirVikiveriItemi() and mw.wikibase then
		self._vikipedi_maddesi = mw.wikibase.sitelink(self:getirVikiveriItemi(), 'trwiki')
	end
	if not self._vikipedi_maddesi then
		self._vikipedi_maddesi = self:getirKategoriAdi()
	end
	return self._vikipedi_maddesi
end

function Dil:yapVikipediBaglantisi()
	return "[[w:" .. self:getirVikipediMaddesi() .. "|" .. self:getirAsilAd() .. "]]"
end

function Dil:getirVikiveriItemi()
	return self._rawData[2] or self._rawData.vikiveri
end


function Dil:getirAlfabeler()
	if not self._alfabeNesneleri then
		local m_alfabeler = require("Modül:alfabeler")
		self._alfabeNesneleri = {}
		
		for _, alf in ipairs(self._rawData.alfabeler or {"None"}) do
			table.insert(self._alfabeNesneleri, m_alfabeler.getirKodaGore(alf))
		end
	end
	
	return self._alfabeNesneleri
end

function Dil:getirAlfabeKodlari()
	return self._rawData.alfabeler or {"None"}
end

function Dil:getirAile()
	if self._aileNesnesi then
		return self._aileNesnesi
	end
		
	local aile = self._rawData[3] or self._rawData.aile 
	if aile then
		self._aileNesnesi = require("Modül:aileler").getirKodaGore(aile)
	end
	
	return self._aileNesnesi
end


function Dil:getirSoylar()
	if not self._soyNesneleri then
		self._soyNesneleri = {}
		
		if self._rawData.soylar then
			for _, soy in ipairs(self._rawData.soylar) do
				table.insert(self._soyNesneleri, cikart.getirKodaGore(soy) or require("Modül:etymology languages").getByCode(soy))
			end
		else
			local aile = self:getirAile()
			local protoDil = aile and aile:getirProtoDili() or nil
			
			-- For the case where the current language is the proto-language
			-- of its family, we need to step up a level higher right from the start.
			if protoDil and protoDil:getirKod() == self:getirKod() then
				aile = aile:getirAile()
				protoDil = aile and aile:getirProtoDili() or nil
			end
			
			while not protoDil and not (not aile or aile:getirKod() == "qfa-not") do
				aile = aile:getirAile()
				protoDil = aile and aile:getirProtoDili() or nil
			end
			
			table.insert(self._soyNesneleri, protoDil)
		end
	end
	
	return self._soyNesneleri
end

local function yineleSoyAgaci(dugum, fonk)
	for _, soy in ipairs(dugum:getirSoylar()) do
		if soy then
			local ret = fonk(soy) or yineleSoyAgaci(soy, fonk)
			if ret then
				return ret
			end
		end
	end
end

function Dil:getirSoyZinciri()
	if not self._soyZinciri then
		self._soyZinciri = {}
		local adim = #self:getirSoylar() == 1 and self:getirSoylar()[1] or nil
		
		while adim do
			table.insert(self._soyZinciri, 1, adim)
			adim = #adim:getirSoylar() == 1 and adim:getirSoylar()[1] or nil
		end
	end
	
	return self._soyZinciri
end


function Dil:varmiSoylar(digerDil)
	local function karsilastir(soy)
		return soy:getirKod() == digerDil:getirKod()
	end
	return yineleSoyAgaci(self, karsilastir) or false
end


function Dil:getirKategoriAdi()
	return self:getirAsilAd()
end


function Dil:getirEbeveynler()
	return {"tüm diller"}
end


function Dil:getirStandartKarakterler()
	return self._rawData.standardKarak
end


function Dil:yapGirdiAdi(yazi)
	yazi = mw.ustring.gsub(yazi, "^[¿¡]", "")
	yazi = mw.ustring.gsub(yazi, "(.)[؟?!;՛՜ ՞ ՟?!︖︕।॥။၊་།]$", "%1")
	
	if self:getirKod() == "ar" then
		local U = mw.ustring.char
		local taTwiil = U(0x640)
		local waSla = U(0x671)
		-- diacritics ordinarily removed by entry_name replacements
		local Arabic_diacritics = U(0x64B, 0x64C, 0x64D, 0x64E, 0x64F, 0x650, 0x651, 0x652, 0x670)
		
		if yazi == waSla or mw.ustring.find(yazi, "^" .. taTwiil .. "?[" .. Arabic_diacritics .. "]" .. "$") then
			return yazi
		end
	end
	
	if self._rawData.girdi_adi then
		for i, from in ipairs(self._rawData.girdi_adi.from) do
			local to = self._rawData.girdi_adi.to[i] or ""
			yazi = mw.ustring.gsub(yazi, from, to)
		end
	end
	
	--[=[ For instance, ᾰ (alpha-breve) + combining smooth breathing is converted
		to alpha + combining smooth breathing by the entry_name replacements.
		It must be re-combined to alpha-smooth breathing (ἀ) so that
		allowSelfLink in [[Module:links]] will work properly. ]=]
	if self:getirKod() == "grc"
		then yazi = mw.ustring.toNFC(yazi)
	end
	
	return yazi
end


local has_dotted_undotted_i = {
	["az"] = true,
	["crh"] = true,
	["gag"] = true,
	["kaa"] = true,
	["tt"] = true,
	["tr"] = true,
	["zza"] = true,
}


function Dil:yapSiraAnahtari(ad, alf)
	if has_dotted_undotted_i[self:getirKod()] then
		ad = mw.ustring.gsub(ad, "I", "ı")
	end
	
	ad = mw.ustring.lower(ad)
	
	-- Remove initial hyphens and *
	local hyphens_regex = "^[-־ـ*]+(.)"
	ad = mw.ustring.gsub(ad, hyphens_regex, "%1")
	
	-- If there are language-specific rules to generate the key, use those
	if type(self._rawData.sira_anahtari) == "table" then
		for i, from in ipairs(self._rawData.sira_anahtari.from) do
			local to = self._rawData.sira_anahtari.to[i] or ""
			ad = mw.ustring.gsub(ad, from, to)
		end
	elseif type(self._rawData.sira_anahtari) == "string" then
		ad = require("Module:" .. self._rawData.sira_anahtari).makeSortKey(ad, self:getirKod(), sc and sc:GetirKod())
	end
	
	-- Remove parentheses, as long as they are either preceded or followed by something
	ad = mw.ustring.gsub(ad, "(.)[()]+", "%1")
	ad = mw.ustring.gsub(ad, "[()]+(.)", "%1")
	
	if has_dotted_undotted_i[self:getirKod()] then
		ad = mw.ustring.gsub(ad, "i", "İ")
	end
	
	return mw.ustring.upper(ad)
end

function Dil:gecersizElleCeviri()
	if self._rawData.gecersiz_ceviri then
		return true
	else
		return false
	end
end


function Dil:alfabeceviri(yazi, alf, modul_gecersiz)
	if not ((modul_gecersiz or self._rawData.ceviri_modulu) and yazi) then
		return nil
	end
	
	if modul_gecersiz then
		require("Modül:debug").track("module_override")
	end
	
	return require("Modül:" .. (modul_gecersiz or self._rawData.ceviri_modulu)).tr(yazi, self:getirKod(), alf and alf:getirKod() or nil)
end

function Dil:varmiCeviri()
	return self._rawData.ceviri_modulu and true or false
end


function Dil:baglanti_cev()
	return self._rawData.baglanti_cev and true or false
end


function Dil:toJSON()
	local girdiAdiModeli = nil
	
	if self._rawData.girdi_adi then
		girdiAdiModeli = {}
		
		for i, from in ipairs(self._rawData.girdi_adi.from) do
			local to = self._rawData.girdi_adi.to[i] or ""
			table.insert(girdiAdiModeli, {from = from, to = to})
		end
	end
	
	local ret = {
		soylar = self._rawData.soylar,
		asilAdi = self:getirAsilAdi(),
		kategoriAdi = self:getirKategoriAdi(),
		kod = self._kod,
		girdiAdiModeli = girdiAdiModeli,
		aile = self._rawData.aile,
		digerAdlari = self:getirDigerAdlari(),
		alfabeler = self._rawData.alfabeler,
		tip = self:getirTip(),
		vikimedyaDilleri = self._rawData.vikimedya_kodlari,
		ceviri_modulu = self._rawData.ceviri_modulu,
		}
	
	return require("Modül:JSON").toJSON(ret)
end


-- Do NOT use this method!
-- All uses should be pre-approved on the talk page!
function Dil:getRawData()
	return self._rawData
end

Dil.__index = Dil


function cikart.getirVeriModulAdi(kod)
	if kod:find("^[a-z][a-z]$") then
		return "diller/veri2"
	elseif kod:find("^[a-z][a-z][a-z]$") then
		local onek = kod:sub(1, 1)
		return "diller/veri3/" .. onek
	elseif kod:find("^[a-z-]+$") then
		return "diller/verix"
	else
		return nil
	end
end


local function getRawLanguageData(kod)
	local moduladi = cikart.getirVeriModulAdi(kod)
	return moduladi and mw.loadData("Modül:" .. moduladi)[kod] or nil
end


function cikart.yapNesne(kod, veri)
	if veri and veri.deprecated then
		require("Modül:debug").track("diller/deprecated")
		require("Modül:debug").track("diller/deprecated/" .. kod)
	end
	
	return veri and setmetatable({ _rawData = veri, _kod = kod }, Dil) or nil
end


function cikart.getirKodaGore(kod)
	if type(kod) ~= "string" then
		error("The function getByCode expects a string as its first argument, but received " .. ( kod == nil and "nil" or "a " .. type(kod) ) .. ".")
	end
	
	return cikart.yapNesne(kod, getRawLanguageData(kod))
end


function cikart.getirAdaGore(ad)
	local adaGore = mw.loadData("Modül:diller/by name")
	local kod = adaGore.all and adaGore.all[ad] or adaGore[ad]
	
	if not kod then
		return nil
	end
	
	return cikart.yapNesne(kod, getRawLanguageData(kod))
end


function cikart.getirAsilAdaGore(ad)
	local adaGore = mw.loadData("Modül:diller/canonical names")
	local kod = adaGore and adaGore[ad]
	
	if not kod then
		return nil
	end
	
	return cikart.yapNesne(kod, getRawLanguageData(kod))
end


function cikart.kodaDonustur(frame)
	dil = frame.args["dil"]
	if cikart.getirAsilAdaGore(dil) then
		return cikart.getirAsilAdaGore(dil):getirKod()
	elseif cikart.getirKodaGore(dil) then
		return cikart.getirKodaGore(dil):getirAsilAd()
	end
end


function cikart.tumDiller(frame)
	tablo = {}
	for _,a in ipairs(mw.loadData("Modül:diller/canonical names")) do
		table.insert(a)
	end
	return table.concat(mw.loadData("Modül:diller/canonical names"), "\n")
end


function cikart.yineleHepsini()
	mw.incrementExpensiveFunctionCount()
	local m_veri = mw.loadData("Modül:diller/alldata")
	local fonk, t, var = pairs(m_veri)
	
	return function()
		local kod, veri = fonk(t, var)
		return cikart.yapNesne(kod, veri)
	end
end

return cikart