Nepali IPA pronunciation module. See {{ne-IPA}}.

Module:ne-IPA/testcases:

1 test failed. (refresh)

လိက် ဗွဲမရံၚ်လၟဳ မဇေတ်ဍာံ တၚ်လညာတ်ဂမၠိုၚ်
test_phonetic:
Passed विवाह (vivāha) [bibäɦä̆] [bibäɦä̆]
Passed श्रावण (śrāwaṇ) [sräwʌɽ̃] [sräwʌɽ̃]
Passed हलो (halo) [ɦʌlo] [ɦʌlo]
Passed अक्षर (akṣar) [ʌk̚t͡sʰer] [ʌk̚t͡sʰer]
Passed क्षेत्री (kṣetrī) [t͡sʰet̪ri] [t͡sʰet̪ri]
Passed त्यस (tyas) [t̪es] [t̪es]
Passed विश्व (viśwa) [bisːo] [bisːo]
Passed पेय (peya) [pejʌ] [pejʌ]
Passed अन्तर्राष्ट्रिय (antarrāṣṭriya) [ʌ̃n̪t̪ʌrːäs̠t̠rie̞] [ʌ̃n̪t̪ʌrːäs̠t̠rie̞] dental assimilation
Passed सय (saya) [sʌe̞] [sʌe̞] non-initial ya before before consonants
Passed सत्य (satya) [sʌt̪t̪e] [sʌt̪t̪e] gemination of preceding consonant and replacement with e
Passed यस (yas) [es] [es] Initial ya replacement with e
Passed विश्वास (viśvās) [biswäs] [biswäs] w to b before certain vowels and glides
Passed विश्व (viśwa) [bisːo] [bisːo]
Passed वरिपरि (waripari) [wʌɾipʌɾi] [wʌɾipʌɾi] w elsewhere
Passed घरको (gharko) [ɡʱʌ̤rko] [ɡʱʌ̤rko] breathy vowel after voiced aspirates
Passed अर्थ (artha) [ʌrt̪ʰʌ] [ʌrt̪ʰʌ]
Passed अर्को (arko) [ʌrko] [ʌrko]
Passed तारा (tārā) [t̪äɾä] [t̪äɾä] tapped r intervocalically
Passed घोडा (ghoḍā) [ɡʱo̤ɽä] [ɡʱo̤ɽä] retroflex tap postvocalically
Passed डर (ḍar) [ɖʌr] [ɖʌr] ḍ elsewhere
Passed कस्को (kasko) [kʌsko] [kʌsko]
Passed कसको (kasko) [kʌsko] [kʌsko]
Passed लर्क (larka) [lʌrkʌ] [lʌrkʌ]
Passed सम्म (samma) [sʌ̃mːʌ] [sʌ̃mːʌ]
Passed संस्था (sansthā) [sʌ̃nst̪ʰä] [sʌ̃nst̪ʰä]
Passed रुची (rucī) [rut͡si] [rut͡si]
Passed आहा (āhā) [äɦä] [äɦä]
Passed हाम्रो (hāmro) [ɦä̃mro] [ɦä̃mro]
Passed बाह्र (bāhra) [bäɾʌ] [bäɾʌ]
Passed बाह्रखरी (bāhrakharī) [bäɾʌk̞ʰʌɾi] [bäɾʌk̞ʰʌɾi]
Passed चर्चा (carcā) [t͡sʌrt͡sä] [t͡sʌrt͡sä]
Passed रचना (racanā) [rʌt͡sʌ̃nä] [rʌt͡sʌ̃nä]
Passed टर्रो (ṭarro) [ʈʌrːo] [ʈʌrːo]
Passed आर (ār) [är] [är]
Passed ईर् (īr) [ir] [ir]
Passed रातो (rāto) [rät̪o] [rät̪o]
Failed उर (ura) [ur] [uɾʌ]
Passed दुई (duī) [d̪ui̯] [d̪ui̯]
Passed चप्पल (cappal) [t͡sʌp̚pʌl] [t͡sʌp̚pʌl]
Passed पक्का (pakkā) [pʌk̚kä] [pʌk̚kä]
Passed ऑस्ट्रेलिया (ŏsṭreliyā) [ɒs̠t̠relijä] [ɒs̠t̠relijä]
Passed टेलिव़िश़न (ṭeliVižan) [ʈeliviʒʌ̃n] [ʈeliviʒʌ̃n]
Passed व़िझ़न (Vižan) [viʒʌ̃n] [viʒʌ̃n]
Passed ॲप (ĕp) [æp] [æp]
Passed ज़ू () [zu] [zu]
Passed द़िस (ðis) [ðis] [ðis]
Passed थ़िक (θik) [θik] [θik]

