* @since 2.0 * @group i18n */ class MessageFormatterTest extends TestCase { const N = 'n'; const N_VALUE = 42; const SUBJECT = 'сабж'; const SUBJECT_VALUE = 'Answer to the Ultimate Question of Life, the Universe, and Everything'; public function testNamedArguments() { $expected = self::SUBJECT_VALUE.' is '.self::N_VALUE; $result = MessageFormatter::formatMessage('en_US', '{'.self::SUBJECT.'} is {'.self::N.', number}', array( self::N => self::N_VALUE, self::SUBJECT => self::SUBJECT_VALUE, )); $this->assertEquals($expected, $result); $pattern = <<<_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} and # other people 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} and # other people 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} and # other people to their party.}}}} _MSG_; $result = MessageFormatter::formatMessage('en_US', $pattern, array( 'gender_of_host' => 'male', 'num_guests' => 4, 'host' => 'ralph', 'guest' => 'beep' )); $this->assertEquals('ralph invites beep and 3 other people to his party.', $result); $pattern = '{name} is {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!'; $result = MessageFormatter::formatMessage('en_US', $pattern, array( 'name' => 'Alexander', 'gender' => 'male', )); $this->assertEquals('Alexander is male and he loves Yii!', $result); // verify pattern in select does not get replaced $pattern = '{name} is {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!'; $result = MessageFormatter::formatMessage('en_US', $pattern, array( 'name' => 'Alexander', 'gender' => 'male', // following should not be replaced 'he' => 'wtf', 'she' => 'wtf', 'it' => 'wtf', )); $this->assertEquals('Alexander is male and he loves Yii!', $result); // verify pattern in select message gets replaced $pattern = '{name} is {gender} and {gender, select, female{she} male{{he}} other{it}} loves Yii!'; $result = MessageFormatter::formatMessage('en_US', $pattern, array( 'name' => 'Alexander', 'gender' => 'male', 'he' => 'wtf', 'she' => 'wtf', )); $this->assertEquals('Alexander is male and wtf loves Yii!', $result); // some parser specific verifications $pattern = '{gender} and {gender, select, female{she} male{{he}} other{it}} loves {nr, number} is {gender}!'; $result = MessageFormatter::formatMessage('en_US', $pattern, array( 'nr' => 42, 'gender' => 'male', 'he' => 'wtf', 'she' => 'wtf', )); $this->assertEquals('male and wtf loves 42 is male!', $result); } public function testInsufficientArguments() { $expected = '{'.self::SUBJECT.'} is '.self::N_VALUE; $result = MessageFormatter::formatMessage('en_US', '{'.self::SUBJECT.'} is {'.self::N.', number}', array( self::N => self::N_VALUE, )); $this->assertEquals($expected, $result); } }