[Translation] Added intl message formatter.
This commit is contained in:
parent
19e8e69979
commit
c2b3dc0a90
@ -33,6 +33,10 @@
|
|||||||
<argument type="service" id="identity_translator" />
|
<argument type="service" id="identity_translator" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<service id="translator.formatter.intl" class="Symfony\Component\Translation\Formatter\IntlMessageFormatter" public="false" />
|
||||||
|
|
||||||
|
<service id="translator.selector" class="Symfony\Component\Translation\MessageSelector" public="false" />
|
||||||
|
|
||||||
<service id="translation.loader.php" class="Symfony\Component\Translation\Loader\PhpFileLoader">
|
<service id="translation.loader.php" class="Symfony\Component\Translation\Loader\PhpFileLoader">
|
||||||
<tag name="translation.loader" alias="php" />
|
<tag name="translation.loader" alias="php" />
|
||||||
</service>
|
</service>
|
||||||
|
@ -41,6 +41,7 @@ CHANGELOG
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
* Added support for escaping `|` in plural translations with double pipe.
|
* Added support for escaping `|` in plural translations with double pipe.
|
||||||
|
* Added intl message formatter.
|
||||||
|
|
||||||
3.1.0
|
3.1.0
|
||||||
-----
|
-----
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Translation\Formatter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
|
||||||
|
*/
|
||||||
|
class IntlMessageFormatter implements MessageFormatterInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function format($message, $locale, array $parameters = array())
|
||||||
|
{
|
||||||
|
$formatter = new \MessageFormatter($locale, $message);
|
||||||
|
if (null === $formatter) {
|
||||||
|
throw new \InvalidArgumentException(sprintf('Invalid message format. Reason: %s (error #%d)', intl_get_error_message(), intl_get_error_code()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$message = $formatter->format($parameters);
|
||||||
|
if ($formatter->getErrorCode() !== U_ZERO_ERROR) {
|
||||||
|
throw new \InvalidArgumentException(sprintf('Unable to format message. Reason: %s (error #%s)', $formatter->getErrorMessage(), $formatter->getErrorCode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Translation\Tests\Formatter;
|
||||||
|
|
||||||
|
use Symfony\Component\Translation\Formatter\IntlMessageFormatter;
|
||||||
|
|
||||||
|
class IntlMessageFormatterTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
if (!extension_loaded('intl')) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'The Intl extension is not available.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideDataForFormat
|
||||||
|
*/
|
||||||
|
public function testFormat($expected, $message, $arguments)
|
||||||
|
{
|
||||||
|
$this->assertEquals($expected, trim($this->getMessageFormatter()->format($message, 'en', $arguments)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFormatWithNamedArguments()
|
||||||
|
{
|
||||||
|
if (PHP_VERSION_ID < 50500 || version_compare(INTL_ICU_VERSION, '4.8', '<')) {
|
||||||
|
$this->markTestSkipped('Format with named arguments can only be run with ICU 4.8 or higher and PHP >= 5.5');
|
||||||
|
}
|
||||||
|
|
||||||
|
$chooseMessage = <<<'_MSG_'
|
||||||
|
{gender_of_host, select,
|
||||||
|
female {{num_guests, plural, offset:1
|
||||||
|
=0 {{host} does not give a party.}
|
||||||
|
=1 {{host} invites {guest} to her party.}
|
||||||
|
=2 {{host} invites {guest} and one other person to her party.}
|
||||||
|
other {{host} invites {guest} as one of the # people invited to her party.}}}
|
||||||
|
male {{num_guests, plural, offset:1
|
||||||
|
=0 {{host} does not give a party.}
|
||||||
|
=1 {{host} invites {guest} to his party.}
|
||||||
|
=2 {{host} invites {guest} and one other person to his party.}
|
||||||
|
other {{host} invites {guest} as one of the # people invited to his party.}}}
|
||||||
|
other {{num_guests, plural, offset:1
|
||||||
|
=0 {{host} does not give a party.}
|
||||||
|
=1 {{host} invites {guest} to their party.}
|
||||||
|
=2 {{host} invites {guest} and one other person to their party.}
|
||||||
|
other {{host} invites {guest} as one of the # people invited to their party.}}}}
|
||||||
|
_MSG_;
|
||||||
|
|
||||||
|
$formatter = $this->getMessageFormatter();
|
||||||
|
$message = $formatter->format($chooseMessage, 'en', array(
|
||||||
|
'gender_of_host' => 'male',
|
||||||
|
'num_guests' => 10,
|
||||||
|
'host' => 'Fabien',
|
||||||
|
'guest' => 'Guilherme',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals('Fabien invites Guilherme as one of the 9 people invited to his party.', $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideDataForFormat()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'There is one apple',
|
||||||
|
'There is one apple',
|
||||||
|
array(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'4,560 monkeys on 123 trees make 37.073 monkeys per tree',
|
||||||
|
'{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree',
|
||||||
|
array(4560, 123, 4560 / 123),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getMessageFormatter()
|
||||||
|
{
|
||||||
|
return new IntlMessageFormatter();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user