logo

Module:Hi-IPA是什么意思_Module:Hi-IPA读音|解释_Module:Hi-IPA同义词|反义词

Module:Hi-IPA

印地语发音模组。见{{hi-IPA}}

测试样例

Module:hi-IPA/testcases

14测试s失败。

文字 预期 实际 Comments
test_all:
Passed अशिष्ट॰ता (aśiṣṭ.tā) ə.ʃɪʂʈ.t̪ɑː ə.ʃɪʂʈ.t̪ɑː syllabification
Passed अशिष्ट-ता (aśiṣṭ-tā) ə.ʃɪʂʈ.t̪ɑː ə.ʃɪʂʈ.t̪ɑː syllabification
Failed अल्प्संख्यक (alpsaṅkhyak) əlp.səŋ.kʰjək əl.psəŋ.kʰjək syllabification
Failed अंडकोष (aṇḍkoṣ) əɳɖ.koːʂ əɳ.ɖkoːʂ syllabification
Passed अंग्रेज़ (aṅgrez) əŋ.ɡɾeːz əŋ.ɡɾeːz syllabification
Failed अंटर्क्टिका (aṇṭarkṭikā) əɳ.ʈəɾk.ʈɪ.kɑː əɳ.ʈəɾ.kʈɪ.kɑː syllabification
Passed मैं (ma͠i) mɛ̃ː mɛ̃ː
Passed देश (deś) d̪eːʃ d̪eːʃ
Passed मेरा (merā) meː.ɾɑː meː.ɾɑː
Passed खिलौना (khilaunā) kʰɪ.lɔː.nɑː kʰɪ.lɔː.nɑː
Passed नौटंकी (nauṭaṅkī) nɔː.ʈəŋ.kiː nɔː.ʈəŋ.kiː
Passed हौं (ha͠u) ɦɔ̃ː ɦɔ̃ː
Failed मुँह (mũh) mũːʱ mʊ̃ɦ
Failed माह (māh) mɑːʱ mɑːɦ
Failed बहना (bahnā) bəʱ.nɑː bəɦ.nɑː
Failed विवाह (vivāh) ʋɪ.ʋɑːʱ ʋɪ.ʋɑːɦ
Passed ग़म (ġam) ɣəm ɣəm
Passed ख़रगोश (xargoś) xəɾ.ɡoːʃ xəɾ.ɡoːʃ
Passed इकट्ठा (ikaṭṭhā) ɪ.kəʈ.ʈʰɑː ɪ.kəʈ.ʈʰɑː
Passed संस्थान (sansthān) sən.st̪ʰɑːn sən.st̪ʰɑːn
Passed मधु (madhu) mə.d̪ʱuː mə.d̪ʱuː final u is lengthened, aspiration should not be split in syllabification
Failed मियाँ (miyā̃) miː.jɑ̃ː mɪ.jɑ̃ː i + y lengthens i
Failed मुहाफ़ज़ाह (muhāfzāh) mʊ.ɦɑːf.zɑːʱ mʊ.ɦɑːf.zɑːɦ
Passed स्त्रीत्व (strītva) st̪ɾiːt̪.ʋᵊ st̪ɾiːt̪.ʋᵊ
Passed शास्त्र (śāstra) ʃɑːs.t̪ɾᵊ ʃɑːs.t̪ɾᵊ
Passed समाचार (samācār) sə.mɑː.t͡ʃɑːɾ sə.mɑː.t͡ʃɑːɾ
Passed श्रावण (śrāvaṇ) ʃɾɑː.ʋəɳ ʃɾɑː.ʋəɳ
Passed हमें (hamẽ) ɦə.mẽː ɦə.mẽː
Passed में (mẽ) mẽː mẽː
Failed भैया (bhaiyā) bʱə.iː.jɑː bʱə̯i.jɑː
Failed सुलह (sulah) sʊ.ləʱ sʊ.ləɦ
Passed दृष्टि (dŕṣṭi) d̪ɾɪʂ.ʈiː d̪ɾɪʂ.ʈiː
Passed सोई (soī) soː.iː soː.iː
Passed खाइए (khāie) kʰɑː.ɪ.eː kʰɑː.ɪ.eː
Passed शक्ति (śakti) ʃək.t̪iː ʃək.t̪iː
Passed उस्ताद (ustād) ʊs.t̪ɑːd̪ ʊs.t̪ɑːd̪
Passed पंकज (paṅkaj) pəŋ.kəd͡ʒ pəŋ.kəd͡ʒ
Passed माला (mālā) mɑː.lɑː mɑː.lɑː
Passed दीवार (dīvār) d̪iː.ʋɑːɾ d̪iː.ʋɑːɾ
Passed सुरुची (surucī) sʊ.ɾʊ.t͡ʃiː sʊ.ɾʊ.t͡ʃiː
Passed निरस्त्र (nirastra) nɪ.ɾəs.t̪ɾᵊ nɪ.ɾəs.t̪ɾᵊ
Passed निर्वृत्त (nirvŕtt) nɪɾ.ʋɾɪt̪t̪ nɪɾ.ʋɾɪt̪t̪
Passed मृत्युंजय (mŕtyuñjay) mɾɪt̪.jʊn.d͡ʒəj mɾɪt̪.jʊn.d͡ʒəj
Failed पितृओं (pitŕõ) pɪt̪.ɾõː pɪt̪.ɾɪ.õː
Passed गर्भ॰पात (garbh.pāt) ɡəɾbʱ.pɑːt̪ ɡəɾbʱ.pɑːt̪
Passed गर्भ (garbh) ɡəɾbʱ ɡəɾbʱ
Passed वस्त्र (vastra) ʋəs.t̪ɾᵊ ʋəs.t̪ɾᵊ
Passed यक्ष्मा (yakṣmā) jək.ʂmɑː jək.ʂmɑː
Passed उत्प्रेक्षा (utprekṣā) ʊt̪.pɾeːk.ʂɑː ʊt̪.pɾeːk.ʂɑː
Passed झुंझलाहट (jhuñjhlāhaṭ) d͡ʒʱʊn.d͡ʒʱlɑː.ɦəʈ d͡ʒʱʊn.d͡ʒʱlɑː.ɦəʈ
Passed संख्या (saṅkhyā) səŋ.kʰjɑː səŋ.kʰjɑː
Passed घुँघरू (ghuṅghrū) ɡʱʊŋ.ɡʱɾuː ɡʱʊŋ.ɡʱɾuː
Passed संभ्रांत (sambhrānt) səm.bʱɾɑːnt̪ səm.bʱɾɑːnt̪
Failed इन्फ़्लुएंज़ा (influẽzā) ɪn.flʊ.eːn.zɑː ɪn.flʊ.ẽː.zɑː
Failed इंफ़्लुएंज़ा (ĩfluẽzā) ɪn.flʊ.eːn.zɑː ɪ̃f.lʊ.ẽː.zɑː

