16 private const WB =
'\b'; #
default word boundary; may be updated in the future
31 private function initLcUc( $lcChars, $ucChars, $reinit =
false ) {
32 # bail if we've already done this, unless we are re-initializing
33 if ( !$reinit && $this->lc2uc && $this->uc2lc ) {
37 # split up the lc and uc lists in a unicode-friendly way
39 preg_match_all(
'/./u', $lcChars, $myLc );
43 preg_match_all(
'/./u', $ucChars, $myUc );
46 # map lc to uc and vice versa
47 $this->lc2uc = array_combine( array_values( $myLc ), array_values( $myUc ) );
48 $this->uc2lc = array_combine( array_values( $myUc ), array_values( $myLc ) );
51 private function myLc( $string ) {
52 return strtr( $string, $this->uc2lc );
55 private function myUc( $string ) {
56 return strtr( $string, $this->lc2uc );
60 return $this->
myUc( mb_substr( $string, 0, 1 ) ) . $this->
myLc( mb_substr( $string, 1 ) );
63 private function addMappings( $mapArray, &$A2B, &$B2A, $exactCase =
false,
64 $prePat =
'', $postPat =
'' ) {
65 foreach ( $mapArray as $WordA => $WordB ) {
67 $ucA = $this->
myUc( $WordA );
68 $ucWordA = $this->
myUcWord( $WordA );
69 $ucB = $this->
myUc( $WordB );
70 $ucWordB = $this->
myUcWord( $WordB );
73 # if there are regexes, only map toward backregs
74 if ( !preg_match(
'/\$[1-9]/', $WordA ) ) {
75 $A2B[ $prePat . $WordA . $postPat ] = $WordB;
77 $A2B[ $prePat . $ucWordA . $postPat ] = $ucWordB;
78 $A2B[ $prePat . $ucA . $postPat ] = $ucB;
82 if ( !preg_match(
'/\$[1-9]/', $WordB ) ) {
83 $B2A[ $prePat . $WordB . $postPat ] = $WordA;
85 $B2A[ $prePat . $ucWordB . $postPat ] = $ucWordA;
86 $B2A[ $prePat . $ucB . $postPat ] = $ucA;
93 # init lc and uc, as needed
94 $this->
initLcUc( $lcChars, $ucChars );
96 # no regex prefix/suffix needed
99 $this->Latn2CyrlExceptions, $this->Cyrl2LatnExceptions );
101 $this->Cyrl2LatnExceptions, $this->Latn2CyrlExceptions );
103 $this->Cyrl2LatnExceptions, $this->Latn2CyrlExceptions,
true );
105 # load C2L and L2C bidirectional affix mappings
107 $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns,
false,
'/' . self::WB,
'/u' );
109 $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns,
false,
'/', self::WB .
'/u' );
111 # tack on one-way mappings to the ends of the prefix and suffix patterns
124 # Carefully ordered many-to-one mappings
125 # these are ordered so C2L is correct (the later Latin one)
126 # see also L2C mappings below
127 'fevqülade' =>
'февкъульаде',
'fevqulade' =>
'февкъульаде',
128 'beyude' =>
'бейуде',
'beyüde' =>
'бейуде',
129 'curat' =>
'джурьат',
'cürat' =>
'джурьат',
130 'mesul' =>
'месуль',
'mesül' =>
'месуль',
139 #### Cyrillic to Latin
140 'аджыумер' =>
'acıümer',
'аджыусеин' =>
'acıüsein',
'алейкум' =>
'aleyküm',
141 'бозтюс' =>
'boztüs',
'боливия' =>
'boliviya',
'большевик' =>
'bolşevik',
'борис' =>
'boris',
142 'борнен' =>
'bornen',
'бублик' =>
'bublik',
'буддизм' =>
'buddizm',
'буддист' =>
'buddist',
143 'буженина' =>
'bujenina',
'бузкесен' =>
'buzkesen',
'букинист' =>
'bukinist',
144 'буксир' =>
'buksir',
'бульбул' =>
'bülbül',
'бульвар' =>
'bulvar',
'бульдог' =>
'buldog',
145 'бульдозер' =>
'buldozer',
'бульон' =>
'bulyon',
'бумеранг' =>
'bumerang',
146 'бунен' =>
'bunen',
'буннен' =>
'bunnen',
'бус-бутюн' =>
'büs-bütün',
147 'бутерброд' =>
'buterbrod',
'бутилен' =>
'butilen',
'бутилир' =>
'butilir',
148 'буфер' =>
'bufer',
'буфет' =>
'bufet',
'гобелен' =>
'gobelen',
'гомео' =>
'gomeo',
149 'горизонт' =>
'gorizont',
'госпитал' =>
'gospital',
'готтентот' =>
'gottentot',
150 'гофрир' =>
'gofrir',
'губерн' =>
'gubern',
'гуверн' =>
'guvern',
'гугенот' =>
'gugenot',
151 'гуливер' =>
'guliver',
'гуна' =>
'güna',
'гунях' =>
'günâh',
'гургуль' =>
'gürgül',
152 'гуя' =>
'güya',
'дёрткуль' =>
'dörtkül',
'джуньджу' =>
'cüncü',
'ёлнен' =>
'yolnen',
153 'зумбуль' =>
'zümbül',
'ильи' =>
'ilyi',
'ишунь' =>
'işün',
'ковер' =>
'kover',
'код' =>
'kod',
154 'койлю' =>
'köylü',
'кокагъач' =>
'kökağaç',
'кокбаштанкъара' =>
'kökbaştanqara',
155 'кокгогерджин' =>
'kökgögercin',
'кокдогъан' =>
'kökdoğan',
'коккозю' =>
'kökközü',
156 'коккъузгъун' =>
'kökquzğun',
'коклюш' =>
'koklüş',
'кокташ' =>
'köktaş',
157 'коктогъан' =>
'köktoğan',
'коктотай' =>
'köktotay',
'коллег' =>
'kolleg',
158 'коллект' =>
'kollekt',
'коллекц' =>
'kollekts',
'колье' =>
'kolye',
'кольраби' =>
'kolrabi',
159 'кольцов' =>
'koltsov',
'комби' =>
'kombi',
'комеди' =>
'komedi',
'коменда' =>
'komenda',
160 'комета' =>
'kometa',
'комив' =>
'komiv',
'комис' =>
'komis',
'комит' =>
'komit',
161 'комм' =>
'komm',
'коммент' =>
'komment',
'коммерс' =>
'kommers',
'коммерц' =>
'kommerts',
162 'комп' =>
'komp',
'конве' =>
'konve',
'конгени' =>
'kongeni',
'конденс' =>
'kondens',
163 'кондил' =>
'kondil',
'кондитер' =>
'konditer',
'кондиц' =>
'kondits',
'коник' =>
'konik',
164 'конкис' =>
'konkis',
'консерв' =>
'konserv',
'конси' =>
'konsi',
'контейнер' =>
'konteyner',
165 'конти' =>
'konti',
'конфе' =>
'konfe',
'конфи' =>
'konfi',
'конце' =>
'kontse',
166 'конъю' =>
'konyu',
'коньки' =>
'konki',
'коньяк' =>
'konyak',
'копирле' =>
'kopirle',
167 'копия' =>
'kopiya',
'корде' =>
'korde',
'кореиз' =>
'koreiz',
'коренн' =>
'korenn',
168 'корея' =>
'koreya',
'кориа' =>
'koria',
'коридор' =>
'koridor',
'корне' =>
'korne',
169 'корнеев' =>
'korneyev',
'корни' =>
'korni',
'корре' =>
'korre',
'косме' =>
'kosme',
170 'космик' =>
'kosmik',
'костюм' =>
'kostüm',
'котельн' =>
'koteln',
'котир' =>
'kotir',
171 'котлет' =>
'kotlet',
'кочерг' =>
'koçerg',
'коше' =>
'köşe',
'куби' =>
'kubi',
172 'кудрин' =>
'kudrin',
'кузнец' =>
'kuznets',
'кулинар' =>
'kulinar',
'кулич' =>
'kuliç',
173 'кульмин' =>
'kulmin',
'культаш' =>
'kültaş',
'культе' =>
'külte',
'культ' =>
'kult',
174 'куркулет' =>
'kürkület',
'курсив' =>
'kursiv',
'кушет' =>
'kuşet',
'кушку' =>
'küşkü',
175 'куюк' =>
'küyük',
'къолязма' =>
'qolyazma',
'къуртумер' =>
'qurtümer',
176 'къуртусеин' =>
'qurtüsein',
'медьюн' =>
'medyun',
'месули' =>
'mesüli',
177 'мефкуре' =>
'mefküre',
'могедек' =>
'mögedek',
'мумиё' =>
'mumiyo',
'мумиф' =>
'mumif',
178 'муче' =>
'müçe',
'муюз' =>
'müyüz',
'нумюне' =>
'nümüne',
'обел' =>
'obel',
'обер' =>
'ober',
179 'обли' =>
'obli',
'обсе' =>
'obse',
'обт' =>
'obt',
'огне' =>
'ogne',
'одеколон' =>
'odekolon',
180 'одеса' =>
'odesa',
'одесса' =>
'odessa',
'озерки' =>
'ozerki',
'озерн' =>
'ozern',
181 'озёрн' =>
'ozörn',
'озюя' =>
'özüya',
'океан' =>
'okean',
'окси' =>
'oksi',
182 'октет' =>
'oktet',
'олеа' =>
'olea',
'олеи' =>
'olei',
'оленев' =>
'olenev',
'олив' =>
'oliv',
183 'олиг' =>
'olig',
'олимп' =>
'olimp',
'олиф' =>
'olif',
'ольчер' =>
'ölçer',
'омле' =>
'omle',
184 'онен' =>
'onen',
'оннен' =>
'onnen',
'опера' =>
'opera',
'опере' =>
'opere',
185 'оптим' =>
'optim',
'опци' =>
'optsi',
'орби' =>
'orbi',
'орден' =>
'orden',
186 'ордер' =>
'order',
'ордин' =>
'ordin',
'ореа' =>
'orea',
'орех' =>
'oreh',
187 'ориент' =>
'oriyent',
'оркестр' =>
'orkestr',
'орлин' =>
'orlin',
'орни' =>
'orni',
188 'орхи' =>
'orhi',
'осци' =>
'ostsi',
'офис' =>
'ofis',
'офиц' =>
'ofits',
'офсет' =>
'ofset',
189 'очерк' =>
'oçerk',
'оюннен' =>
'oyunnen',
'побед' =>
'pobed',
'полево' =>
'polevo',
190 'поли' =>
'poli',
'полюшко' =>
'polüşko',
'помидор' =>
'pomidor',
'пониз' =>
'poniz',
191 'порфир' =>
'porfir',
'потелов' =>
'potelov',
'потюк' =>
'pötük',
'почетн' =>
'poçetn',
192 'почётн' =>
'poçötn',
'пукле' =>
'pükle',
'пуркю' =>
'pürkü',
'пурумют' =>
'purümüt',
193 'пускул' =>
'püskül',
'пускур' =>
'püskür',
'пусюр' =>
'püsür',
'пуфле' =>
'püfle',
194 'сейитумер' =>
'seyitümer',
'сейитусеин' =>
'seyitüsein',
'сейитягъя' =>
'seyityağya',
195 'сейитягья' =>
'seyityagya',
'сейитяхья' =>
'seyityahya',
'сейитяя' =>
'seyityaya',
196 'сеитумер' =>
'seitümer',
'сеитусеин' =>
'seitüsein',
'сеитягъя' =>
'seityağya',
197 'сеитягья' =>
'seityagya',
'сеитяхья' =>
'seityahya',
'сеитяя' =>
'seityaya',
198 'сурет' =>
'süret',
'увертюра' =>
'uvertüra',
'угле' =>
'ugle',
'узвий' =>
'uzviy',
199 'улица' =>
'ulitsa',
'ультимат' =>
'ultimat',
'ультра' =>
'ultra',
'ульянов' =>
'ulyanov',
200 'универ' =>
'univer',
'уник' =>
'unik',
'унис' =>
'unis',
'унит' =>
'unit',
'униф' =>
'unif',
201 'унтер' =>
'unter',
'урьян' =>
'uryan',
'утил' =>
'util',
'уткин' =>
'utkin',
202 'учебн' =>
'uçebn',
'шовини' =>
'şovini',
'шоссе' =>
'şosse',
'шубин' =>
'şubin',
203 'шунен' =>
'şunen',
'шуннен' =>
'şunnen',
'шунчюн' =>
'şunçün',
'щёлкино' =>
'şçolkino',
204 'эмирусеин' =>
'emirüsein',
'юзбашы' =>
'yüzbaşı',
'юзйыл' =>
'yüzyıl',
'юртер' =>
'yurter',
205 'ющенко' =>
'yuşçenko',
207 ### Carefully ordered many-to-one mappings
208 # these are ordered so L2C is correct (the later Cyrillic one)
209 # see also $ManyToOneC2LMappings above for C2L
210 'шофер' =>
'şoför',
'шофёр' =>
'şoför',
211 'бугун' =>
'bugün',
'бугунь' =>
'bugün',
212 'демирёл' =>
'demiryol',
'демиръёл' =>
'demiryol',
213 'гонъюл' =>
'göñül',
'гонъюль' =>
'göñül',
214 'коккоз' =>
'kökköz',
'коккозь' =>
'kökköz',
215 'корбекул' =>
'körbekül',
'корьбекул' =>
'körbekül',
'корьбекуль' =>
'körbekül',
216 'муур' =>
'müür',
'муурь' =>
'müür',
217 'оригинал' =>
'original',
'оригиналь' =>
'original',
218 'пускю' =>
'püskü',
'пуськю' =>
'püskü',
219 'къарагоз' =>
'qaragöz',
'къарагозь' =>
'qaragöz',
221 #### Latin to Cyrillic (deduped from above)
225 'актуаль' =>
'aktual',
'диагональ' =>
'diagonal',
'документаль' =>
'dokumental',
226 'эмсаль' =>
'emsal',
'фааль' =>
'faal',
'феодаль' =>
'feodal',
'фестиваль' =>
'festival',
227 'горизонталь' =>
'gorizontal',
'хроникаль' =>
'hronikal',
'идеаль' =>
'ideal',
228 'инструменталь' =>
'instrumental',
'икъмаль' =>
'iqmal',
'икъбаль' =>
'iqbal',
229 'истикъбаль' =>
'istiqbal',
'истикъляль' =>
'istiqlâl',
'италия' =>
'italiya',
230 'италья' =>
'italya',
'ишгъаль' =>
'işğal',
'кафедраль' =>
'kafedral',
'казуаль' =>
'kazual',
231 'коллегиаль' =>
'kollegial',
'колоссаль' =>
'kolossal',
'коммуналь' =>
'kommunal',
232 'кординаль' =>
'kordinal',
'криминаль' =>
'kriminal',
'легаль' =>
'legal',
233 'леталь' =>
'letal',
'либераль' =>
'liberal',
'локаль' =>
'lokal',
234 'магистраль' =>
'magistral',
'материаль' =>
'material',
'машиналь' =>
'maşinal',
235 'меаль' =>
'meal',
'медальон' =>
'medalyon',
'медаль' =>
'medal',
236 'меридиональ' =>
'meridional',
'мешъаль' =>
'meşal',
'минераль' =>
'mineral',
237 'минималь' =>
'minimal',
'мисаль' =>
'misal',
'модаль' =>
'modal',
'музыкаль' =>
'muzıkal',
238 'номиналь' =>
'nominal',
'нормаль' =>
'normal',
'оптималь' =>
'optimal',
239 'орбиталь' =>
'orbital',
'педаль' =>
'pedal',
'пропорциональ' =>
'proportsional',
240 'профессиональ' =>
'professional',
'радикаль' =>
'radikal',
'рациональ' =>
'ratsional',
241 'реаль' =>
'real',
'региональ' =>
'regional',
'суаль' =>
'sual',
'шималь' =>
'şimal',
242 'территориаль' =>
'territorial',
'тимсаль' =>
'timsal',
'тоталь' =>
'total',
243 'уникаль' =>
'unikal',
'универсаль' =>
'universal',
'вертикаль' =>
'vertikal',
244 'виртуаль' =>
'virtual',
'визуаль' =>
'vizual',
'вуаль' =>
'vual',
'зональ' =>
'zonal',
245 'зуаль' =>
'zual',
'италь' =>
'ital',
247 # слова с мягким знаком перед а, о, у, э
248 # Words with a soft sign before а, о, у, э
249 'бильакис' =>
'bilakis',
'маальэсеф' =>
'maalesef',
'мельун' =>
'melun',
'озьара' =>
'özara',
250 'вельасыл' =>
'velasıl',
'ельаякъ' =>
'yelayaq',
252 # другие слова с мягким знаком
253 # Other words with a soft sign
254 'альбатрос' =>
'albatros',
'альбинос' =>
'albinos',
'альбом' =>
'albom',
255 'альбумин' =>
'albumin',
'алфавит' =>
'alfavit',
'альфа' =>
'alfa',
'альманах' =>
'almanah',
256 'альпинист' =>
'alpinist',
'альтерн' =>
'altern',
'альтру' =>
'altru',
257 'альвеола' =>
'alveola',
'ансамбль' =>
'ansambl',
'аньане' =>
'anane',
'асфальт' =>
'asfalt',
258 'бальнео' =>
'balneo',
'баарь' =>
'baar',
'базальт' =>
'bazalt',
'бинокль' =>
'binokl',
259 'девальв' =>
'devalv',
'факульт' =>
'fakult',
'фальсиф' =>
'falsif',
'фольклор' =>
'folklor',
260 'гальван' =>
'galvan',
'геральд' =>
'gerald',
'женьшень' =>
'jenşen',
261 'инвентарь' =>
'inventar',
'кальк' =>
'kalk',
'кальмар' =>
'kalmar',
'консульт' =>
'konsult',
262 'контроль' =>
'kontrol',
'культур' =>
'kultur',
'лагерь' =>
'lager',
'макъбуль' =>
'maqbul',
263 'макъуль' =>
'maqul',
'мальт' =>
'malt',
'мальземе' =>
'malzeme',
'меджуль' =>
'mecul',
264 'мешгуль' =>
'meşgül',
'мешгъуль' =>
'meşğul',
'мульти' =>
'multi',
265 'мусульман' =>
'musulman',
'нефть' =>
'neft',
'пальто' =>
'palto',
'пароль' =>
'parol',
266 'патруль' =>
'patrul',
'пенальти' =>
'penalti',
'къальби' =>
'qalbi',
'къальпке' =>
'qalpke',
267 'къальплер' =>
'qalpler',
'къальпни' =>
'qalpni',
'къальпте' =>
'qalpte',
'къаарь' =>
'qaar',
268 'ресуль' =>
'resul',
'рыцарь' =>
'rıtsar',
'рояль' =>
'royal',
'саарь' =>
'saar',
269 'спираль' =>
'spiral',
'сульх' =>
'sulh',
'сумбуль' =>
'sumbul',
'суньий' =>
'suniy',
270 'темаюль' =>
'temayul',
'шампунь' =>
'şampun',
'вальс' =>
'vals',
'вальц' =>
'valts',
271 'ведомость' =>
'vedomost',
'зулькъарнейн' =>
'zulqarneyn',
'январь' =>
'yanvar',
272 'февраль' =>
'fevral',
'июнь' =>
'iyün',
'сентябрь' =>
'sentâbr',
'октябрь' =>
'oktâbr',
273 'ноябрь' =>
'noyabr',
'декабрь' =>
'dekabr',
275 # слова с твёрдым знаком
276 # Words with a solid sign
277 'бидъат' =>
'bidat',
'бузъюрек' =>
'buzyürek',
'атешъюрек' =>
'ateşyürek',
278 'алъянакъ' =>
'alyanaq',
'инъекц' =>
'inyekts',
'мефъум' =>
'mefum',
'мешъум' =>
'meşum',
279 'объект' =>
'obyekt',
'разъезд' =>
'razyezd',
'субъект' =>
'subyekt',
'хавъяр' =>
'havyar',
284 'ящик' =>
'yaşçik',
'мещан' =>
'meşçan',
288 'акциз' =>
'aktsiz',
'ацет' =>
'atset',
'блиц' =>
'blits',
'бруцеллёз' =>
'brutsellöz',
289 'доцент' =>
'dotsent',
'фармацевт' =>
'farmatsevt',
'глицер' =>
'glitser',
290 'люцерна' =>
'lütserna',
'лицей' =>
'litsey',
'меццо' =>
'metstso',
'наци' =>
'natsi',
291 'проце' =>
'protse',
'рецеп' =>
'retsep',
'реценз' =>
'retsenz',
'теплица' =>
'teplitsa',
292 'вице' =>
'vitse',
'швейцар' =>
'şveytsar',
'богородиц' =>
'bogorodits',
293 'бруцел' =>
'brutsel',
'дацюк' =>
'datsük',
'доницетти' =>
'donitsetti',
294 'драцена' =>
'dratsena',
'контрацеп' =>
'kontratsep',
'коцюб' =>
'kotsüb',
295 'меценат' =>
'metsenat',
'мицел' =>
'mitsel',
'моцарт' =>
'motsart',
'плац' =>
'plats',
296 'плацен' =>
'platsen',
'прецедент' =>
'pretsedent',
'прецес' =>
'pretses',
297 'прицеп' =>
'pritsep',
'спец' =>
'spets',
'троиц' =>
'troits',
'шприц' =>
'şprits',
298 'эпицентр' =>
'epitsentr',
'яценюк' =>
'yatsenük',
302 'агъартс' =>
'ağarts',
'агъыртс' =>
'ağırts',
'бильдиртс' =>
'bildirts',
'битсин' =>
'bitsin',
303 'буюльтс' =>
'büyülts',
'буютс' =>
'büyüts',
'гебертс' =>
'geberts',
'делиртс' =>
'delirts',
304 'эгрильтс' =>
'egrilts',
'эксильтс' =>
'eksilts',
'эшитс' =>
'eşits',
'иритс' =>
'irits',
305 'иситс' =>
'isits',
'ичиртс' =>
'içirts',
'кертсин' =>
'kertsin',
'кенишлетс' =>
'kenişlets',
306 'кийсетс' =>
'kiysets',
'копюртс' =>
'köpürts',
'косьтертс' =>
'kösterts',
307 'кучертс' =>
'küçerts',
'кучюльтс' =>
'küçülts',
'пертсин' =>
'pertsin',
'къайтс' =>
'qayts',
308 'къутсуз' =>
'qutsuz',
'орьтс' =>
'örts',
'отьс' =>
'öts',
'тартс' =>
'tarts',
309 'тутсун' =>
'tutsun',
'тюнъюльтс' =>
'tüñülts',
'тюртс' =>
'türts',
'янъартс' =>
'yañarts',
310 'ебертс' =>
'yeberts',
'ешертс' =>
'yeşerts',
'йиритс' =>
'yirits',
313 # different exceptions
314 'бюджет' =>
'bücet',
'бюллет' =>
'büllet',
'бюро' =>
'büro',
'бюст' =>
'büst',
315 'диалог' =>
'dialog',
'ханымэфенди' =>
'hanımefendi',
'каньон' =>
'kanyon',
316 'кирил' =>
'kiril',
'кирилл' =>
'kirill',
'кёрджа' =>
'körca',
'коy' =>
'köy',
317 'кулеръюзь' =>
'küleryüz',
'маалле' =>
'маальle',
'майор' =>
'mayor',
'маниал' =>
'manиаль',
318 'нормала' =>
'нормальa',
'проект' =>
'proekt',
'район' =>
'rayon',
'сойады' =>
'soyadı',
319 'спортсмен' =>
'sportsmen',
'услюп' =>
'üslüp',
'услюб' =>
'üslüb',
'вакъиал' =>
'vaqиаль',
320 'юзйыллыкъ' =>
'yüzyıllıq',
'койот' =>
'koyot',
324 'адольф' =>
'adolf',
'альберт' =>
'albert',
'бешуй' =>
'beşüy',
'флотск' =>
'flotsk',
325 'гайана' =>
'gayana',
'грэсовский' =>
'gresovskiy',
'гриц' =>
'grits',
'гурджи' =>
'gürci',
326 'игорь' =>
'igor',
'ильич' =>
'ilyiç',
'ильин' =>
'ilyin',
'исмаил' =>
'ismail',
327 'киттс' =>
'kitts',
'комсомольск' =>
'komsomolsk',
'корьбекулю' =>
'körbekülü',
328 'куницын' =>
'kunitsın',
'львив' =>
'lviv',
'львов' =>
'lvov',
'марьино' =>
'maryino',
329 'махульдюр' =>
'mahuldür',
'павел' =>
'pavel',
'пантикапейон' =>
'pantikapeyon',
330 'къуртсейит' =>
'qurtseyit',
'къуртсеит' =>
'qurtseit',
'смаил' =>
'smail',
331 'советск' =>
'sovetsk',
'шемьи-заде' =>
'şemi-zade',
'тсвана' =>
'tsvana',
332 'учьэвли' =>
'üçevli',
'йохан' =>
'yohan',
'йорк' =>
'york',
'винныця' =>
'vinnıtsâ',
333 'винница' =>
'vinnitsa',
'хмельницк' =>
'hmelnitsk',
'хмельныцк' =>
'hmelnıtsk',
334 'зайце' =>
'zaytse',
'чистеньк' =>
'çistenk',
'кольчуг' =>
'kolçug',
'ручьи' =>
'ruçyi',
335 'ботсвана' =>
'botsvana',
'большой' =>
'bolşoy',
'большое' =>
'bolşoye',
336 'большая' =>
'bolşaya',
'ущелье' =>
'uşçelye',
'ущельное' =>
'uşçelnoye',
337 'предущельное' =>
'preduşçelnoye',
'новенькое' =>
'novenkoye',
'новосельц' =>
'novoselts',
338 'мелко' =>
'melko',
'овощ' =>
'ovoşç',
'перепёлк' =>
'perepölk',
'рощин' =>
'roşçin',
339 'братск' =>
'bratsk',
'краснофлотск' =>
'krasnoflotsk',
'синицин' =>
'sinitsin',
340 'синицын' =>
'sinitsın',
'льгов' =>
'lgov',
'желто' =>
'jelto',
'жёлт' =>
'jölt',
341 'пермь' =>
'perm',
'солдатск' =>
'soldatsk',
'кольцо' =>
'koltso',
'шелко' =>
'şelko',
342 'охотск' =>
'ohotsk',
'марий эл' =>
'mariy el',
'мариуполь' =>
'mariupol',
343 'белгород' =>
'belgorod',
'иркутск' =>
'irkutsk',
'Иркутск' =>
'İrkutsk',
'орёл' =>
'oröl',
344 'рязанск' =>
'râzansk',
'рязань' =>
'râzan',
'тверск' =>
'tversk',
'тверь' =>
'tver',
345 'ярославль' =>
'yaroslavl',
'благовеще' =>
'blagoveşçe',
'мальдив' =>
'maldiv',
346 'бальбек' =>
'balbek',
'альчик' =>
'alçik',
'харьков' =>
'harkov',
'волынск' =>
'volınsk',
358 'ОБСЕ' =>
'OBSE',
'КъМДж' =>
'QMC',
'КъДж' =>
'QC',
'КъАЭ' =>
'QAE',
'ГъСМК' =>
'ĞSMK',
359 'ШСДжБ' =>
'ŞSCB',
'КъМШСДж' =>
'QMŞSC',
'КъАССР' =>
'QASSR',
'КъДМПУ' =>
'QDMPU',
372 'иаль' =>
'ial',
'нуль' =>
'nul',
'кой' =>
'köy',
'койнинъ' =>
'köyniñ',
'койни' =>
'köyni',
373 'койге' =>
'köyge',
'койде' =>
'köyde',
'койдеки' =>
'köydeki',
'койден' =>
'köyden',
374 'козь' =>
'köz',
'-юнджи' =>
'-ünci',
'-юнджиде' =>
'-üncide',
'-юнджиден' =>
'-ünciden',
376 # originally L2C, here swapped
377 'льная' =>
'lnaya',
'льное' =>
'lnoye',
'льный' =>
'lnıy',
'льний' =>
'lniy',
378 'льская' =>
'lskaya',
'льский' =>
'lskiy',
'льское' =>
'lskoye',
'ополь' =>
'opol',
379 'щее' =>
'şçeye',
'щий' =>
'şçiy',
'щая' =>
'şçaya',
'цепс' =>
'tseps',
391 'буюк([^ъ])' =>
'büyük$1',
'бую([гдйлмнпрстчшc])(и)' =>
'büyü$1$2',
392 'буют([^ыа])' =>
'büyüt$1',
'джонк([^ъ])' =>
'cönk$1',
'коюм' =>
'köyüm',
'коюнъ' =>
'köyüñ',
393 'коюн([ди])' =>
'köyün$1',
'куе' =>
'küye',
'куркке' =>
'kürkke',
'куркни' =>
'kürkni',
394 'куркте' =>
'kürkte',
'куркчю' =>
'kürkçü',
'кою' =>
'köyü',
397 # арабизмы на муи- муэ- / Arabic муи- муэ-
398 'му([иэИЭ])' =>
'mü$1',
400 # originally L2C, here swapped
401 'роль$1' =>
'rol([^ü]|' . self::WB .
')',
402 'усть$1' =>
'üst([^ü]|' . self::WB .
')',
405 'ком-кок' =>
'köm-kök',
414 $this->Cyrl2LatnRegexes = [
415 # относятся ко всему слову
421 '/' . self::WB .
'КъЮШ' . self::WB .
'/u' =>
'QYŞ',
422 '/' . self::WB .
'ЮШ' . self::WB .
'/u' =>
'YŞ',
424 '/' . self::WB .
'кок' . self::WB .
'/u' =>
'kök',
425 '/' . self::WB .
'Кок' . self::WB .
'/u' =>
'Kök',
426 '/' . self::WB .
'КОК' . self::WB .
'/u' =>
'KÖK',
427 '/' . self::WB .
'ком-кок' . self::WB .
'/u' =>
'köm-kök',
428 '/' . self::WB .
'Ком-кок' . self::WB .
'/u' =>
'Köm-kök',
429 '/' . self::WB .
'КОМ-КОК' . self::WB .
'/u' =>
'KÖM-KÖK',
431 '/' . self::WB .
'коп' . self::WB .
'/u' =>
'köp',
432 '/' . self::WB .
'Коп' . self::WB .
'/u' =>
'Köp',
433 '/' . self::WB .
'КОП' . self::WB .
'/u' =>
'KÖP',
435 '/' . self::WB .
'курк' . self::WB .
'/u' =>
'kürk',
436 '/' . self::WB .
'Курк' . self::WB .
'/u' =>
'Kürk',
437 '/' . self::WB .
'КУРК' . self::WB .
'/u' =>
'KÜRK',
439 '/' . self::WB .
'ог' . self::WB .
'/u' =>
'ög',
440 '/' . self::WB .
'Ог' . self::WB .
'/u' =>
'Ög',
441 '/' . self::WB .
'ОГ' . self::WB .
'/u' =>
'ÖG',
443 '/' . self::WB .
'юрип' . self::WB .
'/u' =>
'yürip',
444 '/' . self::WB .
'Юрип' . self::WB .
'/u' =>
'Yürip',
445 '/' . self::WB .
'ЮРИП' . self::WB .
'/u' =>
'YÜRİP',
447 '/' . self::WB .
'юз' . self::WB .
'/u' =>
'yüz',
448 '/' . self::WB .
'Юз' . self::WB .
'/u' =>
'Yüz',
449 '/' . self::WB .
'ЮЗ' . self::WB .
'/u' =>
'YÜZ',
451 '/' . self::WB .
'юк' . self::WB .
'/u' =>
'yük',
452 '/' . self::WB .
'Юк' . self::WB .
'/u' =>
'Yük',
453 '/' . self::WB .
'ЮК' . self::WB .
'/u' =>
'YÜK',
455 '/' . self::WB .
'буюп' . self::WB .
'/u' =>
'büyüp',
456 '/' . self::WB .
'Буюп' . self::WB .
'/u' =>
'Büyüp',
457 '/' . self::WB .
'БУЮП' . self::WB .
'/u' =>
'BÜYÜP',
459 '/' . self::WB .
'буюк' . self::WB .
'/u' =>
'büyük',
460 '/' . self::WB .
'Буюк' . self::WB .
'/u' =>
'Büyük',
461 '/' . self::WB .
'БУЮК' . self::WB .
'/u' =>
'BÜYÜK',
463 '/' . self::WB .
'джонк' . self::WB .
'/u' =>
'cönk',
464 '/' . self::WB .
'Джонк' . self::WB .
'/u' =>
'Cönk',
465 '/' . self::WB .
'ДЖОНК' . self::WB .
'/u' =>
'CÖNK',
466 '/' . self::WB .
'джонкю' . self::WB .
'/u' =>
'cönkü',
467 '/' . self::WB .
'Джонкю' . self::WB .
'/u' =>
'Cönkü',
468 '/' . self::WB .
'ДЖОНКЮ' . self::WB .
'/u' =>
'CÖNKÜ',
470 '/' . self::WB .
'куркчи/u' =>
'kürkçi',
471 '/' . self::WB .
'Куркчи/u' =>
'Kürkçi',
472 '/' . self::WB .
'КУРКЧИ/u' =>
'KÜRKÇI',
474 '/' . self::WB .
'устке' . self::WB .
'/u' =>
'üstke',
475 '/' . self::WB .
'Устке' . self::WB .
'/u' =>
'Üstke',
476 '/' . self::WB .
'УСТКЕ' . self::WB .
'/u' =>
'ÜSTKE',
477 '/' . self::WB .
'устте' . self::WB .
'/u' =>
'üstte',
478 '/' . self::WB .
'Устте' . self::WB .
'/u' =>
'Üstte',
479 '/' . self::WB .
'УСТТЕ' . self::WB .
'/u' =>
'ÜSTTE',
480 '/' . self::WB .
'усттен' . self::WB .
'/u' =>
'üstten',
481 '/' . self::WB .
'Усттен' . self::WB .
'/u' =>
'Üstten',
482 '/' . self::WB .
'УСТТЕН' . self::WB .
'/u' =>
'ÜSTTEN',
484 # отдельно стоящие Ё и Я
485 # stand-alone Ё and Я
486 '/' . self::WB .
'Я' . self::WB .
'/u' =>
'Ya',
487 '/' . self::WB .
'Ё' . self::WB .
'/u' =>
'Yo',
489 # относятся к началу слова
491 '/' . self::WB .
'КъЮШн/u' =>
'QYŞn',
492 '/' . self::WB .
'ЮШн/u' =>
'YŞn',
494 # need to convert digraphs (гъ, къ, нъ, дж) now to match patterns
506 '])([еиэюьü])/u' =>
'$1ö$2$3$4',
509 '])([еиэюьüЕИЭЮЬÜ])/u' =>
'$1Ö$2$3$4',
514 '/' . self::WB .
'о([' .
Crh::C_CONS .
'])([еиэюьü])/u' =>
'ö$1$2',
517 '/' . self::WB .
'О([' .
Crh::C_CONS .
'])([еиэюьüЕИЭЮЬÜ])/u' =>
'Ö$1$2',
523 '/' . self::WB .
'ё([' .
Crh::C_CONS .
'])([ьеюü])/u' =>
'yö$1$2',
524 '/' . self::WB .
'Ё([' .
Crh::C_CONS_LC .
'])([ьеюü])/u' =>
'Yö$1$2',
525 '/' . self::WB .
'Ё([' .
Crh::C_CONS_UC .
'])([ЬЕЮÜ])/u' =>
'YÖ$1$2',
529 '])([еиэюьü])/u' =>
'$1ü$2$3$4',
533 '])([еиэюьüЕИЭЮЬÜ])/u' =>
'$1Ü$2$3$4',
540 '/' . self::WB .
'у([' .
Crh::C_CONS .
'])([еиэюьü])/u' =>
'ü$1$2',
541 '/' . self::WB .
'ую([' .
Crh::C_CONS .
'])([еиэюьü])/u' =>
'üyü$1$2',
544 '/' . self::WB .
'У([' .
Crh::C_CONS .
'])([еиэюьüЕИЭЮЬÜ])/u' =>
'Ü$1$2',
545 '/' . self::WB .
'Ую([' .
Crh::C_CONS .
'])([еиэюьü])/u' =>
'Üyü$1$2',
546 '/' . self::WB .
'УЮ([' .
Crh::C_CONS .
'])([еиэюьü])/u' =>
'ÜYÜ$1$2',
555 '/' . self::WB .
'([аыоуеиёюАЫОУЕИЁЮ]?)ю([' .
Crh::C_CONS .
'])([ьеюü])/u' =>
'$1yü$2$3',
556 '/' . self::WB .
'([АЫОУЕИЁЮ]?)Ю([' .
Crh::C_CONS_LC .
'])([ьеюü])/u' =>
'$1Yü$2$3',
557 '/' . self::WB .
'([АЫОУЕИЁЮ]?)Ю([' .
Crh::C_CONS_UC .
'])([ЬЕЮÜ])/u' =>
'$1YÜ$2$3',
560 '/' . self::WB .
'е/u' =>
'ye',
561 '/' . self::WB .
'Е([' .
Crh::C_LC .
'cğñqöü])/u' =>
'Ye$1',
562 '/' . self::WB .
'Е([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'YE$1',
563 '/' . self::WB .
'я/u' =>
'ya',
564 '/' . self::WB .
'Я([' .
Crh::C_LC .
'cğñqöü])/u' =>
'Ya$1',
565 '/' . self::WB .
'Я([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'YA$1',
566 '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е/u' =>
'$1ye',
567 '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' .
Crh::C_LC .
'cğñqöü])/u' =>
'$1Ye$2',
568 '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'$1YE$2',
569 '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])я/u' =>
'$1ya',
570 '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' .
Crh::C_LC .
'cğñqöü])/u' =>
'$1Ya$2',
571 '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'$1YA$2',
573 # не зависят от места в слове
574 # position independent
581 '/козь([^я])/u' =>
'köz$1',
582 '/Козь([^я])/u' =>
'Köz$1',
583 '/КОЗЬ([^Я])/u' =>
'KÖZ$1',
585 # Ö, Ü 1-й заход: ё, ю после согласных > ö, ü
586 # Ö, Ü 1st instance: ё, ю after consonants > ö, ü
592 # остальные вхождения о, у, ё, ю
593 # other occurences of о, у, ё, ю
594 '/Ё([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'YO$1',
595 '/Ю([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'YU$1',
598 '/Ц([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'TS$1',
599 '/Щ([' .
Crh::C_UC .
'CĞÑQÖÜ])/u' =>
'ŞÇ$1',
602 $this->Latn2CyrlRegexes = [
607 '/' . self::WB .
'an' . self::WB .
'/u' =>
'ань',
608 '/' . self::WB .
'An' . self::WB .
'/u' =>
'Ань',
609 '/' . self::WB .
'AN' . self::WB .
'/u' =>
'АНЬ',
610 '/' . self::WB .
'ange' . self::WB .
'/u' =>
'аньге',
611 '/' . self::WB .
'Ange' . self::WB .
'/u' =>
'Аньге',
612 '/' . self::WB .
'ANGE' . self::WB .
'/u' =>
'АНЬГЕ',
613 '/' . self::WB .
'ande' . self::WB .
'/u' =>
'аньде',
614 '/' . self::WB .
'Ande' . self::WB .
'/u' =>
'Аньде',
615 '/' . self::WB .
'ANDE' . self::WB .
'/u' =>
'АНЬДЕ',
616 '/' . self::WB .
'anki' . self::WB .
'/u' =>
'аньки',
617 '/' . self::WB .
'Anki' . self::WB .
'/u' =>
'Аньки',
618 '/' . self::WB .
'ANKİ' . self::WB .
'/u' =>
'АНЬКИ',
619 '/' . self::WB .
'deral' . self::WB .
'/u' =>
'деръал',
620 '/' . self::WB .
'Deral' . self::WB .
'/u' =>
'Деръал',
621 '/' . self::WB .
'DERAL' . self::WB .
'/u' =>
'ДЕРЪАЛ',
622 '/' . self::WB .
'kör' . self::WB .
'/u' =>
'кёр',
623 '/' . self::WB .
'Kör' . self::WB .
'/u' =>
'Кёр',
624 '/' . self::WB .
'KÖR' . self::WB .
'/u' =>
'КЁР',
625 '/' . self::WB .
'mer' . self::WB .
'/u' =>
'мэр',
626 '/' . self::WB .
'Mer' . self::WB .
'/u' =>
'Мэр',
627 '/' . self::WB .
'MER' . self::WB .
'/u' =>
'МЭР',
629 '/' . self::WB .
'cönk/u' =>
'джонк',
630 '/' . self::WB .
'Cönk/u' =>
'Джонк',
631 '/' . self::WB .
'CÖNK/u' =>
'ДЖОНК',
633 # (y)etsin -> етсин/этсин
634 # note that target starts with CYRILLIC е/Е!
635 '/yetsin/u' =>
'етсин',
636 '/Yetsin/u' =>
'Етсин',
637 '/YETSİN/u' =>
'ЕТСИН',
639 # note that target starts with LATIN e/E!
640 # (other transformations will determine CYRILLIC е/э as needed)
641 '/etsin/u' =>
'eтсин',
642 '/Etsin/u' =>
'Eтсин',
643 '/ETSİN/u' =>
'EТСИН',
645 # буква Ё - первый заход
646 # расставляем Ь после согласных
651 '/' . self::WB .
'AQŞ([^AEI]|' . self::WB .
')/u' =>
'АКъШ$1',
653 # буква Ю - первый заход
654 # расставляем Ь после согласных
661 self::WB .
')/u' =>
'$1ö$2ь$3',
663 self::WB .
')/u' =>
'$1Ö$2Ь$3',
665 self::WB .
')/u' =>
'$1ü$2ь$3',
667 self::WB .
')/u' =>
'$1Ü$2Ь$3',
669 # ö и ü в начале слова
670 # случаи, когда нужен Ь
684 '/ts' . self::WB .
'/u' =>
'ц',
685 '/şç' . self::WB .
'/u' =>
'щ',
686 '/Ş[çÇ]' . self::WB .
'/u' =>
'Щ',
687 '/T[sS]' . self::WB .
'/u' =>
'Ц',
694 # относятся к началу слова
695 '/' . self::WB .
'ts/u' =>
'ц',
696 '/' . self::WB .
'T[sS]/u' =>
'Ц',
698 '/' . self::WB .
'şç/u' =>
'щ',
699 '/' . self::WB .
'Ş[çÇ]/u' =>
'Щ',
702 '/(' . self::WB .
'|[' .
Crh::L_VOW .
'аеэяАЕЭЯ])e/u' =>
'$1э',
703 '/(' . self::WB .
'|[' .
Crh::L_VOW_UC .
'АЕЭЯ])E/u' =>
'$1Э',
710 '/' . self::WB .
'ö/u' =>
'о',
711 '/' . self::WB .
'Ö/u' =>
'О',
712 '/' . self::WB .
'ü/u' =>
'у',
713 '/' . self::WB .
'Ü/u' =>
'У',
715 # некоторые исключения
717 '/maal([^e])/u' =>
'мааль$1',
718 '/Maal([^e])/u' =>
'Мааль$1',
719 '/MAAL([^E])/u' =>
'МААЛЬ$1',
720 '/küf([^eü])/u' =>
'куфь$1',
721 '/Küf([^eü])/u' =>
'Куфь$1',
722 '/KÜF([^EÜ])/u' =>
'КУФЬ$1',
723 '/köz([^eü])/u' =>
'козь$1',
724 '/Köz([^eü])/u' =>
'Козь$1',
725 '/KÖZ([^EÜ])/u' =>
'КОЗЬ$1',
730 # некоторые случаи употребления Ц
731 '/tsi([^zñ])/u' =>
'ци$1',
732 '/T[sS][iİ]([^zZñÑ])/u' =>
'ЦИ$1',
733 '/ts([ou])/u' =>
'ц$1',
734 '/T[sS]([oOuU])/u' =>
'Ц$1',
739 '/tsиал/u' =>
'циал',
740 '/TSИАЛ/u' =>
'ЦИАЛ',
743 # remove ьi (note Cyrillic ь and Latin i)
744 '/[ьЬ]([iİ])/u' =>
'$1',
752 # расставляем Ь перед Ё
753 # place Ь in front of Ё
756 # оставшиеся вхождения yo и yö
757 # remaining occurrences of yo and yö
759 '/[yY][oOöÖ]/u' =>
'Ё',
761 # расставляем Ь перед Ю
762 # place Ь in front of Ю
765 # оставшиеся вхождения yu и yü
766 # remaining occurrences of yu and yü
768 '/[yY][uUüÜ]/u' =>
'Ю',
771 # remove ьa (note Cyrillic ь and Latin a)
772 '/[ьЬ]([aA])/u' =>
'$1',
792 '/([клнрст])ь\1/u' =>
'$1$1',
793 '/([КЛНРСТ])Ь\1/u' =>
'$1$1',
805 '/[ьЬ]([гдклмнпрстчшГДКЛМНПРСТЧШ])ы/u' =>
'$1ы',
806 '/Ь([гдклмнпрстчшГДКЛМНПРСТЧШ])Ы/u' =>
'$1Ы',
807 '/[ьЬ]([гкнГКН])([ъЪ])ы/u' =>
'$1$2ы',
808 '/Ь([ГКН])ЪЫ/u' =>
'$1ЪЫ',
815 # частичное решение проблемы слова юз - 100
816 # Partial solution of the problem of the word юз ("100")
817 # notice that these are cross-word patterns
818 '/эки юзь/u' =>
'эки юз',
'/Эки юзь/u' =>
'Эки юз',
'/ЭКИ ЮЗЬ/u' =>
'ЭКИ ЮЗ',
819 '/учь юзь/u' =>
'учь юз',
'/Учь юзь/u' =>
'Учь юз',
'/УЧЬ ЮЗЬ/u' =>
'УЧЬ ЮЗ',
820 '/дёрт юзь/u' =>
'дёрт юз',
'/Дёрт юзь/u' =>
'Дёрт юз',
'/ДЁРТ ЮЗЬ/u' =>
'ДЁРТ ЮЗ',
821 '/беш юзь/u' =>
'беш юз',
'/Беш юзь/u' =>
'Беш юз',
'/БЕШ ЮЗЬ/u' =>
'БЕШ ЮЗ',
822 '/алты юзь/u' =>
'алты юз',
'/Алты юзь/u' =>
'Алты юз',
'/АЛТЫ ЮЗЬ/u' =>
'АЛТЫ ЮЗ',
823 '/еди юзь/u' =>
'еди юз',
'/Еди юзь/u' =>
'Еди юз',
'/ЕДИ ЮЗЬ/u' =>
'ЕДИ ЮЗ',
824 '/секиз юзь/u' =>
'секиз юз',
'/Секиз юзь/u' =>
'Секиз юз',
'/СЕКИЗ ЮЗЬ/u' =>
'СЕКИЗ ЮЗ',
825 '/докъуз юзь/u' =>
'докъуз юз',
'/Докъуз юзь/u' =>
'Докъуз юз',
'/ДОКЪУЗ ЮЗЬ/u' =>
'ДОКЪУЗ ЮЗ',
Crimean Tatar (Qırımtatarca) converter routines.