@ -7,6 +7,7 @@
namespace yiiunit\framework\i18n;
use Yii;
use yii\base\Event;
use yii\i18n\I18N;
use yii\i18n\PhpMessageSource;
@ -35,13 +36,19 @@ class I18NTest extends TestCase
{
$this->i18n = new I18N([
'translations' => [
'test' => new PhpMessageSource([
'test' => [
'class' => $this->getMessageSourceClass(),
'basePath' => '@yiiunit/data/i18n/messages',
])
]
]
]);
}
private function getMessageSourceClass()
{
return PhpMessageSource::className();
}
public function testTranslate()
{
$msg = 'The dog runs fast.';
@ -63,13 +70,14 @@ class I18NTest extends TestCase
{
$i18n = new I18N([
'translations' => [
'*' => new PhpMessageSource([
'*' => [
'class' => $this->getMessageSourceClass(),
'basePath' => '@yiiunit/data/i18n/messages',
'fileMap' => [
'test' => 'test.php',
'foo' => 'test.php',
],
])
]
]
]);
@ -174,15 +182,15 @@ class I18NTest extends TestCase
public function testUsingSourceLanguageForMissingTranslation()
{
\ Yii::$app->sourceLanguage = 'ru';
\ Yii::$app->language = 'en';
Yii::$app->sourceLanguage = 'ru';
Yii::$app->language = 'en';
$msg = '{n, plural, =0{Нет комментариев} =1{# комментарий} one{# комментарий} few{# комментария} many{# комментариев} other{# комментария}}';
$this->assertEquals('5 комментариев', \ Yii::t('app', $msg, ['n' => 5]));
$this->assertEquals('3 комментария', \ Yii::t('app', $msg, ['n' => 3]));
$this->assertEquals('1 комментарий', \ Yii::t('app', $msg, ['n' => 1]));
$this->assertEquals('21 комментарий', \ Yii::t('app', $msg, ['n' => 21]));
$this->assertEquals('Нет комментариев', \ Yii::t('app', $msg, ['n' => 0]));
$this->assertEquals('5 комментариев', Yii::t('app', $msg, ['n' => 5]));
$this->assertEquals('3 комментария', Yii::t('app', $msg, ['n' => 3]));
$this->assertEquals('1 комментарий', Yii::t('app', $msg, ['n' => 1]));
$this->assertEquals('21 комментарий', Yii::t('app', $msg, ['n' => 21]));
$this->assertEquals('Нет комментариев', Yii::t('app', $msg, ['n' => 0]));
}
/**
@ -213,6 +221,50 @@ class I18NTest extends TestCase
Event::off(PhpMessageSource::className(), PhpMessageSource::EVENT_MISSING_TRANSLATION);
}
public function sourceLanguageDataProvider()
{
return [
['en-GB'],
['en']
];
}
/**
* @dataProvider sourceLanguageDataProvider
* @param $sourceLanguage
*/
public function testIssue11429($sourceLanguage)
{
$this->mockApplication();
$this->setI18N();
Yii::$app->sourceLanguage = $sourceLanguage;
$logger = Yii::getLogger();
$logger->messages = [];
$filter = function ($array) {
// Ensures that error message is related to PhpMessageSource
$className = $this->getMessageSourceClass();
return substr_compare($array[2], $className, 0, strlen($className)) === 0;
};
$this->assertEquals('The dog runs fast.', $this->i18n->translate('test', 'The dog runs fast.', [], 'en-GB'));
$this->assertEquals([], array_filter($logger->messages, $filter));
$this->assertEquals('The dog runs fast.', $this->i18n->translate('test', 'The dog runs fast.', [], 'en'));
$this->assertEquals([], array_filter($logger->messages, $filter));
$this->assertEquals('The dog runs fast.', $this->i18n->translate('test', 'The dog runs fast.', [], 'en-CA'));
$this->assertEquals([], array_filter($logger->messages, $filter));
$this->assertEquals('The dog runs fast.', $this->i18n->translate('test', 'The dog runs fast.', [], 'hz-HZ'));
$this->assertCount(1, array_filter($logger->messages, $filter));
$logger->messages = [];
$this->assertEquals('The dog runs fast.', $this->i18n->translate('test', 'The dog runs fast.', [], 'hz'));
$this->assertCount(1, array_filter($logger->messages, $filter));
$logger->messages = [];
}
/**
* Formatting a message that contains params but they are not provided.
* https://github.com/yiisoft/yii2/issues/10884