Split user language (UI translation) from locale (formatted values) (#4595)

This commit is contained in:
Kevin Papst
2024-01-30 00:09:53 +01:00
committed by GitHub
parent 12ef19df28
commit df3ca9d5a9
39 changed files with 685 additions and 881 deletions

View File

@@ -48,27 +48,18 @@ class LocaleFormatExtensionsTest extends TestCase
}
/**
* @param string|array $locale
* @param array|string $dateSettings
* @return LocaleFormatExtensions
* @param array<string, array{'date': string, 'time': string, 'rtl': bool, 'translation': bool}> $languageSettings
*/
protected function getSut($locale, $dateSettings, ?User $user = null)
private function getSut(string $locale, array $languageSettings): LocaleFormatExtensions
{
$language = $locale;
if (\is_array($locale)) {
$language = $dateSettings;
$dateSettings = $locale;
}
$user = new User();
$user->setTimezone('Europe/Vienna');
if ($user === null) {
$user = new User();
$user->setTimezone('Europe/Vienna');
}
$security = $this->createMock(Security::class);
$security->expects($this->any())->method('getUser')->willReturn($user);
$sut = new LocaleFormatExtensions(new LocaleService($dateSettings), $security);
$sut->setLocale($language);
$sut = new LocaleFormatExtensions(new LocaleService($languageSettings), $security);
$sut->setLocale($locale);
return $sut;
}
@@ -143,9 +134,9 @@ class LocaleFormatExtensionsTest extends TestCase
public function testDateShort(string $locale, \DateTime|string|null $date, string $expected): void
{
$sut = $this->getSut($locale, [
'de' => ['date' => 'dd.MM.Y'],
'en' => ['date' => 'Y-MM-dd'],
'ru' => ['date' => 'dd.MM.Y'],
'de' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'dd.MM.Y']),
'en' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'Y-MM-dd']),
'ru' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'dd.MM.Y']),
]);
$this->assertEquals($expected, $sut->dateShort($date));
}
@@ -175,8 +166,8 @@ class LocaleFormatExtensionsTest extends TestCase
public function testDateTime(string $locale, \DateTime|string|null $date, string $expected): void
{
$sut = $this->getSut($locale, [
'de' => ['date' => 'dd.MM.Y', 'time' => 'HH:mm:s'],
'en' => ['date' => 'Y-MM-dd', 'time' => 'h:mm a'],
'de' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'dd.MM.Y', 'time' => 'HH:mm:s']),
'en' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'Y-MM-dd', 'time' => 'h:mm a']),
]);
$this->assertEquals($expected, $sut->dateTime($date));
}
@@ -265,7 +256,7 @@ class LocaleFormatExtensionsTest extends TestCase
$time = new \DateTime('2016-06-23');
$time->setTime(17, 53, 23);
$sut = $this->getSut('en', ['en' => ['time' => 'HH:mm']]);
$sut = $this->getSut('en', ['en' => array_merge(LocaleService::DEFAULT_SETTINGS, ['time' => 'HH:mm'])]);
$this->assertEquals('17:53', $sut->time($time));
$this->assertEquals('17:53', $sut->time('2016-06-23 17:53'));
}
@@ -289,10 +280,10 @@ class LocaleFormatExtensionsTest extends TestCase
public function testMoneyWithoutCurrency(): void
{
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('123.75', $sut->money(123.75));
$sut = $this->getSut($this->localeEn, 'de');
$sut = $this->getSut('de', $this->localeEn);
$this->assertEquals('123.234,76', $sut->money(123234.7554, null, true));
$this->assertEquals('123.234,76', $sut->money(123234.7554, null, false));
$this->assertEquals('123.234,76', $sut->money(123234.7554, 'EUR', false));
@@ -303,7 +294,7 @@ class LocaleFormatExtensionsTest extends TestCase
*/
public function testMoneyNoCurrency($result, $amount, $currency, $locale): void
{
$sut = $this->getSut($this->localeEn, $locale);
$sut = $this->getSut($locale, $this->localeEn);
$this->assertEquals($result, $sut->money($amount, $currency, false));
}
@@ -338,7 +329,7 @@ class LocaleFormatExtensionsTest extends TestCase
*/
public function testMoney(string $result, float|int|null $amount, string $currency, string $locale): void
{
$sut = $this->getSut($this->localeEn, $locale);
$sut = $this->getSut($locale, $this->localeEn);
$this->assertEquals($result, $sut->money($amount, $currency));
}
@@ -370,9 +361,9 @@ class LocaleFormatExtensionsTest extends TestCase
/**
* @dataProvider getAmountData
*/
public function testAmount($result, $amount, $locale): void
public function testAmount(string $result, null|int|float|string $amount, string $locale): void
{
$sut = $this->getSut($this->localeEn, $locale);
$sut = $this->getSut($locale, $this->localeEn);
$this->assertEquals($result, $sut->amount($amount));
}
@@ -391,6 +382,7 @@ class LocaleFormatExtensionsTest extends TestCase
['2.345,009', 2345.009, 'de'],
['13.75', 13.75, 'en'],
['13,75', 13.75, 'de'],
['13,75', '13.75', 'de'],
["13\u{a0}933,49", 13933.49, 'ru'],
['1.234.567,891', 1234567.891234567890000, 'de'],
];
@@ -399,11 +391,11 @@ class LocaleFormatExtensionsTest extends TestCase
/**
* @dataProvider getMoneyData62_1
*/
public function testMoney62_1($result, $amount, $currency, $locale): void
public function testMoney62_1(string $result, null|int|float $amount, string $currency, string $locale): void
{
IntlTestHelper::requireFullIntl($this, '62.1');
$sut = $this->getSut($this->localeEn, $locale);
$sut = $this->getSut($locale, $this->localeEn);
$this->assertEquals($result, $sut->money($amount, $currency));
}
@@ -432,11 +424,11 @@ class LocaleFormatExtensionsTest extends TestCase
$this->assertEquals('2.62', $sut->duration($record, true));
// test extended format
$sut = $this->getSut($this->localeFake, 'XX');
$sut = $this->getSut('XX', $this->localeFake);
$this->assertEquals('2:37', $sut->duration($record->getDuration()));
// test negative duration
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0:00', $sut->duration(0));
$this->assertEquals('0:00', $sut->duration(-1));
$this->assertEquals('0:00', $sut->duration(-59));
@@ -444,10 +436,10 @@ class LocaleFormatExtensionsTest extends TestCase
$this->assertEquals('-1:36', $sut->duration(-5786));
// test zero duration
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0:00', $sut->duration(0));
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0:00', $sut->duration(null));
$this->assertEquals('0.00', $sut->duration(null, true));
@@ -499,31 +491,31 @@ class LocaleFormatExtensionsTest extends TestCase
$this->assertEquals('2.62', $sut->durationDecimal($record));
// test extended format
$sut = $this->getSut($this->localeDe, 'de');
$sut = $this->getSut('de', $this->localeDe);
$this->assertEquals('2,62', $sut->durationDecimal($record->getDuration()));
// test negative duration
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('-0.00', $sut->durationDecimal(-1));
// test negative duration
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('-0.01', $sut->durationDecimal(-40));
$this->assertEquals('-0.01', $sut->durationDecimal(-50));
// test negative duration - with rounding issue
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('-0.02', $sut->durationDecimal(-60));
// test zero duration
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0.00', $sut->durationDecimal(-0));
$this->assertEquals('0.00', $sut->durationDecimal(0));
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0.00', $sut->durationDecimal(-0));
$sut = $this->getSut($this->localeEn, 'en');
$sut = $this->getSut('en', $this->localeEn);
$this->assertEquals('0.00', $sut->durationDecimal(null));
}