/** @var Language */
protected $digitTransformLanguage;
+ /** @var boolean */
+ private $useNumericCollation = false;
+
/** @var array */
private $firstLetterData;
// Verified by native speakers
'be' => [ "Ё" ],
'be-tarask' => [ "Ё" ],
+ 'bs' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
+ 'cs' => [ "Č", "Ch", "Ř", "Š", "Ž" ],
'cy' => [ "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ],
'en' => [],
- // RTL, let's put each letter on a new line
'fa' => [
+ // RTL, let's put each letter on a new line
"آ",
"ء",
"ه",
],
'fi' => [ "Å", "Ä", "Ö" ],
'fr' => [],
+ 'hr' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
+ 'hsb' => [ "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ],
'hu' => [ "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ],
'is' => [ "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ],
'it' => [],
+ 'lt' => [ "Č", "Š", "Ž" ],
'lv' => [ "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ],
+ 'mk' => [ "Ѓ", "Ќ" ],
+ 'nl' => [],
'pl' => [ "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ],
'pt' => [],
'ru' => [],
+ 'sk' => [ "Ä", "Č", "Ch", "Ô", "Š", "Ž" ],
+ 'sr' => [],
'sv' => [ "Å", "Ä", "Ö" ],
'sv@collation=standard' => [ "Å", "Ä", "Ö" ],
+ 'ta' => [
+ "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
+ "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
+ "ஸ்", "ஹ்", "க்ஷ்"
+ ],
'uk' => [ "Ґ", "Ь" ],
'vi' => [ "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ],
// Not verified, but likely correct
'az' => [ "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ],
'bg' => [],
'br' => [ "Ch", "C'h" ],
- 'bs' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
'ca' => [],
'co' => [],
- 'cs' => [ "Č", "Ch", "Ř", "Š", "Ž" ],
'da' => [ "Æ", "Ø", "Å" ],
'de' => [],
'dsb' => [ "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ],
'ga' => [],
'gd' => [],
'gl' => [ "Ch", "Ll", "Ñ" ],
- 'hr' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
- 'hsb' => [ "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ],
'kk' => [ "Ү", "І" ],
'kl' => [ "Æ", "Ø", "Å" ],
'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ],
'ky' => [ "Ё" ],
'la' => [],
'lb' => [],
- 'lt' => [ "Č", "Š", "Ž" ],
- 'mk' => [],
'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
- 'nl' => [],
'no' => [ "Æ", "Ø", "Å" ],
'oc' => [],
'rm' => [],
'ro' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ],
'sco' => [],
- 'sk' => [ "Ä", "Č", "Ch", "Ô", "Š", "Ž" ],
'sl' => [ "Č", "Š", "Ž" ],
'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
- 'sr' => [],
- 'ta' => [
- "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
- "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
- "ஸ்", "ஹ்", "க்ஷ்"
- ],
'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
'tl' => [ "Ñ", "Ng" ],
'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
$this->primaryCollator = Collator::create( $locale );
$this->primaryCollator->setStrength( Collator::PRIMARY );
+
+ // If the special suffix for numeric collation is present, turn on numeric collation.
+ if ( substr( $locale, -5, 5 ) === '-u-kn' ) {
+ $this->useNumericCollation = true;
+ // Strip off the special suffix so it doesn't trip up fetchFirstLetterData().
+ $this->locale = substr( $this->locale, 0, -5 );
+ $this->mainCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+ $this->primaryCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+ }
}
public function getSortKey( $string ) {
return '';
}
- // Check for CJK
$firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
+
+ // If the first character is a CJK character, just return that character.
if ( ord( $firstChar ) > 0x7f && self::isCjk( UtfNormal\Utils::utf8ToCodepoint( $firstChar ) ) ) {
return $firstChar;
}
// Before the first letter
return '';
}
- return $this->getLetterByIndex( $min );
+
+ $sortLetter = $this->getLetterByIndex( $min );
+
+ if ( $this->useNumericCollation ) {
+ // If the sort letter is a number, return '0–9' (or localized equivalent).
+ // ASCII value of 0 is 48. ASCII value of 9 is 57.
+ // Note that this also applies to non-Arabic numerals since they are
+ // mapped to Arabic numeral sort letters. For example, ২ sorts as 2.
+ if ( ord( $sortLetter ) >= 48 && ord( $sortLetter ) <= 57 ) {
+ $sortLetter = wfMessage( 'category-header-numerals' )->numParams( 0, 9 )->text();
+ }
+ }
+ return $sortLetter;
}
/**
}
/**
+ * Test if a code point is a CJK (Chinese, Japanese, Korean) character
* @since 1.16.3
*/
public static function isCjk( $codepoint ) {