Modul:translit/ru

Definition från Wiktionary, den fria ordlistan.
Hoppa till navigering Hoppa till sök

Dokumentation för denna modul finns på /dok (redigera), /test


Syfte[redigera]

Den här modulen translittererar ryska.
För en beskrivning av språkspecifika saker att ta i beaktning, se dokumentationen för {{tr}}.

Användning[redigera]

local Translit = require("Modul:translit/ru")
latin_text = Translit.tr("rysk text")

Specifikation[redigera]

Publika funktioner:
  • tr("text") Returnerar innehållet i "text" translittererat till latinska bokstäver på det svenska sättet.

Tester[redigera]

All tests passed. (refresh)

Text Expected Actual
test01_isolated_uppercase_characters:
Passed mut.tr("А,Б,В,Г,Д") A,B,V,G,D A,B,V,G,D
Passed mut.tr("Е,Ё,Ж,З,И") Je,Jo,Zj,Z,I Je,Jo,Zj,Z,I
Passed mut.tr("Й,К,Л,М,Н") J,K,L,M,N J,K,L,M,N
Passed mut.tr("О,П,Р,С,Т") O,P,R,S,T O,P,R,S,T
Passed mut.tr("У,Ф,Х,Ц,Ч") U,F,Ch,Ts,Tj U,F,Ch,Ts,Tj
Passed mut.tr("Ш,Щ,Ы,Э,Ю,Я") Sj,Sjtj,Y,E,Ju,Ja Sj,Sjtj,Y,E,Ju,Ja
Text Expected Actual
test02_isolated_lowercase_characters:
Passed mut.tr("а,б,в,г,д") a,b,v,g,d a,b,v,g,d
Passed mut.tr("е,ё,ж,з,и") je,jo,zj,z,i je,jo,zj,z,i
Passed mut.tr("й,к,л,м,н") j,k,l,m,n j,k,l,m,n
Passed mut.tr("о,п,р,с,т") o,p,r,s,t o,p,r,s,t
Passed mut.tr("у,ф,х,ц,ч") u,f,ch,ts,tj u,f,ch,ts,tj
Passed mut.tr("ш,щ,ы,э,ю,я") sj,sjtj,y,e,ju,ja sj,sjtj,y,e,ju,ja
Text Expected Actual
test03_uppercase_vs_mixedcase_words:
Passed mut.tr("ЖА,Жa") ZjA,Zja ZjA,Zja
Text Expected Actual
test04_leave_out_hard_sign:
Passed mut.tr("Ъ,ъ") , ,
Text Expected Actual
test05_leave_out_soft_sign_but_not_before_i:
Passed mut.tr("Ь,ь") , ,
Passed mut.tr("Игорь") Igor Igor
Passed mut.tr("ьи") ji ji
Passed mut.tr("Ильич") Iljitj Iljitj
Passed mut.tr("ЬИ") JI JI
Passed mut.tr("сьич") sjitj sjitj
Passed mut.tr("зьич") zjitj zjitj
Passed mut.tr("тьич") tjitj tjitj
Text Expected Actual
test06_example:
Passed mut.tr("Горбачёв") Gorbatjóv Gorbatjóv
Passed mut.tr("Михаил Горбачёв") Michail Gorbatjóv Michail Gorbatjóv
Text Expected Actual
test07_e_becomes_je_after_vowel:
Passed mut.tr("Иего́ва") Ijegóva Ijegóva
Passed mut.tr("Алексеев") Aleksejev Aleksejev
Passed mut.tr("Алексе́ев") Alekséjev Alekséjev
Text Expected Actual
test08_automatically_accentuate_polysyllabic_yo:
Passed mut.tr("Фёдор") Fjódor Fjódor
Passed mut.tr("Пётр") Pjotr Pjotr
Passed mut.tr("Пётр Ильич") Pjotr Iljitj Pjotr Iljitj
Passed mut.tr("чёлн

По") || tjoln Po || tjoln Po

Text Expected Actual
test09_never_treat_e_like_yo:
Passed mut.tr("Пeтр") Petr Petr
Text Expected Actual
test10_return_unaccentuated_from_unaccentuated_input:
Passed mut.tr("замок") zamok zamok
Text Expected Actual
test11_pass_through_non_cyrillic_input:
Passed mut.tr("IP-адрес") IP-adres IP-adres
Passed mut.tr("β-распад") β-raspad β-raspad
Text Expected Actual
test12_initial_yo_distinct_from_non_initial:
Passed mut.tr("Евгений") Jevgenij Jevgenij
Passed mut.tr("Я Евгений") Ja Jevgenij Ja Jevgenij
Text Expected Actual
test13_punctuation_marks:
Passed mut.tr("Я Тарзан. Ты Джейн.") Ja Tarzan. Ty Dzjejn. Ja Tarzan. Ty Dzjejn.
Text Expected Actual
test14_i_rather_than_j_after_s_or_t_or_z:
Passed mut.tr("сё,сю,ся") sio,siu,sia sio,siu,sia
Passed mut.tr("тё,тю,тя") tio,tiu,tia tio,tiu,tia
Passed mut.tr("зё,зю,зя") zio,ziu,zia zio,ziu,zia
Passed mut.tr("сье,сьё,сью,сья") sie,sio,siu,sia sie,sio,siu,sia
Passed mut.tr("тье,тьё,тью,тья") tie,tio,tiu,tia tie,tio,tiu,tia
Passed mut.tr("зье,зьё,зью,зья") zie,zio,ziu,zia zie,zio,ziu,zia
Passed mut.tr("Сё,Сю,Ся") Sio,Siu,Sia Sio,Siu,Sia
Passed mut.tr("Тё,Тю,Тя") Tio,Tiu,Tia Tio,Tiu,Tia
Passed mut.tr("Зё,Зю,Зя") Zio,Ziu,Zia Zio,Ziu,Zia
Passed mut.tr("Сье,Сьё,Сью,Сья") Sie,Sio,Siu,Sia Sie,Sio,Siu,Sia
Passed mut.tr("Тье,Тьё,Тью,Тья") Tie,Tio,Tiu,Tia Tie,Tio,Tiu,Tia
Passed mut.tr("Зье,Зьё,Зью,Зья") Zie,Zio,Ziu,Zia Zie,Zio,Ziu,Zia
Text Expected Actual
test15_o_rather_than_jo:
Passed mut.tr("шё,щё,чё,жё") sjo,sjtjo,tjo,zjo sjo,sjtjo,tjo,zjo
Passed mut.tr("Шё,Щё,Чё,Жё") Sjo,Sjtjo,Tjo,Zjo Sjo,Sjtjo,Tjo,Zjo
Text Expected Actual
test16_apostrophes_in_input:
Passed mut.tr("Когда́ вы прие́хали?") Kogdá vy prijéchali? Kogdá vy prijéchali?
Text Expected Actual
test99_reference_from_Svenska_skrivregler:
Passed mut.tr("Анна") Anna Anna
Passed mut.tr("Борис") Boris Boris
Passed mut.tr("Волга") Volga Volga
Passed mut.tr("Горький") Gorkij Gorkij
Passed mut.tr("Дон") Don Don
Passed mut.tr("Афанасьев") Afanasiev Afanasiev
Passed mut.tr("Днепр") Dnepr Dnepr
Passed mut.tr("Евгений") Jevgenij Jevgenij
Passed mut.tr("Алексеев") Aleksejev Aleksejev
Passed mut.tr("Кондратьев") Kondratiev Kondratiev
Passed mut.tr("Чёрный") Tjórnyj Tjórnyj
Passed mut.tr("Аксёнов") Aksiónov Aksiónov
Passed mut.tr("Фёдор") Fjódor Fjódor
Passed mut.tr("Пётр") Pjotr Pjotr
Passed mut.tr("Зёрнов") Ziórnov Ziórnov
Passed mut.tr("Щёлкин") Sjtjólkin Sjtjólkin
Passed mut.tr("Жуковский") Zjukovskij Zjukovskij
Passed mut.tr("Замятин") Zamjatin Zamjatin
Passed mut.tr("Ирина") Irina Irina
Passed mut.tr("Толстой") Tolstoj Tolstoj
Passed mut.tr("Куприн") Kuprin Kuprin
Passed mut.tr("Лесков") Leskov Leskov
Passed mut.tr("Максим") Maksim Maksim
Passed mut.tr("Надя") Nadja Nadja
Passed mut.tr("Онега") Onega Onega
Passed mut.tr("Пушкин") Pusjkin Pusjkin
Passed mut.tr("Ростропович") Rostropovitj Rostropovitj
Passed mut.tr("Самара") Samara Samara
Passed mut.tr("Толстой") Tolstoj Tolstoj
Passed mut.tr("Устинов") Ustinov Ustinov
Passed mut.tr("Фёдор") Fjódor Fjódor
Passed mut.tr("Тихонов") Tichonov Tichonov
Passed mut.tr("Донец") Donets Donets
Passed mut.tr("Чайковский") Tjajkovskij Tjajkovskij
Passed mut.tr("Шостакович") Sjostakovitj Sjostakovitj
Passed mut.tr("Щедрин") Sjtjedrin Sjtjedrin
Passed mut.tr("Подъячев") Podjatjev Podjatjev
Passed mut.tr("Белый") Belyj Belyj
Passed mut.tr("Ильич") Iljitj Iljitj
Passed mut.tr("Игорь") Igor Igor
Passed mut.tr("Эдуард") Eduard Eduard
Passed mut.tr("Юрий") Jurij Jurij
Passed mut.tr("Актюбинск") Aktiubinsk Aktiubinsk
Passed mut.tr("Союз") Sojuz Sojuz
Passed mut.tr("Татьяна") Tatiana Tatiana
Passed mut.tr("Зябков") Ziabkov Ziabkov
Passed mut.tr("Ярослав") Jaroslav Jaroslav


-- Denna modul används för att transkribera ryska.
-- 
-- För att transkribera bulgariska, ukrainska och
-- vitryska/belarusiska kan ett liknande system användas.
-- Det hanteras dock av särskilda moduler. Se:
-- 
-- Modul:translit/be
-- Modul:translit/bg
-- Modul:translit/uk
-- 
-- Systemet för transkribering följer det som anges i
-- "Svenska skrivregler" (2017), fjärde upplagan, red. Ola Karlsson
-- En kopia av avsnittet finns i skrivande stund här:
-- https://www.isof.se/download/18.648bef4b18093ee2f03ee80/1652364347434/Kyrillisk%20tabell%20SS2017.pdf
-- 
-- Notera att detta sätt är specifikt för att transkribera
-- till svenska. Transkribering till andra språk sker enligt
-- andra mönster. Exempelvis ska Горбачёв bli just Gorbatjóv.
-- På andra språk skulle det kunna bli Gorbachev, Gorbatschow,
-- Gorbatchev, Gorbatsjov, osv.
--
-- En vanlig fallgrop är att "ё" bara transkriberas korrekt när
-- de två punkterna är med. På ryska utelämnas de ofta när sammanhanget gör det
-- uppenbart. Alltså är det vanligt att "Пётр" istället stavas "Пeтр", vilket
-- denna modul följaktligen tolkar som "Petr" istället för "Pjotr".
--
-- Denna modul är gjord för att returnera latinska tecken med accenterna
-- utskrivna. Därför blir Горбачёв till Gorbatjóv, inte Gorbatjov.
--
-- TODO: Placera i en dold kategori för att markera de ord som inte har
-- tillräckligt många accenttecken
--
-- Denna modul används av följande mall:
-- {{tr}}
--
-- Modulen är författad av (och underhålls av) [[Användare:Gabbe]]

local export = {}
local Q = require("Modul:queue")

local multibyte_char_pattern = ".[\128-\191]*"

local latin_by_cyrillic = { ["А"]="A", ["а"]="a", ["Б"]="B", ["б"]="b", ["В"]="V", ["в"]="v",
["Г"]="G", ["г"]="g", ["Д"]="D", ["д"]="d", ["Е"]="E", ["е"]="e", ["Ё"]="Jo",
["ё"]="jo", ["Ж"]="Zj", ["ж"]="zj", ["З"]="Z", ["з"]="z", ["И"]="I", ["и"]="i",
["Й"]="J", ["й"]="j", ["К"]="K", ["к"]="k", ["Л"]="L", ["л"]="l", ["М"]="M", 
["м"]="m", ["Н"]="N", ["н"]="n", ["О"]="O", ["о"]="o", ["П"]="P", ["п"]="p",
["Р"]="R", ["р"]="r", ["С"]="S", ["с"]="s", ["Т"]="T", ["т"]="t", ["У"]="U",
["у"]="u", ["Ф"]="F", ["ф"]="f", ["Х"]="Ch", ["х"]="ch", ["Ц"]="Ts", ["ц"]="ts",
["Ч"]="Tj", ["ч"]="tj", ["Ш"]="Sj", ["ш"]="sj", ["Щ"]="Sjtj", ["щ"]="sjtj",
["Ъ"]="", ["ъ"]="", ["Ы"]="Y", ["ы"]="y", ["Ь"]="J", ["ь"]="j", ["Э"]="E",
["э"]="e", ["Ю"]="Ju", ["ю"]="ju", ["Я"]="Ja", ["я"]="ja" }

local function addAccentToYoInPolysyllabicWords(text)
	local yo_without_accent = "ё"
	local yo_with_accent = "ё́"
	local whitespace_and_punctuation_pattern = "[%s%p]" 

	local removeAccentsFromYoToAvoidDoubleAccent = function(text)
		return string.gsub(text, yo_with_accent, yo_without_accent)
	end
	
	local splitStringAndKeepSeparator = function(text, separator_pattern)
		local t = {}
		local i = 1
		local accent = "́"

		for c in string.gmatch(text, multibyte_char_pattern) do
			if mw.ustring.find(c, separator_pattern) then
				if (t[1] ~= nil) then
					i = i + 1
				end
				t[i] = c
			else
				if not t[i] then
					t[i] = c
				else
					t[i] = t[i] .. c
				end
			end
		end
		
		return t
	end

	local addAccentToYoIfPolysyllabic = function(words_and_punctuations)
		local isPolysyllabic = function(word)
			local vowels = "АЕЁИОУЭЮЫЯаеёиоуэюыя"
			local neither_whitespace_nor_punctuation = "[^%s%p]"
			local at_least_two_vowels_pattern = "[" .. vowels .. "]" .. neither_whitespace_nor_punctuation .. "*[" .. vowels .. "]"
			
			return not not mw.ustring.find(word, at_least_two_vowels_pattern)
		end
	
		for i, word_or_punctuation in ipairs(words_and_punctuations) do
			if isPolysyllabic(word_or_punctuation) then
				words_and_punctuations[i] = string.gsub(word_or_punctuation, yo_without_accent, yo_with_accent)
			end
		end
		
		return words_and_punctuations
	end

	text = removeAccentsFromYoToAvoidDoubleAccent(text)
	local words_and_punctuations = splitStringAndKeepSeparator(text, whitespace_and_punctuation_pattern)
	words_and_punctuations = addAccentToYoIfPolysyllabic(words_and_punctuations)
	mw.logObject(words_and_punctuations)
	text = table.concat(words_and_punctuations, "")
	return text
end

function export.tr (text)
	local cyrillic_q = Q()
	local latin_q    = Q()
	
	text = addAccentToYoInPolysyllabicWords(text)

	for c in string.gmatch(text, multibyte_char_pattern) do
		Q.enqueue(cyrillic_q, c)
	end

	repeat
		local x = Q.dequeue(cyrillic_q)
		local y = Q.peekFirst(cyrillic_q)
		local z = Q.peekSecond(cyrillic_q)
		local u = Q.peekLast(latin_q)
		local accent = "́"
    
		if not latin_by_cyrillic[x] then
			Q.enqueue(latin_q, x)
		elseif (Q.isEmpty(latin_q) or u == " ") and x == "Е" then
			Q.enqueue(latin_q, "Je")
		elseif (Q.isEmpty(latin_q) or u == " ") and x == "е" then
			Q.enqueue(latin_q, "je")
		elseif x == "ь" then
			if y == "и" then
				Q.enqueue(latin_q, "ji")
				Q.dequeue(cyrillic_q)
			end
		elseif x == "Ь" then
			if y == "и" then
				Q.enqueue(latin_q, "Ji")
				Q.dequeue(cyrillic_q)
			elseif y == "И" then
				Q.enqueue(latin_q, "JI")
				Q.dequeue(cyrillic_q)
			end
		elseif mw.ustring.find(x, "[стзСТЗ]") then
			Q.enqueue(latin_q, latin_by_cyrillic[x])
			if y == "ь" then
				if z == "е" then
					Q.enqueue(latin_q, "ie")
					Q.dequeue(cyrillic_q)
					Q.dequeue(cyrillic_q)
				elseif z == "ё" then
					Q.enqueue(latin_q, "io")
					Q.dequeue(cyrillic_q)
					Q.dequeue(cyrillic_q)
				elseif z == "ю" then
					Q.enqueue(latin_q, "iu")
					Q.dequeue(cyrillic_q)
					Q.dequeue(cyrillic_q)
				elseif z == "я" then
					Q.enqueue(latin_q, "ia")
					Q.dequeue(cyrillic_q)
					Q.dequeue(cyrillic_q)
				end
			elseif y == "ё" then
				Q.enqueue(latin_q, "io")
				Q.dequeue(cyrillic_q)
			elseif y == "ю" then
				Q.enqueue(latin_q, "iu")
				Q.dequeue(cyrillic_q)
			elseif y == "я" then
				Q.enqueue(latin_q, "ia")
				Q.dequeue(cyrillic_q)
			end
		elseif mw.ustring.find(x, "[шщчжШЩЧЖ]") then
			Q.enqueue(latin_q, latin_by_cyrillic[x])
			if y == "ё" then
				Q.enqueue(latin_q, "o")
				Q.dequeue(cyrillic_q)
			end
    	elseif x == "е" then
			if mw.ustring.find(u, "[aeouiyAEOUIY]") or u == accent then
				Q.enqueue(latin_q, "je")
			else
				Q.enqueue(latin_q, "e")
			end
		else
			Q.enqueue(latin_q, latin_by_cyrillic[x])
		end
	until Q.isEmpty(cyrillic_q)

	local tbl = {}
	
	repeat
    	local x = Q.dequeue(latin_q)
    	local y = Q.peekFirst(latin_q) or ""
		local accent = "́"

		if y == accent then
			x = mw.ustring.toNFC(x .. y)
			Q.dequeue(latin_q)
		end

		table.insert(tbl, x)

	until Q.isEmpty(latin_q)
	
	text = table.concat(tbl, "")

	return text
end

return export