Qullanıcı:AlefZet/crh/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;
	}

}