Qullanıcı:Don Alessandro/Translit/LanguageCrh.php

/*

*/
<?php
/** Crimean Tatar (Qırımtatarca)
  * converter routines
  *
  * @addtogroup Language
  */

require_once( dirname(__FILE__).'/../LanguageConverter.php' );
require_once( dirname(__FILE__).'/LanguageCrh_crh.php' );

// Defines working character ranges
define( 'WORD_BEGINS', '\r\s\"\'\(\)\-<>\[\]\/.,:;!?' ); # 
define( 'WORD_ENDS', '\r\s\"\'\(\)\-<>\[\]\/.,:;!?' ); # 

// Cyrillic
define( 'CRH_C_UC', 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' ); # Crimean Tatar Cyrillic uppercase
define( 'CRH_C_LC', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' ); # Crimean Tatar Cyrillic lowercase
define( 'CRH_C_CONS_UC', 'БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ' ); # Crimean Tatar Cyrillic + CÑ uppercase consonants 
define( 'CRH_C_CONS_LC', 'бвгджзйклмнпрстфхцчшщcñ' ); # Crimean Tatar Cyrillic + CÑ lowercase consonants 
define( 'CRH_C_CONS', 'бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ' ); # Crimean Tatar Cyrillic + CÑ consonants 
define( 'CRH_C_M_CONS', 'бгкмпшcБГКМПШC' ); # Crimean Tatar Cyrillic M-type consonants

// Latin
define( 'CRH_L_UC', 'AÂBCÇDEFGĞHIİJKLMNÑOÖPQRSŞTUÜVXYZ' ); # Crimean Tatar Latin uppercase
define( 'CRH_L_LC', 'aâbcçdefgğhıijklmnñoöpqrsştuüvxyz' ); # Crimean Tatar Latin lowercase
define( 'CRH_L_N_CONS_UC', 'ÇNRSTZ' ); # Crimean Tatar Latin N-type upper case consonants
define( 'CRH_L_N_CONS_LC', 'çnrstz' ); # Crimean Tatar Latin N-type lower case consonants
define( 'CRH_L_N_CONS', 'çnrstzÇNRSTZ' ); # Crimean Tatar Latin N-type consonants
define( 'CRH_L_M_CONS', 'bcgkmpşBCGKMPŞ' ); # Crimean Tatar Latin M-type consonants
define( 'CRH_L_CONS_UC', 'BCÇDFGHJKLMNÑPRSŞTVZ' ); # Crimean Tatar Latin uppercase consonants 
define( 'CRH_L_CONS_LC', 'bcçdfghjklmnñprsştvz' ); # Crimean Tatar Latin lowercase consonants 
define( 'CRH_L_CONS', 'bcçdfghjklmnñprsştvzBCÇDFGHJKLMNÑPRSŞTVZ' ); # Crimean Tatar Latin consonants 
define( 'CRH_L_VOW_UC', 'AÂEIİOÖUÜ' ); # Crimean Tatar Latin uppercase vowels
define( 'CRH_L_VOW', 'aâeıioöuüAÂEIİOÖUÜ' ); # Crimean Tatar Latin vowels
define( 'CRH_L_F_UC', 'EİÖÜ' ); # Crimean Tatar Latin uppercase front vowels 
define( 'CRH_L_F', 'eiöüEİÖÜ' ); # Crimean Tatar Latin front vowels 

class CrhConverter extends LanguageConverter {

	function __construct($langobj, $maincode,
								$variants=array(),
								$variantfallbacks=array(),
								$markup=array(),
								$flags = array()) {
		parent::__construct( $langobj, $maincode,
			$variants, $variantfallbacks, $markup, $flags );
		
		// No point delaying this since they're in code.
		// Waiting until loadDefaultTables() means they never get loaded
		// when the tables themselves are loaded from cache.
		$this->loadRegs();
	}

	function loadDefaultTables() {
		require( dirname(__FILE__)."/../../includes/CrhConversion.php" );
		$crh2Cyrl = array();
		$crh2Latn = array();

		$this->mTables = array(
			'crh-latn' => new ReplacementArray( $crh2Latn ),
			'crh-cyrl' => new ReplacementArray( $crh2Cyrl ),
			'crh'      => new ReplacementArray()
		);
	}


	function loadRegs() { 

		$this->mCyrl2Latn = array
		(
 
		############################
		# относятся ко всему слову #
		############################
		
		'^КъЮШ$' => 'QYŞ',
		'^ЮШ$' => 'YŞ',
		
		'^кою$' => 'köyü',
		'^Кою$' => 'Köyü',
		'^КОЮ$' => 'KÖYÜ',
		
		'^кок$' => 'kök',
		'^Кок$' => 'Kök',
		'^КОК$' => 'KÖK',
		'^ком-кок$' => 'köm-kök',
		'^Ком-кок$' => 'Köm-kök',
		'^КОМ-КОК$' => 'KÖM-KÖK',
		 
		'^коп$' => 'köp',
		'^Коп$' => 'Köp',
		'^КОП$' => 'KÖP',
		
		'^ог$' => 'ög',
		'^Ог$' => 'Ög',
		'^ОГ$' => 'ÖG',
		
		'^юрип$' => 'yürip',
		'^Юрип$' => 'Yürip',
		'^ЮРИП$' => 'YÜRİP',
		
		'^юз$' => 'yüz',
		'^Юз$' => 'Yüz',
		'^ЮЗ$' => 'YÜZ',
		
		'^юк$' => 'yük',
		'^Юк$' => 'Yük',
		'^ЮК$' => 'YÜK',
		
		'^буюп$' => 'büyüp',
		'^Буюп$' => 'Büyüp',
		'^БУЮП$' => 'BÜYÜP',
		
		'^буюк$' => 'büyük',
		'^Буюк$' => 'Büyük',
		'^БУЮК$' => 'BÜYÜK',
		
		'^джонк$' => 'cönk',
		'^Джонк$' => 'Cönk',
		'^ДЖОНК$' => 'CÖNK',
		'^джонкю$' => 'cönkü',
		'^Джонкю$' => 'Cönkü',
		'^ДЖОНКЮ$' => 'CÖNKÜ',
		
		'^устке$' => 'üstke',
		'^Устке$' => 'Üstke',
		'^УСТКЕ$' => 'ÜSTKE',
		'^устте$' => 'üstte',
		'^Устте$' => 'Üstte',
		'^УСТТЕ$' => 'ÜSTTE',
		'^усттен$' => 'üstten',
		'^Усттен$' => 'Üstten',
		'^УСТТЕН$' => 'ÜSTTEN',
		
		'^([34])(\-)юнджи$' => '$1$2ünci',
		'^([34])(\-)ЮНДЖИ$' => '$1$2ÜNCİ',
		
		## отдельно стоящие Ё и Я
		'^Я$' => '$1Ya$2',
		'^Ё$' => '$1Yo$2',
		
		
		###########################
		# относятся к концу слова #
		###########################
		
		'кой$' => 'köy',
		'Кой$' => 'Köy',
		'КОЙ$' => 'KÖY',
		'койнинъ$' => 'köyniñ',
		'Койнинъ$' => 'Köyniñ',
		'КОЙНИНЪ$' => 'KÖYNİÑ',
		'койни$' => 'köyni',
		'Койни$' => 'Köyni',
		'КОЙНИ$' => 'KÖYNİ',
		'койге$' => 'köyge',
		'Койге$' => 'Köyge',
		'КОЙГЕ$' => 'KÖYGE',
		'койде$' => 'köyde',
		'Койде$' => 'Köyde',
		'КОЙДЕ$' => 'KÖYDE',
		'койдеки$' => 'köydeki',
		'Койдеки$' => 'Köydeki',
		'КОЙДЕКИ$' => 'KÖYDEKİ',
		'койден$' => 'köyden',
		'Койден$' => 'Köyden',
		'КОЙДЕН$' => 'KÖYDEN',
		'козь$' => 'köz',
		'Козь$' => 'Köz',
		'КОЗЬ$' => 'KÖZ',
		
		
		############################
		# относятся к началу слова #
		############################
		
		'^КъЮШн' => 'QYŞn',
		'^ЮШн' => 'YŞn',
		
		'^буюк([^ъ])' => 'büyük$1',
		'^Буюк([^ъ])' => 'Büyük$1',
		'^БУЮК([^Ъ])' => 'BÜYÜK$1',
		'^бую([гдйлмнпрстчшc])(и)' => 'büyü$1$2',
		'^Бую([гдйлмнпрстчшc])(и)' => 'Büyü$1$2',
		'^БУЮ([ГДЙЛМНПРСТЧШС])(И)' => 'BÜYÜ$1$2',
		'^буют([^ыа])' => 'büyüt$1',
		'^Буют([^ыа])' => 'Büyüt$1',
		'^БУЮТ([^ЫА])' => 'BÜYÜT$1',
		'^джонк([^ъ])' => 'cönk$1',
		'^Джонк([^ъ])' => 'Cönk$1',
		'^ДЖОНК([^Ъ])' => 'CÖNK$1',
		
		'^коюм' => 'köyüm',
		'^Коюм' => 'Köyüm',
		'^КОЮМ' => 'KÖYÜM',
		 
		'^коюнъ' => 'köyüñ',
		'^Коюнъ' => 'Köyüñ',
		'^КОЮНЪ' => 'KÖYÜÑ',
		
		'^коюн([ди])' => 'köyün$1',
		'^Коюн([ди])' => 'Köyün$1',
		'^КОЮН([ДИ])' => 'KÖYÜN$1',
		
		'^куе' => 'küye',
		'^Куе' => 'Küye',
		'^КУЕ' => 'KÜYE',
		
		'^куркке' => 'kürkke',
		'^Куркке' => 'Kürkke',
		'^КУРККЕ' => 'KÜRKKE',
		'^куркни' => 'kürkni',
		'^Куркни' => 'Kürkni',
		'^КУРКНИ' => 'KÜRKNİ',
		'^куркте' => 'kürkte',
		'^Куркте' => 'Kürkte',
		'^КУРКТЕ' => 'KÜRKTE',
		'^куркчи' => 'kürkçi',
		'^Куркчи' => 'Kürkçi',
		'^КУРКЧИ' => 'KÜRKÇİ',
		'^куркчю' => 'kürkçü',
		'^Куркчю' => 'Kürkçü',
		'^КУРКЧЮ' => 'KÜRKÇÜ',
		
		
		## этот кусок хоть и не зависит от места в слове, но должен идти в начале, иначе нельзя
		'гъ' => 'ğ',
		'Г[ъЪ]' => 'Ğ',
		'къ' => 'q',
		'К[ъЪ]' => 'Q',
		'нъ' => 'ñ',
		'Н[ъЪ]' => 'Ñ',
		'дж' => 'c',
		'Д[жЖ]' => 'C',

 
		## о => ö 
		'^(['.CRH_C_M_CONS.'])о(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => '$1ö$2$3$4',
		'^о(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => 'ö$1$2$3',
		'^(['.CRH_C_M_CONS.'])О(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => '$1Ö$2$3$4',
		'^О(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => 'Ö$1$2$3',
		
		'^(['.CRH_C_M_CONS.'])о(['.CRH_C_CONS.'])([еиэюьü])' => '$1ö$2$3',
		'^о(['.CRH_C_CONS.'])([еиэюьü])' => 'ö$1$2',
		'^(['.CRH_C_M_CONS.'])О(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => '$1Ö$2$3',
		'^О(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => 'Ö$1$2',
		
		## ё => yö  
		'^ё(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([ьеюü])' => 'yö$1$2$3',
		'^Ё(['.CRH_C_CONS_LC.'])(['.CRH_C_CONS_LC.'])([ьеюü])' => 'Yö$1$2$3',
		'^Ё(['.CRH_C_CONS_UC.'])(['.CRH_C_CONS_UC.'])([ЬЕЮÜ])' => 'YÖ$1$2$3',
		'^ё(['.CRH_C_CONS.'])([ьеюü])' => 'yö$1$2',
		'^Ё(['.CRH_C_CONS_LC.'])([ьеюü])' => 'Yö$1$2',
		'^Ё(['.CRH_C_CONS_UC.'])([ЬЕЮÜ])' => 'YÖ$1$2',
		
		
		## у => ü, ую => üyü 
		'^(['.CRH_C_M_CONS.'])у(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => '$1ü$2$3$4',
		'^у(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => 'ü$1$2$3',
		'^ую(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => 'üyü$1$2$3',
		'^(['.CRH_C_M_CONS.'])У(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => '$1Ü$2$3$4',
		'^У(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => 'Ü$1$2$3',
		'^Ую(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => 'Üyü$1$2$2',
		'^УЮ(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([еиэюьü])' => 'ÜYÜ$1$2$3',

		'^(['.CRH_C_M_CONS.'])у(['.CRH_C_CONS.'])([еиэюьü])' => '$1ü$2$3',
		'^у(['.CRH_C_CONS.'])([еиэюьü])' => 'ü$1$2',
		'^ую(['.CRH_C_CONS.'])([еиэюьü])' => 'üyü$1$2',
		'^(['.CRH_C_M_CONS.'])У(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => '$1Ü$2$3',
		'^У(['.CRH_C_CONS.'])([еиэюьüЕИЭЮЬÜ])' => 'Ü$1$2',
		'^Ую(['.CRH_C_CONS.'])([еиэюьü])' => 'Üyü$1$2',
		'^УЮ(['.CRH_C_CONS.'])([еиэюьü])' => 'ÜYÜ$1$2',
		

		# ю => yü 
		'^([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.CRH_C_CONS.'])(['.CRH_C_CONS.'])([ьеюü])' => '$1yü$2$3$4',
		'^([АЫОУЕИЁЮ]?)Ю(['.CRH_C_CONS_LC.'])(['.CRH_C_CONS_LC.'])([ьеюü])' => '$1Yü$2$3$4',
		'^([АЫОУЕИЁЮ]?)Ю(['.CRH_C_CONS_UC.'])(['.CRH_C_CONS_UC.'])([ЬЕЮÜ])' => '$1YÜ$2$3$4',
		'^([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.CRH_C_CONS.'])([ьеюü])' => '$1yü$2$3',
		'^([АЫОУЕИЁЮ]?)Ю(['.CRH_C_CONS_LC.'])([ьеюü])' => '$1Yü$2$3',
		'^([АЫОУЕИЁЮ]?)Ю(['.CRH_C_CONS_UC.'])([ЬЕЮÜ])' => '$1YÜ$2$3',
		
		## арабизмы на муи- муэ-
		'^му([иэИЭ])' => 'mü$1',
		'^Му([иэИЭ])' => 'Mü$1',
		'^МУ([ИЭ])' => 'MÜ$1',
		
		## e => ye, я => ya
		'^е' => 'ye',
		'^Е(['.CRH_C_LC.'cğñqöü])' => 'Ye$1',
		'^Е(['.CRH_C_UC.'CĞÑQÖÜ])' => 'YE$1',
		'^я' => 'ya',
		'^Я(['.CRH_C_LC.'cğñqöü])' => 'Ya$1',
		'^Я(['.CRH_C_UC.'CĞÑQÖÜ])' => 'YA$1',
		'([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е' => '$1ye',
		'([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.CRH_C_LC.'cğñqöü])' => '$1Ye$2',
		'([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.CRH_C_UC.'CĞÑQÖÜ])' => '$1YE$2',
		'([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])я' => '$1ya',
		'([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.CRH_C_LC.'cğñqöü])' => '$1Ya$2',
		'([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.CRH_C_UC.'CĞÑQÖÜ])' => '$1YA$2',

		###############################
		# не зависят от места в слове #
		###############################
		
		## слова на -льон
		'льон' => 'lyon',
		'ЛЬОН' => 'LYON',
		
		'козь([^я])' => 'köz$1',
		'Козь([^я])' => 'Köz$1',
		'КОЗЬ([^Я])' => 'KÖZ$1',
		
		## номер
		# '№' => 'No.',
		
		## Ö, Ü 1-й заход: ё, ю после согласных > ö, ü
		'(['.CRH_C_CONS.'])ю' => '$1ü',
		'(['.CRH_C_CONS.'])Ю' => '$1Ü',
		'(['.CRH_C_CONS.'])ё' => '$1ö',
		'(['.CRH_C_CONS.'])Ё' => '$1Ö',
		
		
		## буквы Е и Я
		## остальные вхождения e и я
		'Е' => 'E', 'е' => 'e',
		'Я' => 'Â', 'я' => 'â',
		
		## остальные вхождения о, у, ё, ю
		'Ё(['.CRH_C_UC.'CĞÑQÖÜ])' => 'YO$2',
		'Ё' => 'Yo', 'ё' => 'yo',
		'Ю(['.CRH_C_UC.'CĞÑQÖÜ])' => 'YU$2',
		'Ю' => 'Yu', 'ю' => 'yu',
		'У' => 'U', 'у' => 'u',
		'О' => 'O', 'о' => 'o',
		
		## убираем Ь и Ъ
		'Ь' => '', 'ь' => '',
		'Ъ' => '', 'ъ' => '',
		
		## буквы Ц и Щ
		'Ц(['.CRH_C_UC.'CĞÑQÖÜ])' => 'TS$2',
		'Ц' => 'Ts', 'ц' => 'ts',
		'Щ(['.CRH_C_UC.'CĞÑQÖÜ])' => 'ŞÇ$2',
		'Щ' => 'Şç', 'щ' => 'şç',
		
		## все остальные буквы
		'all_other_letters' => TRUE,
		);

		$all_other_letters_cyr2lat = array(
		'А' => 'A', 'а' => 'a',
		'Б' => 'B', 'б' => 'b',
		'В' => 'V', 'в' => 'v',
		'Г' => 'G', 'г' => 'g',
		'Д' => 'D', 'д' => 'd',
		'Ж' => 'J', 'ж' => 'j',
		'З' => 'Z', 'з' => 'z',
		'И' => 'İ', 'и' => 'i',
		'Й' => 'Y', 'й' => 'y',
		'К' => 'K', 'к' => 'k',
		'Л' => 'L', 'л' => 'l',
		'М' => 'M', 'м' => 'm',
		'Н' => 'N', 'н' => 'n',
		'П' => 'P', 'п' => 'p',
		'Р' => 'R', 'р' => 'r',
		'С' => 'S', 'с' => 's',
		'Т' => 'T', 'т' => 't',
		'Ф' => 'F', 'ф' => 'f',
		'Х' => 'H', 'х' => 'h',
		'Ч' => 'Ç', 'ч' => 'ç',
		'Ш' => 'Ş', 'ш' => 'ş',
		'Ы' => 'I', 'ы' => 'ı',
		'Э' => 'E', 'э' => 'e',
 );

		$this->mLatn2Cyrl = array(

		#
		# относятся ко всему слову
		#

		'/^an$/u' => 'ань',
		'/^An$/u' => 'Ань',
		'/^AN$/u' => 'АНЬ',
		'/^ange$/u' => 'аньге',
		'/^Ange$/u' => 'Аньге',
		'/^ANGE$/u' => 'АНЬГЕ',
		'/^ande$/u' => 'аньде',
		'/^Ande$/u' => 'Аньде',
		'/^ANDE$/u' => 'АНЬДЕ',
		'/^anki$/u' => 'аньки',
		'/^Anki$/u' => 'Аньки',
		'/^ANKİ$/u' => 'АНЬКИ',
		'/^deral$/u' => 'деръал',
		'/^Deral$/u' => 'Деръал',
		'/^DERAL$/u' => 'ДЕРЪАЛ',
		'/^kör$/u' => 'кёр',
		'/^Kör$/u' => 'Кёр',
		'/^KÖR$/u' => 'КЁР',
		'/^mer$/u' => 'мэр',
		'/^Mer$/u' => 'Мэр',
		'/^MER$/u' => 'МЭР',

		## буква Ё - первый заход
		## расставляем Ь после согласных
		'/^([yY])ö(['.CRH_L_N_CONS.'])(?([aAuU'.CRH_L_CONS.'])|$)/u' => '$1ö$2ь$3',
		'/^([yY])Ö(['.CRH_L_N_CONS.'])(?([aAuU'.CRH_L_CONS.'])|$)/u' => '$1Ö$2Ь$3',
		'/^AQŞ(['.WORD_ENDS.'ngd])/u' => 'АКъШ$1',

		## буква Ю - первый заход
		## расставляем Ь после согласных
		'/^([yY])ü(['.CRH_L_N_CONS.'])(?([aAuU'.CRH_L_CONS.'])|$)/u' => '$1ü$2ь$3',
		'/^([yY])Ü(['.CRH_L_N_CONS.'])(?([aAuU'.CRH_L_CONS.'])|$)/u' => '$1Ü$2Ь$3',

		'/^([bcgkpşBCGKPŞ])ö(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1ö$2ь$3',
		'/^([bcgkpşBCGKPŞ])Ö(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1Ö$2Ь$3',
		'/^([bcgkpşBCGKPŞ])Ö(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1Ö$2Ь$3',
		'/^([bcgkpşBCGKPŞ])ü(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1ü$2ь$3',
		'/^([bcgkpşBCGKPŞ])Ü(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1Ü$2Ь$3',
		'/^([bcgkpşBCGKPŞ])Ü(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => '$1Ü$2Ь$3',

		 ## ö и ü в начале слова
		 ## случаи, когда нужен Ь
		'/^ö(['.CRH_L_N_CONS.'pP])(?(['.CRH_L_CONS.'])|$)/u' => 'ö$1ь$2',
		'/^Ö(['.CRH_L_N_CONS_LC.'p])(?(['.CRH_L_CONS.'])|$)/u' => 'Ö$1ь$2',
		'/^Ö(['.CRH_L_N_CONS_UC.'P])(?(['.CRH_L_CONS.'])|$)/u' => 'Ö$1Ь$2',
		'/^ü(['.CRH_L_N_CONS.'])(?(['.CRH_L_CONS.'])|$)/u' => 'ü$1ь$2',
		'/^Ü(['.CRH_L_N_CONS_LC.'])(?(['.CRH_L_CONS.'])|$)/u' => 'Ü$1ь$2',
		'/^Ü(['.CRH_L_N_CONS_UC.'])(?(['.CRH_L_CONS.'])|$)/u' => 'Ü$1Ь$2',

		## повел. накл. на -етсин
		'/^etsin$/u' => 'этсин',
		'/^Etsin$/u' => 'Этсин',
		'/^ETSİN$/u' => 'ЭТСИН',

		#
		# относятся к концу слова
		#

		'/ts$/u' => 'ц',
		'/şç$/u' => 'щ',
		'/Ş[çÇ]$/u' => 'Щ',
		'/T[sS]$/u' => 'Ц',

		## Ь после Л
		'/(['.CRH_L_F.'])l(?(['.CRH_L_CONS_LC.'])|$)/u' => '$1ль$2',
		'/(['.CRH_L_F_UC.'])L(?(['.CRH_L_CONS.'])|$)/u' => '$1ЛЬ$2',

		'/etsin$/u' => 'етсин',
		'/ETSİN$/u' => 'ЕТСИН',

		#
		# относятся к началу слова
		#

		'/^ital/u' => 'итъаль',
		'/^İtal/u' => 'Итъаль',
		'/^İTAL/u' => 'ИТЪАЛЬ',
		'/^rol([^ü])/u' => 'роль$1',
		'/^Rol([^ü])/u' => 'Роль$1',
		'/^ROL([^Ü])/u' => 'РОЛЬ$1',

		'/^ts/u' => 'ц',
		'/^T[sS]/u' => 'Ц',

		'/^şç/u' => 'щ',
		'/^Ş[çÇ]/u' => 'Щ',

		## Э
		'/(?(^)|['.CRH_L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
		'/(?(^)|['.CRH_L_VOW_UC.'АЕЭЯ])E/u' => '$1Э',

		## усть
		'/^üst([knt])/u' => 'усть$1',
		'/^Üst([knt])/u' => 'Усть$1',
		'/^ÜST([KNT])/u' => 'УСТЬ$1',

		'/^(['.CRH_L_M_CONS.'])ö/u' => '$1о',
		'/^(['.CRH_L_M_CONS.'])Ö/u' => '$1О',
		'/^(['.CRH_L_M_CONS.'])ü/u' => '$1у',
		'/^(['.CRH_L_M_CONS.'])Ü/u' => '$1У',


		'/^ö/u' => 'о',
		'/^Ö/u' => 'О',
		'/^ü/u' => 'у',
		'/^Ü/u' => 'У',

		#
		# не зависят от места в слове
		#

		# некоторые исключения
		'/maal([^e])/u' => 'мааль$1', 
		'/Maal([^e])/u' => 'Мааль$1',
		'/MAAL([^E])/u' => 'МААЛЬ$1',
		'/küf([^eü])/u' => 'куфь$1',
		'/Küf([^eü])/u' => 'Куфь$1',
		'/KÜF([^EÜ])/u' => 'КУФЬ$1',
		'/köz([^eü])/u' => 'козь$1',
		'/Köz([^eü])/u' => 'Козь$1',
		'/KÖZ([^EÜ])/u' => 'КОЗЬ$1',

		## Punctuation
		'/#|No\./' => '№',

		## некоторые случаи употребления Ц
		'/tsi([^zñ])/u' => 'ци$1',
		'/T[sS][iİ]([^zZñÑ])/u' => 'ЦИ$1',
		'/ts([ou])/u' => 'ц$1',
		'/T[sS]([oOuU])/u' => 'Ц$1',
		'/ts(['.CRH_L_CONS.'])/u' => 'ц$1',
		'/T[sS](['.CRH_L_CONS.'])/u' => 'Ц$1',
		'/(['.CRH_L_CONS.'])ts/u' => '$1ц',
		'/(['.CRH_L_CONS.'])T[sS]/u' => '$1Ц',
		'/tsиал/u' => 'циал',
		'/TSИАЛ/u' => 'ЦИАЛ',

	
		## слова на -льон
		'/lyon/u' => 'льон',
		'/LYON/u' => 'ЛЬОН',

		## убираем ьi
		'/ьi/u' => 'i',
		'/Ьi/u' => 'i',
		'/Ьİ/u' => 'İ',

		## буквы гъ, къ, нъ
		'/ğ/u' => 'гъ',
		'/Ğ(['.CRH_L_LC.'])/u' => 'Гъ$1',
		'/Ğ(['.CRH_L_UC.'])/u' => 'ГЪ$1',
		'/Ğ(['.CRH_L_UC.'Ъ])/u' => 'ГЪ$1',
		'/q/u' => 'къ',
		'/Q(['.CRH_L_LC.'])/u' => 'Къ$1',
		'/Q(['.CRH_L_UC.'])/u' => 'КЪ$1',
		'/Q(['.CRH_L_UC.'Ъ])/u' => 'КЪ$1',
		'/ñ/u' => 'нъ',
		'/Ñ(['.CRH_L_LC.'])/u' => 'Нъ$1',
		'/Ñ(['.CRH_L_UC.'])/u' => 'НЪ$1',
		'/Ñ(['.CRH_L_UC.'Ъ])/u' => 'НЪ$1',

		## ya и ye
		'/(['.CRH_L_CONS.'])ya/u' => '$1ья',
		'/(['.CRH_L_CONS.'])Y[aA]/u' => '$1ЬЯ',
		'/ya/u' => 'я',
		'/Y[aA]/u' => 'Я',
		'/(['.CRH_L_CONS.'])ye/u' => '$1ье',
		'/(['.CRH_L_CONS.'])Y[eE]/u' => '$1ЬЕ',
		'/ye/u' => 'е',
		'/Y[eE]/u' => 'Е',

		 ## расставляем Ь перед Ё
		'/(['.CRH_L_CONS.'])y[oö]/u' => '$1ьё',
		'/(['.CRH_L_CONS.'])Y[oOöÖ]/u' => '$1ЬЁ',
		 ## оставшиеся вхождения yo и yö
		'/y[oö]/u' => 'ё',
		'/Y[oOöÖ]/u' => 'Ё',
		'/[yY][oOöÖ]/u' => 'Ё',

		 ## расставляем Ь перед Ю
		'/(['.CRH_L_CONS.'])y[uü]/u' => '$1ью',
		'/(['.CRH_L_CONS.'])Y[uUüÜ]/u' => '$1ЬЮ',
		 ## оставшиеся вхождения yu и yü
		'/y[uü]/u' => 'ю',
		'/Y[uUüÜ]/u' => 'Ю',
		'/[yY][uUüÜ]/u' => 'Ю',


		## убираем ьa
		'/ьa/u' => 'a',
		'/Ьa/u' => 'a',
		'/ЬA/u' => 'A',


		## все оставшиеся вхождения a, e, o, ö, ü, u, y
		'/A/u' => 'А', '/a/u' => 'а',
		'/E/u' => 'Е', '/e/u' => 'е',
		'/O/u' => 'О', '/o/u' => 'о',
		'/Ö/u' => 'Ё', '/ö/u' => 'ё',
		'/U/u' => 'У', '/u/u' => 'у',
		'/Ü/u' => 'Ю', '/ü/u' => 'ю',
		'/Y/u' => 'Й', '/y/u' => 'й',

		## буква дж
		'/c/u' => 'дж',
		'/C(['.CRH_L_LC.CRH_C_LC.'])/u' => 'Дж$1',
		'/C(['.CRH_L_UC.CRH_C_UC.'])/u' => 'ДЖ$1',
		'/C(['.CRH_L_UC.CRH_C_UC.'Ъ])/u' => 'ДЖ$1',

		## все остальные буквы
		'/Â/u' => 'Я', '/â/u' => 'я',
		'/B/u' => 'Б', '/b/u' => 'б',
		'/Ç/u' => 'Ч', '/ç/u' => 'ч',
		'/D/u' => 'Д', '/d/u' => 'д',
		'/F/u' => 'Ф', '/f/u' => 'ф',
		'/G/u' => 'Г', '/g/u' => 'г',
		'/H/u' => 'Х', '/h/u' => 'х',
		'/I/u' => 'Ы', '/ı/u' => 'ы',
		'/İ/u' => 'И', '/i/u' => 'и',
		'/J/u' => 'Ж', '/j/u' => 'ж',
		'/K/u' => 'К', '/k/u' => 'к',
		'/L/u' => 'Л', '/l/u' => 'л',
		'/M/u' => 'М', '/m/u' => 'м',
		'/N/u' => 'Н', '/n/u' => 'н',
		'/O/u' => 'О', '/o/u' => 'о',
		'/P/u' => 'П', '/p/u' => 'п',
		'/R/u' => 'Р', '/r/u' => 'р',
		'/S/u' => 'С', '/s/u' => 'с',
		'/Ş/u' => 'Ш', '/ş/u' => 'ш',
		'/T/u' => 'Т', '/t/u' => 'т',
		'/V/u' => 'В', '/v/u' => 'в',
		'/Z/u' => 'З', '/z/u' => 'з',


		## убираем кьк, льл, ньн, рьр, сьс, тьт
		'/кьк/u' => 'кк',
		'/К[ьЬ]к/u' => 'Кк',
		'/КЬК/u' => 'КК',
		'/льл/u' => 'лл',
		'/Л[ьЬ]л/u' => 'Лл',
		'/ЛЬЛ/u' => 'ЛЛ',
		'/ньн/u' => 'нн',
		'/Н[ьЬ]н/u' => 'Нн',
		'/НЬН/u' => 'НН',
		'/рьр/u' => 'рр',
		'/Р[ьЬ]р/u' => 'Рр',
		'/РЬР/u' => 'РР',
		'/сьс/u' => 'сс',
		'/С[ьЬ]с/u' => 'Сс',
		'/СЬС/u' => 'СС',
		'/тьт/u' => 'тт',
		'/Т[ьЬ]т/u' => 'Тт',
		'/ТЬТ/u' => 'ТТ',

		## убираем ьы и ь..ы
		'/[ьЬ]ы/u' => 'ы',
		'/ЬЫ/u' => 'Ы',
		'/[ьЬ]([гдклмнпрстчшГДКЛМНПРСТЧШ])ы/u' => '$1ы',
		'/Ь([гдклмнпрстчшГДКЛМНПРСТЧШ])Ы/u' => '$1Ы',
		'/[ьЬ]([гкнГКН])([ъЪ])ы/u' => '$1$2ы',
		'/Ь([ГКН])ЪЫ/u' => '$1ЪЫ',

		## убираем йь
		'/йь/u' => 'й',
		'/ЙЬ/u' => 'Й',

		## частичное решение проблемы слова юз - 100
		'/эки юзь/u' => 'эки юз', '/Эки юзь/u' => 'Эки юз', '/ЭКИ ЮЗЬ/u' => 'ЭКИ ЮЗ',
		'/учь юзь/u' => 'учь юз', '/Учь юзь/u' => 'Учь юз', '/УЧЬ ЮЗЬ/u' => 'УЧЬ ЮЗ',
		'/дёрт юзь/u' => 'дёрт юз', '/Дёрт юзь/u' => 'Дёрт юз', '/ДЁРТ ЮЗЬ/u' => 'ДЁРТ ЮЗ',
		'/беш юзь/u' => 'беш юз', '/Беш юзь/u' => 'Беш юз', '/БЕШ ЮЗЬ/u' => 'БЕШ ЮЗ',
		'/алты юзь/u' => 'алты юз', '/Алты юзь/u' => 'Алты юз', '/АЛТЫ ЮЗЬ/u' => 'АЛТЫ ЮЗ',
		'/еди юзь/u' => 'еди юз', '/Еди юзь/u' => 'Еди юз', '/ЕДИ ЮЗЬ/u' => 'ЕДИ ЮЗ',
		'/секиз юзь/u' => 'секиз юз', '/Секиз юзь/u' => 'Секиз юз', '/СЕКИЗ ЮЗЬ/u' => 'СЕКИЗ ЮЗ',
		'/докъуз юзь/u' => 'докъуз юз', '/Докъуз юзь/u' => 'Докъуз юз', '/ДОКЪУЗ ЮЗЬ/u' => 'ДОКЪУЗ ЮЗ',

		);

	}

	/* rules should be defined as -{ekavian | iyekavian-} -or-
		-{code:text | code:text | ...}-
		update: delete all rule parsing because it's not used
				currently, and just produces a couple of bugs
	*/
	function parseManualRule($rule, $flags=array()) {
		if(in_array('T',$flags)){
			return parent::parseManualRule($rule, $flags);
		}

		// otherwise ignore all formatting
		foreach($this->mVariants as $v) {
			$carray[$v] = $rule;
		}
		
		return $carray;
	}

	// Do not convert content on talk pages
	function parserConvert( $text, &$parser ){
		if(is_object($parser->getTitle() ) && $parser->getTitle()->isTalkPage())
			$this->mDoContentConvert=false;
		else 
			$this->mDoContentConvert=true;

		return parent::parserConvert($text, $parser );
	}

	/*
	 * A function wrapper:
	 *  - if there is no selected variant, leave the link 
	 *    names as they were
	 *  - do not try to find variants for usernames
	 */
	function findVariantLink( &$link, &$nt ) {
		// check for user namespace
		if(is_object($nt)){
			$ns = $nt->getNamespace();
			if($ns==NS_USER || $ns==NS_USER_TALK)
				return;
		}

		$oldlink=$link;
		parent::findVariantLink($link,$nt);
		if($this->getPreferredVariant()==$this->mMainLanguageCode)
			$link=$oldlink;
	}

	/*
	 * An ugly function wrapper for parsing Image titles
	 * (to prevent image name conversion)
	 */
	function autoConvert($text, $toVariant=false) {
		global $wgTitle;
		if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_IMAGE){ 
			$imagename = $wgTitle->getNsText();
			if(preg_match("/^$imagename:/",$text)) return $text;
		}
		return parent::autoConvert($text,$toVariant);
	}

	/**
	 *  It translates text into variant
	 */
	function translate( $text, $toVariant ){
		global $wgContLanguageCode;
		$text = parent::translate( $text, $toVariant );

		$letters = '';
		switch( $toVariant ) {
			case 'crh-cyrl':
				$letters = CRH_L_UC . CRH_L_LC . "\'";
				$wgContLanguageCode = 'crh-Cyrl';
				break;
			case 'crh-latn':
				$letters = CRH_C_UC . CRH_C_LC;
				$wgContLanguageCode = 'crh-Latn';
				break;
			default:
				$wgContLanguageCode = 'crh';
				return $text;
		}

		// disable conversion of roman numbers like VII, XIX...
		$breaks = '[^'.WORD_BEGINS.']' /*'[^\w\x80-\xff]'*/;
		$roman = 'M{0,3}(C[DM]|D{0,1}C{0,3})(X[LC]|L{0,1}X{0,3})(I[VX]|V{0,1}I{0,3})';
		$romanfix = '^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks;

		// disable conversion of variables like $1, $2...
		$varsfix = '\$[0-9][0-9]';
		$reg = '/' . $romanfix . $varsfix . '[^' . $letters . ']+/u';

		$matches = preg_split( $reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
		$mstart = 0;
		$ret = '';
		foreach( $matches as $m ) {
			$ret .= substr( $text, $mstart, $m[1]-$mstart );
			$ret .= $this->regsConverter( $m[0], $toVariant );
			$mstart = $m[1] + strlen($m[0]);
		}
		return $ret;
	}

	function regsConverter( $text, $toVariant ) {
		if ($text == '') return $text;

		$pat = array();
		$rep = array();
		switch( $toVariant ) {
			case 'crh-latn':
				foreach( $this->mCyrl2Latn as $pat => $rep ) {
					$text = preg_replace( $pat, $rep, $text );
				}
				return $text;
				break;
			case 'crh-cyrl':
				foreach( $this->mLatn2Cyrl as $pat => $rep ) {
					$text = preg_replace( $pat, $rep, $text );
				}
				return $text;
				break;
			default:
				return $text;
		}
	}

	/*
	 * We want our external link captions to be converted in variants,
	 * so we return the original text instead -{$text}-, except for URLs
	 */
	function markNoConversion( $text, $noParse=false ) {
		if( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
			return parent::markNoConversion( $text );
		return $text;
	}

	function convertCategoryKey( $key ) {
		return $this->autoConvert( $key, 'crh' );
	}

}

/* class that handles Cyrillic and Latin scripts for Crimean Tatarish
   right now it only distinguish crh_cyrl, crh_latn.
*/
class LanguageCrh extends LanguageCrh_crh {

	function __construct() {
		global $wgHooks;
		parent::__construct();

		$variants = array( 'crh', 'crh-latn', 'crh-cyrl' );
		$variantfallbacks = array(
			'crh'      => 'crh-latn',
			'crh-latn' => 'crh',
			'crh-cyrl' => 'crh',
		);

		$this->mConverter = new CrhConverter( $this, 'crh', $variants, $variantfallbacks );

		$wgHooks['ArticleSaveComplete'][] = $this->mConverter;
	}


	/*
	 * It fixes issue with ucfirst for transforming 'i' to 'İ'
	 * 
	 */
	function ucfirst ( $string ) {
		$variant = $this->getPreferredVariant();
		if ( $variant == 'crh-latn'  && $string[0] == 'i' ) {
			$string = 'İ' . substr( $string, 1 );
		} else {
			$string = parent::ucfirst( $string );
		}
		return $string;
	}

	/*
	 * It fixes issue with  lcfirst for transforming 'I' to 'ı'
	 * 
	 */
	function lcfirst ( $string ) {
		$variant = $this->getPreferredVariant();
		if ( $variant == 'crh-latn'  && $string[0] == 'I' ) {
			$string = 'ı' . substr( $string, 1 );
		} else {
			$string = parent::lcfirst( $string );
		}
		return $string;
	}

	# Convert from the nominative form of a noun to some other case
	# Invoked with {{GRAMMAR:case|word}}
	function convertGrammar( $word, $case ) {
		wfProfileIn( __METHOD__ );

		$variant = $this->getPreferredVariant();
		switch ( $variant ) {
			case 'crh-cyrl':
				$word = parent::convertGrammarCrh_cyrl( $word, $case );
				break;
			case 'crh-latn':
			case 'crh':
			default:
				$word = parent::convertGrammarCrh_latn( $word, $case );
		}

		wfProfileOut( __METHOD__ );
		return $word;
	}

}
/*

*/