Modul:translit/ru
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 | |
---|---|---|---|
mut.tr("А,Б,В,Г,Д") | A,B,V,G,D | A,B,V,G,D | |
mut.tr("Е,Ё,Ж,З,И") | Je,Jo,Zj,Z,I | Je,Jo,Zj,Z,I | |
mut.tr("Й,К,Л,М,Н") | J,K,L,M,N | J,K,L,M,N | |
mut.tr("О,П,Р,С,Т") | O,P,R,S,T | O,P,R,S,T | |
mut.tr("У,Ф,Х,Ц,Ч") | U,F,Ch,Ts,Tj | U,F,Ch,Ts,Tj | |
mut.tr("Ш,Щ,Ы,Э,Ю,Я") | Sj,Sjtj,Y,E,Ju,Ja | Sj,Sjtj,Y,E,Ju,Ja |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("а,б,в,г,д") | a,b,v,g,d | a,b,v,g,d | |
mut.tr("е,ё,ж,з,и") | je,jo,zj,z,i | je,jo,zj,z,i | |
mut.tr("й,к,л,м,н") | j,k,l,m,n | j,k,l,m,n | |
mut.tr("о,п,р,с,т") | o,p,r,s,t | o,p,r,s,t | |
mut.tr("у,ф,х,ц,ч") | u,f,ch,ts,tj | u,f,ch,ts,tj | |
mut.tr("ш,щ,ы,э,ю,я") | sj,sjtj,y,e,ju,ja | sj,sjtj,y,e,ju,ja |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("ЖА,Жa") | ZjA,Zja | ZjA,Zja |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Ъ,ъ") | , | , |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Ь,ь") | , | , | |
mut.tr("Игорь") | Igor | Igor | |
mut.tr("ьи") | ji | ji | |
mut.tr("Ильич") | Iljitj | Iljitj | |
mut.tr("ЬИ") | JI | JI | |
mut.tr("сьич") | sjitj | sjitj | |
mut.tr("зьич") | zjitj | zjitj | |
mut.tr("тьич") | tjitj | tjitj |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Горбачёв") | Gorbatjóv | Gorbatjóv | |
mut.tr("Михаил Горбачёв") | Michail Gorbatjóv | Michail Gorbatjóv |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Иего́ва") | Ijegóva | Ijegóva | |
mut.tr("Алексеев") | Aleksejev | Aleksejev | |
mut.tr("Алексе́ев") | Alekséjev | Alekséjev |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Фёдор") | Fjódor | Fjódor | |
mut.tr("Пётр") | Pjotr | Pjotr | |
mut.tr("Пётр Ильич") | Pjotr Iljitj | Pjotr Iljitj | |
mut.tr("чёлн
По") || tjoln Po || tjoln Po |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Пeтр") | Petr | Petr |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("замок") | zamok | zamok |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("IP-адрес") | IP-adres | IP-adres | |
mut.tr("β-распад") | β-raspad | β-raspad |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Евгений") | Jevgenij | Jevgenij | |
mut.tr("Я Евгений") | Ja Jevgenij | Ja Jevgenij |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Я Тарзан. Ты Джейн.") | Ja Tarzan. Ty Dzjejn. | Ja Tarzan. Ty Dzjejn. |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("сё,сю,ся") | sio,siu,sia | sio,siu,sia | |
mut.tr("тё,тю,тя") | tio,tiu,tia | tio,tiu,tia | |
mut.tr("зё,зю,зя") | zio,ziu,zia | zio,ziu,zia | |
mut.tr("сье,сьё,сью,сья") | sie,sio,siu,sia | sie,sio,siu,sia | |
mut.tr("тье,тьё,тью,тья") | tie,tio,tiu,tia | tie,tio,tiu,tia | |
mut.tr("зье,зьё,зью,зья") | zie,zio,ziu,zia | zie,zio,ziu,zia | |
mut.tr("Сё,Сю,Ся") | Sio,Siu,Sia | Sio,Siu,Sia | |
mut.tr("Тё,Тю,Тя") | Tio,Tiu,Tia | Tio,Tiu,Tia | |
mut.tr("Зё,Зю,Зя") | Zio,Ziu,Zia | Zio,Ziu,Zia | |
mut.tr("Сье,Сьё,Сью,Сья") | Sie,Sio,Siu,Sia | Sie,Sio,Siu,Sia | |
mut.tr("Тье,Тьё,Тью,Тья") | Tie,Tio,Tiu,Tia | Tie,Tio,Tiu,Tia | |
mut.tr("Зье,Зьё,Зью,Зья") | Zie,Zio,Ziu,Zia | Zie,Zio,Ziu,Zia |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("шё,щё,чё,жё") | sjo,sjtjo,tjo,zjo | sjo,sjtjo,tjo,zjo | |
mut.tr("Шё,Щё,Чё,Жё") | Sjo,Sjtjo,Tjo,Zjo | Sjo,Sjtjo,Tjo,Zjo |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Когда́ вы прие́хали?") | Kogdá vy prijéchali? | Kogdá vy prijéchali? |
Text | Expected | Actual | |
---|---|---|---|
mut.tr("Анна") | Anna | Anna | |
mut.tr("Борис") | Boris | Boris | |
mut.tr("Волга") | Volga | Volga | |
mut.tr("Горький") | Gorkij | Gorkij | |
mut.tr("Дон") | Don | Don | |
mut.tr("Афанасьев") | Afanasiev | Afanasiev | |
mut.tr("Днепр") | Dnepr | Dnepr | |
mut.tr("Евгений") | Jevgenij | Jevgenij | |
mut.tr("Алексеев") | Aleksejev | Aleksejev | |
mut.tr("Кондратьев") | Kondratiev | Kondratiev | |
mut.tr("Чёрный") | Tjórnyj | Tjórnyj | |
mut.tr("Аксёнов") | Aksiónov | Aksiónov | |
mut.tr("Фёдор") | Fjódor | Fjódor | |
mut.tr("Пётр") | Pjotr | Pjotr | |
mut.tr("Зёрнов") | Ziórnov | Ziórnov | |
mut.tr("Щёлкин") | Sjtjólkin | Sjtjólkin | |
mut.tr("Жуковский") | Zjukovskij | Zjukovskij | |
mut.tr("Замятин") | Zamjatin | Zamjatin | |
mut.tr("Ирина") | Irina | Irina | |
mut.tr("Толстой") | Tolstoj | Tolstoj | |
mut.tr("Куприн") | Kuprin | Kuprin | |
mut.tr("Лесков") | Leskov | Leskov | |
mut.tr("Максим") | Maksim | Maksim | |
mut.tr("Надя") | Nadja | Nadja | |
mut.tr("Онега") | Onega | Onega | |
mut.tr("Пушкин") | Pusjkin | Pusjkin | |
mut.tr("Ростропович") | Rostropovitj | Rostropovitj | |
mut.tr("Самара") | Samara | Samara | |
mut.tr("Толстой") | Tolstoj | Tolstoj | |
mut.tr("Устинов") | Ustinov | Ustinov | |
mut.tr("Фёдор") | Fjódor | Fjódor | |
mut.tr("Тихонов") | Tichonov | Tichonov | |
mut.tr("Донец") | Donets | Donets | |
mut.tr("Чайковский") | Tjajkovskij | Tjajkovskij | |
mut.tr("Шостакович") | Sjostakovitj | Sjostakovitj | |
mut.tr("Щедрин") | Sjtjedrin | Sjtjedrin | |
mut.tr("Подъячев") | Podjatjev | Podjatjev | |
mut.tr("Белый") | Belyj | Belyj | |
mut.tr("Ильич") | Iljitj | Iljitj | |
mut.tr("Игорь") | Igor | Igor | |
mut.tr("Эдуард") | Eduard | Eduard | |
mut.tr("Юрий") | Jurij | Jurij | |
mut.tr("Актюбинск") | Aktiubinsk | Aktiubinsk | |
mut.tr("Союз") | Sojuz | Sojuz | |
mut.tr("Татьяна") | Tatiana | Tatiana | |
mut.tr("Зябков") | Ziabkov | Ziabkov | |
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