local export = {}

local lang = require("Module:languages").getByCode("hi")
local sc = require("Module:scripts").getByCode("Deva")
local m_IPA = require("Module:IPA")
local m_a = require("Module:accent qualifier")

local gsub = mw.ustring.gsub
local gmatch = mw.ustring.gmatch
local find = mw.ustring.find

local correspondences = {
	["ṅ"] = "ŋ", ["g"] = "ɡ", 
	["c"] = "t͡ʃ", ["j"] = "d͡ʒ", 
	["ṭ"] = "ʈ", ["ḍ"] = "ɖ", ["ṇ"] = "ɳ",
	["t"] = "t̪", ["d"] = "d̪",
	["y"] = "j", ["r"] = "ɾ", ["v"] = "ʋ", ["l"] = "l̪",
	["ś"] = "ʃ", ["ṣ"] = "ʂ", ["h"] = "ɦ",
	["ṛ"] = "ɽ", ["ž"] = "ʒ", ["ḻ"] = "ɭ", ["ġ"] = "ɣ", ["q"] = "q", ["x"] = "x", ["ṉ"] = "n", ["ṟ"] = "r",

	["a"] = "ə", ["ā"] = "ɑː", ["i"] = "ɪ",
	["ī"] = "iː", ["o"] = "oː", ["e"] = "eː",
	["u"] = "ʊ", ["ū"] = "uː", ["ŏ"] = "ɔ", ["ĕ"] = "æ",

	["ẽ"] = "ẽː", ["ũ"] = "ʊ̃", ["õ"] = "õː", ["ã"] = "ə̃", ["ā̃"] = "ɑ̃ː",  ["ĩ"] = "ɪ̃", ["ī̃"] = "ĩː",

	["ॐ"] = "oːm", ["ḥ"] = "(ɦ)", ["'"] = "(ʔ)",
}

