35 const C_UC =
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; # Crimean Tatar Cyrillic uppercase
36 const C_LC =
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; # Crimean Tatar Cyrillic lowercase
37 const C_CONS_UC =
'БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ'; # Crimean Tatar Cyrillic + CÑ uppercase consonants
38 const C_CONS_LC =
'бвгджзйклмнпрстфхцчшщcñ'; # Crimean Tatar Cyrillic + CÑ lowercase consonants
39 const C_M_CONS =
'бгкмшcБГКМШC'; # Crimean Tatar Cyrillic M-
type consonants
42 const C_CONS =
'бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ';
45 const L_UC =
'AÂBCÇDEFGĞHIİJKLMNÑOÖPQRSŞTUÜVYZ'; # Crimean Tatar Latin uppercase
46 const L_LC =
'aâbcçdefgğhıijklmnñoöpqrsştuüvyz'; # Crimean Tatar Latin lowercase
49 const L_N_CONS =
'çnrstzÇNRSTZ'; # Crimean Tatar Latin N-
type consonants
50 const L_M_CONS =
'bcgkmpşBCGKMPŞ'; # Crimean Tatar Latin M-
type consonants
51 const L_CONS_UC =
'BCÇDFGĞHJKLMNÑPQRSŞTVZ'; # Crimean Tatar Latin uppercase consonants
52 const L_CONS_LC =
'bcçdfgğhjklmnñpqrsştvz'; # Crimean Tatar Latin lowercase consonants
53 const L_CONS =
'bcçdfgğhjklmnñpqrsştvzBCÇDFGĞHJKLMNÑPQRSŞTVZ'; # Crimean Tatar Latin consonants
54 const L_VOW_UC =
'AÂEIİOÖUÜ'; # Crimean Tatar Latin uppercase vowels
55 const L_VOW =
'aâeıioöuüAÂEIİOÖUÜ'; # Crimean Tatar Latin vowels
56 const L_F_UC =
'EİÖÜ'; # Crimean Tatar Latin uppercase front vowels
57 const L_F =
'eiöüEİÖÜ'; # Crimean Tatar Latin front vowels
68 $variantfallbacks = [],
70 parent::__construct( $langobj, $maincode,
71 $variants, $variantfallbacks, $flags );
81 ## these are independent of location in the word, but have
82 ## to go first so other transforms don't bleed them
83 'гъ' =>
'ğ',
'Гъ' =>
'Ğ',
'ГЪ' =>
'Ğ',
84 'къ' =>
'q',
'Къ' =>
'Q',
'КЪ' =>
'Q',
85 'нъ' =>
'ñ',
'Нъ' =>
'Ñ',
'НЪ' =>
'Ñ',
86 'дж' =>
'c',
'Дж' =>
'C',
'ДЖ' =>
'C',
88 'А' =>
'A',
'а' =>
'a',
'Б' =>
'B',
'б' =>
'b',
89 'В' =>
'V',
'в' =>
'v',
'Г' =>
'G',
'г' =>
'g',
90 'Д' =>
'D',
'д' =>
'd',
'Ж' =>
'J',
'ж' =>
'j',
91 'З' =>
'Z',
'з' =>
'z',
'И' =>
'İ',
'и' =>
'i',
92 'Й' =>
'Y',
'й' =>
'y',
'К' =>
'K',
'к' =>
'k',
93 'Л' =>
'L',
'л' =>
'l',
'М' =>
'M',
'м' =>
'm',
94 'Н' =>
'N',
'н' =>
'n',
'П' =>
'P',
'п' =>
'p',
95 'Р' =>
'R',
'р' =>
'r',
'С' =>
'S',
'с' =>
's',
96 'Т' =>
'T',
'т' =>
't',
'Ф' =>
'F',
'ф' =>
'f',
97 'Х' =>
'H',
'х' =>
'h',
'Ч' =>
'Ç',
'ч' =>
'ç',
98 'Ш' =>
'Ş',
'ш' =>
'ş',
'Ы' =>
'I',
'ы' =>
'ı',
99 'Э' =>
'E',
'э' =>
'e',
'Е' =>
'E',
'е' =>
'e',
100 'Я' =>
'Â',
'я' =>
'â',
'У' =>
'U',
'у' =>
'u',
101 'О' =>
'O',
'о' =>
'o',
103 'Ё' =>
'Yo',
'ё' =>
'yo',
'Ю' =>
'Yu',
'ю' =>
'yu',
104 'Ц' =>
'Ts',
'ц' =>
'ts',
'Щ' =>
'Şç',
'щ' =>
'şç',
105 'Ь' =>
'',
'ь' =>
'',
'Ъ' =>
'',
'ъ' =>
'',
110 'Â' =>
'Я',
'â' =>
'я',
'B' =>
'Б',
'b' =>
'б',
111 'Ç' =>
'Ч',
'ç' =>
'ч',
'D' =>
'Д',
'd' =>
'д',
112 'F' =>
'Ф',
'f' =>
'ф',
'G' =>
'Г',
'g' =>
'г',
113 'H' =>
'Х',
'h' =>
'х',
'I' =>
'Ы',
'ı' =>
'ы',
114 'İ' =>
'И',
'i' =>
'и',
'J' =>
'Ж',
'j' =>
'ж',
115 'K' =>
'К',
'k' =>
'к',
'L' =>
'Л',
'l' =>
'л',
116 'M' =>
'М',
'm' =>
'м',
'N' =>
'Н',
'n' =>
'н',
117 'O' =>
'О',
'o' =>
'о',
'P' =>
'П',
'p' =>
'п',
118 'R' =>
'Р',
'r' =>
'р',
'S' =>
'С',
's' =>
'с',
119 'Ş' =>
'Ш',
'ş' =>
'ш',
'T' =>
'Т',
't' =>
'т',
120 'V' =>
'В',
'v' =>
'в',
'Z' =>
'З',
'z' =>
'з',
122 'ya' =>
'я',
'Ya' =>
'Я',
'YA' =>
'Я',
123 'ye' =>
'е',
'YE' =>
'Е',
'Ye' =>
'Е',
126 'A' =>
'А',
'a' =>
'а',
'E' =>
'Е',
'e' =>
'е',
127 'Ö' =>
'Ё',
'ö' =>
'ё',
'U' =>
'У',
'u' =>
'у',
128 'Ü' =>
'Ю',
'ü' =>
'ю',
'Y' =>
'Й',
'y' =>
'й',
129 'C' =>
'Дж',
'c' =>
'дж',
'Ğ' =>
'Гъ',
'ğ' =>
'гъ',
130 'Ñ' =>
'Нъ',
'ñ' =>
'нъ',
'Q' =>
'Къ',
'q' =>
'къ',
153 if ( $this->mExceptionsLoaded ) {
157 $this->mExceptionsLoaded =
true;
159 list( $this->mCyrl2LatnExceptions, $this->mLatn2CyrlExceptions,
160 $this->mCyrl2LatnPatterns, $this->mLatn2CyrlPatterns, $this->mCyrlCleanUpRegexes ) =
161 $crhExceptions->loadExceptions( self::L_LC . self::C_LC, self::L_UC . self::C_UC );
176 if ( is_object( $nt ) ) {
177 $ns = $nt->getNamespace();
184 parent::findVariantLink(
$link, $nt, $ignoreOtherCond );
185 if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
201 switch ( $toVariant ) {
209 if ( !$this->mTablesLoaded ) {
213 if ( !isset( $this->mTables[$toVariant] ) ) {
214 throw new MWException(
"Broken variant table: " . implode(
',', array_keys( $this->mTables ) ) );
217 switch ( $toVariant ) {
224 $roman =
'(?=[MDCLXVI]([^.]|$))M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
226 $breaks =
'([^\w\x80-\xff])';
229 $romanRegex =
'/^' . $roman .
'$|^(' . $roman . $breaks .
')+|(' . $breaks . $roman .
')+$|' .
230 $breaks .
'(' . $roman . $breaks .
')+/';
232 $matches = preg_split( $romanRegex, $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
237 $ret .= substr( $text, $mstart, $m[1] - $mstart );
240 if ( $m[0] !==
'' ) {
244 $mstart = $m[1] + strlen( $m[0] );
255 if ( $text ==
'' )
return $text;
259 switch ( $toVariant ) {
261 $text = strtr( $text, $this->mCyrl2LatnExceptions );
262 foreach ( $this->mCyrl2LatnPatterns
as $pat => $rep ) {
263 $text = preg_replace( $pat, $rep, $text );
266 $text = strtr( $text, [
'«' =>
'"',
'»' =>
'"', ] );
269 $text = strtr( $text, $this->mLatn2CyrlExceptions );
270 foreach ( $this->mLatn2CyrlPatterns
as $pat => $rep ) {
271 $text = preg_replace( $pat, $rep, $text );
274 $text = strtr( $text, [
'“' =>
'«',
'”' =>
'»', ] );
275 foreach ( $this->mCyrlCleanUpRegexes
as $pat => $rep ) {
276 $text = preg_replace( $pat, $rep, $text );
294 parent::__construct();
296 $variants = [
'crh',
'crh-cyrl',
'crh-latn' ];
297 $variantfallbacks = [
299 'crh-cyrl' =>
'crh-latn',
300 'crh-latn' =>
'crh-cyrl',
303 $this->mConverter =
new CrhConverter( $this,
'crh', $variants, $variantfallbacks );