fitlemon commited on
Commit
1e1c454
·
verified ·
1 Parent(s): 184c970

Upload uz_translit.py

Browse files
Files changed (1) hide show
  1. uz_translit.py +1498 -0
uz_translit.py ADDED
@@ -0,0 +1,1498 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ import re
3
+ import sys
4
+
5
+ LATIN_TO_CYRILLIC = {
6
+ "a": "а",
7
+ "A": "А",
8
+ "b": "б",
9
+ "B": "Б",
10
+ "d": "д",
11
+ "D": "Д",
12
+ "e": "е",
13
+ "E": "Е",
14
+ "f": "ф",
15
+ "F": "Ф",
16
+ "g": "г",
17
+ "G": "Г",
18
+ "h": "ҳ",
19
+ "H": "Ҳ",
20
+ "i": "и",
21
+ "I": "И",
22
+ "j": "ж",
23
+ "J": "Ж",
24
+ "k": "к",
25
+ "K": "К",
26
+ "l": "л",
27
+ "L": "Л",
28
+ "m": "м",
29
+ "M": "М",
30
+ "n": "н",
31
+ "N": "Н",
32
+ "o": "о",
33
+ "O": "О",
34
+ "p": "п",
35
+ "P": "П",
36
+ "q": "қ",
37
+ "Q": "Қ",
38
+ "r": "р",
39
+ "R": "Р",
40
+ "s": "с",
41
+ "S": "С",
42
+ "t": "т",
43
+ "T": "Т",
44
+ "u": "у",
45
+ "U": "У",
46
+ "v": "в",
47
+ "V": "В",
48
+ "x": "х",
49
+ "X": "Х",
50
+ "y": "й",
51
+ "Y": "Й",
52
+ "z": "з",
53
+ "Z": "З",
54
+ "ʼ": "ъ", # TODO: case?
55
+ }
56
+ LATIN_VOWELS = ("a", "A", "e", "E", "i", "I", "o", "O", "u", "U", "o‘", "O‘")
57
+
58
+ # These words cannot be reliably converted to cyrillic because of the lossy
59
+ # nature of the to_latin converter.
60
+ TS_WORDS = {
61
+ "aberra(ts)ion": "аберрацион",
62
+ "aberra(ts)iya": "аберрация",
63
+ "abza(ts)": "абзац",
64
+ "aboli(ts)iya": "аболиция",
65
+ "absorb(s)iya": "абсорбция",
66
+ "abstrak(s)ionizm": "абстракционизм",
67
+ "abstrak(s)ionist": "абстракционист",
68
+ "abstrak(s)iya": "абстракция",
69
+ "abs(s)ess": "абсцесс",
70
+ "avianose(ts)": "авианосец",
71
+ "avia(ts)iya": "авиация",
72
+ "avtoinspek(s)iya": "автоинспекция",
73
+ "avtopr(s)ep": "автопрцеп",
74
+ "avtostan(s)iya": "автостанция",
75
+ "agglyutina(ts)iya": "агглютинация",
76
+ "agita(ts)ion": "агитацион",
77
+ "agita(ts)iya": "агитация",
78
+ "aglomera(ts)iya": "агломерация",
79
+ "agnosti(ts)izm": "агностицизм",
80
+ "agromeliora(ts)iya": "агромелиорация",
81
+ "adapta(ts)iya": "адаптация",
82
+ "administra(ts)iya": "администрация",
83
+ "adsorb(s)iya": "адсорбция",
84
+ "aka(ts)iya": "акация",
85
+ "akklimatiza(ts)iya": "акклиматизация",
86
+ "akkomoda(ts)iya": "аккомодация",
87
+ "akkredita(ts)iya": "аккредитация",
88
+ "ak(s)ent": "акцент",
89
+ "ak(s)iz": "акциз",
90
+ "ak(s)ioner": "акционер",
91
+ "ak(s)ionerlik": "акционерлик",
92
+ "ak(s)iya": "акция",
93
+ "ak(s)iyadorlik": "акциядорлик",
94
+ "allitera(ts)iya": "аллитерация",
95
+ "amortiza(ts)iya": "амортизация",
96
+ "amputa(ts)iya": "ампутация",
97
+ "annota(ts)iya": "аннотация",
98
+ "annulya(ts)iya": "аннуляция",
99
+ "anti(ts)iklon": "антициклон",
100
+ "antra(ts)it": "антрацит",
101
+ "apellya(ts)iya": "апелляция",
102
+ "appendi(ts)it": "аппендицит",
103
+ "applika(ts)iya": "аппликация",
104
+ "aproba(ts)iya": "апробация",
105
+ "argumenta(ts)iya": "аргументация",
106
+ "assimilya(ts)iya": "ассимиляция",
107
+ "asso(ts)ia(ts)iya": "ассоциация",
108
+ "attesta(ts)ion": "аттестацион",
109
+ "attesta(ts)iya": "аттестация",
110
+ "attrak(s)ion": "аттракцион",
111
+ "auk(s)ion": "аукцион",
112
+ "a(ts)etilen": "ацетилен",
113
+ "a(ts)eton": "ацетон",
114
+ "aeronaviga(ts)iya": "аэронавигация",
115
+ "bakteri(ts)id": "бактерицид",
116
+ "ba(ts)illar": "бациллар",
117
+ "bioloka(ts)iya": "биолокация",
118
+ "biolyumines(s)en(s)iya": "биолюминесценция",
119
+ "bo(ts)man": "боцман",
120
+ "bronenose(ts)": "броненосец",
121
+ "bru(ts)ellyoz": "бруцеллёз",
122
+ "vak(s)ina": "вакцина",
123
+ "valva(ts)iya": "вальвация",
124
+ "vegeta(ts)ion": "вегетацион",
125
+ "vegeta(ts)iya": "вегетация",
126
+ "venepunk(s)iya": "венепункция",
127
+ "ventilya(ts)ion": "вентиляцион",
128
+ "ventilya(ts)iya": "вентиляция",
129
+ "vibra(ts)iya": "вибрация",
130
+ "vibroizolya(ts)iya": "виброизоляция",
131
+ "vi(ts)e-": "вице-",
132
+ "vi(ts)e-admiral": "вице-адмирал",
133
+ "vi(ts)e-prezident": "вице-президент",
134
+ "vulkaniza(ts)iya": "вулканизация",
135
+ "galli(ts)izm": "галлицизм",
136
+ "gallyu(ts)ina(ts)iya": "галлюцинация",
137
+ "galvaniza(ts)iya": "гальванизация",
138
+ "gastrol-kon(s)ert": "гастроль-концерт",
139
+ "gaubi(ts)a": "гаубица",
140
+ "gelio(ts)entrik": "гелиоцентрик",
141
+ "geno(ts)id": "геноцид",
142
+ "geo(ts)entrik": "геоцентрик",
143
+ "gerbi(ts)idlar": "гербицидлар",
144
+ "ger(s)": "герц",
145
+ "ger(s)og": "��ерцог",
146
+ "gia(ts)int": "гиацинт",
147
+ "gidromeliora(ts)iya": "гидромелиорация",
148
+ "gidromexaniza(ts)iya": "гидромеханизация",
149
+ "gidrostan(s)iya": "гидростанция",
150
+ "gidroelektrostan(s)iya": "гидроэлектростанция",
151
+ "giperinflya(ts)iya": "гиперинфляция",
152
+ "gipo(ts)entr": "гипоцентр",
153
+ "gli(ts)erin": "глицерин",
154
+ "glya(ts)iolog": "гляциолог",
155
+ "glya(ts)iologiya": "гляциология",
156
+ "gorchi(ts)a": "горчица",
157
+ "gravita(ts)iya": "гравитация",
158
+ "grada(ts)iya": "градация",
159
+ "guseni(ts)a": "гусеница",
160
+ "devalva(ts)iya": "девальвация",
161
+ "degaza(ts)iya": "дегазация",
162
+ "degenera(ts)iya": "дегенерация",
163
+ "degustat(s)iya": "дегустатция",
164
+ "deduk(s)iya": "дедукция",
165
+ "dezaktiva(ts)iya": "дезактивация",
166
+ "dezinsek(s)iya": "дезинсекция",
167
+ "dezinfek(s)iya": "дезинфекция",
168
+ "dezinfek(s)iyalamoq": "дезинфекцияламоқ",
169
+ "deklama(ts)iya": "декламация",
170
+ "deklama(ts)iyachi": "декламациячи",
171
+ "deklara(ts)iya": "декларация",
172
+ "dekora(ts)iya": "декорация",
173
+ "delega(ts)iya": "делегация",
174
+ "delimita(ts)iya": "делимитация",
175
+ "demarka(ts)iya": "демаркация",
176
+ "demilitariza(ts)iya": "демилитаризация",
177
+ "demobiliza(ts)iya": "демобилизация",
178
+ "denaturaliza(ts)iya": "денатурализация",
179
+ "denomina(ts)iya": "деноминация",
180
+ "denonsa(ts)iya": "денонсация",
181
+ "depilya(ts)iya": "депиляция",
182
+ "deporta(ts)iya": "депортация",
183
+ "deratiza(ts)iya": "дератизация",
184
+ "deriva(ts)ion": "деривацион",
185
+ "deriva(ts)iya": "деривация",
186
+ "desika(ts)iya": "десикация",
187
+ "detona(ts)iya": "детонация",
188
+ "defini(ts)iya": "дефиниция",
189
+ "defi(ts)it": "дефицит",
190
+ "deflya(ts)iya": "дефляция",
191
+ "defolia(ts)iya": "дефолиация",
192
+ "deforma(ts)iya": "деформация",
193
+ "de(ts)igramm": "дециграмм",
194
+ "de(ts)ilitr": "децилитр",
195
+ "de(ts)imetr": "дециметр",
196
+ "dik(s)iya": "дикция",
197
+ "direk(s)iya": "дирекция",
198
+ "diskvalifika(ts)iya": "дисквалификация",
199
+ "diskrimina(ts)iya": "дискриминация",
200
+ "disloka(ts)iya": "дислокация",
201
+ "dispropor(s)iya": "диспропорция",
202
+ "disserta(ts)iya": "диссертация",
203
+ "dissimilya(ts)iya": "диссимиляция",
204
+ "disso(ts)ia(ts)iya": "диссоциация",
205
+ "distan(s)ion": "дистанцион",
206
+ "distan(s)iya": "дистанция",
207
+ "distillya(ts)iya": "дистилляция",
208
+ "differen(s)ial": "дифференциал",
209
+ "differen(s)ia(ts)iya": "дифференциация",
210
+ "differen(s)iyalamoq": "дифференцияламоқ",
211
+ "dota(ts)iya": "дотация",
212
+ "do(ts)ent": "доцент",
213
+ "jinoiy-pro(ts)essual": "жиноий-процессуал",
214
+ "identifika(ts)iya": "идентификация",
215
+ "izolya(ts)ion": "изоляцион",
216
+ "izolya(ts)iya": "изоляция",
217
+ "izolya(ts)iyalamoq": "изоляцияламоқ",
218
+ "illyumina(ts)iya": "иллюминация",
219
+ "illyustra(ts)iya": "иллюстрация",
220
+ "immigra(ts)iya": "иммиграция",
221
+ "immobiliza(ts)iya": "иммобилизация",
222
+ "impoten(s)iya": "импотенция",
223
+ "improviza(ts)iya": "импровизация",
224
+ "inaugura(ts)iya": "инаугурация",
225
+ "inventariza(ts)iya": "инвентаризация",
226
+ "investi(ts)iya": "инвестиция",
227
+ "ingalya(ts)iya": "ингаляция",
228
+ "indeksa(ts)iya": "индексация",
229
+ "induk(s)ion": "индукцион",
230
+ "induk(s)iya": "индукция",
231
+ "iner(s)iya": "инерция",
232
+ "iner(s)iyali": "инерцияли",
233
+ "inkvizi(ts)iya": "инквизиция",
234
+ "inkorpora(ts)iya": "инкорпорация",
235
+ "inkuba(ts)iya": "инкубация",
236
+ "innova(ts)iya": "инновация",
237
+ "inspek(s)iya": "инспекция",
238
+ "instar(s)iya": "инстарция",
239
+ "instruk(s)iya": "инструкция",
240
+ "ins(s)enirovka": "инсценировка",
241
+ "integra(ts)iya": "интеграция",
242
+ "intelligen(s)iya": "интеллигенция",
243
+ "interven(s)iya": "интервенция",
244
+ "interven(s)iyachi": "интервенциячи",
245
+ "interna(ts)ional": "интернационал",
246
+ "interna(ts)ionalizm": "интернационализм",
247
+ "interna(ts)ionalist": "интернационалист",
248
+ "intoksika(ts)iya": "интоксикация",
249
+ "intona(ts)ion": "интонацион",
250
+ "intona(ts)iya": "интонация",
251
+ "intui(ts)iya": "интуиция",
252
+ "infek(s)ion": "инфекцион",
253
+ "infek(s)iya": "инфекция",
254
+ "inflya(ts)iya": "инфляция",
255
+ "informa(ts)ion": "информацион",
256
+ "informa(ts)iya": "информация",
257
+ "inʼek(s)iya": "инъекция",
258
+ "irra(ts)ional": "иррационал",
259
+ "irriga(ts)ion": "ирригацион",
260
+ "irriga(ts)iya": "ирригация",
261
+ "kalkulya(ts)iya": "калькуляция",
262
+ "kal(s)iy": "кальций",
263
+ "kanaliza(ts)iya": "канализация",
264
+ "kan(s)eliyariya": "канцелиярия",
265
+ "kan(s)erogen": "канцероген",
266
+ "kan(s)ler": "канцлер",
267
+ "kapitaliza(ts)iya": "капитализация",
268
+ "kapitulya(ts)iya": "капитуляция",
269
+ "kassa(ts)iya": "кассация",
270
+ "katol(s)izm": "католцизм",
271
+ "kvalifika(ts)iya": "квалификация",
272
+ "kvar(s)": "кварц",
273
+ "kvar(s)it": "кварцит",
274
+ "kvitan(s)iya": "квитанция",
275
+ "kinokon(s)ert": "киноконцерт",
276
+ "kinos(s)enariy": "киносценарий",
277
+ "klassifika(ts)iya": "классификация",
278
+ "klassi(ts)izm": "классицизм",
279
+ "koali(ts)ion": "коалицион",
280
+ "koali(ts)iya": "коалиция",
281
+ "kodifika(ts)iya": "кодификация",
282
+ "kollek(s)ioner": "коллекционер",
283
+ "kollek(s)iya": "коллекция",
284
+ "kollek(s)iyachchi": "коллекцияччи",
285
+ "kolon(s)ifra": "колонцифра",
286
+ "kombina(ts)iya": "комбинация",
287
+ "kommer(s)iya": "коммерция",
288
+ "kommunika(ts)iya": "коммуникация",
289
+ "kommuta(ts)iya": "коммутация",
290
+ "kompensa(ts)iya": "компенсация",
291
+ "kompeten(s)iya": "компетенция",
292
+ "kompilya(ts)iya": "компиляция",
293
+ "kompozi(ts)ion": "композицион",
294
+ "kompozi(ts)iya": "композиция",
295
+ "konvek(s)iya": "конвекция",
296
+ "konven(s)iya": "конвенция",
297
+ "konverta(ts)iya": "конвертация",
298
+ "kondensa(ts)iya": "конденсация",
299
+ "kondi(ts)iya": "кондиция",
300
+ "kondi(ts)ioner": "кондиционер",
301
+ "konkuren(s)iya": "конкуренция",
302
+ "konserva(ts)iya": "консервация",
303
+ "konsigna(ts)iya": "консигнация",
304
+ "konsolida(ts)iya": "консолидация",
305
+ "konsor(s)ium": "консорциум",
306
+ "konspira(ts)iya": "конспирация",
307
+ "konstitu(ts)ion": "конституцион",
308
+ "konstitu(ts)iya": "конституция",
309
+ "konstitu(ts)iyaviy": "конституциявий",
310
+ "konstruk(s)iya": "конструкция",
311
+ "konsulta(ts)iya": "консультация",
312
+ "kontrakta(ts)iya": "контрактация",
313
+ "kontribu(ts)iya": "контрибуция",
314
+ "kontrrevolyu(ts)ion": "контрреволюцион",
315
+ "kontrrevolyu(ts)ioner": "контрреволюционер",
316
+ "kontrrevolyu(ts)iya": "контрреволюция",
317
+ "konfedera(ts)iya": "конфедерация",
318
+ "konferen(s)-zal": "конференц-зал",
319
+ "konferen(s)iya": "конференция",
320
+ "konfiska(ts)iya": "конфискация",
321
+ "konfronta(ts)iya": "конфронтация",
322
+ "konfu(ts)iylik": "конфуцийлик",
323
+ "konfu(ts)iychilik": "конфуцийчилик",
324
+ "kon(s)entrat": "концентрат",
325
+ "kon(s)entratli": "концентратли",
326
+ "kon(s)entra(ts)ion": "концентрацион",
327
+ "kon(s)entra(ts)iya": "концентрация",
328
+ "kon(s)entra(ts)iyalashmoq": "концентрациялашмоқ",
329
+ "kon(s)entrik": "концентрик",
330
+ "kon(s)ep(s)iya": "концепция",
331
+ "kon(s)ern": "концерн",
332
+ "kon(s)ert": "концерт",
333
+ "kon(s)ertmeyster": "концертмейстер",
334
+ "kon(s)essiya": "концессия",
335
+ "kon(s)lager": "концлагерь",
336
+ "koopera(ts)iya": "кооперация",
337
+ "koopta(ts)iya": "кооптация",
338
+ "koordina(ts)ion": "координацион",
339
+ "koordina(ts)iya": "координация",
340
+ "korpora(ts)iya": "корпорация",
341
+ "korrelya(ts)iya": "корреляция",
342
+ "korresponden(s)iya": "корреспонденция",
343
+ "korrup(s)iya": "коррупция",
344
+ "koeffi(ts)iyent": "коэффициент",
345
+ "krema(ts)iya": "кремация",
346
+ "kristalliza(ts)iya": "кристаллизация",
347
+ "kulmina(ts)ion": "кульминацион",
348
+ "kulmina(ts)iya": "кульминация",
349
+ "kultiva(ts)iya": "культивация",
350
+ "lakta(ts)iya": "лактация",
351
+ "lamina(ts)iya": "ламинация",
352
+ "lan(s)et": "ланцет",
353
+ "levomi(ts)etin": "левомицетин",
354
+ "legitima(ts)iya": "легитимация",
355
+ "leyko(ts)itlar": "лейкоцитлар",
356
+ "leyko(ts)itoz": "лейкоцитоз",
357
+ "lek(s)iya": "лекция",
358
+ "liberaliza(ts)iya": "либерализация",
359
+ "li(ts)ey": "лицей",
360
+ "li(ts)enziya": "лицензия",
361
+ "lokaliza(ts)iya": "локализация",
362
+ "loka(ts)iya": "локация",
363
+ "lo(ts)man": "лоцман",
364
+ "lyumenis(s)en(s)iya": "люменисценция",
365
+ "lyute(ts)iy": "лютеций",
366
+ "manipulya(ts)iya": "манипуляция",
367
+ "margane(ts)": "марганец",
368
+ "matri(ts)a": "матрица",
369
+ "medi(ts)ina": "медицина",
370
+ "meliora(ts)iya": "мелиорация",
371
+ "menstrua(ts)iya": "менструация",
372
+ "metalliza(ts)iya": "металлизация",
373
+ "metiza(ts)iya": "метизация",
374
+ "mexaniza(ts)iya": "механизация",
375
+ "mexaniza(ts)iyalash": "механизациялаш",
376
+ "mexaniza(ts)iyalashmoq": "механизациялашмоқ",
377
+ "mexani(ts)izm": "механицизм",
378
+ "migra(ts)iya": "миграция",
379
+ "mizans(s)ena": "мизансцена",
380
+ "militariza(ts)iya": "милитаризация",
381
+ "mili(ts)ioner": "милиционер",
382
+ "mili(ts)iya": "милиция",
383
+ "mili(ts)iyaxona": "милицияхона",
384
+ "mineraliza(ts)iya": "минерализация",
385
+ "minonose(ts)": "миноносец",
386
+ "misti(ts)izm": "мистицизм",
387
+ "mobiliza(ts)iya": "мобилизация",
388
+ "moderniza(ts)iya": "модернизация",
389
+ "moderniza(ts)iyalamoq": "модернизацияламоқ",
390
+ "modifika(ts)iya": "модификация",
391
+ "moto(ts)ikl": "мотоцикл",
392
+ "moto(ts)iklet": "мотоциклет",
393
+ "moto(ts)ikletchi": "мотоциклетчи",
394
+ "moto(ts)iklli": "мотоциклли",
395
+ "moto(ts)iklchi": "мотоциклчи",
396
+ "multiplika(ts)ion": "мультипликацион",
397
+ "multiplika(ts)iya": "мультипликация",
398
+ "muni(ts)ipaliza(ts)iya": "муниципализация",
399
+ "muni(ts)ipalitet": "муниципалитет",
400
+ "naviga(ts)iya": "навигация",
401
+ "naturaliza(ts)iya": "натурализация",
402
+ "na(ts)ionaliza(ts)iya": "национализация",
403
+ "nene(ts)": "ненец",
404
+ "nene(ts)lar": "ненецлар",
405
+ "nitrogli(ts)erin": "нитроглицерин",
406
+ "nomina(ts)iya": "номинация",
407
+ "nostrifika(ts)iya": "нострификация",
408
+ "nullifika(ts)iya": "нуллификация",
409
+ "obliga(ts)iya": "облигация",
410
+ "obroga(ts)iya": "оброгация",
411
+ "observa(ts)iya": "обсервация",
412
+ "okkupa(ts)ion": "оккупацион",
413
+ "okkupa(ts)iya": "оккупация",
414
+ "okkupa(ts)iyachi": "оккупациячи",
415
+ "opera(ts)iya": "операция",
416
+ "opera(ts)iyaviy": "операциявий",
417
+ "oppozo(ts)ion": "оппозоцион",
418
+ "oppozi(ts)iya": "оппозиция",
419
+ "oppozi(ts)iyachi": "оппозициячи",
420
+ "op(s)ion": "опцион",
421
+ "ordinare(ts)": "ординарец",
422
+ "oriyenta(ts)iya": "ориентация",
423
+ "osteomalya(ts)iya": "остеомаляция",
424
+ "ofi(ts)er": "офицер",
425
+ "ofi(ts)iant": "официант",
426
+ "ofi(ts)iantka": "официантка",
427
+ "palpa(ts)iya": "пальпация",
428
+ "pa(ts)iyent": "пациент",
429
+ "pa(ts)ifizm": "пацифизм",
430
+ "pa(ts)ifist": "пацифист",
431
+ "peni(ts)(s)ilin": "пениццилин",
432
+ "pesti(ts)idlar": "пестицидлар",
433
+ "peti(ts)iya": "петиция",
434
+ "petli(ts)a": "петлица",
435
+ "pigmenta(ts)iya": "пигментация",
436
+ "pin(s)et": "пинцет",
437
+ "pi(ts)(s)a": "пицца",
438
+ "planta(ts)iya": "плантация",
439
+ "pla(ts)darm": "плацдарм",
440
+ "pla(ts)kart": "плацкарт",
441
+ "pla(ts)karta": "плацкарта",
442
+ "pla(ts)kartali": "плацкартали",
443
+ "plebis(s)it": "плебисцит",
444
+ "podstan(s)iya": "подстанция",
445
+ "pozi(ts)ion": "позицион",
446
+ "pozi(ts)iya": "позиция",
447
+ "poli(ts)iya": "полиция",
448
+ "poli(ts)iyachi": "полициячи",
449
+ "poli(ts)meyster": "полицмейстер",
450
+ "pollyu(ts)iya": "поллюция",
451
+ "populya(ts)iya": "популяция",
452
+ "por(s)iya": "порция",
453
+ "poten(s)ial": "потенциал",
454
+ "prezenta(ts)iya": "презентация",
455
+ "press-konferen(s)iya": "пресс-конференция",
456
+ "preferen(s)iya": "преференция",
457
+ "privatiza(ts)iya": "приватизация",
458
+ "prin(s)ip": "принцип",
459
+ "prin(s)ipial": "принципиал",
460
+ "prin(s)ipiallik": "принципиаллик",
461
+ "prin(s)ipli": "принципли",
462
+ "prin(s)ipsiz": "принципсиз",
463
+ "pri(ts)ep": "прицеп",
464
+ "provin(s)ializm": "провинциализм",
465
+ "provin(s)iya": "провинция",
466
+ "provoka(ts)iya": "провокация",
467
+ "proyek(s)iya": "проекция",
468
+ "proyek(s)iyalamoq": "проекцияламоқ",
469
+ "proklama(ts)iya": "прокламация",
470
+ "prolonga(ts)iya": "пролонгация",
471
+ "propor(s)ional": "пропорционал",
472
+ "propor(s)ionallik": "пропорционаллик",
473
+ "propor(s)iya": "пропорция",
474
+ "protek(s)ionizm": "протекционизм",
475
+ "pro(ts)ent": "процент",
476
+ "pro(ts)entli": "процентли",
477
+ "pro(ts)entchi": "процентчи",
478
+ "pro(ts)ess": "процесс",
479
+ "pro(ts)essor": "процессор",
480
+ "pro(ts)essual": "процессуал",
481
+ "publi(ts)ist": "публицист",
482
+ "publi(ts)istik": "публицистик",
483
+ "publi(ts)istika": "публицистика",
484
+ "punktua(ts)ion": "пунктуацион",
485
+ "punktua(ts)iya": "пунктуация",
486
+ "punk(s)iya": "пункция",
487
+ "radia(ts)ion": "радиацион",
488
+ "radia(ts)iya": "радиация",
489
+ "radioloka(ts)iya": "радиолокация",
490
+ "radionaviga(ts)iya": "радионавигация",
491
+ "radiostan(s)iya": "радиостанция",
492
+ "rane(ts)": "ранец",
493
+ "ratifika(ts)iya": "ратификация",
494
+ "rafina(ts)iya": "рафинация",
495
+ "rafina(ts)iyalash": "рафинациялаш",
496
+ "ra(ts)ion": "рацион",
497
+ "ra(ts)ional": "рационал",
498
+ "ra(ts)ionalizator": "рационализатор",
499
+ "ra(ts)ionalizatorlik": "рационализаторлик",
500
+ "ra(ts)ionaliza(ts)iya": "рационализация",
501
+ "ra(ts)ionalizm": "рационализм",
502
+ "ra(ts)ionalist": "рационалист",
503
+ "ra(ts)ionlallashmoq": "рационлаллашмоқ",
504
+ "ra(ts)iya": "рация",
505
+ "reabilita(ts)iya": "реабилитация",
506
+ "reak(s)ion": "реакцион",
507
+ "reak(s)ioner": "реакционер",
508
+ "reak(s)iya": "реакция",
509
+ "reak(s)iyachi": "реакциячи",
510
+ "realiza(ts)iya": "реализация",
511
+ "reanima(ts)iya": "реанимация",
512
+ "revalva(ts)iya": "ревальвация",
513
+ "revolyu(ts)ion": "революцион",
514
+ "revolyu(ts)ioner": "революционер",
515
+ "revolyu(ts)iya": "революция",
516
+ "regenera(ts)iya": "регенерация",
517
+ "registra(ts)iya": "регистрация",
518
+ "redak(s)ion": "редакцион",
519
+ "redak(s)iya": "редакция",
520
+ "reduk(s)iya": "редукция",
521
+ "reduplika(ts)iya": "редупликация",
522
+ "rezek(s)iya": "резекция",
523
+ "reziden(s)iya": "резиденция",
524
+ "rezolyu(ts)iya": "резолюция",
525
+ "reinvesti(ts)iya": "реинвестиция",
526
+ "rekvizi(ts)iya": "реквизиция",
527
+ "reklama(ts)iya": "рекламация",
528
+ "rekognos(s)irovka": "рекогносцировка",
529
+ "rekomenda(ts)iya": "рекомендация",
530
+ "rekonstruk(s)iya": "реконструкция",
531
+ "rekonstruk(s)iyalamoq": "реконструкцияламоқ",
532
+ "remilitariza(ts)iya": "ремилитаризация",
533
+ "repara(ts)iya": "репарация",
534
+ "repatri(ts)iya": "репатриция",
535
+ "repeti(ts)iya": "репетиция",
536
+ "reprivatiza(ts)iya": "реприватизация",
537
+ "reproduk(s)iya": "репродукция",
538
+ "restavra(ts)iya": "реставрация",
539
+ "retranslya(ts)iya": "ретрансляция",
540
+ "reforma(ts)iya": "реформация",
541
+ "refrak(s)iya": "рефракция",
542
+ "re(ts)enzent": "рецензент",
543
+ "re(ts)enziya": "рецензия",
544
+ "re(ts)ept": "рецепт",
545
+ "re(ts)eptorlar": "рецепторлар",
546
+ "re(ts)idiv": "рецидив",
547
+ "re(ts)idivist": "рецидивист",
548
+ "re(ts)ipiyent": "реципиент",
549
+ "reevakua(ts)iya": "реэвакуация",
550
+ "reemigra(ts)iya": "реэмиграция",
551
+ "ri(ts)arlik": "рицарлик",
552
+ "ri(ts)ar": "рицарь",
553
+ "rota(ts)ion": "ротацион",
554
+ "sana(ts)iya": "санация",
555
+ "sana(ts)iyalash": "санациялаш",
556
+ "sank(s)iya": "санкция",
557
+ "sekre(ts)iya": "секреция",
558
+ "sek(s)iya": "секция",
559
+ "selek(s)ion": "селекцион",
560
+ "selek(s)iya": "селекция",
561
+ "selek(s)iyachi": "селекциячи",
562
+ "selek(s)iyachilik": "селекциячилик",
563
+ "sensa(ts)ion": "сенсацион",
564
+ "sensa(ts)iya": "сенсация",
565
+ "signaliza(ts)iya": "сигнализация",
566
+ "sili(ts)iy": "силиций",
567
+ "situa(ts)iya": "ситуация",
568
+ "skepti(ts)izm": "скепти��изм",
569
+ "slane(ts)": "сланец",
570
+ "so(ts)ial": "социал",
571
+ "so(ts)ial-demokrat": "социал-демократ",
572
+ "so(ts)ial-demokratik": "социал-демократик",
573
+ "so(ts)ial-demokratiya": "социал-демократия",
574
+ "so(ts)ializa(ts)iya": "социализация",
575
+ "so(ts)ializm": "социализм",
576
+ "so(ts)ialist": "социалист",
577
+ "so(ts)ialistik": "социалистик",
578
+ "so(ts)iolingvistika": "социолингвистика",
579
+ "so(ts)iolog": "социолог",
580
+ "so(ts)iologik": "социологик",
581
+ "so(ts)iologiya": "социология",
582
+ "spekulya(ts)iya": "спекуляция",
583
+ "spe(ts)ifik": "специфик",
584
+ "spe(ts)ifika": "специфика",
585
+ "spe(ts)ifika(ts)iya": "спецификация",
586
+ "stabiliza(ts)iya": "стабилизация",
587
+ "stan(s)iya": "станция",
588
+ "sta(ts)ionar": "стационар",
589
+ "steriliza(ts)iya": "стерилизация",
590
+ "stoi(ts)izm": "стоицизм",
591
+ "stron(s)iy": "стронций",
592
+ "substan(s)iya": "субстанция",
593
+ "s(s)enariy": "сценарий",
594
+ "s(s)enariychi": "сценарийчи",
595
+ "s(s)enarist": "сценарист",
596
+ "tabli(ts)a": "таблица",
597
+ "tan(s)a": "танца",
598
+ "teleins(s)enirovka": "телеинсценировка",
599
+ "telekommunika(ts)iya": "телекоммуникация",
600
+ "telemexaniza(ts)iya": "телемеханизация",
601
+ "tenden(s)ioz": "тенденциоз",
602
+ "tenden(s)iozlik": "тенденциозлик",
603
+ "tenden(s)iya": "тенденция",
604
+ "tepli(ts)a": "теплица",
605
+ "teploizolya(ts)iya": "теплоизоляция",
606
+ "termoizolya(ts)iya": "термоизоляция",
607
+ "ter(s)et": "терцет",
608
+ "ter(s)iya": "терция",
609
+ "texne(ts)iy": "технеций",
610
+ "tradi(ts)ion": "традицион",
611
+ "tradi(ts)iya": "традиция",
612
+ "transkrip(s)ion": "транскрипцион",
613
+ "transkrip(s)iya": "транскрипция",
614
+ "transkrip(s)iyalamoq": "транскрипцияламоқ",
615
+ "translitera(ts)iya": "транслитерация",
616
+ "translya(ts)ion": "трансляцион",
617
+ "translya(ts)iya": "трансляция",
618
+ "transplanta(ts)iya": "трансплантация",
619
+ "transforma(ts)iya": "трансформация",
620
+ "transforma(ts)iyalamoq": "трансформацияламоқ",
621
+ "trape(ts)iya": "трапеция",
622
+ "trepana(ts)iya": "трепанация",
623
+ "uborshi(ts)a": "уборшица",
624
+ "uzurpa(ts)iya": "узурпация",
625
+ "unifika(ts)iya": "унификация",
626
+ "unifika(ts)iyalashtirmoq": "унификациялаштирмоқ",
627
+ "unter-ofi(ts)er": "унтер-офицер",
628
+ "urbaniza(ts)iya": "урбанизация",
629
+ "fago(ts)it": "фагоцит",
630
+ "falsifika(ts)iya": "фальсификация",
631
+ "farma(ts)evt": "фармацевт",
632
+ "farma(ts)evtika": "фармацевтика",
633
+ "farma(ts)iya": "фармация",
634
+ "federa(ts)iya": "федерация",
635
+ "fermenta(ts)iya": "ферментация",
636
+ "film-kon(s)ert": "фильм-концерт",
637
+ "filtra(ts)iya": "фильтрация",
638
+ "fiton(s)id": "фитонцид",
639
+ "forma(ts)iya": "формация",
640
+ "frak(s)ion": "фракцион",
641
+ "frak(s)iooner": "фракциоонер",
642
+ "frak(s)iya": "фракция",
643
+ "fran(s)iya": "франция",
644
+ "fran(s)uz": "француз",
645
+ "fran(s)uzlar": "французлар",
646
+ "fran(s)uzcha": "французча",
647
+ "fri(ts)": "фриц",
648
+ "funk(s)ional": "функционал",
649
+ "funk(s)iya": "функция",
650
+ "xemosorb(s)iya": "хемосорбция",
651
+ "xole(ts)istit": "холецистит",
652
+ "(s)anga": "цанга",
653
+ "(s)apfa": "цапфа",
654
+ "(s)edra": "цедра",
655
+ "(s)eziy": "цезий",
656
+ "(s)eytnot": "цейтнот",
657
+ "(s)ellofan": "целлофан",
658
+ "(s)elluloid": "целлулоид",
659
+ "(s)ellyuloza": "целлюлоза",
660
+ "(s)elsiy": "цельсий",
661
+ "(s)ement": "цемент",
662
+ "(s)ementlamoq": "цементламоқ",
663
+ "(s)enz": "ценз",
664
+ "(s)enzor": "цензор",
665
+ "(s)enzura": "цензура",
666
+ "(s)ent": "цент",
667
+ "(s)entner": "центнер",
668
+ "(s)entnerli": "центнерли",
669
+ "(s)entnerchi": "центнерчи",
670
+ "(s)entralizm": "централизм",
671
+ "(s)entrizm": "центризм",
672
+ "(s)entrist": "центрист",
673
+ "(s)entrifuga": "центрифуга",
674
+ "(s)eriy": "церий",
675
+ "(s)esarka": "цесарка",
676
+ "(s)ex": "цех",
677
+ "(s)ian": "циан",
678
+ "(s)ianli": "цианли",
679
+ "(s)iviliza(ts)iya": "цивилизация",
680
+ "(s)igara": "цигара",
681
+ "(s)ikl": "цикл",
682
+ "(s)iklik": "циклик",
683
+ "(s)ikllashtirmoq": "цикллаштирмоқ",
684
+ "(s)iklli": "циклли",
685
+ "(s)iklon": "циклон",
686
+ "(s)iklotron": "циклотрон",
687
+ "(s)ilindr": "цилиндр",
688
+ "(s)ilindrik": "цилиндрик",
689
+ "(s)ilindrli": "цилиндрли",
690
+ "(s)inga": "цинга",
691
+ "(s)ink": "цинк",
692
+ "(s)inkograf": "цинкограф",
693
+ "(s)inkografiya": "цинкография",
694
+ "(s)irk": "цирк",
695
+ "(s)irkoniy": "цирконий",
696
+ "(s)irkul": "циркуль",
697
+ "(s)irkulyar": "циркуляр",
698
+ "(s)irkchi": "циркчи",
699
+ "(s)irroz": "цирроз",
700
+ "(s)isterna": "цистерна",
701
+ "(s)isternali": "цистернали",
702
+ "(s)istit": "цистит",
703
+ "(s)itata": "цитата",
704
+ "(s)itatabozlik": "цитатабозлик",
705
+ "(s)ito-": "цито-",
706
+ "(s)itodiagnostika": "цитодиагностика",
707
+ "(s)itokimyo": "цитокимё",
708
+ "(s)itoliz": "цитолиз",
709
+ "(s)itologiya": "цитология",
710
+ "(s)itrus": "цитрус",
711
+ "(s)iferblat": "циферблат",
712
+ "(s)iferblatli": "циферблатли",
713
+ "(s)okol": "цоколь",
714
+ "(s)unami": "цунами",
715
+ "cherepi(ts)a": "черепица",
716
+ "shvey(s)ar": "швейцар",
717
+ "shmu(ts)titul": "шмуцтитул",
718
+ "shni(ts)el": "шницель",
719
+ "shpri(ts)": "шприц",
720
+ "shtangen(s)irkul": "штангенциркуль",
721
+ "evakua(ts)iya": "эвакуация",
722
+ "evolyu(ts)ion": "эволюцион",
723
+ "evolyu(ts)iya": "эволюция",
724
+ "ego(ts)entrizm": "эгоцентризм",
725
+ "eksguma(ts)iya": "эксгумация",
726
+ "ekspedi(ts)ion": "экспедицион",
727
+ "ekspedi(ts)iya": "экспедиция",
728
+ "ekspedi(ts)iyachi": "экспедициячи",
729
+ "ekspluata(ts)iya": "эксплуатация",
730
+ "ekspluata(ts)iyachi": "эксплуатациячи",
731
+ "ekspozi(ts)iya": "экспозиция",
732
+ "ekspropria(ts)iya": "экспроприация",
733
+ "ekstradi(ts)iya": "экстрадиция",
734
+ "ekstrak(s)iya": "экстракция",
735
+ "elektrifika(ts)iya": "электрификация",
736
+ "elektrostan(s)iya": "электростанция",
737
+ "emansipa(ts)iya": "эмансипация",
738
+ "emigra(ts)iya": "эмиграция",
739
+ "emo(ts)ional": "эмоционал",
740
+ "emo(ts)ionallik": "эмоционаллик",
741
+ "emo(ts)iya": "эмоция",
742
+ "empiriokriti(ts)izm": "эмпириокритицизм",
743
+ "en(s)efalit": "энцефалит",
744
+ "en(s)efalogramma": "энцефалограмма",
745
+ "en(s)iklopedik": "энциклопедик",
746
+ "en(s)iklopedist": "энциклопедист",
747
+ "en(s)iklopediya": "энциклопедия",
748
+ "en(s)iklopediyachi": "энциклопедиячи",
749
+ "epi(ts)entr": "эпицентр",
750
+ "eritro(ts)itlar": "эритроцитлар",
751
+ "erudi(ts)iya": "эрудиция",
752
+ "eskala(ts)iya": "эскалация",
753
+ "esmine(ts)": "эсминец",
754
+ "essen(s)iya": "эссенция",
755
+ "yurisdik(s)iya": "юрисдикция",
756
+ "yurispruden(s)iya": "юриспруденция",
757
+ "yusti(ts)iya": "юстиция",
758
+ }
759
+ # These words cannot be reliably transliterated into cyrillic
760
+ E_WORDS = {
761
+ "bel(e)taj": "бельэтаж",
762
+ "bugun-(e)rta": "бугун-эрта",
763
+ "diqqat-(e)ʼtibor": "диққат-эътибор",
764
+ "ich-(e)t": "ич-эт",
765
+ "karat(e)": "каратэ",
766
+ "m(e)r": "мэр",
767
+ "obroʻ-(e)ʼtiborli": "обрў-эътиборли",
768
+ "omon-(e)son": "омон-эсон",
769
+ "r(e)ket": "рэкет",
770
+ "sut(e)mizuvchilar": "сутэмизувчилар",
771
+ "upa-(e)lik": "упа-элик",
772
+ "xayr-(e)hson": "хайр-эҳсон",
773
+ "qayn(e)gachi": "қайнэгачи",
774
+ }
775
+ # Not to confuse with ш
776
+ SH_WORDS = {"a(sh)ob": "асҳоб", "mu(sh)af": "мусҳаф"}
777
+ # Not to confuse with ё
778
+ YO_WORDS = {
779
+ "general-ma(yo)r": "генерал-майор",
780
+ "(yo)g": "йог",
781
+ "(yo)ga": "йога",
782
+ "(yo)gurt": "йогурт",
783
+ "(yo)d": "йод",
784
+ "(yo)dlamoq": "йодламоқ",
785
+ "(yo)dli": "йодли",
786
+ "ma(yo)nez": "майонез",
787
+ "mikrorayon": "микрорайон",
788
+ "ma(yo)r": "майор",
789
+ "ra(yo)n": "район",
790
+ }
791
+ YU_WORDS = {"mo(yu)pa": "мойупа", "po(yu)stun": "пойустун"}
792
+ YA_WORDS = {
793
+ "po(ya)bzal": "пойабзал",
794
+ "po(ya)ndoz": "пойандоз",
795
+ "po(ya)fzal": "пойафзал",
796
+ }
797
+ YE_WORDS = {
798
+ "i(ye)": "ийе",
799
+ "konve(ye)r": "конвейер",
800
+ "ple(ye)r": "плейер",
801
+ "sta(ye)r": "стайер",
802
+ "fo(ye)": "фойе",
803
+ }
804
+ SOFT_SIGN_WORDS = {
805
+ "aviamodel": "авиамодель",
806
+ "avtomagistralavtomat": "автомагистральавтомат",
807
+ "avtomobil": "автомобил��",
808
+ "akvarel": "акварель",
809
+ "alkogol": "алкоголь",
810
+ "albatros": "альбатрос",
811
+ "albom": "альбом",
812
+ "alpinizm": "альпинизм",
813
+ "alpinist": "альпинист",
814
+ "alt": "альт",
815
+ "alternativ": "альтернатив",
816
+ "alternativa": "альтернатива",
817
+ "altimetr": "альтиметр",
818
+ "altchi": "альтчи",
819
+ "alfa": "альфа",
820
+ "alfa-zarralar": "альфа-зарралар",
821
+ "alma-terapiya": "альма-терапия",
822
+ "alyans": "альянс",
823
+ "amalgama": "амальгама",
824
+ "ansambl": "ансамбль",
825
+ "apelsin": "апельсин",
826
+ "aprel": "апрель",
827
+ "artel": "артель",
828
+ "artikl": "артикль",
829
+ "arergard": "арьергард",
830
+ "asfalt": "асфальт",
831
+ "asfaltlamoq": "асфальтламоқ",
832
+ "asfaltli": "асфальтли",
833
+ "atele": "ателье",
834
+ "bazalt": "базальт",
835
+ "balzam": "бальзам",
836
+ "balzamlash": "бальзамлаш",
837
+ "balneolog": "бальнеолог",
838
+ "balneologik": "бальнеологик",
839
+ "balneologiya": "бальнеология",
840
+ "balneoterapiya": "бальнеотерапия",
841
+ "balneotexnika": "бальнеотехника",
842
+ "banderol": "бандероль",
843
+ "barelef": "барельеф",
844
+ "barrel": "баррель",
845
+ "barer": "барьер",
846
+ "batalon": "батальон",
847
+ "belveder": "бельведер",
848
+ "belgiyalik": "бельгиялик",
849
+ "belting": "бельтинг",
850
+ "beletaj": "бельэтаж",
851
+ "bilyard": "бильярд",
852
+ "binokl": "бинокль",
853
+ "biofiltr": "биофильтр",
854
+ "bolonya": "болонья",
855
+ "bolshevizm": "большевизм",
856
+ "bolshevik": "большевик",
857
+ "brakonerlik": "браконьерлик",
858
+ "broneavtomobil": "бронеавтомобиль",
859
+ "bron": "бронь",
860
+ "budilnik": "будильник",
861
+ "bulvar": "бульвар",
862
+ "buldenej": "бульденеж",
863
+ "buldog": "бульдог",
864
+ "buldozer": "бульдозер",
865
+ "buldozerchi": "бульдозерчи",
866
+ "bulon": "бульон",
867
+ "byulleten": "бюллетень",
868
+ "valeryanka": "валерьянка",
869
+ "valvatsiya": "вальвация",
870
+ "vals": "вальс",
871
+ "vanil": "ваниль",
872
+ "varete": "варьете",
873
+ "vedomost": "ведомость",
874
+ "veksel": "вексель",
875
+ "ventil": "вентиль",
876
+ "vermishel": "вермишель",
877
+ "verner": "верньер",
878
+ "verf": "верфь",
879
+ "vestibyul": "вестибюль",
880
+ "videofilm": "видеофильм",
881
+ "viklyuchatel": "виключатель",
882
+ "vinetka": "виньетка",
883
+ "violonchel": "виолончель",
884
+ "vklyuchatel": "включатель",
885
+ "vodevil": "водевиль",
886
+ "volost": "волость",
887
+ "volt": "вольт",
888
+ "volta": "вольта",
889
+ "voltli": "вольтли",
890
+ "voltmetr": "вольтметр",
891
+ "volfram": "вольфрам",
892
+ "vulgar": "вульгар",
893
+ "vulgarizm": "вульгаризм",
894
+ "vulgarlashtirmoq": "вульгарлаштирмоқ",
895
+ "gavan": "гавань",
896
+ "galvanizatsiya": "гальванизация",
897
+ "galvanik": "гальваник",
898
+ "galvanometr": "гальванометр",
899
+ "gantel": "гантель",
900
+ "garmon": "гармонь",
901
+ "gastrol": "гастроль",
902
+ "gastrol-konsert": "гастроль-концерт",
903
+ "gelmint": "гельминт",
904
+ "gelmintoz": "гельминтоз",
905
+ "gelmintologiya": "гельминтология",
906
+ "geraldika": "геральдика",
907
+ "gilza": "гильза",
908
+ "giposulfit": "гипосульфит",
909
+ "golf": "гольф",
910
+ "gorelef": "горельеф",
911
+ "gorizontal": "горизонталь",
912
+ "gospital": "госпиталь",
913
+ "grifel": "грифель",
914
+ "guash": "гуашь",
915
+ "daltonizm": "дальтонизм",
916
+ "dvigatel": "двигатель",
917
+ "devalvatsiya": "девальвация",
918
+ "dekabr": "декабрь",
919
+ "delta": "дельта",
920
+ "delfin": "дельфин",
921
+ "delfinariy": "дельфинарий",
922
+ "delfinsimonlar": "дельфинсимонлар",
923
+ "detal": "деталь",
924
+ "diagonal": "диагональ",
925
+ "diafilm": "диафильм",
926
+ "dizel": "дизель",
927
+ "dizel-motor": "дизель-мотор",
928
+ "dirijabl": "дирижабль",
929
+ "drel": "дрель",
930
+ "duel": "дуэль",
931
+ "jenshen": "женьшень",
932
+ "impuls": "импульс",
933
+ "inventar": "инвентарь",
934
+ "insult": "инсульт",
935
+ "intervyu": "интервью",
936
+ "interer": "интерьер",
937
+ "italyan": "итальян",
938
+ "italyanlar": "итальянлар",
939
+ "italyancha": "итальянча",
940
+ "iyul": "июль",
941
+ "iyun": "июнь",
942
+ "kabel": "кабель",
943
+ "kalendar": "календарь",
944
+ "kalka": "калька",
945
+ "kalkalamoq": "калькаламоқ",
946
+ "kalkulyator": "калькулятор",
947
+ "kalkulyatsiya": "калькуляция",
948
+ "kalsiy": "кальций",
949
+ "kanifol": "канифоль",
950
+ "kapelmeyster": "капельмейстер",
951
+ "kapsyul": "капсюль",
952
+ "karamel": "карамель",
953
+ "kartel": "картель",
954
+ "kartech": "картечь",
955
+ "karusel": "карусель",
956
+ "karer": "карьер",
957
+ "kastryul": "кастрюль",
958
+ "kastryulka": "кастрюлька",
959
+ "katapulta": "катапульта",
960
+ "kafel": "кафель",
961
+ "kinofestival": "кинофестиваль",
962
+ "kinofilm": "кинофильм",
963
+ "kisel": "кисель",
964
+ "kitel": "китель",
965
+ "knyaz": "князь",
966
+ "kobalt": "кобальт",
967
+ "kokil": "кокиль",
968
+ "kokteyl": "коктейль",
969
+ "kompyuter": "компьютер",
970
+ "kompyuterlashtirmoq": "компьютерлаштирмоқ",
971
+ "konsultant": "консультант",
972
+ "konsultativ": "консультатив",
973
+ "konsultatsiya": "консультация",
974
+ "kontrol": "контроль",
975
+ "konferanse": "конферансье",
976
+ "konslager": "концлагерь",
977
+ "kon": "конь",
978
+ "konki": "коньки",
979
+ "konkichi": "конькичи",
980
+ "konyunktiva": "коньюнктива",
981
+ "konyunktivit": "коньюнктивит",
982
+ "konyunktura": "коньюнктура",
983
+ "konyak": "коньяк",
984
+ "korol": "король",
985
+ "kreml": "кремль",
986
+ "krovat": "кровать",
987
+ "kulminatsion": "кульминацион",
988
+ "kulminatsiya": "кульминация",
989
+ "kultivator": "культиватор",
990
+ "kultivatsiya": "культивация",
991
+ "kulturizm": "культуризм",
992
+ "kurer": "курьер",
993
+ "kyat": "кьят",
994
+ "lager": "лагерь",
995
+ "latun": "латунь",
996
+ "losos": "лосось",
997
+ "loson": "лосьон",
998
+ "magistral": "магистраль",
999
+ "marseleza": "марсельеза",
1000
+ "mebel": "мебель",
1001
+ "medal": "медаль",
1002
+ "medalon": "медальон",
1003
+ "melxior": "мельхиор",
1004
+ "menshevizm": "меньшевизм",
1005
+ "menshevik": "меньшевик",
1006
+ "migren": "мигрень",
1007
+ "mikroinsult": "микроинсульт",
1008
+ "mikrofilm": "микрофильм",
1009
+ "model": "модель",
1010
+ "modeler": "модельер",
1011
+ "molbert": "мольберт",
1012
+ "monastir": "монастирь",
1013
+ "monokultoura": "монокультоура",
1014
+ "motel": "мотель",
1015
+ "multi-": "мульти-",
1016
+ "multimediya": "мультимедия",
1017
+ "multimillioner": "мультимиллионер",
1018
+ "multiplikatsion": "мультипликацион",
1019
+ "multiplikator": "мультипликатор",
1020
+ "multiplikatsiya": "мультипликация",
1021
+ "neft": "нефть",
1022
+ "nikel": "никель",
1023
+ "nimpalto": "нимпальто",
1024
+ "nippel": "ниппель",
1025
+ "nol": "ноль",
1026
+ "normal": "нормаль",
1027
+ "noyabr": "ноябрь",
1028
+ "oblast": "область",
1029
+ "okkultizm": "оккультизм",
1030
+ "oktabr": "октябрь",
1031
+ "otel": "отель",
1032
+ "oftalmologiya": "офтальмология",
1033
+ "ochered": "очередь",
1034
+ "pavilon": "павильон",
1035
+ "palma": "пальма",
1036
+ "palmazor": "пальмазор",
1037
+ "palpatsiya": "пальпация",
1038
+ "palto": "пальто",
1039
+ "paltobop": "пальтобоп",
1040
+ "paltolik": "пальтолик",
1041
+ "panel": "панель",
1042
+ "parallel": "параллель",
1043
+ "parol": "пароль",
1044
+ "patrul": "патруль",
1045
+ "pedal": "педаль",
1046
+ "penalti": "пенальти",
1047
+ "pechat": "печать",
1048
+ "pechene": "печенье",
1049
+ "pech": "печь",
1050
+ "plastir": "пластирь",
1051
+ "povest": "повесть",
1052
+ "polka": "полька",
1053
+ "portfel": "портфель",
1054
+ "porshen": "поршень",
1055
+ "pochtalon": "почтальон",
1056
+ "predoxranitel": "предохранитель",
1057
+ "premera": "премьера",
1058
+ "premer-ministr": "премьер-министр",
1059
+ "press-pape": "пресс-папье",
1060
+ "press-sekretar": "пресс-секретарь",
1061
+ "pristan": "пристань",
1062
+ "profil": "профиль",
1063
+ "pulverizator": "пульверизатор",
1064
+ "pulmonologiya": "пульмонология",
1065
+ "pulpa": "пульпа",
1066
+ "pulpit": "пульпит",
1067
+ "puls": "пульс",
1068
+ "pult": "пульт",
1069
+ "pesa": "пьеса",
1070
+ "radiospektakl": "радиоспектакль",
1071
+ "rante": "ран��ье",
1072
+ "revalvatsiya": "ревальвация",
1073
+ "revolver": "револьвер",
1074
+ "rezba": "резьба",
1075
+ "rezbali": "резьбали",
1076
+ "relef": "рельеф",
1077
+ "rels": "рельс",
1078
+ "relsli": "рельсли",
1079
+ "relssiz": "рельссиз",
1080
+ "retush": "ретушь",
1081
+ "riyel": "риель",
1082
+ "ritsar": "рицарь",
1083
+ "rol": "роль",
1084
+ "royal": "рояль",
1085
+ "rubilnik": "рубильник",
1086
+ "rubl": "рубль",
1087
+ "rul": "руль",
1088
+ "saldo": "сальдо",
1089
+ "salto": "сальто",
1090
+ "sekretar": "секретарь",
1091
+ "selderey": "сельдерей",
1092
+ "seld": "сельдь",
1093
+ "sentabr": "сентябрь",
1094
+ "senor": "сеньор",
1095
+ "senora": "сеньора",
1096
+ "sinka": "синька",
1097
+ "sinkalamoq": "синькаламоқ",
1098
+ "siren": "сирень",
1099
+ "skalpel": "скальпель",
1100
+ "slesar": "слесарь",
1101
+ "sobol": "соболь",
1102
+ "sol": "соль",
1103
+ "spektakl": "спектакль",
1104
+ "spiral": "спираль",
1105
+ "statya": "статья",
1106
+ "stelka": "стелька",
1107
+ "sterjen": "стержень",
1108
+ "stil": "стиль",
1109
+ "sudya": "судья",
1110
+ "sudyalik": "судьялик",
1111
+ "sulfat": "сульфат",
1112
+ "sulfatlar": "сульфатлар",
1113
+ "tabel": "табель",
1114
+ "talk": "тальк",
1115
+ "tekstil": "текстиль",
1116
+ "telefilm": "телефильм",
1117
+ "tigel": "тигель",
1118
+ "tokar": "токарь",
1119
+ "tol": "толь",
1120
+ "tonnel": "тоннель",
1121
+ "tunnel": "туннель",
1122
+ "tush": "тушь",
1123
+ "tyulen": "тюлень",
1124
+ "tyul": "тюль",
1125
+ "ultimatum": "ультиматум",
1126
+ "ultra-": "ультра-",
1127
+ "ultrabinafsha": "ультрабинафша",
1128
+ "ultramikroskop": "ультрамикроскоп",
1129
+ "ultratovush": "ультратовуш",
1130
+ "ultraqisqa": "ультрақисқа",
1131
+ "umivalnik": "умивальник",
1132
+ "util": "утиль",
1133
+ "fakultativ": "факультатив",
1134
+ "fakultet": "факультет",
1135
+ "fakultetlalaro": "факультетлаларо",
1136
+ "falsifikator": "фальсификатор",
1137
+ "falsifikatsiya": "фальсификация",
1138
+ "fevral": "февраль",
1139
+ "feldmarshal": "фельдмаршал",
1140
+ "feldsher": "фельдшер",
1141
+ "feldʼeger": "фельдъегерь",
1142
+ "feleton": "фельетон",
1143
+ "feletonchi": "фельетончи",
1144
+ "festival": "фестиваль",
1145
+ "fizkultura": "физкультура",
1146
+ "fizkulturachi": "физкультурачи",
1147
+ "film": "фильм",
1148
+ "film-konsert": "фильм-концерт",
1149
+ "filmoskop": "фильмоскоп",
1150
+ "filmoteka": "фильмотека",
1151
+ "filtr": "фильтр",
1152
+ "filtratsiya": "фильтрация",
1153
+ "filtrlamoq": "фильтрламоқ",
1154
+ "filtrli": "фильтрли",
1155
+ "folga": "фольга",
1156
+ "folklor": "фольклор",
1157
+ "folklorist": "фольклорист",
1158
+ "folkloristika": "фольклористика",
1159
+ "folklorchi": "фольклорчи",
1160
+ "folklorshunos": "фольклоршунос",
1161
+ "folklorshunoslik": "фольклоршунослик",
1162
+ "fonar": "фонарь",
1163
+ "fortepyano": "фортепьяно",
1164
+ "xolodilnik": "холодильник",
1165
+ "xrustal": "хрусталь",
1166
+ "selsiy": "цельсий",
1167
+ "sirkul": "циркуль",
1168
+ "sokol": "цоколь",
1169
+ "chizel": "чизель",
1170
+ "shagren": "шагрень",
1171
+ "shampun": "шампунь",
1172
+ "sherst": "шерсть",
1173
+ "shinel": "шинель",
1174
+ "shifoner": "шифоньер",
1175
+ "shnitsel": "шницель",
1176
+ "shpatel": "шпатель",
1177
+ "shpilka": "шпилька",
1178
+ "shpindel": "шпиндель",
1179
+ "shtangensirkul": "штангенциркуль",
1180
+ "shtapel": "штапель",
1181
+ "shtempel": "штемпель",
1182
+ "emal": "эмаль",
1183
+ "emulsiya": "эмульсия",
1184
+ "endshpil": "эндшпиль",
1185
+ "eskadrilya": "эскадрилья",
1186
+ "yuan": "юань",
1187
+ "yuriskonsult": "юрисконсульт",
1188
+ "yakor": "якорь",
1189
+ "yanvar": "январь",
1190
+ }
1191
+
1192
+ CYRILLIC_TO_LATIN = {
1193
+ "а": "a",
1194
+ "А": "A",
1195
+ "б": "b",
1196
+ "Б": "B",
1197
+ "в": "v",
1198
+ "В": "V",
1199
+ "г": "g",
1200
+ "Г": "G",
1201
+ "д": "d",
1202
+ "Д": "D",
1203
+ "е": "e",
1204
+ "Е": "E",
1205
+ "ё": "yo",
1206
+ "Ё": "Yo",
1207
+ "ж": "j",
1208
+ "Ж": "J",
1209
+ "з": "z",
1210
+ "З": "Z",
1211
+ "и": "i",
1212
+ "И": "I",
1213
+ "й": "y",
1214
+ "Й": "Y",
1215
+ "к": "k",
1216
+ "К": "K",
1217
+ "л": "l",
1218
+ "Л": "L",
1219
+ "м": "m",
1220
+ "М": "M",
1221
+ "н": "n",
1222
+ "Н": "N",
1223
+ "о": "o",
1224
+ "О": "O",
1225
+ "п": "p",
1226
+ "П": "P",
1227
+ "р": "r",
1228
+ "Р": "R",
1229
+ "с": "s",
1230
+ "С": "S",
1231
+ "т": "t",
1232
+ "Т": "T",
1233
+ "у": "u",
1234
+ "У": "U",
1235
+ "ф": "f",
1236
+ "Ф": "F",
1237
+ "х": "x",
1238
+ "Х": "X",
1239
+ "ц": "s",
1240
+ "Ц": "S",
1241
+ "ч": "ch",
1242
+ "Ч": "Ch",
1243
+ "ш": "sh",
1244
+ "Ш": "Sh",
1245
+ "ъ": "ʼ",
1246
+ "Ъ": "ʼ",
1247
+ "ь": "",
1248
+ "Ь": "",
1249
+ "э": "e",
1250
+ "Э": "E",
1251
+ "ю": "yu",
1252
+ "Ю": "Yu",
1253
+ "я": "ya",
1254
+ "Я": "Ya",
1255
+ "ў": "oʻ",
1256
+ "Ў": "Oʻ",
1257
+ "қ": "q",
1258
+ "Қ": "Q",
1259
+ "ғ": "gʻ",
1260
+ "Ғ": "Gʻ",
1261
+ "ҳ": "h",
1262
+ "Ҳ": "H",
1263
+ }
1264
+ CYRILLIC_VOWELS = (
1265
+ "а",
1266
+ "А",
1267
+ "е",
1268
+ "Е",
1269
+ "ё",
1270
+ "Ё",
1271
+ "и",
1272
+ "И",
1273
+ "о",
1274
+ "О",
1275
+ "у",
1276
+ "У",
1277
+ "э",
1278
+ "Э",
1279
+ "ю",
1280
+ "Ю",
1281
+ "я",
1282
+ "Я",
1283
+ "ў",
1284
+ "Ў",
1285
+ )
1286
+
1287
+
1288
+ def to_cyrillic(text):
1289
+ """Transliterate latin text to cyrillic using the following rules:
1290
+ 1. ye = е in the beginning of a word or after a vowel
1291
+ 2. e = э in the beginning of a word or after a vowel
1292
+ 3. ц exception words
1293
+ 4. э exception words
1294
+ """
1295
+ # These compounds must be converted before other letters
1296
+ compounds_first = {
1297
+ "ch": "ч",
1298
+ "Ch": "Ч",
1299
+ "CH": "Ч",
1300
+ # this line must come before 's' because it has an 'h'
1301
+ "sh": "ш",
1302
+ "Sh": "Ш",
1303
+ "SH": "Ш",
1304
+ # This line must come before 'yo' because of it's apostrophe
1305
+ "yo‘": "йў",
1306
+ "Yo‘": "Йў",
1307
+ "YO‘": "ЙЎ",
1308
+ }
1309
+ compounds_second = {
1310
+ "yo": "ё",
1311
+ "Yo": "Ё",
1312
+ "YO": "Ё",
1313
+ # 'ts': 'ц', 'Ts': 'Ц', 'TS': 'Ц', # No need for this, see TS_WORDS
1314
+ "yu": "ю",
1315
+ "Yu": "Ю",
1316
+ "YU": "Ю",
1317
+ "ya": "я",
1318
+ "Ya": "Я",
1319
+ "YA": "Я",
1320
+ "ye": "е",
1321
+ "Ye": "Е",
1322
+ "YE": "Е",
1323
+ # different kinds of apostrophes
1324
+ "o‘": "ў",
1325
+ "O‘": "Ў",
1326
+ "oʻ": "ў",
1327
+ "Oʻ": "Ў",
1328
+ "g‘": "ғ",
1329
+ "G‘": "Ғ",
1330
+ "gʻ": "ғ",
1331
+ "Gʻ": "Ғ",
1332
+ }
1333
+ beginning_rules = {
1334
+ "ye": "е",
1335
+ "Ye": "Е",
1336
+ "YE": "Е",
1337
+ "e": "э",
1338
+ "E": "Э",
1339
+ }
1340
+ after_vowel_rules = {
1341
+ "ye": "е",
1342
+ "Ye": "Е",
1343
+ "YE": "Е",
1344
+ "e": "э",
1345
+ "E": "Э",
1346
+ }
1347
+ exception_words_rules = {
1348
+ "s": "ц",
1349
+ "S": "Ц",
1350
+ "ts": "ц",
1351
+ "Ts": "Ц",
1352
+ "TS": "Ц", # but not tS
1353
+ "e": "э",
1354
+ "E": "э",
1355
+ "sh": "сҳ",
1356
+ "Sh": "Сҳ",
1357
+ "SH": "СҲ",
1358
+ "yo": "йо",
1359
+ "Yo": "Йо",
1360
+ "YO": "ЙО",
1361
+ "yu": "йу",
1362
+ "Yu": "Йу",
1363
+ "YU": "ЙУ",
1364
+ "ya": "йа",
1365
+ "Ya": "Йа",
1366
+ "YA": "ЙА",
1367
+ }
1368
+
1369
+ # standardize some characters
1370
+ # the first one is the windows string, the second one is the mac string
1371
+ text = text.replace("ʻ", "‘")
1372
+
1373
+ def replace_soft_sign_words(m):
1374
+ word = m.group(1)
1375
+ if word.isupper():
1376
+ result = SOFT_SIGN_WORDS[word.lower()].upper()
1377
+ elif word[0].isupper():
1378
+ result = SOFT_SIGN_WORDS[word.lower()]
1379
+ result = result[0].upper() + result[1:]
1380
+ else:
1381
+ result = SOFT_SIGN_WORDS[word.lower()]
1382
+ return result
1383
+
1384
+ for word in SOFT_SIGN_WORDS:
1385
+ text = re.sub(r"\b(%s)" % word, replace_soft_sign_words, text, flags=re.U)
1386
+
1387
+ def replace_exception_words(m):
1388
+ """Replace ц (or э) only leaving other characters unchanged"""
1389
+ return "%s%s%s" % (
1390
+ m.group(1)[: m.start(2)],
1391
+ exception_words_rules[m.group(2)],
1392
+ m.group(1)[m.end(2) :],
1393
+ )
1394
+
1395
+ # loop because of python's limit of 100 named groups
1396
+ for word in list(TS_WORDS.keys()) + list(E_WORDS.keys()):
1397
+ text = re.sub(r"\b(%s)" % word, replace_exception_words, text, flags=re.U)
1398
+
1399
+ # compounds
1400
+ text = re.sub(
1401
+ r"(%s)" % "|".join(compounds_first.keys()),
1402
+ lambda x: compounds_first[x.group(1)],
1403
+ text,
1404
+ flags=re.U,
1405
+ )
1406
+
1407
+ text = re.sub(
1408
+ r"(%s)" % "|".join(compounds_second.keys()),
1409
+ lambda x: compounds_second[x.group(1)],
1410
+ text,
1411
+ flags=re.U,
1412
+ )
1413
+
1414
+ text = re.sub(
1415
+ r"\b(%s)" % "|".join(beginning_rules.keys()),
1416
+ lambda x: beginning_rules[x.group(1)],
1417
+ text,
1418
+ flags=re.U,
1419
+ )
1420
+
1421
+ text = re.sub(
1422
+ r"(%s)(%s)" % ("|".join(LATIN_VOWELS), "|".join(after_vowel_rules.keys())),
1423
+ lambda x: "%s%s" % (x.group(1), after_vowel_rules[x.group(2)]),
1424
+ text,
1425
+ flags=re.U,
1426
+ )
1427
+
1428
+ text = re.sub(
1429
+ r"(%s)" % "|".join(LATIN_TO_CYRILLIC.keys()),
1430
+ lambda x: LATIN_TO_CYRILLIC[x.group(1)],
1431
+ text,
1432
+ flags=re.U,
1433
+ )
1434
+
1435
+ return text
1436
+
1437
+
1438
+ def to_latin(text):
1439
+ """Transliterate cyrillic text to latin using the following rules:
1440
+ 1. ц = s at the beginning of a word.
1441
+ ц = ts in the middle of a word after a vowel.
1442
+ ц = s in the middle of a word after consonant (DEFAULT in CYRILLIC_TO_LATIN)
1443
+ цирк = sirk
1444
+ цех = sex
1445
+ федерация = federatsiya
1446
+ функция = funksiya
1447
+ 2. е = ye at the beginning of a word or after a vowel.
1448
+ е = e in the middle of a word after a consonant (DEFAULT).
1449
+ 3. Сентябр = Sentabr, Октябр = Oktabr
1450
+ """
1451
+ beginning_rules = {"ц": "s", "Ц": "S", "е": "ye", "Е": "Ye"}
1452
+ after_vowel_rules = {"ц": "ts", "Ц": "Ts", "е": "ye", "Е": "Ye"}
1453
+
1454
+ text = re.sub(
1455
+ r"(сент|окт)([яЯ])(бр)",
1456
+ lambda x: "%s%s%s"
1457
+ % (x.group(1), "a" if x.group(2) == "я" else "A", x.group(3)),
1458
+ text,
1459
+ flags=re.IGNORECASE | re.U,
1460
+ )
1461
+
1462
+ text = re.sub(
1463
+ r"\b(%s)" % "|".join(beginning_rules.keys()),
1464
+ lambda x: beginning_rules[x.group(1)],
1465
+ text,
1466
+ flags=re.U,
1467
+ )
1468
+
1469
+ text = re.sub(
1470
+ r"(%s)(%s)" % ("|".join(CYRILLIC_VOWELS), "|".join(after_vowel_rules.keys())),
1471
+ lambda x: "%s%s" % (x.group(1), after_vowel_rules[x.group(2)]),
1472
+ text,
1473
+ flags=re.U,
1474
+ )
1475
+
1476
+ text = re.sub(
1477
+ r"(%s)" % "|".join(CYRILLIC_TO_LATIN.keys()),
1478
+ lambda x: CYRILLIC_TO_LATIN[x.group(1)],
1479
+ text,
1480
+ flags=re.U,
1481
+ )
1482
+
1483
+ return text
1484
+
1485
+
1486
+ def transliterate(text, to_variant):
1487
+ if to_variant == "cyrillic":
1488
+ text = to_cyrillic(text)
1489
+ elif to_variant == "latin":
1490
+ text = to_latin(text)
1491
+
1492
+ return text
1493
+
1494
+
1495
+ if __name__ == "__main__":
1496
+ """cat input_in_lat.txt | python transliterate.py > output_in_cyr.txt"""
1497
+ for line in sys.stdin:
1498
+ sys.stdout.write(transliterate(line, "cyrillic"))