Module:tr-IPA
Jump to navigation
Jump to search
- The following documentation is located at Module:tr-IPA/documentation. [edit]
- Useful links: subpage list • links • transclusions • testcases • sandbox
Turkish pronunciation module, powers {{tr-IPA}}
. This is under development and may contain errors; mass deployment on entries is discouraged.
local export = {}
local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("tr")
local C = "[bçcdfgğhjklmnprsştvyzqxw]" -- consonants
local V = "[aeiıoöuüâû]" -- vowels
local lowerc = {
--Armeno-Turkish
["Ո"]="ո", ["Ա"]="ա", ["Գ"]="գ", ["Ե"]="ե", ["Զ"]="զ", ["Է"]="է",
["Ը"]="ը", ["Թ"]="թ", ["Ժ"]="ժ", ["Ի"]="ի", ["Լ"]="լ", ["Խ"]="խ",
["Կ"]="կ", ["Հ"]="հ", ["Ղ"]="ղ", ["Ճ"]="ճ", ["Մ"]="մ", ["Ն"]="ն",
["Շ"]="շ", ["Չ"]="չ", ["Պ"]="պ", ["Ս"]="ս", ["Վ"]="վ", ["Տ"]="տ",
["Ր"]="ր", ["Փ"]="փ", ["Ք"]="ք", ["Օ"]="օ", ["Ֆ"]="ֆ", ["Յ"]="յ",
--Latin
["A"]="a", ["B"]="b", ["C"]="c", ["Ç"]="ç", ["D"]="d", ["E"]="e",
["F"]="f", ["G"]="g", ["Ğ"]="ğ", ["H"]="h", ["I"]="ı", ["İ"]="i",
["J"]="j", ["K"]="k", ["L"]="l", ["M"]="m", ["N"]="n", ["O"]="o",
["Ö"]="ö", ["P"]="p", ["R"]="r", ["S"]="s", ["Ş"]="ş", ["T"]="t",
["U"]="u", ["Ü"]="ü", ["V"]="v", ["Y"]="y", ["Z"]="z", ["Â"]="â",
["Û"]="û", ["Q"]="q", ["X"]="x", ["W"]="w", ["Î"]="î"
}
local monographs = {
["ա"]="a", ["գ"]="k", ["ե"]="y", ["զ"]="z", ["է"]="e", ["ը"]="ı",
["թ"]="t", ["ժ"]="j", ["ի"]="i", ["լ"]="l", ["խ"]="ẍ", ["կ"]="g",
["հ"]="h", ["ղ"]="g", ["ճ"]="c", ["մ"]="m", ["ն"]="n", ["շ"]="ʃ",
["չ"]="ç", ["պ"]="b", ["ս"]="s", ["վ"]="v", ["տ"]="d", ["ր"]="r",
["փ"]="p", ["ք"]="k", ["օ"]="o", ["ֆ"]="f"
}
local placeholders = {
["ու"] = "ù",
["իւ"] = "ì",
["էօ"] = "ò",
}
local placeholder_to_latin = {
["ù"] = "u",
["ì"] = "ü",
["ò"] = "ö",
}
local function convert_armeno_turkish_to_latin(text)
-- Replace digraphs with placeholders
for digraph, placeholder in pairs(placeholders) do
text = mw.ustring.gsub(text, digraph, placeholder)
end
-- Replace placeholders with Latin script
text = mw.ustring.gsub(text, '.', placeholder_to_latin)
-- Replace monographs
text = mw.ustring.gsub(text, '.', monographs)
return text
end
local phon = {
["c"]="d͡ʒ", ["ç"]="t͡ʃ", ["ğ"]="ɣ", ["ş"]="ʃ",
["b"]="b", ["d"]="d", ["f"]="f", ["g"]="ɡ",
["h"]="h", ["j"]="ʒ", ["k"]="k", ["l"]="l",
["m"]="m", ["n"]="n", ["p"]="p", ["r"]="ɾ",
["s"]="s", ["t"]="t", ["v"]="v", ["y"]="j", ["z"]="z",
["q"]="k", ["x"]="ks", ["w"]="v", ["î"]="iː",
["a"]="a", ["â"]="a", ["e"]="e", ["ı"]="ɯ", ["i"]="i",
["o"]="o", ["ö"]="œ", ["u"]="u", ["û"]="u", ["ü"]="y",
}
local function phonemic(text)
text = mw.ustring.gsub(text, '.', lowerc)
text = convert_armeno_turkish_to_latin(text)
text = mw.ustring.gsub(text, '.', phon)
text = mw.ustring.gsub(text, "ć", "c")
text = mw.ustring.gsub(text, "ý", "j")
text = mw.ustring.gsub(text, "ÿ", "y")
text = mw.ustring.gsub(text, "g", "ɡ")
text = mw.ustring.gsub(text, ":", "ː")
text = mw.ustring.gsub(text, "ẍ", "x")
text = mw.ustring.gsub(text, "č", "t͡ʃ")
text = mw.ustring.gsub(text, "ḉ", "ç")
return text
end
local function phonetic(text)
text = mw.ustring.gsub(text, '.', lowerc)
text = convert_armeno_turkish_to_latin(text)
-- Handle k, g palatalization rules
text = mw.ustring.gsub(text, "k[ɛeiyœöüÿâû]", "ć%1")
text = mw.ustring.gsub(text, "g[ɛeiyœöüÿâû]", "ɟ%1")
text = mw.ustring.gsub(text, "ćk", "ć")
text = mw.ustring.gsub(text, "ɟg", "ɟ")
text = mw.ustring.gsub(text, "[ɛeiyœöüÿâû]k", "%1ć")
text = mw.ustring.gsub(text, "[ɛeiyœöüÿâû]g", "%1ɟ")
text = mw.ustring.gsub(text, "kć", "ć")
text = mw.ustring.gsub(text, "gɟ", "ɟ")
-- Handle ğ rules
text = mw.ustring.gsub(text, "([aeiıoöuüÿâû])ğ([bçcdfgğhjklmnprsştvyzqxwý])",
"%1ː%2")
text = mw.ustring.gsub(text, "([ɛeiyöüÿ])ğ([ɛeiyöüÿ])", "%1ý%2")
text = mw.ustring.gsub(text, "ğ$", "ː")
text = mw.ustring.gsub(text, "([ɛeiyÿöü])ğ", "%1ý")
text = mw.ustring.gsub(text, "ğ", "")
-- Handle l rules
text = mw.ustring.gsub(text, "l","ɫ")
text = mw.ustring.gsub(text, "ɫ[ɛeiyœöüÿâû]", "l%1")
text = mw.ustring.gsub(text, "[ɛeiyœöüÿâû]ɫ", "%1l")
text = mw.ustring.gsub(text, "lɫ", "ɫ")
text = mw.ustring.gsub(text, "ɫl", "l")
-- Handle aspirated p, t, c, k
text = mw.ustring.gsub(text, "^p", "pʰ")
text = mw.ustring.gsub(text, "^t", "tʰ")
text = mw.ustring.gsub(text, "^ć", "ćʰ")
text = mw.ustring.gsub(text, "^k", "kʰ")
-- Front final /h/
text = mw.ustring.gsub(text, "[ɛeiyœöüÿâû]h$", "%1ḉ")
text = mw.ustring.gsub(text, "hḉ", "ḉ")
text = mw.ustring.gsub(text, "h$", "ẍ")
-- Handle exceptions for final devoicing
local exceptions = {
["ad"] = true,
["hac"] = true,
["İd"] = true,
["kod"] = true,
["od"] = true
}
-- Only apply devoicing rule if word isn't in exception list
if not exceptions[text] then
-- Devoice final /b, d, d͡ʒ, ɡ, ɟ/
text = mw.ustring.gsub(text, "b$", "p")
text = mw.ustring.gsub(text, "d$", "t")
text = mw.ustring.gsub(text, "d͡ʒ$", "č")
text = mw.ustring.gsub(text, "ɡ$", "k")
text = mw.ustring.gsub(text,"g$", "k")
text = mw.ustring.gsub(text, "ɟ$", "ć")
text = mw.ustring.gsub(text, "c$", "č")
end
-- Devoice /ɾ/ and make /ɫ/ and /l/ voiceless in appropriate conditions
text = mw.ustring.gsub(text, "ɾ$", "ɾ̥")
text = mw.ustring.gsub(text, "ɾ([ptćkḉsčʃ])", "ɾ̥%1")
text = mw.ustring.gsub(text, "r$", "ɾ̥")
text = mw.ustring.gsub(text, "r([ptćkḉsčʃ])", "ɾ̥%1")
text = mw.ustring.gsub(text, "ɫ$", "ɫ̥")
text = mw.ustring.gsub(text, "ɫ([ptćkḉsčʃ])", "ɫ̥%1")
text = mw.ustring.gsub(text, "l$", "l̥")
text = mw.ustring.gsub(text, "l([ptćkḉsčʃ])", "l̥%1")
-- Lower /e/ before coda /m, n, l, r/
text = mw.ustring.gsub(text, "e([mnlrɾɾ̥l̥ɫ̥])", "ɛ%1")
-- Handle the lowering of specific vowels in word-final position
text = mw.ustring.gsub(text, "i$", "ɪ")
text = mw.ustring.gsub(text, "ÿ$", "ʏ")
text = mw.ustring.gsub(text, "u$", "ʊ")
text = mw.ustring.gsub(text, "e$", "ɛ")
return phonemic(text)
end
function export.IPA(frame)
local words = {}
for _, word in ipairs(frame:getParent().args) do
table.insert(words, word)
end
if #words == 0 then
words = {mw.title.getCurrentTitle().text}
end
local IPA_results = {}
for _, word in ipairs(words) do
table.insert(IPA_results, { pron = "/" .. phonemic(word) .. "/" })
table.insert(IPA_results, { pron = "[" .. phonetic(word) .. "]" })
end
return m_IPA.format_IPA_full { lang = lang, items = IPA_results }
end
return export