This module will transliterate Tibetan language text per the Wylie transliteration scheme. It is used to transliterate Adap, Balti, Gahri, Tibetan, Brokkat, Chocangaca, Idu, Changthang, Dakpa, Dzongkha, Dzala, Kutang Ghale, Bumthangkha, Kalaktang Monpa, Ladakhi, Lunanakha, Layakha, Nyenkha, Manangba, Olekha, Old Tibetan, Sanskrit, Brokpake, Sikkimese, Bokar, Chali, Tshangla, Tawang Monpa, Classical Tibetan, Khengkha, Kurtöp, Sherpa, Zhang-Zhung, and Zangskari. The module should preferably not be called directly from templates or other modules. To use it from a template, use {{xlit}}. Within a module, use Module:languages#Language:transliterate.

For testcases, see Module:Tibt-translit/testcases.

Functions

tr(text, lang, sc)
Transliterates a given piece of text written in the script specified by the code sc, and language specified by the code lang.
When the transliteration fails, returns nil.

Sample text

བོད་རྒྱལ་རབས་དེ་སྤྱིར་བོད་བརྒྱུད་ནང་བསྟན་ཆོས་ལུགས་ཀྱི་ལོ་རྒྱུས་དང་ཧ་ཅང་འབྲེལ་ཡོད། རྒྱུ་རྐྱེན་གཙོ་བོ་ནི་བོད་རིགས་དང་ སོག་རིགས་ མན་ཇུ་རིགས་སོགས་ཀྱི་རིག་གནས་འཕེལ་རྒྱས་དང་འབྲེལ་ཡོད་ མ་ཟད་སྔོན་བྱོན་ཀྱི་ལོ་རྒྱུས་མཁས་ཅན་ཕལ་ཆེ་བ་ནི་ནང་ཆོས་རྒྱུད་འཛིན་པ་ཡིན༎བོད་གངས་ཅན་ཞེས་པའི་རྒྱལ་ཁབ་ཆེན་པོ་འདི་ཉིད། ཆེས་སྔ་བའི་དུས་བོད་ཀྱི་ཡུལ་ཆ་ཤས་རྒྱ་ཆེ་བ་རྒྱ་མཚོ་ཡིན་པ་དང་། རིམ་གྱིས་མཚོའི་རྒྱུན་སྐམ་ནས་ཡུལ་ལྗོངས་ཆགས། དེ་ནས་མིའི་འགྲོ་བ་བྱུང་ཞིང་། དེ་ཡང་མིའི་འགྲོ་བ་ནི་འཕགས་མཆོག་སྤྱན་རས་གཟིགས་ཀྱི་རྣམ་སྤྲུལ་ཕ་སྤྲེའུ་བྱང་ ཆུབ་སེམས་དཔའ་དང་། མ་སྒྲོལ་མའི་རྣམ་སྤྲུལ་མ་བྲག་སྲིན་མོ་གཉིས་དུས་པ་ལས་ བྱུང་བ་ཡིན་པ་རེད། གངས་ཅན་བོད་རྒྱལ་ཁབ་ཀྱི་ས་ཁྱོན་ནི་སྤྱི་ལེ་གྲུ་བཞི་མ་འབུམ་ ༢༥ ཡིན་ཞིང་། རྒྱ་ཁྱོན་དེ་ནི་བལ་ཡུལ་གྱི་རྒྱ་ཁྱོན་ལྔ་བཅུ་ཙམ་ཞིག་ཡིན་པ་དང་། ཁོར་ཡུག་ནི། ཤར་དུ་རྒྱ་ནག་དང་། མན་ཇུ། སོག་པོ། ནུབ་ཏུ་བལ་ཡུལ་དང་། རྒྱ་གར། པ་ཀི་སི་ཐན། ཨབ་གྷ་ནི་སི་ཏན། བྱང་དུ་ཏུར་ཀི་སི་ ཏན་དང་། ཨུ་རུ་སུ། ལྷོ་རུ་འབྲུག་དང་། འབྲས་ལྗོངས། འབར་མ། བྷང་ལ་སྡེ་ཤི་བཅས་ཀྱི་དབུས་སུ་གནས་ཡོད། དེ་ལྟ་བུའི་རྒྱ་ཁྱོན་ཅན་གྱི་བོད་ཀྱི་རྒྱལ་ཁབ་དེ། སྤྱི་ལོ་མ་བྱུང་བའི་ལོ་ ༡༢༧ གོང་རྒྱལ་པོའི་ཐོག་མ་གཉའ་ཁྲི་བཙན་པོ་བྱུང་བ་ནས་བཟུང་རྒྱལ་པོ་གླང་ དར་མའི་བར་མི་ལོ་དགུ་བརྒྱ་ལྷག་གི་རིང་ཆོས་དང་སྲིད་ཀྱི་བྱུང་བ་མཐའ་ཡས་པ་བྱུང། སྤྱི་ལོ་ ༩༠༠ ཙམ་ནས་མི་ལོ་ ༣༤༧ ཙམ་རིང་བོད་ཡུལ་མདོ་སྟོད་སྨད་དང་། དབུས་གཙང་བཅས་པ་སིལ་བུར་འཐོར་ཏེ་བོད་ཁམས་ཉམས་རྒྱུད་ཇེ་ཆེར་གྱུར། རིམ་པས་ས་སྐྱའི་ཁྲི་རབས་ཉི་ཤུས་ལོ་ ༩༦ རིང་བོད་སྤྱི་ལ་དབང་བསྒྱུར་ཞིང་། དེ་རྗེས་ཕག་མོ་གྲུབ་པ་ཁྲི་རབས་བཅུ་གཅིག་གིས་ལོ་ ༨༦དང་། རིན་སྤུངས་པ་ཁྲི་རབས་བཞི་ནས་ལོ་ ༡༣༠ དང་། སྡེ་པ་གཙང་པའི་ཁྲི་རབས་གསུམ་གྱིས་ལོ་ ༧༦ བཅས་དབང་སྒྱུར། དགའ་ལྡན་ཕོ་བྲང་གི་དུས་རབས། སྤྱི་ལོ་ ༡༦༤༢ ནས་ ༡༩༥༠ བར་ལོ་ ༣༦༧སོགས་ཡིན།

