Къошулуучу:Ernác/Translit/LanguageKrc.php

Википедия — эркин энциклопедияны бети.

/*

*/
<?php
/** Karachay-Balkar (Qaraçay-Malqarça)
  * converter routines
  *
  * @addtogroup Language
  */

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

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

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

// Latin
define( 'KRC_L_UC', 'AÂBCÇDEFGĞHIİJKLMNÑOÖPQRSŞTUÜVWXYZ' ); # Karachay-Balkar Latin uppercase
define( 'KRC_L_LC', 'aâbcçdefgğhıijklmnñoöpqrsştuüvwxyz' ); # Karachay-Balkar Latin lowercase
define( 'KRC_L_N_CONS_UC', 'ÇNRSTZ' ); # Karachay-Balkar Latin N-type upper case consonants
define( 'KRC_L_N_CONS_LC', 'çnrstz' ); # Karachay-Balkar Latin N-type lower case consonants
define( 'KRC_L_N_CONS', 'çnrstzÇNRSTZ' ); # Karachay-Balkar Latin N-type consonants
define( 'KRC_L_M_CONS', 'bcgkmpşBCGKMPŞ' ); # Karachay-Balkar Latin M-type consonants
define( 'KRC_L_CONS_UC', 'BCÇDFGHJKLMNÑPRSŞTVWZ' ); # Karachay-Balkar Latin uppercase consonants 
define( 'KRC_L_CONS_LC', 'bcçdfghjklmnñprsştvwz' ); # Karachay-Balkar Latin lowercase consonants 
define( 'KRC_L_CONS', 'bcçdfghjklmnñprsştvwzBCÇDFGHJKLMNÑPRSŞTVWZ' ); # Karachay-Balkar Latin consonants 
define( 'KRC_L_VOW_UC', 'AÂEIİOÖUÜ' ); # Karachay-Balkar Latin uppercase vowels
define( 'KRC_L_VOW', 'aâeıioöuüAÂEIİOÖUÜ' ); # Karachay-Balkar Latin vowels
define( 'KRC_L_F_UC', 'EİÖÜ' ); # Karachay-Balkar Latin uppercase front vowels 
define( 'KRC_L_F', 'eiöüEİÖÜ' ); # Karachay-Balkar Latin front vowels 

class KrcConverter 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/KrcConversion.php" );
		//$krc2Cyrl = array();
		//$krc2Latn = array();

		$this->mTables = array(
			'krc-latn' => new ReplacementArray( $krc2Latn ),
			'krc-cyrl' => new ReplacementArray( $krc2Cyrl ),
			'krc'      => new ReplacementArray()
		);
	}


	function loadRegs() { 

		$this->$mCyrl2Latn = array
		(
 
		############################
		# относятся ко всему слову #
		############################
 		
		 '^Югославия$' => 'Yugoslaviya',
		 '^Юпитер$' => 'Yupiter',
		
		'^([34])(\-)юнджи$' => '$1$2ünçü',
		'^([34])(\-)ЮНДЖИ$' => '$1$2ÜNÇÜ',
		
		
		
		## отдельно стоящие Ё и Я
		 '^Я$' => '$1Ya$2',
		 '^Ё$' => '$1Yo$2',
		

		## этот кусок хоть и не зависит от места в слове, но должен идти в начале, иначе нельзя
		 'гъ' => 'ğ',
 		'Г[ъЪ]' => 'Ğ',
		 'къ' => 'q',
 		'К[ъЪ]' => 'Q',
 		'нг' => 'ñ',
 		'Н[гГ]' => 'Ñ',
		 'дж' => 'c',
 		'Д[жЖ]' => 'C',


## e => ye, я => ya,  у => w
 '^е' => 'ye',
 '^Е(['.KRC_C_LC.'cğñqöü])' => 'Ye$1',
 '^Е(['.KRC_C_UC.'CĞÑQÖÜ])' => 'YE$1',
 '^я' => 'ya',
 '^Я(['.KRC_C_LC.'cğñqöü])' => 'Ya$1',
 '^Я(['.KRC_C_UC.'CĞÑQÖÜ])' => 'YA$1',
 '^у' => 'w',
 '^У(['.KRC_C_LC.'cğñqöü])' => 'W$1',
 '^У(['.KRC_C_UC.'CĞÑQÖÜ])' => 'W$1',
 '([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е' => '$1ye',
 '([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.KRC_C_LC.'cğñqöü])' => '$1Ye$2',
 '([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.KRC_C_UC.'CĞÑQÖÜ])' => '$1YE$2',
 '([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])я' => '$1ya',
 '([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.KRC_C_LC.'cğñqöü])' => '$1Ya$2',
 '([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.KRC_C_UC.'CĞÑQÖÜ])' => '$1YA$2',
 '([аеёиоуыэюяaeöüАЕЁИОУЫЭЮЯAEÖÜ])у' => '$1w',
 '([аеёиоуыэюяaeöüАЕЁИОУЫЭЮЯAEÖÜ])У(['.KRC_C_LC.'cğñqöü])' => '$1W$2',
 '([аеёиоуыэюяaeöüАЕЁИОУЫЭЮЯAEÖÜ])У(['.KRC_C_UC.'CĞÑQÖÜ])' => '$1W$2',


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

