Page MenuHomePhabricator

PHP 8.4: NumberFormatter will now throw for invalid locale
Closed, ResolvedPublicBUG REPORT

Description

uselang= hack with its values such as qqx and other nonstandard language codes understood by MediaWiki can leads to passing of such code as locale to NumberFormatter constructor.

A change in php-intl extension means this will now throw ValueError in PHP 8.4. (Upstream change https://github.com/php/php-src/commit/683e78786070ab77d33f7787598ac1b90d68390a)

It will pretty much affect a lot of things that gets merged into $wgDummyLanguageCodes during setup.

foreach( $wgDummyLanguageCodes as $code ) {
  try {
     new NumberFormatter( $code, NumberFormatter::DECIMAL );
  } catch ( ValueError $e ) {
      print(  $code . ': ' . $e->getMessage() . "\n" );
  }
}

// qqq: NumberFormatter::__construct(): Argument #1 ($locale) "qqq" is invalid
// qqx: NumberFormatter::__construct(): Argument #1 ($locale) "qqx" is invalid
// cbk-zam: NumberFormatter::__construct(): Argument #1 ($locale) "cbk-zam" is invalid
// eml: NumberFormatter::__construct(): Argument #1 ($locale) "eml" is invalid
// map-bms: NumberFormatter::__construct(): Argument #1 ($locale) "map-bms" is invalid
// nrm: NumberFormatter::__construct(): Argument #1 ($locale) "nrm" is invalid
// roa-tara: NumberFormatter::__construct(): Argument #1 ($locale) "roa-tara" is invalid
// x-xss: NumberFormatter::__construct(): Argument #1 ($locale) "x-xss" is invalid

Additionally, a lot of languages selectable via the interface at Special:Preferences will suffer from the same issue.
The first language shown on Special:Preferences language dropdown selector aae - Arbërisht is one prime example.
Users who selected that language cannot be able to use wiki running PHP 8.4. Selecting the language from the interface would be impossible for those who have not already done so.

// Usable languages per includes/preferences/DefaultPreferencesFactory.php
$languageNameUtils = MediaWiki\MediaWikiServices::getInstance()->getLanguageNameUtils();
$languages = $languageNameUtils->getLanguageNames(  $languageNameUtils::AUTONYMS, $languageNameUtils::SUPPORTED );

$i = 0;
foreach( array_keys( $languages ) as $code ) {
  try {
     new NumberFormatter( $code, NumberFormatter::DECIMAL );
  } catch ( ValueError $e ) {
      $i++;
  }
}

print($i); // 94

Event Timeline

Reedy renamed this task from PHP 8.4: NumberFormater will now throw for invalid locale to PHP 8.4: NumberFormatter will now throw for invalid locale.Oct 8 2024, 12:26 PM
Reedy updated the task description. (Show Details)

Change #1103451 had a related patch set uploaded (by Umherirrender; author: Umherirrender):

[mediawiki/core@master] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1103451

Using fallback chain could be a solution

Affected languages

NumberFormatter via fallback for aae ... it => created
NumberFormatter via fallback for abs ... id => created
NumberFormatter via fallback for acf ... en => created
NumberFormatter via fallback for acm ... ar => created
NumberFormatter via fallback for ami ... zh-tw => created
NumberFormatter via fallback for ann ... en => created
NumberFormatter via fallback for apc ... ar => created
NumberFormatter via fallback for atj ... fr => created
NumberFormatter via fallback for azb ... fa => created
NumberFormatter via fallback for bcc ... fa => created
NumberFormatter via fallback for bci ... fr => created
NumberFormatter via fallback for bcl ... en => created
NumberFormatter via fallback for bdr ... ms => created
NumberFormatter via fallback for btm ... id => created
NumberFormatter via fallback for bto ... en => created
NumberFormatter via fallback for bxr ... ru => created
NumberFormatter via fallback for cbk-zam ... es => created
NumberFormatter via fallback for cdo ... cdo-latn => next ... cdo-hant => next ... nan-hant => created
NumberFormatter via fallback for cdo-hant ... cdo => next ... cdo-latn => next ... nan-hant => created
NumberFormatter via fallback for cdo-latn ... cdo => next ... cdo-hant => next ... nan-hant => created
NumberFormatter via fallback for cpx ... cpx-hant => next ... cpx-hans => next ... cpx-latn => next ... cdo => next ... zh-hant => created
NumberFormatter via fallback for cpx-hans ... cpx => next ... cpx-hant => next ... cpx-latn => next ... cdo => next ... zh-hans => created
NumberFormatter via fallback for cpx-hant ... cpx => next ... cpx-hans => next ... cpx-latn => next ... cdo => next ... zh-hant => created
NumberFormatter via fallback for dag ... en => created
NumberFormatter via fallback for dga ... en => created
NumberFormatter via fallback for diq ... en => created
NumberFormatter via fallback for dty ... ne => created
NumberFormatter via fallback for eml ... it => created
NumberFormatter via fallback for eml ... it => created
NumberFormatter via fallback for fvr ... en => created
NumberFormatter via fallback for gcf ... fr => created
NumberFormatter via fallback for gcr ... fr => created
NumberFormatter via fallback for gld ... ru => created
NumberFormatter via fallback for gpe ... en => created
NumberFormatter via fallback for guw ... en => created
NumberFormatter via fallback for hke ... en => created
NumberFormatter via fallback for hno ... en => created
NumberFormatter via fallback for hrx ... de => created
NumberFormatter via fallback for hyw ... hy => created
NumberFormatter via fallback for igl ... en => created
NumberFormatter via fallback for ike-cans ... iu => created
NumberFormatter via fallback for ike-latn ... iu => created
NumberFormatter via fallback for isv-cyrl ... en => created
NumberFormatter via fallback for isv-latn ... en => created
NumberFormatter via fallback for kai ... en => created
NumberFormatter via fallback for kbp ... fr => created
NumberFormatter via fallback for kge ... id => created
NumberFormatter via fallback for kjh ... ru => created
NumberFormatter via fallback for knc ... en => created
NumberFormatter via fallback for kus ... en => created
NumberFormatter via fallback for lbe ... ru => created
NumberFormatter via fallback for lki ... fa => created
NumberFormatter via fallback for lld ... it => created
NumberFormatter via fallback for luz ... fa => created
NumberFormatter via fallback for map-bms ... jv => created
NumberFormatter via fallback for mhr ... mrj => created
NumberFormatter via fallback for mrh ... en => created
NumberFormatter via fallback for mui ... id => created
NumberFormatter via fallback for nah ... es => created
NumberFormatter via fallback for nit ... en => created
NumberFormatter via fallback for nmz ... en => created
NumberFormatter via fallback for nod ... en => created
NumberFormatter via fallback for nrm ... nrf => next ... fr => created
NumberFormatter via fallback for nup ... en => created
NumberFormatter via fallback for nys ... en => created
NumberFormatter via fallback for ojb ... en => created
NumberFormatter via fallback for olo ... fi => created
NumberFormatter via fallback for pih ... en => created
NumberFormatter via fallback for pnb ... en => created
NumberFormatter via fallback for pwn ... zh-tw => created
NumberFormatter via fallback for qqq ... en => created
NumberFormatter via fallback for rki ... en => created
NumberFormatter via fallback for rmc ... en => created
NumberFormatter via fallback for rmy ... ro => created
NumberFormatter via fallback for roa-tara ... it => created
NumberFormatter via fallback for rsk ... sr-ec => created
NumberFormatter via fallback for ruq ... ruq-latn => next ... ro => created
NumberFormatter via fallback for ruq-cyrl ... mk => created
NumberFormatter via fallback for ruq-latn ... ro => created
NumberFormatter via fallback for rut ... ru => created
NumberFormatter via fallback for ryu ... en => created
NumberFormatter via fallback for shy ... shy-latn => next ... en => created
NumberFormatter via fallback for shy-latn ... fr => created
NumberFormatter via fallback for sjd ... ru => created
NumberFormatter via fallback for sje ... en => created
NumberFormatter via fallback for skr ... skr-arab => next ... en => created
NumberFormatter via fallback for skr-arab ... skr => next ... en => created
NumberFormatter via fallback for sro ... it => created
NumberFormatter via fallback for sty ... ru => created
NumberFormatter via fallback for syl ... en => created
NumberFormatter via fallback for szy ... zh-tw => created
NumberFormatter via fallback for tay ... zh-tw => created
NumberFormatter via fallback for tdd ... en => created
NumberFormatter via fallback for ttj ... nyo => created
NumberFormatter via fallback for wls ... fr => created
NumberFormatter via fallback for xsy ... en => created

Change #1103451 merged by jenkins-bot:

[mediawiki/core@master] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1103451

Change #1120233 had a related patch set uploaded (by Umherirrender; author: Umherirrender):

[mediawiki/core@REL1_43] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120233

Change #1120233 merged by jenkins-bot:

[mediawiki/core@REL1_43] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120233

Judging by the tags on this task, should this fix also be backported to MW1.42 & MW1.39?

Change #1120248 had a related patch set uploaded (by Umherirrender; author: Umherirrender):

[mediawiki/core@REL1_42] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120248

Change #1120249 had a related patch set uploaded (by Umherirrender; author: Umherirrender):

[mediawiki/core@REL1_39] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120249

Judging by the tags on this task, should this fix also be backported to MW1.42 & MW1.39?

Yes, it has a merge conflicts, but that was easy to resolve as it conflicts with the namespacing of the Language class in 1.43. But the patch set should work as well.

As this throws an exception in php8.4 there is no way to ignore the issue. Other deprecations like T376276 not fixed in these releases and needs to ignore with weaker error reporting, so not sure how usable the backport is.

Change #1120249 merged by jenkins-bot:

[mediawiki/core@REL1_39] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120249

Change #1120248 merged by jenkins-bot:

[mediawiki/core@REL1_42] language: Use fallback chain to create NumberFormatter

https://gerrit.wikimedia.org/r/1120248