itd/translit/translit.go

380 lines
5.6 KiB
Go
Raw Permalink Normal View History

2021-10-04 08:05:01 +00:00
package translit
import (
"strings"
)
// 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 {
// Perform transliteration with it
2021-10-06 16:41:33 +00:00
out = custom.Transliterate(out)
}
// 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]
if !ok {
continue
}
2021-10-06 16:41:33 +00:00
transliterator.Init()
// Perform transliteration
2021-10-06 16:41:33 +00:00
out = transliterator.Transliterate(out)
}
// 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()
}
// Map implements Transliterator using a slice where
// every even element is a key and every odd one is a value
// 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() {}
// Transliterators stores transliterator implementations for each supported language.
// Some of these were sourced from https://codeberg.org/Freeyourgadget/Gadgetbridge
var Transliterators = map[string]Transliterator{
"eASCII": Map{
2021-10-04 08:05:01 +00:00
"œ", "oe",
"ª", "a",
"°", "o",
"«", `"`,
"»", `"`,
},
"Scandinavian": Map{
2021-10-04 08:05:01 +00:00
"Æ", "Ae",
"æ", "ae",
"Ø", "Oe",
"ø", "oe",
"Å", "Aa",
"å", "aa",
},
"German": Map{
2021-10-04 08:05:01 +00:00
"ä", "ae",
"ö", "oe",
"ü", "ue",
"Ä", "Ae",
"Ö", "Oe",
"Ü", "Ue",
2021-10-04 08:05:01 +00:00
"ß", "ss",
"ẞ", "SS",
},
"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",
},
"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",
"Θ", "Th",
2021-10-04 08:05:01 +00:00
"Ι", "I",
"Ί", "I",
"Ϊ", "I",
"Κ", "K",
"Λ", "L",
"Μ", "M",
"Ν", "N",
"Ξ", "Ks",
2021-10-04 08:05:01 +00:00
"Ο", "O",
"Ό", "O",
"Π", "P",
"Ρ", "R",
"Σ", "S",
"Τ", "T",
"Υ", "Y",
"Ύ", "Y",
"Ϋ", "Y",
"Φ", "F",
"Χ", "Ch",
"Ψ", "Ps",
2021-10-04 08:05:01 +00:00
"Ω", "O",
"Ώ", "O",
},
"Russian": Map{
2021-10-04 08:05:01 +00:00
"Ё", "Йo",
"ё", "йo",
},
"Ukranian": Map{
2021-10-04 08:05:01 +00:00
"ґ", "gh",
"є", "je",
"і", "i",
"ї", "ji",
"Ґ", "Gh",
"Є", "Je",
2021-10-04 08:05:01 +00:00
"І", "I",
"Ї", "JI",
},
"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",
},
"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",
"ّ", "",
},
"Polish": Map{
2021-10-04 08:05:01 +00:00
"Ł", "L",
"ł", "l",
},
"Lithuanian": Map{
2021-10-04 08:05:01 +00:00
"ą", "a",
"č", "c",
"ę", "e",
"ė", "e",
"į", "i",
"š", "s",
"ų", "u",
"ū", "u",
"ž", "z",
},
"Estonian": Map{
2021-10-04 08:05:01 +00:00
"ä", "a",
"Ä", "A",
"ö", "o",
"õ", "o",
"Ö", "O",
"Õ", "O",
"ü", "u",
"Ü", "U",
},
"Icelandic": Map{
2021-10-04 08:05:01 +00:00
"Þ", "Th",
"þ", "th",
"Ð", "D",
"ð", "d",
},
"Czeck": Map{
2021-10-04 08:05:01 +00:00
"ř", "r",
"ě", "e",
"ý", "y",
"á", "a",
"í", "i",
"é", "e",
"ó", "o",
"ú", "u",
"ů", "u",
"ď", "d",
"ť", "t",
"ň", "n",
},
"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",
"„", "\"",
"”", "\"",
},
"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:",
},
"Korean": &KoreanTranslit{},
"Chinese": &ChineseTranslit{},
"Armenian": &ArmenianTranslit{},
2021-10-04 08:05:01 +00:00
}