Skip to content

Commit

Permalink
Validate locales sets intos translator
Browse files Browse the repository at this point in the history
  • Loading branch information
Jérémy Derussé authored and fabpot committed Jul 15, 2014
1 parent 06fc97e commit 06a80fb
Show file tree
Hide file tree
Showing 5 changed files with 233 additions and 6 deletions.
Expand Up @@ -45,7 +45,7 @@ public function testTransWithoutCaching()
{
$translator = $this->getTranslator($this->getLoader());
$translator->setLocale('fr');
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR'));
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8'));

$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
Expand All @@ -54,14 +54,15 @@ public function testTransWithoutCaching()
$this->assertEquals('no translation', $translator->trans('no translation'));
$this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
$this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
$this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
}

public function testTransWithCaching()
{
// prime the cache
$translator = $this->getTranslator($this->getLoader(), array('cache_dir' => $this->tmpDir));
$translator->setLocale('fr');
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR'));
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8'));

$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
Expand All @@ -70,12 +71,13 @@ public function testTransWithCaching()
$this->assertEquals('no translation', $translator->trans('no translation'));
$this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
$this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
$this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));

// do it another time as the cache is primed now
$loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir));
$translator->setLocale('fr');
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR'));
$translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8'));

$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
Expand All @@ -84,6 +86,7 @@ public function testTransWithCaching()
$this->assertEquals('no translation', $translator->trans('no translation'));
$this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
$this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
$this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
}

public function testGetLocale()
Expand Down Expand Up @@ -175,6 +178,13 @@ protected function getLoader()
'other choice' => '{0} other choice 0 (PT-BR)|{1} other choice 1 (PT-BR)|]1,Inf] other choice inf (PT-BR)',
))))
;
$loader
->expects($this->at(5))
->method('load')
->will($this->returnValue($this->getCatalogue('fr.UTF-8', array(
'foobarbaz' => 'foobarbaz (fr.UTF-8)',
))))
;

return $loader;
}
Expand Down Expand Up @@ -205,6 +215,7 @@ public function getTranslator($loader, $options = array())
$translator->addResource('loader', 'foo', 'es');
$translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
$translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
$translator->addResource('loader', 'foo', 'fr.UTF-8');

return $translator;
}
Expand Down
6 changes: 4 additions & 2 deletions src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php
Expand Up @@ -97,8 +97,10 @@ protected function loadCatalogue($locale)

$fallbackContent = '';
$current = '';
$replacementPattern = '/[^a-z0-9_]/i';
foreach ($this->computeFallbackLocales($locale) as $fallback) {
$fallbackSuffix = ucfirst(str_replace('-', '_', $fallback));
$fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback));
$currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current));

$fallbackContent .= sprintf(<<<EOF
\$catalogue%s = new MessageCatalogue('%s', %s);
Expand All @@ -110,7 +112,7 @@ protected function loadCatalogue($locale)
$fallbackSuffix,
$fallback,
var_export($this->catalogues[$fallback]->all(), true),
ucfirst(str_replace('-', '_', $current)),
$currentSuffix,
$fallbackSuffix
);
$current = $fallback;
Expand Down
175 changes: 175 additions & 0 deletions src/Symfony/Component/Translation/Tests/TranslatorTest.php
Expand Up @@ -17,6 +17,33 @@

