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 if customMap, ok := Transliterators["custom"]; ok { // Perform transliteration with it out = customMap.Transliterate(out) } // For every map to use for _, useMap := range useMaps { // If custom, skip if useMap == "custom" { continue } // Get requested map translitMap, ok := Transliterators[useMap] if !ok { continue } // Perform transliteration out = translitMap.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 } // Map implements Transliterator using a slice where // every odd element is a key and every even one is a value // which replaces the key. type Map []string func (mt Map) Transliterate(s string) string { return strings.NewReplacer(mt...).Replace(s) } // 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{ "œ", "oe", "ª", "a", "°", "o", "«", `"`, "»", `"`, }, "Scandinavian": Map{ "Æ", "Ae", "æ", "ae", "Ø", "Oe", "ø", "oe", "Å", "Aa", "å", "aa", }, "German": Map{ "ä", "ae", "ö", "oe", "ü", "ue", "Ä", "Ae", "Ö", "Oe", "Ü", "Ue", "ß", "ss", "ẞ", "SS", }, "Hebrew": Map{ "א", "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{ "α", "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", "Ι", "I", "Ί", "I", "Ϊ", "I", "Κ", "K", "Λ", "L", "Μ", "M", "Ν", "N", "Ξ", "KS", "Ο", "O", "Ό", "O", "Π", "P", "Ρ", "R", "Σ", "S", "Τ", "T", "Υ", "Y", "Ύ", "Y", "Ϋ", "Y", "Φ", "F", "Χ", "CH", "Ψ", "PS", "Ω", "O", "Ώ", "O", }, "Russian": Map{ "Ё", "Йo", "ё", "йo", }, "Ukranian": Map{ "ґ", "gh", "є", "je", "і", "i", "ї", "ji", "Ґ", "GH", "Є", "JE", "І", "I", "Ї", "JI", }, "Arabic": Map{ "ا", "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{ "پ", "p", "چ", "ch", "ژ", "zh", "ک", "k", "گ", "g", "ی", "y", "\u200c", " ", "؟", "?", "٪", "%", "؛", ";", "،", ":", "۱", "1", "۲", "2", "۳", "3", "۴", "4", "۵", "5", "۶", "6", "۷", "7", "۸", "8", "۹", "9", "۰", "0", "»", "<", "«", ">", "ِ", "e", "َ", "a", "ُ", "o", "ّ", "", }, "Polish": Map{ "Ł", "L", "ł", "l", }, "Lithuanian": Map{ "ą", "a", "č", "c", "ę", "e", "ė", "e", "į", "i", "š", "s", "ų", "u", "ū", "u", "ž", "z", }, "Estonian": Map{ "ä", "a", "Ä", "A", "ö", "o", "õ", "o", "Ö", "O", "Õ", "O", "ü", "u", "Ü", "U", }, "Icelandic": Map{ "Þ", "Th", "þ", "th", "Ð", "D", "ð", "d", }, "Czeck": Map{ "ř", "r", "ě", "e", "ý", "y", "á", "a", "í", "i", "é", "e", "ó", "o", "ú", "u", "ů", "u", "ď", "d", "ť", "t", "ň", "n", }, "French": Map{ "à", "a", "â", "a", "é", "e", "è", "e", "ê", "e", "ë", "e", "ù", "u", "ü", "u", "ÿ", "y", "ç", "c", }, "Armenian": Map{ "աու", "au", "բու", "bu", "գու", "gu", "դու", "du", "եու", "eu", "զու", "zu", "էու", "eu", "ըու", "yu", "թու", "tu", "ժու", "ju", "իու", "iu", "լու", "lu", "խու", "xu", "ծու", "cu", "կու", "ku", "հու", "hu", "ձու", "dzu", "ղու", "xu", "ճու", "cu", "մու", "mu", "յու", "yu", "նու", "nu", "շու", "shu", "չու", "chu", "պու", "pu", "ջու", "ju", "ռու", "ru", "սու", "su", "վու", "vu", "տու", "tu", "րու", "ru", "ցու", "cu", "փու", "pu", "քու", "qu", "օու", "ou", "ևու", "eu", "ֆու", "fu", "ոու", "vou", "ու", "u", "բո", "bo", "գո", "go", "դո", "do", "զո", "zo", "թո", "to", "ժո", "jo", "լո", "lo", "խո", "xo", "ծո", "co", "կո", "ko", "հո", "ho", "ձո", "dzo", "ղո", "xo", "ճո", "co", "մո", "mo", "յո", "yo", "նո", "no", "շո", "so", "չո", "co", "պո", "po", "ջո", "jo", "ռո", "ro", "սո", "so", "վո", "vo", "տո", "to", "րո", "ro", "ցո", "co", "փո", "po", "քո", "qo", "ևո", "eo", "ֆո", "fo", "ո", "vo", "եւ", "ev", "եվ", "ev", "ա", "a", "բ", "b", "գ", "g", "դ", "d", "ե", "e", "զ", "z", "է", "e", "ը", "y", "թ", "t", "ժ", "j", "ի", "i", "լ", "l", "խ", "x", "ծ", "c", "կ", "k", "հ", "h", "ձ", "dz", "ղ", "x", "ճ", "c", "մ", "m", "յ", "y", "ն", "n", "շ", "sh", "չ", "ch", "պ", "p", "ջ", "j", "ռ", "r", "ս", "s", "վ", "v", "տ", "t", "ր", "r", "ց", "c", "փ", "p", "ք", "q", "օ", "o", "և", "ev", "ֆ", "f", "ւ", "", }, "Emoji": Map{ "😂", ":')", "😊", ":)", "😃", ":)", "😩", "-_-", "😏", ":‑J", "💜", "<3", "💖", "<3", "💗", "<3", "❤️", "<3", "💕", "<3", "💞", "<3", "💘", "<3", "💓", "<3", "💚", "<3", "💙", "<3", "💔", "