Bod rgyal rabs de spyir bod brgyud nang bstan chos lugs kyi lo rgyus dang ha cang 'brel yod. Rgyu rkyen gtso bo ni bod rigs dang sog rigs man ju rigs sogs kyi rig gnas 'phel rgyas dang 'brel yod ma zad sngon byon kyi lo rgyus mkhas can phal che ba ni nang chos rgyud 'dzin pa yin.

Bod gangs can zhes pa'i rgyal khab chen po 'di nyid. Ches snga ba'i dus bod kyi yul cha shas rgya che ba rgya mtsho yin pa dang. Rim gyis mtsho'i rgyun skam nas yul ljongs chags. De nas mi'i 'gro ba byung zhing. De yang mi'i 'gro ba ni 'phags mchog spyan ras gzigs kyi rnam sprul pha spre'u byang chub sems dpa' dang. Ma sgrol ma'i rnam sprul ma brag srin mo gnyis dus pa las byung ba yin pa red. Gangs can bod rgyal khab kyi sa khyon ni spyi le gru bzhi ma 'bum 25 yin zhing. Rgya khyon de ni bal yul gyi rgya khyon lnga bcu tsam zhig yin pa dang. Khor yug ni. Shar du rgya nag dang. Man ju. Sog po. Nub tu bal yul dang. Rgya gar. Pa ki si than. Ab gha ni si tan. Byang du tur ki si tan dang. U ru su. Lho ru 'brug dang. 'Bras ljongs. 'Bar ma. Bhang la sde shi bcas kyi dbus su gnas yod. De lta bu'i rgya khyon can gyi bod kyi rgyal khab de. Spyi lo ma byung ba'i lo 127 gong rgyal po'i thog ma gnya' khri btsan po byung ba nas bzung rgyal po glang dar ma'i bar mi lo dgu brgya lhag gi ring chos dang srid kyi byung ba mtha' yas pa byung. Spyi lo 900 tsam nas mi lo 347 tsam ring bod yul mdo stod smad dang. Dbus gtsang bcas pa sil bur 'thor te bod khams nyams rgyud je cher gyur. Rim pas sa skya'i khri rabs nyi shus lo 96 ring bod spyi la dbang bsgyur zhing. De rjes phag mo grub pa khri rabs bcu gcig gis lo 86dang. Rin spungs pa khri rabs bzhi nas lo 130 dang. Sde pa gtsang pa'i khri rabs gsum gyis lo 76 bcas dbang sgyur. Dga' ldan pho brang gi dus rabs. Spyi lo 1642 nas 1950 bar lo 367sogs yin


