IcuCollation: Add CollationCkb subclass for Sorani Kurdish

ICU does not currently support Sorani Kurdish / Central Kurdish
language ('ckb'). CollationCkb uses the same collation rules as
Persian / Farsi ('fa'), but different characters for digits.

For use at ckb.wikipedia, which currently has 'uca-fa' collation
deployed as a workaround.

Added the MW language used for transforming digits to cache key for
first-letters data, in addition to the ICU locale.

Bug: 55630
Change-Id: I7d7f007592ede952859c5c9556b9ea5084b90e89
This commit is contained in:
Bartosz Dziewoński 2013-11-17 16:02:29 +01:00 committed by Tim Starling
parent 66abb4b620
commit 0f614669b6
2 changed files with 18 additions and 1 deletions

View file

@ -50,6 +50,7 @@ $wgAutoloadLocalClasses = array(
'ChangeTags' => 'includes/ChangeTags.php',
'ChannelFeed' => 'includes/Feed.php',
'Collation' => 'includes/Collation.php',
'CollationCkb' => 'includes/Collation.php',
'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
'Cookie' => 'includes/Cookie.php',
'CookieJar' => 'includes/Cookie.php',

View file

@ -47,6 +47,8 @@ abstract class Collation {
return new IdentityCollation;
case 'uca-default':
return new IcuCollation( 'root' );
case 'xx-uca-ckb':
return new CollationCkb;
default:
$match = array();
if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
@ -350,7 +352,7 @@ class IcuCollation extends Collation {
}
$cache = wfGetCache( CACHE_ANYTHING );
$cacheKey = wfMemcKey( 'first-letters', $this->locale );
$cacheKey = wfMemcKey( 'first-letters', $this->locale, $this->digitTransformLanguage->getCode() );
$cacheEntry = $cache->get( $cacheKey );
if ( $cacheEntry && isset( $cacheEntry['version'] )
@ -615,3 +617,17 @@ class IcuCollation extends Collation {
}
}
}
/**
* Workaround for the lack of support of Sorani Kurdish / Central Kurdish language ('ckb') in ICU.
*
* Uses the same collation rules as Persian / Farsi ('fa'), but different characters for digits.
*/
class CollationCkb extends IcuCollation {
function __construct() {
// This will set $locale and collators, which affect the actual sorting order
parent::__construct( 'fa' );
// Override the 'fa' language set by parent constructor, which affects #getFirstLetterData()
$this->digitTransformLanguage = Language::factory( 'ckb' );
}
}