diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php
index 0b499468b5..cda38061ef 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php
@@ -46,7 +46,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
{
$translator = $this->getTranslator($this->getLoader());
$translator->setLocale('fr');
- $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8'));
+ $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
@@ -56,6 +56,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
$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'));
+ $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
}
public function testTransWithCaching()
@@ -63,7 +64,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
// 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', 'fr.UTF-8'));
+ $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
@@ -73,12 +74,13 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
$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'));
+ $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
// 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', 'fr.UTF-8'));
+ $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
$this->assertEquals('foo (FR)', $translator->trans('foo'));
$this->assertEquals('bar (EN)', $translator->trans('bar'));
@@ -88,6 +90,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
$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'));
+ $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
}
/**
@@ -189,6 +192,13 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
'foobarbaz' => 'foobarbaz (fr.UTF-8)',
))))
;
+ $loader
+ ->expects($this->at(6))
+ ->method('load')
+ ->will($this->returnValue($this->getCatalogue('sr@latin', array(
+ 'foobarbax' => 'foobarbax (sr@latin)',
+ ))))
+ ;
return $loader;
}
@@ -220,6 +230,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
$translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
$translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
$translator->addResource('loader', 'foo', 'fr.UTF-8');
+ $translator->addResource('loader', 'foo', 'sr@latin'); // Latin Serbian
return $translator;
}
diff --git a/src/Symfony/Component/ExpressionLanguage/Lexer.php b/src/Symfony/Component/ExpressionLanguage/Lexer.php
index aba51bb3fb..26bb51d42e 100644
--- a/src/Symfony/Component/ExpressionLanguage/Lexer.php
+++ b/src/Symfony/Component/ExpressionLanguage/Lexer.php
@@ -69,7 +69,7 @@ class Lexer
$tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
++$cursor;
- } elseif (preg_match('/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As', $expression, $match, null, $cursor)) {
+ } elseif (preg_match('/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As', $expression, $match, null, $cursor)) {
// strings
$tokens[] = new Token(Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)), $cursor + 1);
$cursor += strlen($match[0]);
diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/LexerTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/LexerTest.php
index 25c1e5ac59..8af5c1c101 100644
--- a/src/Symfony/Component/ExpressionLanguage/Tests/LexerTest.php
+++ b/src/Symfony/Component/ExpressionLanguage/Tests/LexerTest.php
@@ -78,6 +78,14 @@ class LexerTest extends \PHPUnit_Framework_TestCase
array(new Token('operator', '..', 1)),
'..',
),
+ array(
+ array(new Token('string', '#foo', 1)),
+ "'#foo'",
+ ),
+ array(
+ array(new Token('string', '#foo', 1)),
+ '"#foo"',
+ ),
);
}
}
diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php
index 56a3ca928b..e992b01fc1 100644
--- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php
+++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php
@@ -152,6 +152,8 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer
* Returns a preconfigured IntlDateFormatter instance
*
* @return \IntlDateFormatter
+ *
+ * @throws TransformationFailedException in case the date formatter can not be constructed.
*/
protected function getIntlDateFormatter()
{
@@ -162,6 +164,12 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer
$pattern = $this->pattern;
$intlDateFormatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
+
+ // new \intlDateFormatter may return null instead of false in case of failure, see https://bugs.php.net/bug.php?id=66323
+ if (!$intlDateFormatter) {
+ throw new TransformationFailedException(intl_get_error_message(), intl_get_error_code());
+ }
+
$intlDateFormatter->setLenient(false);
return $intlDateFormatter;
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
index 022a414932..1748d2e31f 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php
@@ -77,6 +77,12 @@ class DateType extends AbstractType
$calendar,
$pattern
);
+
+ // new \intlDateFormatter may return null instead of false in case of failure, see https://bugs.php.net/bug.php?id=66323
+ if (!$formatter) {
+ throw new InvalidOptionsException(intl_get_error_message(), intl_get_error_code());
+ }
+
$formatter->setLenient(false);
if ('choice' === $options['widget']) {
diff --git a/src/Symfony/Component/Process/ProcessPipes.php b/src/Symfony/Component/Process/ProcessPipes.php
index b9354e9d4a..9ed1def9f2 100644
--- a/src/Symfony/Component/Process/ProcessPipes.php
+++ b/src/Symfony/Component/Process/ProcessPipes.php
@@ -306,6 +306,8 @@ class ProcessPipes
private function readStreams($blocking, $close = false)
{
if (empty($this->pipes)) {
+ usleep(Process::TIMEOUT_PRECISION * 1E4);
+
return array();
}
diff --git a/src/Symfony/Component/Process/Tests/AbstractProcessTest.php b/src/Symfony/Component/Process/Tests/AbstractProcessTest.php
index be4a81bd17..78483d9519 100644
--- a/src/Symfony/Component/Process/Tests/AbstractProcessTest.php
+++ b/src/Symfony/Component/Process/Tests/AbstractProcessTest.php
@@ -652,7 +652,14 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
}
$duration = microtime(true) - $start;
- $this->assertLessThan($timeout + Process::TIMEOUT_PRECISION, $duration);
+ if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+ // Windows is a bit slower as it read file handles, then allow twice the precision
+ $maxDuration = $timeout + 2 * Process::TIMEOUT_PRECISION;
+ } else {
+ $maxDuration = $timeout + Process::TIMEOUT_PRECISION;
+ }
+
+ $this->assertLessThan($maxDuration, $duration);
}
public function testCheckTimeoutOnNonStartedProcess()
diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php
index 313199fa02..1efcff6de2 100644
--- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php
+++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php
@@ -103,7 +103,6 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('bar (fr)', $translator->trans('bar'));
}
-
/**
* @dataProvider getInvalidLocalesTests
* @expectedException \InvalidArgumentException
@@ -329,7 +328,6 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
// no assertion. this method just asserts that no exception is thrown
}
-
public function getTransFileTests()
{
return array(
@@ -430,6 +428,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
array('fr_FR'),
array('fr.FR'),
array('fr-FR.UTF8'),
+ array('sr@latin'),
);
}
diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php
index bcd73316ff..f6ae7d03de 100644
--- a/src/Symfony/Component/Translation/Translator.php
+++ b/src/Symfony/Component/Translation/Translator.php
@@ -318,8 +318,8 @@ class Translator implements TranslatorInterface
*/
private function assertValidLocale($locale)
{
- if (0 !== preg_match('/[^a-z0-9_\\.\\-]+/i', $locale, $match)) {
- throw new \InvalidArgumentException(sprintf('Invalid locale: %s.', $locale));
+ if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
+ throw new \InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale));
}
}
}
diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf
index f74fe90615..f08cfc8063 100644
--- a/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf
+++ b/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf
@@ -280,11 +280,11 @@
- O formato da imagem é muito grande ({{ ratio }}). O formato máximo é {{ max_ratio }}.
+ A proporção da imagem é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}.
- O formato da imagem é muito pequeno ({{ ratio }}). O formato mínimo esperado é {{ min_ratio }}.
+ A proporção da imagem é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}.
@@ -300,7 +300,7 @@
- Ficheiro vazio não é permitido.
+ Arquivo vazio não é permitido.