from icu import UnicodeString, Normalizer2, Transliterator

def to_latin(string):
    ustring = UnicodeString(string)
    nfc = Normalizer2.getNFCInstance()
    ustring = nfc.normalize(ustring)

    trans = Transliterator.createFromRules("",
                                           "$wb = [^[:Letter:]] ;"
                                           ";"
                                           # е
                                           "$wb { е } $wb > e ;"
                                           "$wb { Е } $wb > E ;"
                                           "$wb { е > e ;"
                                           "$wb { Е > | E ;"
                                           "[ьъЬЪ] { е > ye ;"
                                           "[ьъЬЪ] { Е > YE ;"
                                           "е > e ;"
                                           "Е > E ;"
                                           # э
                                           "$wb { э } $wb > q ;"
                                           "$wb { Э } $wb > Q ;"
                                           "$wb { э > q ;"
                                           "$wb { Э } [йеёюяye] > Qe ;"
                                           "$wb { Э > Q ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { э > е ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { Э > E ;"
                                           "э } [йЙеЕёЁюЮяЯyYeE] > qe ;"
                                           "Э } [йЙеЕёЁюЮяЯyYeE] > QE ;"
                                           "э > q ;"
                                           "Э > Q ;"
                                           # ы
                                           "[жЖшШцЦйЙjJwWcCyY] { ы > i ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { Ы > I ;"
                                           "ы > qi ;"
                                           "Ы > QI ;"
                                           # ё
                                           "$wb { ё } $wb > yo ;"
                                           "$wb { Ё } $wb > YO ;"
                                           "$wb { ё > yo ;"
                                           "$wb { Ё } [[:Ll:]] > Yo ;"
                                           "$wb { Ё > YO ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { ё > o ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { Ё > O ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { ё > yo ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { Ё > YO ;"
                                           "ё > ho ;"
                                           "Ё > HO ;"
                                           # ю
                                           "$wb { ю > yu ;"
                                           "$wb { Ю } [[:Ll:]] > Yu ;"
                                           "$wb { Ю > YU ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { ю > u ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { Ю > U ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { ю > yu ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { Ю > YU ;"
                                           "ю > hu ;"
                                           "Ю > HU ;"
                                           # я
                                           "$wb { я > ya ;"
                                           "$wb { Я } [[:Ll:]] > Ya ;"
                                           "$wb { Я > YA ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { я > a ;"
                                           "[жЖшШцЦйЙjJwWcCyY] { Я > A ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { я > ya ;"
                                           "[уУеЕёЁыЫаАоОэЭяЯиИюЮьЬъЪiIuUoOeEaAqQ] { Я > YA ;"
                                           "я > ha ;"
                                           "Я > HA ;"
                                           # Буквосочетание ьо, только в заимствованных
                                           "ьо > yo ;"
                                           "Ьо > Yo ;"
                                           "ьО > yO ;"
                                           "ЬО > YO ;"
                                           # Буква и, отдельные случаи (э уже транслитерирована)
                                           "[qQ] { и > hi ;"
                                           "[qQ] { и > hi ;"
                                           "Q { И > HI ;"
                                           "q { И > hI ;"
                                           "ьи > yi ;"
                                           "Ьи > Yi ;"
                                           "ьИ > yI ;"
                                           "ЬИ > YI ;"
                                           # Остальные буквы
                                           "а > a ; А > A ;"
                                           "б > b ; Б > B ;"
                                           "в > v ; В > V ;"
                                           "г > g ; Г > G ;"
                                           "д > d ; Д > D ;"
                                           "ж > j ; Ж > J ;"
                                           "з > z ; З > z ;"
                                           "и > i ; И > I ;"
                                           "й > y ; Й > Y ;"
                                           "к > k ; К > K ;"
                                           "л > l ;"
                                           "м > m ;"
                                           "н > n ;"
                                           "о > o ;"
                                           "п > p ;"
                                           "р > r ;"
                                           "с > s ;"
                                           "т > t ;"
                                           "у > u ;"
                                           "ф > f ;"
                                           "х > x ;"
                                           "ц > c ;"
                                           "ч > ch ;"
                                           "ш > w ;"
                                           "щ > wh ;"
                                           # Проход с начала, в строке незаменены остались только буквы ь и ъ
                                           ":: Any-Null ;"
                                           "ь } [yY] > ;"
                                           "Ь } [yY] > ;"
                                           "[cCwWjJhH] { ь > ;"
                                           "[cCwWjJhH] { Ь > ;"
                                           "ь > h ;"
                                           "Ь > H ;"
                                           "ъ } [yY] > q;"
                                           "Ъ } [yY] > Q;"
                                           "ъ > ;"
                                           "Ъ > ;"
                                           # Проход с начала
                                           ":: Any-Null ;"
                                           "h+ > h ;"
                                           "H+ > H ;"
                                           "[hH]+ > H ;"
                                           "qye > yq ;"
                                           "qyE > yQ ;"
                                           "qYe > Yq ;"
                                           "qYE > YQ ;"
                                           "Qye > Yq ;"
                                           "QyE > yQ ;"
                                           "QYe > Yq ;"
                                           "QYE > YQ ;"
                                           )
    ustring = trans.transliterate(ustring)
    return ustring
