Commit c0595895 by Carsten Brandt

Merge pull request #1091 from cebe/messageformatter-refactoring

Messageformatter refactoring
parents e8c20413 7bb4826a
...@@ -116,7 +116,7 @@ class MessageFormatter extends Component ...@@ -116,7 +116,7 @@ class MessageFormatter extends Component
* Parses an input string according to an [ICU message format](http://userguide.icu-project.org/formatparse/messages) pattern. * Parses an input string according to an [ICU message format](http://userguide.icu-project.org/formatparse/messages) pattern.
* *
* It uses the PHP intl extension's [MessageFormatter::parse()](http://www.php.net/manual/en/messageformatter.parsemessage.php) * It uses the PHP intl extension's [MessageFormatter::parse()](http://www.php.net/manual/en/messageformatter.parsemessage.php)
* and works around some issues. * and adds support for named arguments.
* Usage of this method requires PHP intl extension to be installed. * Usage of this method requires PHP intl extension to be installed.
* *
* @param string $pattern The pattern to use for parsing the message. * @param string $pattern The pattern to use for parsing the message.
...@@ -134,11 +134,24 @@ class MessageFormatter extends Component ...@@ -134,11 +134,24 @@ class MessageFormatter extends Component
throw new NotSupportedException('You have to install PHP intl extension to use this feature.'); throw new NotSupportedException('You have to install PHP intl extension to use this feature.');
} }
// TODO try to support named args // replace named arguments
// if (version_compare(PHP_VERSION, '5.5.0', '<')) { if (($tokens = $this->tokenizePattern($pattern)) === false) {
// $message = $this->replaceNamedArguments($message, $params); return false;
// $params = array_values($params); }
// } $map = [];
foreach($tokens as $i => $token) {
if (is_array($token)) {
$param = trim($token[0]);
if (!isset($map[$param])) {
$map[$param] = count($map);
}
$token[0] = $map[$param];
$tokens[$i] = '{' . implode(',', $token) . '}';
}
}
$pattern = implode('', $tokens);
$map = array_flip($map);
$formatter = new \MessageFormatter($language, $pattern); $formatter = new \MessageFormatter($language, $pattern);
if ($formatter === null) { if ($formatter === null) {
$this->_errorCode = -1; $this->_errorCode = -1;
...@@ -151,9 +164,12 @@ class MessageFormatter extends Component ...@@ -151,9 +164,12 @@ class MessageFormatter extends Component
$this->_errorMessage = $formatter->getErrorMessage(); $this->_errorMessage = $formatter->getErrorMessage();
return false; return false;
} else { } else {
return $result; $values = [];
foreach($result as $key => $value) {
$values[$map[$key]] = $value;
}
return $values;
} }
} }
/** /**
......
...@@ -34,6 +34,24 @@ class FallbackMessageFormatterTest extends TestCase ...@@ -34,6 +34,24 @@ class FallbackMessageFormatterTest extends TestCase
] ]
], ],
[
'{'.self::SUBJECT.'} is {'.self::N.', number}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
self::N => self::N_VALUE,
self::SUBJECT => self::SUBJECT_VALUE,
]
],
[
'{'.self::SUBJECT.'} is {'.self::N.', number, integer}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
self::N => self::N_VALUE,
self::SUBJECT => self::SUBJECT_VALUE,
]
],
// This one was provided by Aura.Intl. Thanks! // This one was provided by Aura.Intl. Thanks!
[<<<_MSG_ [<<<_MSG_
{gender_of_host, select, {gender_of_host, select,
......
...@@ -41,6 +41,15 @@ class MessageFormatterTest extends TestCase ...@@ -41,6 +41,15 @@ class MessageFormatterTest extends TestCase
] ]
], ],
[
'{'.self::SUBJECT.'} is {'.self::N.', number, integer}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
self::N => self::N_VALUE,
self::SUBJECT => self::SUBJECT_VALUE,
]
],
// This one was provided by Aura.Intl. Thanks! // This one was provided by Aura.Intl. Thanks!
[<<<_MSG_ [<<<_MSG_
{gender_of_host, select, {gender_of_host, select,
...@@ -119,6 +128,79 @@ _MSG_ ...@@ -119,6 +128,79 @@ _MSG_
]; ];
} }
public function parsePatterns()
{
return [
[
self::SUBJECT_VALUE.' is {0, number}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
0 => self::N_VALUE,
]
],
[
self::SUBJECT_VALUE.' is {'.self::N.', number}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
self::N => self::N_VALUE,
]
],
[
self::SUBJECT_VALUE.' is {'.self::N.', number, integer}', // pattern
self::SUBJECT_VALUE.' is '.self::N_VALUE, // expected
[ // params
self::N => self::N_VALUE,
]
],
[
"{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree",
"4,560 monkeys on 123 trees make 37.073 monkeys per tree",
[
0 => 4560,
1 => 123,
2 => 37.073
],
'en_US'
],
[
"{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum",
"4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum",
[
0 => 4560,
1 => 123,
2 => 37.073
],
'de',
],
[
"{monkeyCount,number,integer} monkeys on {trees,number,integer} trees make {monkeysPerTree,number} monkeys per tree",
"4,560 monkeys on 123 trees make 37.073 monkeys per tree",
[
'monkeyCount' => 4560,
'trees' => 123,
'monkeysPerTree' => 37.073
],
'en_US'
],
[
"{monkeyCount,number,integer} Affen auf {trees,number,integer} Bäumen sind {monkeysPerTree,number} Affen pro Baum",
"4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum",
[
'monkeyCount' => 4560,
'trees' => 123,
'monkeysPerTree' => 37.073
],
'de',
],
];
}
/** /**
* @dataProvider patterns * @dataProvider patterns
*/ */
...@@ -129,6 +211,16 @@ _MSG_ ...@@ -129,6 +211,16 @@ _MSG_
$this->assertEquals($expected, $result, $formatter->getErrorMessage()); $this->assertEquals($expected, $result, $formatter->getErrorMessage());
} }
/**
* @dataProvider parsePatterns
*/
public function testParseNamedArguments($pattern, $expected, $args, $locale = 'en_US')
{
$formatter = new MessageFormatter();
$result = $formatter->parse($pattern, $expected, $locale);
$this->assertEquals($args, $result, $formatter->getErrorMessage() . ' Pattern: ' . $pattern);
}
public function testInsufficientArguments() public function testInsufficientArguments()
{ {
$expected = '{'.self::SUBJECT.'} is '.self::N_VALUE; $expected = '{'.self::SUBJECT.'} is '.self::N_VALUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment