]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - languages/classes/LanguageKk.php
MediaWiki 1.15.0
[autoinstalls/mediawiki.git] / languages / classes / LanguageKk.php
1 <?php
2
3 require_once( dirname(__FILE__).'/../LanguageConverter.php' );
4 require_once( dirname(__FILE__).'/LanguageKk_cyrl.php' );
5
6 define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
7 define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
8 define( 'KK_L_UC', 'AÄBCÇDEÉFGĞHIİÏJKLMNÑOÖPQRSŞTUÜVWXYÝZ' ); # Kazakh Latin uppercase
9 define( 'KK_L_LC', 'aäbcçdeéfgğhıiïjklmnñoöpqrsştuüvwxyýz' ); # Kazakh Latin lowercase
10 //define( 'KK_A', 'ٴابپتجحدرزسشعفقكلمنڭەوۇۋۆىيچھ' ); # Kazakh Arabic
11 define( 'H_HAMZA', 'ٴ' ); # U+0674 ARABIC LETTER HIGH HAMZA
12 //define( 'ZWNJ', '‌' ); # U+200C ZERO WIDTH NON-JOINER
13
14 /** Kazakh (Қазақша)
15  * converter routines
16  *
17  * @ingroup Language
18  */
19 class KkConverter extends LanguageConverter {
20
21         function __construct($langobj, $maincode,
22                                                                 $variants=array(),
23                                                                 $variantfallbacks=array(),
24                                                                 $markup=array(),
25                                                                 $flags = array()) {
26                 parent::__construct( $langobj, $maincode,
27                         $variants, $variantfallbacks, $markup, $flags );
28
29                 // No point delaying this since they're in code.
30                 // Waiting until loadDefaultTables() means they never get loaded
31                 // when the tables themselves are loaded from cache.
32                 $this->loadRegs();
33         }
34
35         function loadDefaultTables() {
36                 // require( dirname(__FILE__)."/../../includes/KkConversion.php" );
37                 // Placeholder for future implementing. Remove variables declarations
38                 // after generating KkConversion.php
39                 $kk2Cyrl = array();
40                 $kk2Latn = array();
41                 $kk2Arab = array();
42                 $kk2KZ   = array();
43                 $kk2TR   = array();
44                 $kk2CN   = array();
45
46                 $this->mTables = array(
47                         'kk-cyrl' => new ReplacementArray( $kk2Cyrl ),
48                         'kk-latn' => new ReplacementArray( $kk2Latn ),
49                         'kk-arab' => new ReplacementArray( $kk2Arab ),
50                         'kk-kz'   => new ReplacementArray( array_merge($kk2Cyrl, $kk2KZ) ),
51                         'kk-tr'   => new ReplacementArray( array_merge($kk2Latn, $kk2TR) ),
52                         'kk-cn'   => new ReplacementArray( array_merge($kk2Arab, $kk2CN) ),
53                         'kk'      => new ReplacementArray()
54                 );
55         }
56
57         function postLoadTables() {
58                 $this->mTables['kk-kz']->merge( $this->mTables['kk-cyrl'] );
59                 $this->mTables['kk-tr']->merge( $this->mTables['kk-latn'] );
60                 $this->mTables['kk-cn']->merge( $this->mTables['kk-arab'] );
61         }
62
63         function loadRegs() {
64
65                 $this->mCyrl2Latn = array(
66                         ## Punctuation
67                         '/№/u' => 'No.',
68                         ## Е after vowels
69                         '/([АӘЕЁИОӨҰҮЭЮЯЪЬ])Е/u' => '$1YE',
70                         '/([АӘЕЁИОӨҰҮЭЮЯЪЬ])е/ui' => '$1ye',
71                         ## leading ЁЮЯЩ
72                         '/^Ё(['.KK_C_UC.']|$)/u' => 'YO$1', '/^Ё(['.KK_C_LC.']|$)/u' => 'Yo$1',
73                         '/^Ю(['.KK_C_UC.']|$)/u' => 'YU$1', '/^Ю(['.KK_C_LC.']|$)/u' => 'Yu$1',
74                         '/^Я(['.KK_C_UC.']|$)/u' => 'YA$1', '/^Я(['.KK_C_LC.']|$)/u' => 'Ya$1',
75                         '/^Щ(['.KK_C_UC.']|$)/u' => 'ŞÇ$1', '/^Щ(['.KK_C_LC.']|$)/u' => 'Şç$1',
76                         ## other ЁЮЯ
77                         '/Ё/u' => 'YO', '/ё/u' => 'yo',
78                         '/Ю/u' => 'YU', '/ю/u' => 'yu',
79                         '/Я/u' => 'YA', '/я/u' => 'ya',
80                         '/Щ/u' => 'ŞÇ', '/щ/u' => 'şç',
81                         ## soft and hard signs
82                         '/[ъЪ]/u' => 'ʺ', '/[ьЬ]/u' => 'ʹ',
83                         ## other characters
84                         '/А/u' => 'A', '/а/u' => 'a', '/Ә/u' => 'Ä', '/ә/u' => 'ä',
85                         '/Б/u' => 'B', '/б/u' => 'b', '/В/u' => 'V', '/в/u' => 'v',
86                         '/Г/u' => 'G', '/г/u' => 'g', '/Ғ/u' => 'Ğ', '/ғ/u' => 'ğ',
87                         '/Д/u' => 'D', '/д/u' => 'd', '/Е/u' => 'E', '/е/u' => 'e',
88                         '/Ж/u' => 'J', '/ж/u' => 'j', '/З/u' => 'Z', '/з/u' => 'z',
89                         '/И/u' => 'Ï', '/и/u' => 'ï', '/Й/u' => 'Ý', '/й/u' => 'ý',
90                         '/К/u' => 'K', '/к/u' => 'k', '/Қ/u' => 'Q', '/қ/u' => 'q',
91                         '/Л/u' => 'L', '/л/u' => 'l', '/М/u' => 'M', '/м/u' => 'm',
92                         '/Н/u' => 'N', '/н/u' => 'n', '/Ң/u' => 'Ñ', '/ң/u' => 'ñ',
93                         '/О/u' => 'O', '/о/u' => 'o', '/Ө/u' => 'Ö', '/ө/u' => 'ö',
94                         '/П/u' => 'P', '/п/u' => 'p', '/Р/u' => 'R', '/р/u' => 'r',
95                         '/С/u' => 'S', '/с/u' => 's', '/Т/u' => 'T', '/т/u' => 't',
96                         '/У/u' => 'W', '/у/u' => 'w', '/Ұ/u' => 'U', '/ұ/u' => 'u',
97                         '/Ү/u' => 'Ü', '/ү/u' => 'ü', '/Ф/u' => 'F', '/ф/u' => 'f',
98                         '/Х/u' => 'X', '/х/u' => 'x', '/Һ/u' => 'H', '/һ/u' => 'h',
99                         '/Ц/u' => 'C', '/ц/u' => 'c', '/Ч/u' => 'Ç', '/ч/u' => 'ç',
100                         '/Ш/u' => 'Ş', '/ш/u' => 'ş', '/Ы/u' => 'I', '/ы/u' => 'ı',
101                         '/І/u' => 'İ', '/і/u' => 'i', '/Э/u' => 'É', '/э/u' => 'é',
102                 );
103
104                 $this->mLatn2Cyrl = array(
105                         ## Punctuation
106                         '/#|No\./' => '№',
107                         ## Şç
108                         '/ŞÇʹ/u'=> 'ЩЬ', '/Şçʹ/u'=> 'Щь', '/Şçʹ/u'=> 'Щь',
109                         '/Ş[Çç]/u' => 'Щ', '/şç/u' => 'щ',
110                         ## soft and hard signs
111                         '/(['.KK_L_UC.'])ʺ(['.KK_L_UC.'])/u' => '$1Ъ$2',
112                         '/ʺ(['.KK_L_LC.'])/u' => 'ъ$1',
113                         '/(['.KK_L_UC.'])ʹ(['.KK_L_UC.'])/u' => '$1Ь$2',
114                         '/ʹ(['.KK_L_LC.'])/u' => 'ь$1',
115                         '/ʺ/u' => 'ъ',
116                         '/ʹ/u' => 'ь',
117                         ## Ye Yo Yu Ya.
118                         '/Y[Ee]/u' => 'Е', '/ye/u' => 'е',
119                         '/Y[Oo]/u' => 'Ё', '/yo/u' => 'ё',
120                         '/Y[UWuw]/u' => 'Ю', '/y[uw]/u' => 'ю',
121                         '/Y[Aa]/u' => 'Я', '/ya/u' => 'я',
122                         ## other characters
123                         '/A/u' => 'А', '/a/u' => 'а', '/Ä/u' => 'Ә', '/ä/u' => 'ә',
124                         '/B/u' => 'Б', '/b/u' => 'б', '/C/u' => 'Ц', '/c/u' => 'ц',
125                         '/Ç/u' => 'Ч', '/ç/u' => 'ч', '/D/u' => 'Д', '/d/u' => 'д',
126                         '/E/u' => 'Е', '/e/u' => 'е', '/É/u' => 'Э', '/é/u' => 'э',
127                         '/F/u' => 'Ф', '/f/u' => 'ф', '/G/u' => 'Г', '/g/u' => 'г',
128                         '/Ğ/u' => 'Ғ', '/ğ/u' => 'ғ', '/H/u' => 'Һ', '/h/u' => 'һ',
129                         '/I/u' => 'Ы', '/ı/u' => 'ы', '/İ/u' => 'І', '/i/u' => 'і',
130                         '/Ï/u' => 'И', '/ï/u' => 'и', '/J/u' => 'Ж', '/j/u' => 'ж',
131                         '/K/u' => 'К', '/k/u' => 'к', '/L/u' => 'Л', '/l/u' => 'л',
132                         '/M/u' => 'М', '/m/u' => 'м', '/N/u' => 'Н', '/n/u' => 'н',
133                         '/Ñ/u' => 'Ң', '/ñ/u' => 'ң', '/O/u' => 'О', '/o/u' => 'о',
134                         '/Ö/u' => 'Ө', '/ö/u' => 'ө', '/P/u' => 'П', '/p/u' => 'п',
135                         '/Q/u' => 'Қ', '/q/u' => 'қ', '/R/u' => 'Р', '/r/u' => 'р',
136                         '/S/u' => 'С', '/s/u' => 'с', '/Ş/u' => 'Ш', '/ş/u' => 'ш',
137                         '/T/u' => 'Т', '/t/u' => 'т', '/U/u' => 'Ұ', '/u/u' => 'ұ',
138                         '/Ü/u' => 'Ү', '/ü/u' => 'ү', '/V/u' => 'В', '/v/u' => 'в',
139                         '/W/u' => 'У', '/w/u' => 'у', '/Ý/u' => 'Й', '/ý/u' => 'й',
140                         '/X/u' => 'Х', '/x/u' => 'х', '/Z/u' => 'З', '/z/u' => 'з',
141                 );
142
143                 $this->mCyLa2Arab = array(
144                         ## Punctuation -> Arabic
145                         '/#|№|No\./u' => '؀', # &#x0600;
146                         '/\,/' => '،', # &#x060C;
147                         '/;/'  => '؛', # &#x061B;
148                         '/\?/' => '؟', # &#x061F;
149                         '/%/'  => '٪', # &#x066A;
150                         '/\*/' => '٭', # &#x066D;
151                         ## Digits -> Arabic
152                         '/0/' => '۰', # &#x06F0;
153                         '/1/' => '۱', # &#x06F1;
154                         '/2/' => '۲', # &#x06F2;
155                         '/3/' => '۳', # &#x06F3;
156                         '/4/' => '۴', # &#x06F4;
157                         '/5/' => '۵', # &#x06F5;
158                         '/6/' => '۶', # &#x06F6;
159                         '/7/' => '۷', # &#x06F7;
160                         '/8/' => '۸', # &#x06F8;
161                         '/9/' => '۹', # &#x06F9;
162                         ## Cyrillic -> Arabic
163                         '/Аллаһ/ui' => 'ﷲ',
164                         '/([АӘЕЁИОӨҰҮЭЮЯЪЬ])е/ui' => '$1يە',
165                         '/[еэ]/ui' => 'ە', '/[ъь]/ui' => '',
166                         '/[аә]/ui' => 'ا', '/[оө]/ui' => 'و', '/[ұү]/ui' => 'ۇ', '/[ыі]/ui' => 'ى',
167                         '/[и]/ui' => 'ىي', '/ё/ui' => 'يو', '/ю/ui' => 'يۋ', '/я/ui' => 'يا', '/[й]/ui' => 'ي',
168                         '/ц/ui' => 'تس', '/щ/ui' => 'شش',
169                         '/һ/ui' => 'ح', '/ч/ui' => 'تش',
170                         #'/һ/ui' => 'ھ', '/ч/ui' => 'چ',
171                         '/б/ui' => 'ب', '/в/ui' => 'ۆ', '/г/ui' => 'گ', '/ғ/ui' => 'ع',
172                         '/д/ui' => 'د', '/ж/ui' => 'ج', '/з/ui' => 'ز', '/к/ui' => 'ك',
173                         '/қ/ui' => 'ق', '/л/ui' => 'ل', '/м/ui' => 'م', '/н/ui' => 'ن',
174                         '/ң/ui' => 'ڭ', '/п/ui' => 'پ', '/р/ui' => 'ر', '/с/ui' => 'س',
175                         '/т/ui' => 'ت', '/у/ui' => 'ۋ', '/ф/ui' => 'ف', '/х/ui' => 'ح',
176                         '/ш/ui' => 'ش',
177                         ## Latin -> Arabic // commented for now...
178                         /*'/Allah/ui' => 'ﷲ',
179                         '/[eé]/ui' => 'ە', '/[yý]/ui' => 'ي', '/[ʺʹ]/ui' => '',
180                         '/[aä]/ui' => 'ا', '/[oö]/ui' => 'و', '/[uü]/ui' => 'ۇ',
181                         '/[ï]/ui' => 'ىي', '/[ıIiİ]/u' => 'ى',
182                         '/c/ui' => 'تس',
183                         '/ç/ui' => 'تش', '/h/ui' => 'ح',
184                         #'/ç/ui' => 'چ', '/h/ui' => 'ھ',
185                         '/b/ui' => 'ب','/d/ui' => 'د',
186                         '/f/ui' => 'ف', '/g/ui' => 'گ', '/ğ/ui' => 'ع',
187                         '/j/ui' => 'ج', '/k/ui' => 'ك', '/l/ui' => 'ل', '/m/ui' => 'م',
188                         '/n/ui' => 'ن', '/ñ/ui' => 'ڭ', '/p/ui' => 'پ', '/q/ui' => 'ق',
189                         '/r/ui' => 'ر', '/s/ui' => 'س', '/ş/ui' => 'ش', '/t/ui' => 'ت',
190                         '/v/ui' => 'ۆ', '/w/ui' => 'ۋ', '/x/ui' => 'ح', '/z/ui' => 'ز',*/
191                 );
192         }
193
194         /* rules should be defined as -{ekavian | iyekavian-} -or-
195                 -{code:text | code:text | ...}-
196                 update: delete all rule parsing because it's not used
197                                 currently, and just produces a couple of bugs
198         */
199         function parseManualRule($rule, $flags=array()) {
200                 if(in_array('T',$flags)){
201                         return parent::parseManualRule($rule, $flags);
202                 }
203
204                 // otherwise ignore all formatting
205                 foreach($this->mVariants as $v) {
206                         $carray[$v] = $rule;
207                 }
208
209                 return $carray;
210         }
211
212         // Do not convert content on talk pages
213         function parserConvert( $text, &$parser ){
214                 if(is_object($parser->getTitle() ) && $parser->getTitle()->isTalkPage())
215                         $this->mDoContentConvert=false;
216                 else
217                         $this->mDoContentConvert=true;
218
219                 return parent::parserConvert($text, $parser );
220         }
221
222         /*
223          * A function wrapper:
224          *  - if there is no selected variant, leave the link
225          *    names as they were
226          *  - do not try to find variants for usernames
227          */
228         function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
229                 // check for user namespace
230                 if(is_object($nt)){
231                         $ns = $nt->getNamespace();
232                         if($ns==NS_USER || $ns==NS_USER_TALK)
233                                 return;
234                 }
235
236                 $oldlink=$link;
237                 parent::findVariantLink( $link, $nt, $ignoreOtherCond );
238                 if( $this->getPreferredVariant()==$this->mMainLanguageCode )
239                         $link=$oldlink;
240         }
241
242         /*
243          * An ugly function wrapper for parsing Image titles
244          * (to prevent image name conversion)
245          */
246         function autoConvert($text, $toVariant=false) {
247                 global $wgTitle;
248                 if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_FILE){
249                         $imagename = $wgTitle->getNsText();
250                         if(preg_match("/^$imagename:/",$text)) return $text;
251                 }
252                 return parent::autoConvert($text,$toVariant);
253         }
254
255         /**
256          *  It translates text into variant
257          */
258         function translate( $text, $toVariant ){
259                 global $wgContLanguageCode;
260                 $text = parent::translate( $text, $toVariant );
261
262                 $letters = '';
263                 switch( $toVariant ) {
264                         case 'kk-cyrl':
265                         case 'kk-kz':
266                                 $letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
267                                 $wgContLanguageCode = 'kk';
268                                 break;
269                         case 'kk-latn':
270                         case 'kk-tr':
271                                 $letters = KK_C_UC . KK_C_LC . '№0123456789';
272                                 $wgContLanguageCode = 'kk-Latn';
273                                 break;
274                         case 'kk-arab':
275                         case 'kk-cn':
276                                 $letters = KK_C_UC.KK_C_LC./*KK_L_UC.KK_L_LC.'ʺʹ'.*/',;\?%\*№0123456789';
277                                 $wgContLanguageCode = 'kk-Arab';
278                                 break;
279                         default:
280                                 $wgContLanguageCode = 'kk';
281                                 return $text;
282                 }
283                 // disable conversion variables like $1, $2...
284                 $varsfix = '\$[0-9]';
285
286                 $matches = preg_split( '/' . $varsfix . '[^' . $letters . ']+/u', $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
287                 $mstart = 0;
288                 $ret = '';
289                 foreach( $matches as $m ) {
290                         $ret .= substr( $text, $mstart, $m[1]-$mstart );
291                         $ret .= $this->regsConverter( $m[0], $toVariant );
292                         $mstart = $m[1] + strlen($m[0]);
293                 }
294                 return $ret;
295         }
296
297         function regsConverter( $text, $toVariant ) {
298                 if ($text == '') return $text;
299
300                 $pat = array();
301                 $rep = array();
302                 switch( $toVariant ) {
303                         case 'kk-arab':
304                         case 'kk-cn':
305                                 $letters = KK_C_LC.KK_C_UC/*.KK_L_LC.KK_L_UC*/;
306                                 $front = 'әөүіӘӨҮІ'/*.'äöüiÄÖÜİ'*/;
307                                 $excludes = 'еэгғкқЕЭГҒКҚ'/*.'eégğkqEÉGĞKQ'*/;
308                                 // split text to words
309                                 $matches = preg_split( '/[\b\s\-\.:]+/', $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
310                                 $mstart = 0;
311                                 $ret = '';
312                                 foreach( $matches as $m ) {
313                                         $ret .= substr( $text, $mstart, $m[1] - $mstart );
314                                         // is matched the word to front vowels?
315                                         // exclude a words matched to е, э, г, к, к, қ,
316                                         // them should be without hamza
317                                         if ( preg_match('/['.$front.']/u', $m[0]) && !preg_match('/['.$excludes.']/u', $m[0]) ) {
318                                                 $ret .= preg_replace('/['.$letters.']+/u', H_HAMZA.'$0', $m[0]);
319                                         } else {
320                                                 $ret .= $m[0];
321                                         }
322                                         $mstart = $m[1] + strlen($m[0]);
323                                 }
324                                 $text =& $ret;
325                                 foreach( $this->mCyLa2Arab as $pat => $rep ) {
326                                         $text = preg_replace( $pat, $rep, $text );
327                                 }
328                                 return $text;
329                                 break;
330                         case 'kk-latn':
331                         case 'kk-tr':
332                                 foreach( $this->mCyrl2Latn as $pat => $rep ) {
333                                         $text = preg_replace( $pat, $rep, $text );
334                                 }
335                                 return $text;
336                                 break;
337                         case 'kk-cyrl':
338                         case 'kk-kz':
339                                 foreach( $this->mLatn2Cyrl as $pat => $rep ) {
340                                         $text = preg_replace( $pat, $rep, $text );
341                                 }
342                                 return $text;
343                                 break;
344                         default:
345                                 return $text;
346                 }
347         }
348
349         /*
350          * We want our external link captions to be converted in variants,
351          * so we return the original text instead -{$text}-, except for URLs
352          */
353         function markNoConversion( $text, $noParse=false ) {
354                 if( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
355                         return parent::markNoConversion( $text );
356                 return $text;
357         }
358
359         function convertCategoryKey( $key ) {
360                 return $this->autoConvert( $key, 'kk' );
361         }
362
363 }
364
365 /**
366  * class that handles Cyrillic, Latin and Arabic scripts for Kazakh
367  * right now it only distinguish kk_cyrl, kk_latn, kk_arab and kk_kz, kk_tr, kk_cn.
368  *
369  * @ingroup Language
370  */
371 class LanguageKk extends LanguageKk_cyrl {
372
373         function __construct() {
374                 global $wgHooks;
375                 parent::__construct();
376
377                 $variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
378                 $variantfallbacks = array(
379                         'kk'      => 'kk-cyrl',
380                         'kk-cyrl' => 'kk',
381                         'kk-latn' => 'kk',
382                         'kk-arab' => 'kk',
383                         'kk-kz'   => 'kk-cyrl',
384                         'kk-tr'   => 'kk-latn',
385                         'kk-cn'   => 'kk-arab'
386                 );
387
388                 $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
389
390                 $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
391         }
392
393         /**
394          * Work around for right-to-left direction support in kk-arab and kk-cn
395          *
396          * @return bool
397          */
398         function isRTL() {
399                 $variant = $this->getPreferredVariant();
400                 if ( $variant == 'kk-arab' || $variant == 'kk-cn' ) {
401                         return true;
402                 } else {
403                         return parent::isRTL();
404                 }
405         }
406
407         /*
408          * It fixes issue with ucfirst for transforming 'i' to 'İ'
409          *
410          */
411         function ucfirst ( $string ) {
412                 $variant = $this->getPreferredVariant();
413                 if ( ($variant == 'kk-latn' || $variant == 'kk-tr') && $string[0] == 'i' ) {
414                         $string = 'İ' . substr( $string, 1 );
415                 } else {
416                         $string = parent::ucfirst( $string );
417                 }
418                 return $string;
419         }
420
421         /*
422          * It fixes issue with  lcfirst for transforming 'I' to 'ı'
423          *
424          */
425         function lcfirst ( $string ) {
426                 $variant = $this->getPreferredVariant();
427                 if ( ($variant == 'kk-latn' || $variant == 'kk-tr') && $string[0] == 'I' ) {
428                         $string = 'ı' . substr( $string, 1 );
429                 } else {
430                         $string = parent::lcfirst( $string );
431                 }
432                 return $string;
433         }
434
435         function convertGrammar( $word, $case ) {
436                 wfProfileIn( __METHOD__ );
437
438                 $variant = $this->getPreferredVariant();
439                 switch ( $variant ) {
440                         case 'kk-arab':
441                         case 'kk-cn':
442                                 $word = parent::convertGrammarKk_arab( $word, $case );
443                                 break;
444                         case 'kk-latn':
445                         case 'kk-tr':
446                                 $word = parent::convertGrammarKk_latn( $word, $case );
447                                 break;
448                         case 'kk-cyrl':
449                         case 'kk-kz':
450                         case 'kk':
451                         default:
452                                 $word = parent::convertGrammarKk_cyrl( $word, $case );
453                 }
454
455                 wfProfileOut( __METHOD__ );
456                 return $word;
457         }
458 }