## слова на -льон
 'льон' => 'lyon',
 'ЛЬОН' => 'LYON',
 
## номер
# '№' => 'No.',
 
## Ö, Ü 1-й заход: ё, ю после согласных > ö, ü
 '(['.KRC_C_CONS.'])ю' => '$1ü',
 '(['.KRC_C_CONS.'])Ю' => '$1Ü',
 '(['.KRC_C_CONS.'])ё' => '$1ö',
 '(['.KRC_C_CONS.'])Ё' => '$1Ö',
 
## буквы Е и Я
## остальные вхождения e и я
 'Е' => 'E', 'е' => 'e',
 'Я' => 'Â', 'я' => 'â',
 
## остальные вхождения о, у, ў, ё, ю
 'Ё(['.KRC_C_UC.'CĞÑQÖÜ])' => 'YO$2',
 'Ё' => 'Yo', 'ё' => 'yo',
 'Ю(['.KRC_C_UC.'CĞÑQÖÜ])' => 'YU$2',
 'Ю' => 'Yu', 'ю' => 'yu',
 'У' => 'U', 'у' => 'u',
 'Ў' => 'W', 'ў' => 'w',
 'О' => 'O', 'о' => 'o',
 
## убираем Ь и Ъ
 'Ь' => '', 'ь' => '',
 'Ъ' => '', 'ъ' => '',
 
## буквы Ц и Щ
 'Ц(['.KRC_C_UC.'CĞÑQÖÜ])' => 'TS$2',
 'Ц' => 'Ts', 'ц' => 'ts',
 'Щ(['.KRC_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' => 'АНЬКИ',
		'/^mer$/u' => 'мэр',
		'/^Mer$/u' => 'Мэр',
		'/^MER$/u' => 'МЭР',


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

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

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


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

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

		'/^rol([^ü])/u' => 'роль$1',
		'/^Rol([^ü])/u' => 'Роль$1',
		'/^ROL([^Ü])/u' => 'РОЛЬ$1',

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

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

		## Э
		'/(?(^)|['.KRC_L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
		'/(?(^)|['.KRC_L_VOW_UC.'АЕЭЯ])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(['.KRC_L_CONS.'])/u' => 'ц$1',
		'/T[sS](['.KRC_L_CONS.'])/u' => 'Ц$1',
		'/(['.KRC_L_CONS.'])ts/u' => '$1ц',
		'/(['.KRC_L_CONS.'])T[sS]/u' => '$1Ц',
		'/tsial/u' => 'циал',
		'/TSİAL/u' => 'ЦИАЛ',

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

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

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

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

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

		 ## расставляем Ь перед Ю
		'/(['.KRC_L_CONS.'])y[uü]/u' => '$1ью',
		'/(['.KRC_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(['.KRC_L_LC.KRC_C_LC.'])/u' => 'Дж$1',
		'/C(['.KRC_L_UC.KRC_C_UC.'])/u' => 'ДЖ$1',
		'/C(['.KRC_L_UC.KRC_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' => 'т',
                '/W/u' => 'У', '/w/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' => 'Й',

		);

	}

	/* 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 'krc-cyrl':
				$letters = KRC_L_UC . KRC_L_LC . "\'";
				$wgContLanguageCode = 'krc-Cyrl';
				break;
			case 'krc-latn':
				$letters = KRC_C_UC . KRC_C_LC;
				$wgContLanguageCode = 'krc-Latn';
				break;
			default:
				$wgContLanguageCode = 'krc';
				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 'krc-latn':
				foreach( $this->mCyrl2Latn as $pat => $rep ) {
					$text = preg_replace( $pat, $rep, $text );
				}
				return $text;
				break;
			case 'krc-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, 'krc' );
	}

}

/* class that handles Cyrillic and Latin scripts for Karachay-Balkar
   right now it only distinguish krc_cyrl, krc_latn.
*/
class LanguageKrc extends LanguageKrc_krc {

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

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

		$this->mConverter = new KrcConverter( $this, 'krc', $variants, $variantfallbacks );

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


	/*
	 * It fixes issue with ucfirst for transforming 'i' to 'İ'
	 * 
	 */
	function ucfirst ( $string ) {
		$variant = $this->getPreferredVariant();
		if ( $variant == 'krc-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 == 'krc-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 'krc-cyrl':
				$word = parent::convertGrammarKrc_cyrl( $word, $case );
				break;
			case 'krc-latn':
			case 'krc':
			default:
				$word = parent::convertGrammarKrc_latn( $word, $case );
		}

		wfProfileOut( __METHOD__ );
		return $word;
	}

}
/*

*/