local export = {}

local lang = require("Module:languages").getByCode("ne")
local sc = require("Module:scripts").getByCode("Deva")
local m_IPA = require("Module:IPA")

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

local correspondences = {
	["ṅ"] = "ŋ", ["g"] = "ɡ", 
    ["c"] = "t͡s", ["j"] = "d͡z", ["ċ"] = "t͡s", ["j̈"] = "d͡z", ["ñ"] = "n",
	["ṭ"] = "ʈ", ["ḍ"] = "ɖ", ["ṇ"] = "ɳ",
	["t"] = "t̪", ["d"] = "d̪",
	["y"] = "j", ["v"] = "b",  ["w"] = "w", ["l"] = "l",
	["ś"] = "s", ["ṣ"] = "s", ["h"] = "ɦ",
	["ṛ"] = "ɽ", ["n"] = "n", ["ž"] = "ʒ", ["z"] = "z", ["ġ"] = "ɣ", ["q"] = "q", ["x"] = "x", ["θ"] = "θ", ["ð"] = "ð", ["f"] = "f", ["ḻ"] = "ɭ", ["ṟ"] = "ɹ", ["r̥"] = "ri", ["ṃ"] = "̃", ["ॽ"] = "", ["'"] = "", [","] = ",", ["r"] = "r", ["ỹ"] = "j̃", ["V"] = "v", 

	["a"] = "ʌ", ["ā"] = "a", ["i"] = "i",
	["ī"] = "i", ["o"] = "o", ["e"] = "e",
	["u"] = "u", ["ū"] = "u", ["ai"] = "ʌi̯", ["au"] = "ʌu̯", ["ŏ"] = "ɒ", ["ĕ"] = "æ", ["āu"] = "āu̯",  ["āi"] = "āi̯",

	["ũ"] = "ũ", ["õ"] = "õ", ["ã"] = "ʌ̃", ["ā̃"] = "ã", ["ẽ"] = "ẽ",

	["ḥ"] = "ɦʌ",  [" "] = " ",
}