local perso_arabic = {
	["x"] = "kh", ["ġ"] = "g", ["q"] = "k", ["ž"] = "z", ["z"] = "j", ["f"] = "ph", ["'"] = "",
}

local lengthen = {
	["a"] = "ā", ["i"] = "ī", ["u"] = "ū",
}

local vowels = "aāiīuūoŏĕʊɪɔɔ̃ɛeæãā̃ẽĩī̃õũū̃ː"
local vowel = "[aāiīuūoŏĕʊɪɔɔ̃ɛeæãā̃ẽĩī̃õũū̃]ː?"
local weak_h = "([gjdḍbṛnm])h"
local aspirate = "([kctṭp])"
local syllabify_pattern = "([" .. vowels .. "]̃?)([^" .. vowels .. "%.%-]+)([" .. vowels .. "]̃?)"

local function find_consonants(text)
	local current = ""
	local cons = {}
	for cc in mw.ustring.gcodepoint(text .. " ") do
		local ch = mw.ustring.char(cc)
		if find(current .. ch, "^[kgṅcjñṭḍṇtdnpbmyrlvśṣshqxġzžḻṛṟfθṉḥ]$") or find(current .. ch, "^[kgcjṭḍṇtdpbṛ]h$") then
			current = current .. ch
		else
			table.insert(cons, current)
			current = ch
		end
	end
	return cons
end

