Skip to content

Commit

Permalink
fix: lang() may return false
Browse files Browse the repository at this point in the history
  • Loading branch information
kenjis committed Sep 24, 2023
1 parent c4bd34e commit 0b9c49a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
10 changes: 9 additions & 1 deletion system/Language/Language.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace CodeIgniter\Language;

use Config\Services;
use InvalidArgumentException;
use MessageFormatter;

/**
Expand Down Expand Up @@ -191,7 +192,14 @@ protected function formatMessage($message, array $args = [])
return $message;
}

return MessageFormatter::formatMessage($this->locale, $message, $args);
$formatted = MessageFormatter::formatMessage($this->locale, $message, $args);
if ($formatted === false) {
throw new InvalidArgumentException(
lang('Language.invalidMessageFormat', [$message, implode(',', $args)])
);
}

return $formatted;
}

/**
Expand Down
15 changes: 15 additions & 0 deletions system/Language/en/Language.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <[email protected]>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/

// "Language" language settings
return [
'invalidMessageFormat' => 'Invalid message format: "{0}", args: "{1}"',
];
23 changes: 23 additions & 0 deletions tests/system/Language/LanguageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\Mock\MockLanguage;
use Config\Services;
use InvalidArgumentException;
use MessageFormatter;
use Tests\Support\Language\SecondMockLanguage;

Expand Down Expand Up @@ -126,6 +127,28 @@ public function testGetLineArrayFormatsMessages(): void
$this->assertSame(['45 related books.'], $this->lang->getLine('books.bookList', [91 / 2]));
}

/**
* @see https://github.com/codeigniter4/shield/issues/851
*/
public function testGetLineInvalidFormatMessage(): void
{
// No intl extension? then we can't test this - go away....
if (! class_exists(MessageFormatter::class)) {
$this->markTestSkipped('No intl support.');
}

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage(
'Invalid message format: "تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.", args: "password,hits,wording"'

This comment has been minimized.

Copy link
@neznaika0

neznaika0 Sep 24, 2023

Contributor

Is this normal (language) for tests?

);

$this->lang->setData('Auth', [
'errorPasswordPwned' => 'تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.',
]);

$this->lang->getLine('Auth.errorPasswordPwned', ['password', 'hits', 'wording']);
}

/**
* @see https://github.com/codeigniter4/CodeIgniter4/issues/891
*/
Expand Down

0 comments on commit 0b9c49a

Please sign in to comment.