(* Operations with Russian letters *) (*rusletters = LanguageData["Russian", "BasicAlphabet"][[1]];*) rusletters = {{"\:0410", "\:0430"}, {"\:0411", "\:0431"}, {"\:0412", "\:0432"}, {"\:0413", "\:0433"}, {"\:0414", "\:0434"}, {"\:0415", "\:0435"}, {"\:0401", "\:0451"}, {"\:0416", "\:0436"}, {"\:0417", "\:0437"}, {"\:0418", "\:0438"}, {"\:0419", "\:0439"}, {"\:041a", "\:043a"}, {"\:041b", "\:043b"}, {"\:041c", "\:043c"}, {"\:041d", "\:043d"}, {"\:041e", "\:043e"}, {"\:041f", "\:043f"}, {"\:0420", "\:0440"}, {"\:0421", "\:0441"}, {"\:0422", "\:0442"}, {"\:0423", "\:0443"}, {"\:0424", "\:0444"}, {"\:0425", "\:0445"}, {"\:0426", "\:0446"}, {"\:0427", "\:0447"}, {"\:0428", "\:0448"}, {"\:0429", "\:0449"}, {"\:042a", "\:044a"}, {"\:042b", "\:044b"}, {"\:042c", "\:044c"}, {"\:042d", "\:044d"}, {"\:042e", "\:044e"}, {"\:042f", "\:044f"}}; {upperrusletters, lowerrusletters} = Transpose[rusletters]; (* Ordering *) ruslettorder[s_String] := 1/2; n = 0; Do[n++; ruslettorder[lett[[1]]] = ruslettorder[lett[[2]]] = n, {lett, rusletters}]; rusorder[s_String] := Module[{lett, n}, letts = Characters[s]; n = -1; Sum[n++; ruslettorder[lett] 100^(-n), {lett, letts}]]; (*engletters = LanguageData["English", "BasicAlphabet"][[1]];*) engletters = {{"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"}, {"Q", "q"}, {"R", "r"}, {"S", "s"}, {"T", "t"}, {"U", "u"}, {"V", "v"}, {"W", "w"}, {"X", "x"}, {"Y", "y"}, {"Z", "z"}}; {upperengletters, lowerengletters} = Transpose[engletters]; tolowercasereplsru = (Rule @@ #)&/@ rusletters; touppercasereplsru = (Rule @@ #)&/@ Reverse[rusletters]; tolowercaseru[s_String] := StringReplace[s, tolowercasereplsru]; touppercaseru[s_String] := StringReplace[s, touppercasereplsru]; tolowercasereplsru = (Rule @@ #) & /@ rusletters; touppercasereplsru = (Rule @@ #) & /@ (Reverse /@ rusletters); tolowercase[s_String] := ToLowerCase[StringReplace[s, tolowercasereplsru]]; touppercase[s_String] := ToUpperCase[StringReplace[s, touppercasereplsru]]; ifrussianlett[s_String] := (Intersection[Characters[s], Flatten[rusletters]] =!= {}); ifenglishlett[s_String] := (Intersection[Characters[s], Flatten[engletters]] =!= {}); capitalize[s_String] := If[s === "", "", touppercase[StringTake[s, 1]] <> StringDrop[s, 1]]; lowerize[s_String] := If[s === "", "", tolowercase[StringTake[s, 1]] <> StringDrop[s, 1]]; trunsliterats = "a,b,v,g,d,e,io,zh,z,i,y,k,l,m,n,o,p,r,s,t,u,f,kh,ts,ch,sh,shch,,y,,e,iu,ya"; trunsliterats = StringSplit[trunsliterats, ",", All]; lowertrunstable = {lowerrusletters, trunsliterats}; Print["Transliteration table: ", lowertrunstable // TableForm]; uppertrunstable = {upperrusletters, capitalize /@ trunsliterats}; lowertransliterat = (Rule @@ #) & /@ Transpose[lowertrunstable]; uppertransliterat = (Rule @@ #) & /@ Transpose[uppertrunstable]; transliterate[s_String] := StringReplace[StringReplace[s, lowertransliterat], uppertransliterat];