local function syllabify(text)
	for count = 1, 2 do
		text = gsub(text, syllabify_pattern, function(a, b, c)
			b_set = find_consonants(b)
			table.insert(b_set, #b_set > 1 and 2 or 1, ".")
			return a .. table.concat(b_set) .. c
			end)
		text = gsub(text, "(" .. vowel .. ")(?=" .. vowel .. ")", "%1.")
	end
	for count = 1, 2 do
		text = gsub(text, "(" .. vowel .. ")(" .. vowel .. ")", "%1.%2")
	end
	return text
end

local identical = "knlsfzθ"
for character in gmatch(identical, ".") do
	correspondences[character] = character
end

local function transliterate(text)
	return lang:transliterate(text)
end

function export.link(term)
	return require("Module:links").full_link{ term = term, lang = lang, sc = sc }
end

function export.narrow_IPA(ipa)
	-- what /ɑ/ really is
	ipa = gsub(ipa, 'ɑ', 'ä')
	-- dentals
	ipa = gsub(ipa, '([snl])', '%1̪')
	-- nasals induce nasalization
	ipa = gsub(ipa, '([əäɪiʊueɛoɔæ])(ː?)([nɳŋm])', '%1̃%2%3')
	-- cc, jj
	ipa = gsub(ipa, 't͡ʃ(%.?)t͡ʃ', 't̚%1t͡ʃ')
	ipa = gsub(ipa, 'd͡ʒ(%.?)d͡ʒ', 'd̚%1d͡ʒ')
	-- syllable boundary consonants
	ipa = gsub(ipa, '([kg])%.([kg])', '%1̚.%2')
	ipa = gsub(ipa, '([ʈɖ])%.([ʈɖ])', '%1̚.%2')
	ipa = gsub(ipa, '([td]̪?)%.([tdn])', '%1̚.%2')
	ipa = gsub(ipa, '([pb])%.([pb])', '%1̚.%2')
	-- aspiration rules
	ipa = gsub(ipa, 'əɦ%.([kgŋtdɲʈɖɳnpbmɾlzqfʂʃsʒɭɣɹʋj])', 'ɛɦ.%1')
	ipa = gsub(ipa, 'ʊɦ%.([kgŋtdɲʈɖɳnpbmɾlzqfʂʃsʒɭɣɹʋj])', 'ɔɦ.%1')
	ipa = gsub(ipa, 'ə%.ɦə', 'ɛ.ɦɛ')
	ipa = gsub(ipa, 'ʊ%.ɦə', 'ɔ.ɦɔ')
	ipa = gsub(ipa, 'ə%.ɦʊ', 'ɔ.ɦɔ')
	-- v/w
	ipa = gsub(ipa, '([kgŋtdɲʈɖɳnpbm]̪?%.?)ʋ', '%1w')
	-- retroflex s rules
	ipa = gsub(ipa, 'ʂ(%.?[^ʈɖ])', 'ʃ%1')
        ipa = gsub(ipa, '([ŋn])%.([q])', 'ɴ.%2')
	ipa = gsub(ipa, 'ʂ$', 'ʃ')
	ipa = gsub(ipa, "ɪ%.j", "i.j")
	return ipa
end

function export.toIPA(text, style)
	text = gsub(text, '॰', '-')
	local translit = transliterate(text)
	if not translit then
		error('The term "' .. Hindi .. '" could not be transliterated.')
	end
	
	if style == "nonpersianized" then
		translit = gsub(translit, "[xġqžzf']", perso_arabic)
	end
	
	-- force final schwa
	translit = gsub(translit, "a~$", "ə")
	
	-- vowels
	translit = gsub(translit, "͠", "̃")
	translit = gsub(translit, 'a(̃?)i', 'ɛ%1ː')
	translit = gsub(translit, 'a(̃?)u', 'ɔ%1ː')
	translit = gsub(translit, "%-$", "")
	translit = gsub(translit, "^%-", "")
	translit = gsub(translit, "ŕ$", "r")
	translit = gsub(translit, "ŕ", "ri")
	translit = gsub(translit, ",", "")
	translit = gsub(translit, " ", "..")
	translit = syllabify(translit)
	translit = gsub(translit, "%.ː", "ː.")
	translit = gsub(translit, "%.̃", "̃")
	
	-- gy
	translit = gsub(translit, 'jñ', 'gy')

	translit = gsub(translit, aspirate .. "h", '%1ʰ')
	translit = gsub(translit, weak_h, '%1ʱ')
	
	local result = gsub(translit, ".", correspondences)

	-- remove final schwa (Pandey, 2014)
	-- actually weaken
	result = gsub(result, "(...)ə$", "%1ᵊ")
	result = gsub(result, "(...)ə ", "%1ᵊ ")
	result = gsub(result, "(...)ə%.?%-", "%1ᵊ-")
	result = gsub(result, "%.?%-", ".")

	result = gsub(result, "%.%.", "‿")
	
	-- formatting
	result = gsub(result, "ː̃", "̃ː")
	result = gsub(result, "ː%.̃", "̃ː.")
	result = gsub(result, "%.$", "")
       -- ñ
        result = gsub(result, "ñ", "n")

	-- i and u lengthening
	result = gsub(result, "ʊ(̃?)(ʱ?)$", "u%1ː%2")
	result = gsub(result, "ɪ(̃?)(ʱ?)$", "i%1ː%2")
	
	result = gsub(result, "ɛː(%.?)j", function(a)
		local res = "ə̯i"
		res = res .. a .. "j"
		return res
	end)
	result = gsub(result, "ɔː(%.?)ʋ", function(a)
		local res = "ə̯u"
		res = res .. a .. "ʋ"
		return res
	end)
	
	return result
end

function export.make(frame)
	local args = frame:getParent().args
	local pagetitle = mw.title.getCurrentTitle().text
	
	local p, results = {}, {}, {}
	
	if args[1] then
		for index, item in ipairs(args) do
			table.insert(p, (item ~= "") and item or nil)
		end
	else
		p = { pagetitle }
	end
	
	for _, Hindi in ipairs(p) do
		local nonpersianized = export.toIPA(Hindi, "nonpersianized")
		local persianized = export.toIPA(Hindi, "persianized")
		table.insert(results, { pron = "/" .. nonpersianized .. "/" })
		local narrow = export.narrow_IPA(nonpersianized)
		if narrow ~= nonpersianized then table.insert(results, { pron = "[" .. narrow .. "]" }) end
		if nonpersianized ~= persianized then
			table.insert(results, { pron = "/" .. persianized .. "/" })
			local narrow = export.narrow_IPA(persianized)
			if narrow ~= persianized then table.insert(results, { pron = "[" .. narrow .. "]" }) end
		end
	end
	
	return m_a.show({'Delhi'}) .. ' ' .. m_IPA.format_IPA_full(lang, results)
end

function export.make_ur(frame)
	local args = frame:getParent().args
	local pagetitle = mw.title.getCurrentTitle().text
	local lang = require("Module:languages").getByCode("ur")
	local sc = require("Module:scripts").getByCode("ur-Arab")
	
	local p, results = {}, {}, {}
	
	if args[1] then
		for index, item in ipairs(args) do
			table.insert(p, (item ~= "") and item or nil)
		end
	else
		error("No transliterations given.")
	end
	
	for _, Urdu in ipairs(p) do
		table.insert(results, { pron = "/" .. export.toIPA(Urdu, "persianized") .. "/" })
	end
	
	return m_IPA.format_IPA_full(lang, results)
end

return export