local m_str_utils = require("Module:string utilities")

local gsub = m_str_utils.gsub
local match = m_str_utils.match
local toNFC = mw.ustring.toNFC
local upper = m_str_utils.upper

local Tibt = require("Module:Tibt-common")

local export = {}

local twoChars = {
	["རྀ"] = "ṛ", ["ྲྀ"] = "ṛ", -- Primarily used in Sanskrit(-derived) borrowings.
	["ལྀ"] = "ḷ", ["ླྀ"] = "ḷ",
	
	["ཕ༹"] = "f", ["བ༹"] = "v", -- Used to transliterate Chinese.
	["ཁ༹"] = "x", ["ག༹"] = "ġ", -- Used in Balti.
	
	["ྥ༹"] = "f", ["ྦ༹"] = "v",
	["ྑ༹"] = "x", ["ྒ༹"] = "ġ",
}

local oneChar = {
	["ཀ"] = "k", ["ཁ"] = "kh", ["ག"] = "g", ["ང"] = "ng",
	["ཅ"] = "c", ["ཆ"] = "ch", ["ཇ"] = "j", ["ཉ"] = "ny",
	["ཏ"] = "t", ["ཐ"] = "th", ["ད"] = "d", ["ན"] = "n",
	["པ"] = "p", ["ཕ"] = "ph", ["བ"] = "b", ["མ"] = "m",
	["ཙ"] = "ts", ["ཚ"] = "tsh", ["ཛ"] = "dz", ["ཝ"] = ".w",
	["ཞ"] = "zh", ["ཟ"] = "z", ["འ"] = "'", ["ཡ"] = ".y",
	["ར"] = ".r", ["ཪ"] = ".r", ["ལ"] = "l", ["ཤ"] = "sh", ["ས"] = "s",
	["ཧ"] = "h", ["ཨ"] = "\1",
	["ཊ"] = "ṭ", ["ཋ"] = "ṭh", ["ཌ"] = "ḍ", ["ཎ"] = "ṇ", ["ཥ"] = "ṣ",
	["ཫ"] = "q", ["ཬ"] = "ṛ", -- Used in Balti.
	["྅"] = "ʼ", ["ྈ"] = "x", ["ྉ"] = "f", ["ྌ"] = "f", -- Used in Sanskrit.
	
	["ཱ"] = "̄", ["ི"] = "i", ["ྀ"] = "ị", ["ུ"] = "u", ["ེ"] = "e", ["ཻ"] = "ai", ["ོ"] = "o", ["ཽ"] = "au",
	
	["ཾ"] = "ṃ", ["ྂ"] = "ṃ", ["ྃ"] = "m̐", ["ཿ"] = "ḥ",
	
	["ྐ"] = "k", ["ྑ"] = "kh", ["ྒ"] = "g", ["ྔ"] = "ng",
	["ྕ"] = "c", ["ྖ"] = "ch", ["ྗ"] = "j", ["ྙ"] = "ny",
	["ྟ"] = "t", ["ྠ"] = "th", ["ྡ"] = "d", ["ྣ"] = "n",
	["ྤ"] = "p", ["ྥ"] = "ph", ["ྦ"] = "b", ["ྨ"] = "m",
	["ྩ"] = "ts", ["ྪ"] = "tsh", ["ྫ"] = "dz", ["ྭ"] = "w", ["ྺ"] = "w",
	["ྮ"] = "zh", ["ྯ"] = "z", ["ྰ"] = "'", ["ྱ"] = "y", ["ྻ"] = "y",
	["ྲ"] = "r", ["ྼ"] = "r", ["ླ"] = "l", ["ྴ"] = "sh", ["ྶ"] = "s",
	["ྷ"] = "h", ["ྸ"] = "+a",
	["ྚ"] = "ṭ", ["ྛ"] = "ṭh", ["ྜ"] = "ḍ", ["ྞ"] = "ṇ", ["ྵ"] = "ṣ",
	["ྍ"] = "x", ["ྎ"] = "f", ["ྏ"] = "f",
}

