Dim TranslateMap As Map = CreateTranslateMap 'do once rather than for every translation
Dim Test As String = "©2019"
Log(Test)
Log(Translate(Test, TranslateMap))
Sub Translate(S As String, TranslateMap As Map) As String
Dim T As String = S
For I = 0 To TranslateMap.Size - 1
T = T.Replace(TranslateMap.GetKeyAt(I), TranslateMap.GetValueAt(I))
Next
Return T
End Sub
Sub AddToMap(M As Map, S() As String)
If (S.Length Mod 2) <> 0 Then
Log("Array should be an even number of elements long")
Log(S)
End If
For I = 0 To S.Length - 2 Step 2
M.Put(S(I), S(I + 1))
Next
End Sub
Sub CreateTranslateMap As Map
Dim FromTo As Map
FromTo.Initialize
'Latin
AddToMap(FromTo, Array As String("À", "A", "Á", "A", "Â", "A", "Ã", "A", "Ä", "A", "Å", "A", "Æ", "AE", "Ç", "C"))
AddToMap(FromTo, Array As String("È", "E", "É", "E", "Ê", "E", "Ë", "E", "Ì", "I", "Í", "I", "Î", "I", "Ï", "I"))
AddToMap(FromTo, Array As String("Ð", "D", "Ñ", "N", "Ò", "O", "Ó", "O", "Ô", "O", "Õ", "O", "Ö", "O", "Ő", "O"))
AddToMap(FromTo, Array As String("Ø", "O", "Ù", "U", "Ú", "U", "Û", "U", "Ü", "U", "Ű", "U", "Ý", "Y", "Þ", "TH"))
AddToMap(FromTo, Array As String("ß", "ss"))
AddToMap(FromTo, Array As String("à", "a", "á", "a", "â", "a", "ã", "a", "ä", "a", "å", "a", "æ", "ae", "ç", "c"))
AddToMap(FromTo, Array As String("è", "e", "é", "e", "ê", "e", "ë", "e", "ì", "i", "í", "i", "î", "i", "ï", "i"))
AddToMap(FromTo, Array As String("ð", "d", "ñ", "n", "ò", "o", "ó", "o", "ô", "o", "õ", "o", "ö", "o", "ő", "o"))
AddToMap(FromTo, Array As String("ø", "o", "ù", "u", "ú", "u", "û", "u", "ü", "u", "ű", "u", "ý", "y", "þ", "th"))
AddToMap(FromTo, Array As String("ÿ", "y"))
'Latin symbols
AddToMap(FromTo, Array As String("©", "(c)"))
'Greek
AddToMap(FromTo, Array As String("Α", "A", "Β", "B", "Γ", "G", "Δ", "D", "Ε", "E", "Ζ", "Z", "Η", "H", "Θ", "8"))
AddToMap(FromTo, Array As String("Ι", "I", "Κ", "K", "Λ", "L", "Μ", "M", "Ν", "N", "Ξ", "3", "Ο", "O", "Π", "P"))
AddToMap(FromTo, Array As String("Ρ", "R", "Σ", "S", "Τ", "T", "Υ", "Y", "Φ", "F", "Χ", "X", "Ψ", "PS", "Ω", "W"))
AddToMap(FromTo, Array As String("Ά", "A", "Έ", "E", "Ί", "I", "Ό", "O", "Ύ", "Y", "Ή", "H", "Ώ", "W", "Ϊ", "I"))
AddToMap(FromTo, Array As String("Ϋ", "Y"))
AddToMap(FromTo, Array As String("α", "a", "β", "b", "γ", "g", "δ", "d", "ε", "e", "ζ", "z", "η", "h", "θ", "8"))
AddToMap(FromTo, Array As String("ι", "i", "κ", "k", "λ", "l", "μ", "m", "ν", "n", "ξ", "3", "ο", "o", "π", "p"))
AddToMap(FromTo, Array As String("ρ", "r", "σ", "s", "τ", "t", "υ", "y", "φ", "f", "χ", "x", "ψ", "ps", "ω", "w"))
AddToMap(FromTo, Array As String("ά", "a", "έ", "e", "ί", "i", "ό", "o", "ύ", "y", "ή", "h", "ώ", "w", "ς", "s"))
AddToMap(FromTo, Array As String("ϊ", "i", "ΰ", "y", "ϋ", "y", "ΐ", "i"))
'Turkish
AddToMap(FromTo, Array As String("Ş", "S", "İ", "I", "Ç", "C", "Ü", "U", "Ö", "O", "Ğ", "G"))
AddToMap(FromTo, Array As String("ş", "s", "ı", "i", "ç", "c", "ü", "u", "ö", "o", "ğ", "g"))
'Russian
AddToMap(FromTo, Array As String("А", "A", "Б", "B", "В", "V", "Г", "G", "Д", "D", "Е", "E", "Ё", "Yo", "Ж", "Zh"))
AddToMap(FromTo, Array As String("З", "Z", "И", "I", "Й", "J", "К", "K", "Л", "L", "М", "M", "Н", "N", "О", "O"))
AddToMap(FromTo, Array As String("П", "P", "Р", "R", "С", "S", "Т", "T", "У", "U", "Ф", "F", "Х", "H", "Ц", "C"))
AddToMap(FromTo, Array As String("Ч", "Ch", "Ш", "Sh", "Щ", "Sh", "Ъ", "", "Ы", "Y", "Ь", "", "Э", "E", "Ю", "Yu"))
AddToMap(FromTo, Array As String("Я", "Ya"))
AddToMap(FromTo, Array As String("а", "a", "б", "b", "в", "v", "г", "g", "д", "d", "е", "e", "ё", "yo", "ж", "zh"))
AddToMap(FromTo, Array As String("з", "z", "и", "i", "й", "j", "к", "k", "л", "l", "м", "m", "н", "n", "о", "o"))
AddToMap(FromTo, Array As String("п", "p", "р", "r", "с", "s", "т", "t", "у", "u", "ф", "f", "х", "h", "ц", "c"))
AddToMap(FromTo, Array As String("ч", "ch", "ш", "sh", "щ", "sh", "ъ", "", "ы", "y", "ь", "", "э", "e", "ю", "yu"))
AddToMap(FromTo, Array As String("я", "ya"))
'Ukrainian
AddToMap(FromTo, Array As String("Є", "Ye", "І", "I", "Ї", "Yi", "Ґ", "G"))
AddToMap(FromTo, Array As String("є", "ye", "і", "i", "ї", "yi", "ґ", "g"))
'Czech
AddToMap(FromTo, Array As String("Č", "C", "Ď", "D", "Ě", "E", "Ň", "N", "Ř", "R", "Š", "S", "Ť", "T", "Ů", "U"))
AddToMap(FromTo, Array As String("Ž", "Z"))
AddToMap(FromTo, Array As String("č", "c", "ď", "d", "ě", "e", "ň", "n", "ř", "r", "š", "s", "ť", "t", "ů", "u"))
AddToMap(FromTo, Array As String("ž", "z"))
'Polish
AddToMap(FromTo, Array As String("Ą", "A", "Ć", "C", "Ę", "e", "Ł", "L", "Ń", "N", "Ó", "o", "Ś", "S", "Ź", "Z"))
AddToMap(FromTo, Array As String("Ż", "Z"))
AddToMap(FromTo, Array As String("ą", "a", "ć", "c", "ę", "e", "ł", "l", "ń", "n", "ó", "o", "ś", "s", "ź", "z"))
AddToMap(FromTo, Array As String("ż", "z"))
'Latvian
AddToMap(FromTo, Array As String("Ā", "A", "Č", "C", "Ē", "E", "Ģ", "G", "Ī", "i", "Ķ", "k", "Ļ", "L", "Ņ", "N"))
AddToMap(FromTo, Array As String("Š", "S", "Ū", "u", "Ž", "Z"))
AddToMap(FromTo, Array As String("ā", "a", "č", "c", "ē", "e", "ģ", "g", "ī", "i", "ķ", "k", "ļ", "l", "ņ", "n"))
AddToMap(FromTo, Array As String("š", "s", "ū", "u", "ž", "z"))
Return FromTo
End Sub