2021-10-04 08:05:01 +00:00
|
|
|
|
package translit
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
2021-10-05 00:45:26 +00:00
|
|
|
|
// Transliterate runs the given maps on s and returns the result
|
|
|
|
|
func Transliterate(s string, useMaps ...string) string {
|
|
|
|
|
// Create variable to store modified string
|
|
|
|
|
out := s
|
|
|
|
|
// If custom map exists
|
2021-10-06 16:41:33 +00:00
|
|
|
|
if custom, ok := Transliterators["custom"]; ok {
|
2021-10-05 00:45:26 +00:00
|
|
|
|
// Perform transliteration with it
|
2021-10-06 16:41:33 +00:00
|
|
|
|
out = custom.Transliterate(out)
|
2021-10-05 00:45:26 +00:00
|
|
|
|
}
|
|
|
|
|
// For every map to use
|
|
|
|
|
for _, useMap := range useMaps {
|
|
|
|
|
// If custom, skip
|
|
|
|
|
if useMap == "custom" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
// Get requested map
|
2021-10-06 16:41:33 +00:00
|
|
|
|
transliterator, ok := Transliterators[useMap]
|
2021-10-05 00:45:26 +00:00
|
|
|
|
if !ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
2021-10-06 16:41:33 +00:00
|
|
|
|
transliterator.Init()
|
2021-10-05 00:45:26 +00:00
|
|
|
|
// Perform transliteration
|
2021-10-06 16:41:33 +00:00
|
|
|
|
out = transliterator.Transliterate(out)
|
2021-10-05 00:45:26 +00:00
|
|
|
|
}
|
|
|
|
|
// Return result
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Transliterator is implemented by anything with a
|
|
|
|
|
// Transliterate method, which performs transliteration
|
|
|
|
|
// and returns the resulting string.
|
|
|
|
|
type Transliterator interface {
|
|
|
|
|
Transliterate(string) string
|
2021-10-06 16:41:33 +00:00
|
|
|
|
Init()
|
2021-10-05 00:45:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Map implements Transliterator using a slice where
|
2021-10-06 20:26:16 +00:00
|
|
|
|
// every even element is a key and every odd one is a value
|
2021-10-05 00:45:26 +00:00
|
|
|
|
// which replaces the key.
|
|
|
|
|
type Map []string
|
|
|
|
|
|
|
|
|
|
func (mt Map) Transliterate(s string) string {
|
|
|
|
|
return strings.NewReplacer(mt...).Replace(s)
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-06 16:41:33 +00:00
|
|
|
|
func (Map) Init() {}
|
|
|
|
|
|
2021-10-05 03:23:54 +00:00
|
|
|
|
// Transliterators stores transliterator implementations for each supported language.
|
|
|
|
|
// Some of these were sourced from https://codeberg.org/Freeyourgadget/Gadgetbridge
|
|
|
|
|
var Transliterators = map[string]Transliterator{
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"eASCII": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"œ", "oe",
|
|
|
|
|
"ª", "a",
|
|
|
|
|
"°", "o",
|
|
|
|
|
"«", `"`,
|
|
|
|
|
"»", `"`,
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Scandinavian": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Æ", "Ae",
|
|
|
|
|
"æ", "ae",
|
|
|
|
|
"Ø", "Oe",
|
|
|
|
|
"ø", "oe",
|
|
|
|
|
"Å", "Aa",
|
|
|
|
|
"å", "aa",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"German": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ä", "ae",
|
|
|
|
|
"ö", "oe",
|
|
|
|
|
"ü", "ue",
|
|
|
|
|
"Ä", "Ae",
|
|
|
|
|
"Ö", "Oe",
|
2021-10-04 20:17:48 +00:00
|
|
|
|
"Ü", "Ue",
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ß", "ss",
|
|
|
|
|
"ẞ", "SS",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Hebrew": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"א", "a",
|
|
|
|
|
"ב", "b",
|
|
|
|
|
"ג", "g",
|
|
|
|
|
"ד", "d",
|
|
|
|
|
"ה", "h",
|
|
|
|
|
"ו", "u",
|
|
|
|
|
"ז", "z",
|
|
|
|
|
"ח", "kh",
|
|
|
|
|
"ט", "t",
|
|
|
|
|
"י", "y",
|
|
|
|
|
"כ", "c",
|
|
|
|
|
"ל", "l",
|
|
|
|
|
"מ", "m",
|
|
|
|
|
"נ", "n",
|
|
|
|
|
"ס", "s",
|
|
|
|
|
"ע", "'",
|
|
|
|
|
"פ", "p",
|
|
|
|
|
"צ", "ts",
|
|
|
|
|
"ק", "k",
|
|
|
|
|
"ר", "r",
|
|
|
|
|
"ש", "sh",
|
|
|
|
|
"ת", "th",
|
|
|
|
|
"ף", "f",
|
|
|
|
|
"ץ", "ts",
|
|
|
|
|
"ך", "ch",
|
|
|
|
|
"ם", "m",
|
|
|
|
|
"ן", "n",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Greek": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"α", "a",
|
|
|
|
|
"ά", "a",
|
|
|
|
|
"β", "v",
|
|
|
|
|
"γ", "g",
|
|
|
|
|
"δ", "d",
|
|
|
|
|
"ε", "e",
|
|
|
|
|
"έ", "e",
|
|
|
|
|
"ζ", "z",
|
|
|
|
|
"η", "i",
|
|
|
|
|
"ή", "i",
|
|
|
|
|
"θ", "th",
|
|
|
|
|
"ι", "i",
|
|
|
|
|
"ί", "i",
|
|
|
|
|
"ϊ", "i",
|
|
|
|
|
"ΐ", "i",
|
|
|
|
|
"κ", "k",
|
|
|
|
|
"λ", "l",
|
|
|
|
|
"μ", "m",
|
|
|
|
|
"ν", "n",
|
|
|
|
|
"ξ", "ks",
|
|
|
|
|
"ο", "o",
|
|
|
|
|
"ό", "o",
|
|
|
|
|
"π", "p",
|
|
|
|
|
"ρ", "r",
|
|
|
|
|
"σ", "s",
|
|
|
|
|
"ς", "s",
|
|
|
|
|
"τ", "t",
|
|
|
|
|
"υ", "y",
|
|
|
|
|
"ύ", "y",
|
|
|
|
|
"ϋ", "y",
|
|
|
|
|
"ΰ", "y",
|
|
|
|
|
"φ", "f",
|
|
|
|
|
"χ", "ch",
|
|
|
|
|
"ψ", "ps",
|
|
|
|
|
"ω", "o",
|
|
|
|
|
"ώ", "o",
|
|
|
|
|
"Α", "A",
|
|
|
|
|
"Ά", "A",
|
|
|
|
|
"Β", "B",
|
|
|
|
|
"Γ", "G",
|
|
|
|
|
"Δ", "D",
|
|
|
|
|
"Ε", "E",
|
|
|
|
|
"Έ", "E",
|
|
|
|
|
"Ζ", "Z",
|
|
|
|
|
"Η", "I",
|
|
|
|
|
"Ή", "I",
|
2021-10-06 20:26:16 +00:00
|
|
|
|
"Θ", "Th",
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Ι", "I",
|
|
|
|
|
"Ί", "I",
|
|
|
|
|
"Ϊ", "I",
|
|
|
|
|
"Κ", "K",
|
|
|
|
|
"Λ", "L",
|
|
|
|
|
"Μ", "M",
|
|
|
|
|
"Ν", "N",
|
2021-10-06 20:26:16 +00:00
|
|
|
|
"Ξ", "Ks",
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Ο", "O",
|
|
|
|
|
"Ό", "O",
|
|
|
|
|
"Π", "P",
|
|
|
|
|
"Ρ", "R",
|
|
|
|
|
"Σ", "S",
|
|
|
|
|
"Τ", "T",
|
|
|
|
|
"Υ", "Y",
|
|
|
|
|
"Ύ", "Y",
|
|
|
|
|
"Ϋ", "Y",
|
|
|
|
|
"Φ", "F",
|
2021-10-06 20:26:16 +00:00
|
|
|
|
"Χ", "Ch",
|
|
|
|
|
"Ψ", "Ps",
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Ω", "O",
|
|
|
|
|
"Ώ", "O",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Russian": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Ё", "Йo",
|
|
|
|
|
"ё", "йo",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Ukranian": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ґ", "gh",
|
|
|
|
|
"є", "je",
|
|
|
|
|
"і", "i",
|
|
|
|
|
"ї", "ji",
|
2021-10-06 20:26:16 +00:00
|
|
|
|
"Ґ", "Gh",
|
|
|
|
|
"Є", "Je",
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"І", "I",
|
|
|
|
|
"Ї", "JI",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Arabic": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ا", "a",
|
|
|
|
|
"ب", "b",
|
|
|
|
|
"ت", "t",
|
|
|
|
|
"ث", "th",
|
|
|
|
|
"ج", "j",
|
|
|
|
|
"ح", "7",
|
|
|
|
|
"خ", "5",
|
|
|
|
|
"د", "d",
|
|
|
|
|
"ذ", "th",
|
|
|
|
|
"ر", "r",
|
|
|
|
|
"ز", "z",
|
|
|
|
|
"س", "s",
|
|
|
|
|
"ش", "sh",
|
|
|
|
|
"ص", "9",
|
|
|
|
|
"ض", "9'",
|
|
|
|
|
"ط", "6",
|
|
|
|
|
"ظ", "6'",
|
|
|
|
|
"ع", "3",
|
|
|
|
|
"غ", "3'",
|
|
|
|
|
"ف", "f",
|
|
|
|
|
"ق", "q",
|
|
|
|
|
"ك", "k",
|
|
|
|
|
"ل", "l",
|
|
|
|
|
"م", "m",
|
|
|
|
|
"ن", "n",
|
|
|
|
|
"ه", "h",
|
|
|
|
|
"و", "w",
|
|
|
|
|
"ي", "y",
|
|
|
|
|
"ى", "a",
|
|
|
|
|
"ﺓ", "",
|
|
|
|
|
"آ", "2",
|
|
|
|
|
"ئ", "2",
|
|
|
|
|
"إ", "2",
|
|
|
|
|
"ؤ", "2",
|
|
|
|
|
"أ", "2",
|
|
|
|
|
"ء", "2",
|
|
|
|
|
"٠", "0",
|
|
|
|
|
"١", "1",
|
|
|
|
|
"٢", "2",
|
|
|
|
|
"٣", "3",
|
|
|
|
|
"٤", "4",
|
|
|
|
|
"٥", "5",
|
|
|
|
|
"٦", "6",
|
|
|
|
|
"٧", "7",
|
|
|
|
|
"٨", "8",
|
|
|
|
|
"٩", "9",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Farsi": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"پ", "p",
|
|
|
|
|
"چ", "ch",
|
|
|
|
|
"ژ", "zh",
|
|
|
|
|
"ک", "k",
|
|
|
|
|
"گ", "g",
|
|
|
|
|
"ی", "y",
|
|
|
|
|
"\u200c", " ",
|
|
|
|
|
"؟", "?",
|
|
|
|
|
"٪", "%",
|
|
|
|
|
"؛", ";",
|
|
|
|
|
"،", ":",
|
|
|
|
|
"۱", "1",
|
|
|
|
|
"۲", "2",
|
|
|
|
|
"۳", "3",
|
|
|
|
|
"۴", "4",
|
|
|
|
|
"۵", "5",
|
|
|
|
|
"۶", "6",
|
|
|
|
|
"۷", "7",
|
|
|
|
|
"۸", "8",
|
|
|
|
|
"۹", "9",
|
|
|
|
|
"۰", "0",
|
|
|
|
|
"»", "<",
|
|
|
|
|
"«", ">",
|
|
|
|
|
"ِ", "e",
|
|
|
|
|
"َ", "a",
|
|
|
|
|
"ُ", "o",
|
|
|
|
|
"ّ", "",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Polish": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Ł", "L",
|
|
|
|
|
"ł", "l",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Lithuanian": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ą", "a",
|
|
|
|
|
"č", "c",
|
|
|
|
|
"ę", "e",
|
|
|
|
|
"ė", "e",
|
|
|
|
|
"į", "i",
|
|
|
|
|
"š", "s",
|
|
|
|
|
"ų", "u",
|
|
|
|
|
"ū", "u",
|
|
|
|
|
"ž", "z",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Estonian": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ä", "a",
|
|
|
|
|
"Ä", "A",
|
|
|
|
|
"ö", "o",
|
|
|
|
|
"õ", "o",
|
|
|
|
|
"Ö", "O",
|
|
|
|
|
"Õ", "O",
|
|
|
|
|
"ü", "u",
|
|
|
|
|
"Ü", "U",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Icelandic": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"Þ", "Th",
|
|
|
|
|
"þ", "th",
|
|
|
|
|
"Ð", "D",
|
|
|
|
|
"ð", "d",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Czeck": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"ř", "r",
|
|
|
|
|
"ě", "e",
|
|
|
|
|
"ý", "y",
|
|
|
|
|
"á", "a",
|
|
|
|
|
"í", "i",
|
|
|
|
|
"é", "e",
|
|
|
|
|
"ó", "o",
|
|
|
|
|
"ú", "u",
|
|
|
|
|
"ů", "u",
|
|
|
|
|
"ď", "d",
|
|
|
|
|
"ť", "t",
|
|
|
|
|
"ň", "n",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"French": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"à", "a",
|
|
|
|
|
"â", "a",
|
|
|
|
|
"é", "e",
|
|
|
|
|
"è", "e",
|
|
|
|
|
"ê", "e",
|
|
|
|
|
"ë", "e",
|
|
|
|
|
"ù", "u",
|
|
|
|
|
"ü", "u",
|
|
|
|
|
"ÿ", "y",
|
|
|
|
|
"ç", "c",
|
|
|
|
|
},
|
2022-03-11 12:15:10 +00:00
|
|
|
|
"Romanian": Map{
|
|
|
|
|
"ă", "a",
|
|
|
|
|
"Ă", "A",
|
|
|
|
|
"â", "a",
|
|
|
|
|
"Â", "A",
|
|
|
|
|
"î", "i",
|
|
|
|
|
"Î", "I",
|
|
|
|
|
"ș", "s",
|
|
|
|
|
"Ș", "S",
|
|
|
|
|
"ț", "t",
|
|
|
|
|
"Ț", "T",
|
|
|
|
|
"ş", "s",
|
|
|
|
|
"Ş", "S",
|
|
|
|
|
"ţ", "t",
|
|
|
|
|
"Ţ", "T",
|
|
|
|
|
"„", "\"",
|
|
|
|
|
"”", "\"",
|
|
|
|
|
},
|
2021-10-05 00:45:26 +00:00
|
|
|
|
"Emoji": Map{
|
2021-10-04 08:05:01 +00:00
|
|
|
|
"😂", ":')",
|
|
|
|
|
"😊", ":)",
|
|
|
|
|
"😃", ":)",
|
|
|
|
|
"😩", "-_-",
|
|
|
|
|
"😏", ":‑J",
|
|
|
|
|
"💜", "<3",
|
|
|
|
|
"💖", "<3",
|
|
|
|
|
"💗", "<3",
|
|
|
|
|
"❤️", "<3",
|
|
|
|
|
"💕", "<3",
|
|
|
|
|
"💞", "<3",
|
|
|
|
|
"💘", "<3",
|
|
|
|
|
"💓", "<3",
|
|
|
|
|
"💚", "<3",
|
|
|
|
|
"💙", "<3",
|
|
|
|
|
"💔", "</3",
|
|
|
|
|
"😱", "D:",
|
|
|
|
|
"😮", ":O",
|
|
|
|
|
"😝", ":P",
|
|
|
|
|
"😍", ":x",
|
|
|
|
|
"😢", ":(",
|
|
|
|
|
"💯", ":100:",
|
|
|
|
|
"🔥", ":fire:",
|
|
|
|
|
"😉", ";)",
|
|
|
|
|
"😴", ":zzz:",
|
|
|
|
|
"💤", ":zzz:",
|
|
|
|
|
},
|
2021-10-05 16:09:19 +00:00
|
|
|
|
"Korean": &KoreanTranslit{},
|
|
|
|
|
"Chinese": &ChineseTranslit{},
|
|
|
|
|
"Armenian": &ArmenianTranslit{},
|
2021-10-04 08:05:01 +00:00
|
|
|
|
}
|