Changeset View
Changeset View
Standalone View
Standalone View
src/internationalization/__tests__/PhutilTranslatorTestCase.php
<?php | <?php | ||||
final class PhutilTranslatorTestCase extends PhutilTestCase { | final class PhutilTranslatorTestCase extends PhutilTestCase { | ||||
public function testEnglish() { | public function testEnglish() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
$translator->addTranslations( | $translator->setTranslations( | ||||
array( | array( | ||||
'%d line(s)' => array('%d line', '%d lines'), | '%d line(s)' => array('%d line', '%d lines'), | ||||
'%d char(s) on %d row(s)' => array( | '%d char(s) on %d row(s)' => array( | ||||
array('%d char on %d row', '%d char on %d rows'), | array('%d char on %d row', '%d char on %d rows'), | ||||
array('%d chars on %d row', '%d chars on %d rows'), | array('%d chars on %d row', '%d chars on %d rows'), | ||||
), | ), | ||||
)); | )); | ||||
Show All 10 Lines | public function testEnglish() { | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'5 chars on 2 rows', | '5 chars on 2 rows', | ||||
$translator->translate('%d char(s) on %d row(s)', 5, 2)); | $translator->translate('%d char(s) on %d row(s)', 5, 2)); | ||||
$this->assertEqual('1 beer(s)', $translator->translate('%d beer(s)', 1)); | $this->assertEqual('1 beer(s)', $translator->translate('%d beer(s)', 1)); | ||||
} | } | ||||
public function testSingleVariant() { | public function testSingleVariant() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
$translator->setLanguage('en'); | |||||
// In this translation, we have no alternatives for the first conversion. | // In this translation, we have no alternatives for the first conversion. | ||||
$translator->addTranslations( | $translator->setTranslations( | ||||
array( | array( | ||||
'Run the command %s %d time(s).' => array( | 'Run the command %s %d time(s).' => array( | ||||
array( | array( | ||||
'Run the command %s once.', | 'Run the command %s once.', | ||||
'Run the command %s %d times.', | 'Run the command %s %d times.', | ||||
), | ), | ||||
), | ), | ||||
)); | )); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'Run the command <tt>ls</tt> 123 times.', | 'Run the command <tt>ls</tt> 123 times.', | ||||
(string)$translator->translate( | (string)$translator->translate( | ||||
'Run the command %s %d time(s).', | 'Run the command %s %d time(s).', | ||||
hsprintf('<tt>%s</tt>', 'ls'), | hsprintf('<tt>%s</tt>', 'ls'), | ||||
123)); | 123)); | ||||
} | } | ||||
public function testCzech() { | public function testCzech() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('cs_CZ'); | ||||
$translator->setLanguage('cs'); | $translator->setTranslations( | ||||
$translator->addTranslations( | |||||
array( | array( | ||||
'%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), | '%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), | ||||
)); | )); | ||||
$this->assertEqual('0 piv', $translator->translate('%d beer(s)', 0)); | $this->assertEqual('0 piv', $translator->translate('%d beer(s)', 0)); | ||||
$this->assertEqual('1 pivo', $translator->translate('%d beer(s)', 1)); | $this->assertEqual('1 pivo', $translator->translate('%d beer(s)', 1)); | ||||
$this->assertEqual('2 piva', $translator->translate('%d beer(s)', 2)); | $this->assertEqual('2 piva', $translator->translate('%d beer(s)', 2)); | ||||
$this->assertEqual('5 piv', $translator->translate('%d beer(s)', 5)); | $this->assertEqual('5 piv', $translator->translate('%d beer(s)', 5)); | ||||
$this->assertEqual('1 line(s)', $translator->translate('%d line(s)', 1)); | $this->assertEqual('1 line(s)', $translator->translate('%d line(s)', 1)); | ||||
} | } | ||||
public function testPerson() { | public function testPerson() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('cs_CZ'); | ||||
$translator->setLanguage('cs'); | $translator->setTranslations( | ||||
$translator->addTranslations( | |||||
array( | array( | ||||
'%s wrote.' => array('%s napsal.', '%s napsala.'), | '%s wrote.' => array('%s napsal.', '%s napsala.'), | ||||
)); | )); | ||||
$person = new PhutilPersonTest(); | $person = new PhutilPersonTest(); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'Test () napsal.', | 'Test () napsal.', | ||||
$translator->translate('%s wrote.', $person)); | $translator->translate('%s wrote.', $person)); | ||||
$person->setSex(PhutilPerson::SEX_MALE); | $person->setSex(PhutilPerson::SEX_MALE); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'Test (m) napsal.', | 'Test (m) napsal.', | ||||
$translator->translate('%s wrote.', $person)); | $translator->translate('%s wrote.', $person)); | ||||
$person->setSex(PhutilPerson::SEX_FEMALE); | $person->setSex(PhutilPerson::SEX_FEMALE); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'Test (f) napsala.', | 'Test (f) napsala.', | ||||
$translator->translate('%s wrote.', $person)); | $translator->translate('%s wrote.', $person)); | ||||
} | } | ||||
public function testTranslateDate() { | public function testTranslateDate() { | ||||
$date = new DateTime('2012-06-21'); | $date = new DateTime('2012-06-21'); | ||||
$translator = $this->newTranslator('en_US'); | |||||
$translator = new PhutilTranslator(); | |||||
$this->assertEqual('June', $translator->translateDate('F', $date)); | $this->assertEqual('June', $translator->translateDate('F', $date)); | ||||
$this->assertEqual('June 21', $translator->translateDate('F d', $date)); | $this->assertEqual('June 21', $translator->translateDate('F d', $date)); | ||||
$this->assertEqual('F', $translator->translateDate('\F', $date)); | $this->assertEqual('F', $translator->translateDate('\F', $date)); | ||||
$translator->addTranslations( | $translator->setTranslations( | ||||
array( | array( | ||||
'June' => 'correct', | 'June' => 'correct', | ||||
'21' => 'wrong', | '21' => 'wrong', | ||||
'F' => 'wrong', | 'F' => 'wrong', | ||||
)); | )); | ||||
$this->assertEqual('correct', $translator->translateDate('F', $date)); | $this->assertEqual('correct', $translator->translateDate('F', $date)); | ||||
$this->assertEqual('correct 21', $translator->translateDate('F d', $date)); | $this->assertEqual('correct 21', $translator->translateDate('F d', $date)); | ||||
$this->assertEqual('F', $translator->translateDate('\F', $date)); | $this->assertEqual('F', $translator->translateDate('\F', $date)); | ||||
} | } | ||||
public function testSetInstance() { | public function testSetInstance() { | ||||
PhutilTranslator::setInstance(new PhutilTranslator()); | $english_translator = $this->newTranslator('en_US'); | ||||
PhutilTranslator::setInstance($english_translator); | |||||
$original = PhutilTranslator::getInstance(); | $original = PhutilTranslator::getInstance(); | ||||
$this->assertEqual('color', pht('color')); | $this->assertEqual('color', pht('color')); | ||||
$british_locale = PhutilLocale::loadLocale('en_GB'); | |||||
$british = new PhutilTranslator(); | $british = new PhutilTranslator(); | ||||
$british->addTranslations( | $british->setLocale($british_locale); | ||||
$british->setTranslations( | |||||
array( | array( | ||||
'color' => 'colour', | 'color' => 'colour', | ||||
)); | )); | ||||
PhutilTranslator::setInstance($british); | PhutilTranslator::setInstance($british); | ||||
$this->assertEqual('colour', pht('color')); | $this->assertEqual('colour', pht('color')); | ||||
PhutilTranslator::setInstance($original); | PhutilTranslator::setInstance($original); | ||||
$this->assertEqual('color', pht('color')); | $this->assertEqual('color', pht('color')); | ||||
} | } | ||||
public function testFormatNumber() { | public function testFormatNumber() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
$this->assertEqual('1,234', $translator->formatNumber(1234)); | $this->assertEqual('1,234', $translator->formatNumber(1234)); | ||||
$this->assertEqual('1,234.5', $translator->formatNumber(1234.5, 1)); | $this->assertEqual('1,234.5', $translator->formatNumber(1234.5, 1)); | ||||
$this->assertEqual('1,234.5678', $translator->formatNumber(1234.5678, 4)); | $this->assertEqual('1,234.5678', $translator->formatNumber(1234.5678, 4)); | ||||
$translator->addTranslations( | $translator->setTranslations( | ||||
array( | array( | ||||
',' => ' ', | ',' => ' ', | ||||
'.' => ',', | '.' => ',', | ||||
)); | )); | ||||
$this->assertEqual('1 234', $translator->formatNumber(1234)); | $this->assertEqual('1 234', $translator->formatNumber(1234)); | ||||
$this->assertEqual('1 234,5', $translator->formatNumber(1234.5, 1)); | $this->assertEqual('1 234,5', $translator->formatNumber(1234.5, 1)); | ||||
$this->assertEqual('1 234,5678', $translator->formatNumber(1234.5678, 4)); | $this->assertEqual('1 234,5678', $translator->formatNumber(1234.5678, 4)); | ||||
} | } | ||||
public function testNumberTranslations() { | public function testNumberTranslations() { | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
$translator->addTranslations( | |||||
$translator->setTranslations( | |||||
array( | array( | ||||
'%s line(s)' => array('%s line', '%s lines'), | '%s line(s)' => array('%s line', '%s lines'), | ||||
)); | )); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'1 line', | '1 line', | ||||
$translator->translate('%s line(s)', new PhutilNumber(1))); | $translator->translate('%s line(s)', new PhutilNumber(1))); | ||||
Show All 28 Lines | $tests = array( | ||||
), | ), | ||||
'beer' => array( | 'beer' => array( | ||||
'pivo' => true, | 'pivo' => true, | ||||
'b<>r' => false, | 'b<>r' => false, | ||||
'b&&r' => false, | 'b&&r' => false, | ||||
), | ), | ||||
); | ); | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
foreach ($tests as $original => $translations) { | foreach ($tests as $original => $translations) { | ||||
foreach ($translations as $translation => $expect) { | foreach ($translations as $translation => $expect) { | ||||
$valid = ($expect ? 'valid' : 'invalid'); | $valid = ($expect ? 'valid' : 'invalid'); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
$expect, | $expect, | ||||
$translator->validateTranslation($original, $translation), | $translator->validateTranslation($original, $translation), | ||||
"'{$original}' should be {$valid} with '{$translation}'."); | "'{$original}' should be {$valid} with '{$translation}'."); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
public function testHTMLTranslations() { | public function testHTMLTranslations() { | ||||
$string = '%s awoke <strong>suddenly</strong> at %s.'; | $string = '%s awoke <strong>suddenly</strong> at %s.'; | ||||
$when = '<4 AM>'; | $when = '<4 AM>'; | ||||
$translator = new PhutilTranslator(); | $translator = $this->newTranslator('en_US'); | ||||
// When no components are HTML, everything is treated as a string. | // When no components are HTML, everything is treated as a string. | ||||
$who = '<span>Abraham</span>'; | $who = '<span>Abraham</span>'; | ||||
$translation = $translator->translate( | $translation = $translator->translate( | ||||
$string, | $string, | ||||
$who, | $who, | ||||
$when); | $when); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
Show All 18 Lines | $translation = $translator->translate( | ||||
$string, | $string, | ||||
$who, | $who, | ||||
new PhutilNumber(1383930802)); | new PhutilNumber(1383930802)); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
'<span>Abraham</span> awoke <strong>suddenly</strong> at 1,383,930,802.', | '<span>Abraham</span> awoke <strong>suddenly</strong> at 1,383,930,802.', | ||||
$translation->getHTMLContent()); | $translation->getHTMLContent()); | ||||
} | } | ||||
private function newTranslator($locale_code) { | |||||
$locale = PhutilLocale::loadLocale($locale_code); | |||||
return id(new PhutilTranslator()) | |||||
->setLocale($locale); | |||||
} | |||||
} | } |