local vowels = "aāā̃ẽõiīuūi̯u̯e̞eī̃ū̃ĩoää̃ʌʌ̃ãũŏĕ̤"
local weak_h_c = "gjdḍd̪ṇɽbṛvrṟwy"
local primary_stress = "ˈ"
local secondary_stress = "ˌ"
local weak_h = "([" .. weak_h_c .. "])h"
local aspirate = "([kctṭt̪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ñṭḍṇɽtdnpbmɽ̃yrlɳwvɾjwśṣshqxġzžḻṛṟfθðṉ]$") or find(current .. ch, "^[kgcjṭḍṇtɽdɽ̃pbṛṟ]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)
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.toIPA(text, phonetic)
	local translit = transliterate(text)
	if not translit then
		error('The term "' .. Nepali .. '" could not be transliterated.')
	end

	if phonetic then
translit = gsub(translit, 'ā([iuĩũīū])', 'ä%1̯') -- syllabicity
		translit = gsub(translit, 'ā', 'ä') -- narrower transcription of a
	       ---translit = gsub(translit, 'ś', 's')
	       ---translit = gsub(translit, 'ṣ', 's')
	       ---translit = gsub(translit, 'ñ', 'n')
               translit = gsub(translit, '([aäāiīuūeaioauŏĕ])([nl])([td])', '%1%2̪%3') -- dental assimilation
               translit = gsub(translit, '([aäāiīuūeaioauŏĕ])ṇ([ṭyḍ])', '%1ɳ%2')
               translit = gsub(translit, '([aäāiīuūeaioauŏĕ])n([ṭḍ])', '%1ɳ%2') -- retroflex assimilation 2nd
                translit = gsub(translit, 'ṇ', 'ɽ̃')
	        translit = gsub(translit, 'ॽ', 'ʔ')
                translit = gsub(translit, "'", "ʔ")
 -- ɡlottal stop
                translit = gsub(translit, '(h?)r̥', 'ɾi') -- hr̥ ligature initially
                translit = gsub(translit, '([aäāiīuūr̥])kṣ', '%1k̚t͡sʰy') -- kṣ ligature
               translit = gsub(translit, '()kṣ', 't͡sʰ') -- kṣ initially
							translit = gsub(translit, '([a])h([iīĩī̃])', '%1%2̯') -- h dropping
									translit = gsub(translit, '([a])h([āä])', '%2̆ɦ%2̤') -- breathy and vowel changes
											translit = gsub(translit, '([äoāe])h([iīuūĩũī̃ū̃])', '%1%2̯') -- h dropping 2nd case											
															translit = gsub(translit, '([äā])h([a])', '%1ɦ%1̆') -- vowel change 2nd

translit = gsub(translit, '([ʌäaāiīuūe̞eo])([nmṅɳŋɲñṇ])', '%1̃%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])h([nml])', '%1%2%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])hr([ʌäaāiīuūe̞eo])', '%1ɾ%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])hy([ʌäaāiīuūe̞eo])', '%1i̯y%2')
translit = gsub(translit, '([ñnl])([cj])', '%1̻%2')
translit = gsub(translit, '([śṣs])([ṭ])(h)', 's̠t̠ʰ')
translit = gsub(translit, '([śṣs])([ḍ])(h)', 's̠d̠ʱ')
translit = gsub(translit, '([śṣs])([ṭ])', 's̠t̠')
translit = gsub(translit, '([śṣs])([ḍ])', 's̠d̠')
translit = gsub(translit, '([l])([ṭʈɖḍ])', 'ɭ%2')
translit = gsub(translit, '([ṭḍʈɖ])(h?)([l])', '%1%2ɭ')
translit = gsub(translit, '([ṭʈḍ])(h?)([n])', '%1%2ɳ')
translit = gsub(translit, '([td])(h?)([n])', '%1%2%3̪')
translit = gsub(translit, '([n])([ʌäaā])([tdṭs])', '%1%2̃%3')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([ʌäaā])([cj])', '%1%2̃%3')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([iīuū])', '%1%2̃')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([iīuū])([̃ṃ]?)([iīuū])([̃ṃ]?)', '%1%2̃%4̃')
translit = gsub(translit, '([ʌäaāsiīuūe̞eo])([p])([h])', '%1ɸ')
translit = gsub(translit, '([ʌäaāsiīuūe̞eo])([k])([h])', '%1k̞ʰ')
translit = gsub(translit, '([ʌäaāiīuūe̞ä̃eoe̤])([j])([h])', '%1j')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])bh([ʌäaāiīuūe̞eo])', '%1β%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])([d])([h])', '%1%2')
translit = gsub(translit, '([ʌäaāisīuūe̞eo])gh', '%1ɡ̞')
translit = gsub(translit, 'c(h?)c(h)', 't̚t͡sʰ')
translit = gsub(translit, 'cc', 't̚t͡s')
translit = gsub(translit, 'j(h?)j(h)', 'd̚d͡zʱ')
translit = gsub(translit, 'jj', 'd̚d͡z')
	translit = gsub(translit, "([kɡtdʈṭpb])(̪?)([ʰʱ]?)([ %.ˈ]?)([kɡtdṭʈpb])([ʰʱ]?)", "%1%2%3̚%4%5%6") -- no audible release
												translit = gsub(translit, '([iī])h([äāe])', '(%1)y%2') -- vowel change 3rd
               translit = gsub(translit, '([aāäiīuā̃ũĩū̃ī̃ä̃ū])ya', '%1e̞') -- ya to e before vowel
                translit = gsub(translit, '([e])ya', '%1yʌ') -- ya remains same
               translit = gsub(translit, '([aāiīuūãä̃ĩī̃ũū̃ā̃õẽeoä])([gbtṭdmhncjvwṛṛ̃ṅɽśṣɳslkpḍ])([wv])a', '%1%2%2o') -- gemination of preceding consonant
               translit = gsub(translit, '()([gbtṭdmhncjvwṇṅɽśṣɳslkpḍ])([wv])a', '%2o')
               translit = gsub(translit, '([aāiīuūãä̃ĩī̃ũū̃ā̃õẽeoä])([grbtṭdmncjvwṇṅśṣɳslkp])(h?)ya', '%1%2%2%3e') -- gemination of preceding consonant
               translit = gsub(translit, '()([grbtṭdmncjvwṅśṣɳslkpḍ])ya', '%2e') -- no gemination
                translit = gsub(translit, '()ya', 'e') -- ya to e initially
               translit = gsub(translit, '([ʌäaāiīuãä̃ĩī̃ũū̃ā̃õẽūeo])ḍ(h?)(y?)', '%1ɽ%3') -- postvocalic allophone of ḍ and ḍh
		translit = gsub(translit, '([bdgjḍ])h([ʌäaāiīuūeeoo])', '%1ʱ%2̤') -- breathy voice
	-- force final schwa
	translit = gsub(translit, "a~$", "ʌ")
               translit = gsub(translit, 'a$', 'ʌ') -- final schwa retention
               translit = gsub(translit, '(...)a ', '%1ʌ ') -- final schwa retenti
		translit = gsub(translit, '([ʌäaāiīuūəeeo̯o ̤])r([ʌäaāiīəuūeoeo̯ ̤])', '%1ɾ%2') -- intervocalic allophone of r
	translit = gsub(translit, "m̐", "ːm")
	end
	local result = gsub(translit, ".", correspondences)
		
	