local symbol = {
	["༠"] = "0", ["༡"] = "1", ["༢"] = "2", ["༣"] = "3", ["༤"] = "4",
	["༥"] = "5", ["༦"] = "6", ["༧"] = "7", ["༨"] = "8", ["༩"] = "9",
	["༪"] = "0.5", ["༫"] = "1.5", ["༬"] = "2.5", ["༭"] = "3.5", ["༮"] = "4.5",
	["༯"] = "5.5", ["༰"] = "6.5", ["༱"] = "7.5", ["༲"] = "8.5", ["༳"] = "9.5",
	["་"] = " ", ["༌"] = "*", ["།"] = ".", ["༎"] = ".\n\n", ["༏"] = ";",
	["༑"] = "|", ["༈"] = "!", ["༔"] = ":", ["༼"] = "(", ["༽"] = ")",
	["༺"] = "<", ["༻"] = ">"
}

function export.tr(text, lang, sc)

	local langObj; if not lang then
		error("Language code required.")
	else
		langObj = require("Module:languages").getByCode(lang)
	end
	local scObj = require("Module:scripts").getByCode("Tibt")
	text = (langObj:makeEntryName(text))
	text = scObj:fixDiscouragedSequences(text)
	text = scObj:toFixedNFD(text)
	text = gsub(text, "༒", "།")
	text = gsub(text, "[་༌]+$", "")
	
	for word in Tibt.getWords(text) do
		for syllable in Tibt.getSyllables(word) do
			local tr = syllable
			
			tr = gsub(tr, "(ཱ)([ིེུ-ཽྀྲླ]+)", "%2%1")
			
			local mainStack = gsub(Tibt.findMainStack(syllable, lang), "[ཾཿྂྃ]", "")
			if match(mainStack, "([^ༀི-ཽྀ]ཱ?)$") then
				local newMainStack = mainStack .. "a"
				newMainStack = gsub(newMainStack, "ཱa$", "aཱ")
				tr = gsub(tr, mainStack, newMainStack, 1)
			end
			
			tr = gsub(tr, "^(.*)༷(.*)$", "<u>%1%2</u>")
			tr = gsub(tr, "^(.*)༵(.*)$", "<span style=\"text-decoration-style:double;\">%1%2</span>")
			
			for letter, replacement in pairs(twoChars) do
				tr = gsub(tr, letter, replacement)
			end
			tr = gsub(tr, ".", oneChar)
			
			tr = gsub(tr, "(.')([^aāeiīoḷḹṛṝuū%-<])", "%1a%2")
			tr = gsub(tr, "%f[^%zaāeiīoḷḹṛṝuū%->]%.", "")
			tr = gsub(tr, "%.([rwy][^aāeiīoḷḹṛṝuū])", "%1")
			tr = gsub(tr, "^\1", "")
			tr = tr:gsub("\1", "%.")
			
			text = gsub(text, syllable, tr, 1)
		end
	end
	
	text = gsub(text, "྄a?", "")
	text = gsub(text, ".", symbol)
	text = gsub(text, " ' ", "")
	text = gsub(text, " *· *·? *", " · ")
	text = gsub(text, " *%.", ".")
	text = gsub(text, "\n+", "\n\n")
	text = gsub(text, "\n\n$", "")
	if match(text, "%. ") or match(text, "%.\n.") or match(text, "%.$") then
		text = gsub(text, "^'?.", upper)
		text = gsub(text, "\n\n'?.", upper)
		text = gsub(text, "%. '?.", upper)
	end
	
	-- End with a space so that concurrent parts of running text that need to be transliterated separately (e.g. due to links) are still properly separated.
	return toNFC(text) .. " "
end

return export