class TranslatorTest extends \PHPUnit_Framework_TestCase
{

/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testConstructorInvalidLocale($locale)
{
$translator = new Translator($locale, new MessageSelector());
}

/**
* @dataProvider getValidLocalesTests
*/
public function testConstructorValidLocale($locale)
{
$translator = new Translator($locale, new MessageSelector());

$this->assertEquals($locale, $translator->getLocale());
}

public function testConstructorWithoutLocale()
{
$translator = new Translator(null, new MessageSelector());

$this->assertNull($translator->getLocale());
}

public function testSetGetLocale()
{
$translator = new Translator('en', new MessageSelector());
Expand All @@ -27,6 +54,27 @@ public function testSetGetLocale()
$this->assertEquals('fr', $translator->getLocale());
}

/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testSetInvalidLocale($locale)
{
$translator = new Translator('fr', new MessageSelector());
$translator->setLocale($locale);
}

/**
* @dataProvider getValidLocalesTests
*/
public function testSetValidLocale($locale)
{
$translator = new Translator($locale, new MessageSelector());
$translator->setLocale($locale);

$this->assertEquals($locale, $translator->getLocale());
}

public function testSetFallbackLocales()
{
$translator = new Translator('en', new MessageSelector());
Expand Down Expand Up @@ -55,6 +103,27 @@ public function testSetFallbackLocalesMultiple()
$this->assertEquals('bar (fr)', $translator->trans('bar'));
}


/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testSetFallbackInvalidLocales($locale)
{
$translator = new Translator('fr', new MessageSelector());
$translator->setFallbackLocales(array('fr', $locale));
}

/**
* @dataProvider getValidLocalesTests
*/
public function testSetFallbackValidLocales($locale)
{
$translator = new Translator($locale, new MessageSelector());
$translator->setFallbackLocales(array('fr', $locale));
// no assertion. this method just asserts that no exception is thrown
}

public function testTransWithFallbackLocale()
{
$translator = new Translator('fr_FR', new MessageSelector());
Expand All @@ -67,6 +136,26 @@ public function testTransWithFallbackLocale()
$this->assertEquals('foobar', $translator->trans('bar'));
}

/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testAddResourceInvalidLocales($locale)
{
$translator = new Translator('fr', new MessageSelector());
$translator->addResource('array', array('foo' => 'foofoo'), $locale);
}

/**
* @dataProvider getValidLocalesTests
*/
public function testAddResourceValidLocales($locale)
{
$translator = new Translator('fr', new MessageSelector());
$translator->addResource('array', array('foo' => 'foofoo'), $locale);
// no assertion. this method just asserts that no exception is thrown
}

public function testAddResourceAfterTrans()
{
$translator = new Translator('fr', new MessageSelector());
Expand Down Expand Up @@ -164,6 +253,32 @@ public function testTrans($expected, $id, $translation, $parameters, $locale, $d
$this->assertEquals($expected, $translator->trans($id, $parameters, $domain, $locale));
}

/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testTransInvalidLocale($locale)
{
$translator = new Translator('en', new MessageSelector());
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', array('foo' => 'foofoo'), 'en');

$translator->trans('foo', array(), '', $locale);
}

/**
* @dataProvider getValidLocalesTests
*/
public function testTransValidLocale($locale)
{
$translator = new Translator('en', new MessageSelector());
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', array('foo' => 'foofoo'), 'en');

$translator->trans('foo', array(), '', $locale);
// no assertion. this method just asserts that no exception is thrown
}

/**
* @dataProvider getFlattenedTransTests
*/
Expand All @@ -188,6 +303,33 @@ public function testTransChoice($expected, $id, $translation, $number, $paramete
$this->assertEquals($expected, $translator->transChoice($id, $number, $parameters, $domain, $locale));
}

/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
*/
public function testTransChoiceInvalidLocale($locale)
{
$translator = new Translator('en', new MessageSelector());
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', array('foo' => 'foofoo'), 'en');

$translator->transChoice('foo', 1, array(), '', $locale);
}

/**
* @dataProvider getValidLocalesTests
*/
public function testTransChoiceValidLocale($locale)
{
$translator = new Translator('en', new MessageSelector());
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', array('foo' => 'foofoo'), 'en');

$translator->transChoice('foo', 1, array(), '', $locale);
// no assertion. this method just asserts that no exception is thrown
}


public function getTransFileTests()
{
return array(
Expand Down Expand Up @@ -257,6 +399,39 @@ public function getTransChoiceTests()
);
}

public function getInvalidLocalesTests()
{
return array(
array('fr FR'),
array('français'),
array('fr+en'),
array('utf#8'),
array('fr&en'),
array('fr~FR'),
array(' fr'),
array('fr '),
array('fr*'),
array('fr/FR'),
array('fr\\FR'),
);
}

public function getValidLocalesTests()
{
return array(
array(''),
array(null),
array('fr'),
array('francais'),
array('FR'),
array('frFR'),
array('fr-FR'),
array('fr_FR'),
array('fr.FR'),
array('fr-FR.UTF8'),
);
}

public function testTransChoiceFallback()
{
$translator = new Translator('ru', new MessageSelector());
Expand Down

0 comments on commit 06a80fb

Please sign in to comment.