translit = gsub(translit, "͠", "̃")
---translit = gmatch(translit, '^[^-]') and ('ˈ' .. gsub(translit, ' ', ' ˈ'))
translit = gsub(translit, "(...)*$", "%1ʌ") -- second person mid-respect verb form
translit = gsub(translit, "m̐", "m")
translit = gsub(translit, "rr̥", "ri")
translit = gsub(translit, '()([śsnlcjzkhptdgb])([vw])([aāäiīuūoeĩ])([cspdtngkbrjyṇṣśṇɾṅñṃ])', '%2w%4%5')
--translit = gsub(translit, 'ā([iuĩũīū])', 'ā%1̯') -- syllabicity
translit = gsub(translit, "([aāäiīuūeoʌ])([̤]?)(̃?)([ṃ]?)([iīūu])(̃?)([ṃ]?)", "%1%2%3%4%5̯%6%7")
      
	translit = gsub(translit, "%-", " ")
	translit = gsub(translit, "r̥", "ri")
	translit = syllabify(translit)
	
	
	-- aspiration rules
	translit = gsub(translit, aspirate .. "h", '%1ʰ')
	translit = gsub(translit, weak_h, '%1ʱ')
	translit = gsub(translit, '([' .. weak_h_c .. '])%.h', '.%1ʱ')
	translit = gsub(translit, aspirate .. '%.h', '.%1ʰ')
        translit = gsub(translit, "%.ː", "ː.")

	local result = gsub(translit, ".", correspondences)
	
	-- formatting
result = gsub(result, "ː̃", "̃ː")
result = gsub(result, "ː.̃", "̃ː.")
result = gsub(result, "([snmrfv])%1", "%1ː")
result = gsub(result, "t̪͡s", "t͡s")
result = gsub(result, "t̪̠", "t̠")
result = gsub(result, "d̪̠", "d̠")
result = gsub(result, "i̯̯", "i̯")
result = gsub(result, "u̯̯", "u̯")
result = gsub(result, "%. ", " ")
result = gsub(result, "%.$", " ")
result = gsub(result, "%.?%-", ".")
result = gsub(result, "t̪̚t͡s", "t̚t͡s")
result = gsub(result, "([ʌäaāiīuūe̞eo]̃)̃", "%1")
result = gsub(result, "ĩ̯̯̃", "ĩ̯")
result = gsub(result, "d̪̚d̪͡z", "d̚d͡z")
result = gsub(result, "ː%.̃", "̃ː.")

	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 _, Nepali in ipairs(p) do
		table.insert(results, { pron = "/" .. export.toIPA(Nepali) .. "/" })
		if export.toIPA(Nepali, true) ~= export.toIPA(Nepali) then
			table.insert(results, { pron = "[" .. export.toIPA(Nepali, true) .. "]" })
		end
	end
	
	return m_IPA.format_IPA_full(lang, results)
end

return export