From 66abb4b620438fec1953e969c0a70ca8748747b6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Sun, 13 Oct 2013 00:21:01 +0200 Subject: [PATCH] IcuCollation: Sort digits under localised digits' headings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Previously both '1' and 'Û±' ("DIGIT ONE" and "EXTENDED ARABIC-INDIC DIGIT ONE") were sorted under '1' heading, regardless of collation locale. Now they will be both sorted under localised heading name (transformed using Language#formatNum), for example '1' for 'uca-en' collation or 'Û±' for 'uca-fa' collation. Bug: 55630 Change-Id: I0b745d955a6e72f53873c95648087aa5f90a8852 --- includes/Collation.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/includes/Collation.php b/includes/Collation.php index ac2187c288..b0688f54e1 100644 --- a/includes/Collation.php +++ b/includes/Collation.php @@ -149,9 +149,9 @@ class IdentityCollation extends Collation { } class IcuCollation extends Collation { - const FIRST_LETTER_VERSION = 1; + const FIRST_LETTER_VERSION = 2; - var $primaryCollator, $mainCollator, $locale; + var $primaryCollator, $mainCollator, $locale, $digitTransformLanguage; var $firstLetterData; /** @@ -284,7 +284,12 @@ class IcuCollation extends Collation { throw new MWException( 'An ICU collation was requested, ' . 'but the intl extension is not available.' ); } + $this->locale = $locale; + // Drop everything after the '@' in locale's name + $localeParts = explode( '@', $locale ); + $this->digitTransformLanguage = Language::factory( $locale === 'root' ? 'en' : $localeParts[0] ); + $this->mainCollator = Collator::create( $locale ); if ( !$this->mainCollator ) { throw new MWException( "Invalid ICU locale specified for collation: $locale" ); @@ -365,6 +370,12 @@ class IcuCollation extends Collation { if ( isset( self::$tailoringFirstLetters['-' . $this->locale] ) ) { $letters = array_diff( $letters, self::$tailoringFirstLetters['-' . $this->locale] ); } + // Apply digit transforms + $digits = array( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ); + $letters = array_diff( $letters, $digits ); + foreach ( $digits as $digit ) { + $letters[] = $this->digitTransformLanguage->formatNum( $digit, true ); + } } else { $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" ); if ( $letters === false ) { -- 2.20.1