Merge branch '2.4'

* 2.4:
  fixed CS
  allow the TextAreaFormField to be used with valid/invalid HTML
  Create security.id.xlf
  [DependencyInjection] Remove unneeded file
  [Twig] removed obsolete conditions on Twig versions
  added lines to exceptions for the trans and transchoice tags
  [FrameworkBundle] Merged multiple line input into one line to fix the tests.
  [Form] Make FormInterface::add docblock more explicit
  [Security] Add zh_CN translations
  Routing condition bugfix
  [Validator][Translation]update zh_CN translations
  [Validator] Minor fix in XmlLoader
This commit is contained in:
Fabien Potencier 2014-01-26 22:33:16 +01:00
commit 6a0de7f512
22 changed files with 335 additions and 101 deletions

View File

@ -95,22 +95,10 @@ class TransNode extends \Twig_Node
preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches); preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches);
if (version_compare(\Twig_Environment::VERSION, '1.5', '>=')) { foreach ($matches[1] as $var) {
foreach ($matches[1] as $var) { $key = new \Twig_Node_Expression_Constant('%'.$var.'%', $body->getLine());
$key = new \Twig_Node_Expression_Constant('%'.$var.'%', $body->getLine()); if (!$vars->hasElement($key)) {
if (!$vars->hasElement($key)) { $vars->addElement(new \Twig_Node_Expression_Name($var, $body->getLine()), $key);
$vars->addElement(new \Twig_Node_Expression_Name($var, $body->getLine()), $key);
}
}
} else {
$current = array();
foreach ($vars as $name => $var) {
$current[$name] = true;
}
foreach ($matches[1] as $var) {
if (!isset($current['%'.$var.'%'])) {
$vars->setNode('%'.$var.'%', new \Twig_Node_Expression_Name($var, $body->getLine()));
}
} }
} }

View File

@ -43,6 +43,33 @@ class TranslationExtensionTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($expected, $this->getTemplate($template)->render($variables)); $this->assertEquals($expected, $this->getTemplate($template)->render($variables));
} }
/**
* @expectedException \Twig_Error_Syntax
* @expectedExceptionMessage Unexpected token. Twig was looking for the "with", "from", or "into" keyword in "index" at line 3.
*/
public function testTransUnknownKeyword()
{
$output = $this->getTemplate("{% trans \n\nfoo %}{% endtrans %}")->render();
}
/**
* @expectedException \Twig_Error_Syntax
* @expectedExceptionMessage A message inside a trans tag must be a simple text in "index" at line 2.
*/
public function testTransComplexBody()
{
$output = $this->getTemplate("{% trans %}\n{{ 1 + 2 }}{% endtrans %}")->render();
}
/**
* @expectedException \Twig_Error_Syntax
* @expectedExceptionMessage A message inside a transchoice tag must be a simple text in "index" at line 2.
*/
public function testTransChoiceComplexBody()
{
$output = $this->getTemplate("{% transchoice count %}\n{{ 1 + 2 }}{% endtranschoice %}")->render();
}
public function getTransTests() public function getTransTests()
{ {
return array( return array(

View File

@ -64,7 +64,7 @@ class TransChoiceTokenParser extends TransTokenParser
$body = $this->parser->subparse(array($this, 'decideTransChoiceFork'), true); $body = $this->parser->subparse(array($this, 'decideTransChoiceFork'), true);
if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) { if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
throw new \Twig_Error_Syntax('A message must be a simple text.'); throw new \Twig_Error_Syntax('A message inside a transchoice tag must be a simple text.', $body->getLine(), $stream->getFilename());
} }
$stream->expect(\Twig_Token::BLOCK_END_TYPE); $stream->expect(\Twig_Token::BLOCK_END_TYPE);

View File

@ -55,7 +55,7 @@ class TransTokenParser extends \Twig_TokenParser
$stream->next(); $stream->next();
$locale = $this->parser->getExpressionParser()->parseExpression(); $locale = $this->parser->getExpressionParser()->parseExpression();
} elseif (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) { } elseif (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
throw new \Twig_Error_Syntax('Unexpected token. Twig was looking for the "with" or "from" keyword.'); throw new \Twig_Error_Syntax('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getFilename());
} }
} }
@ -64,7 +64,7 @@ class TransTokenParser extends \Twig_TokenParser
$body = $this->parser->subparse(array($this, 'decideTransFork'), true); $body = $this->parser->subparse(array($this, 'decideTransFork'), true);
if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) { if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
throw new \Twig_Error_Syntax('A message inside a trans tag must be a simple text'); throw new \Twig_Error_Syntax('A message inside a trans tag must be a simple text.', $body->getLine(), $stream->getFilename());
} }
$stream->expect(\Twig_Token::BLOCK_END_TYPE); $stream->expect(\Twig_Token::BLOCK_END_TYPE);

View File

@ -1,5 +1 @@
<input <input type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>" <?php echo $view['form']->block($form, 'widget_attributes') ?><?php if (!empty($value) || is_numeric($value)): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?> />
type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>"
<?php echo $view['form']->block($form, 'widget_attributes') ?>
<?php if (!empty($value) || is_numeric($value)): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?>
/>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="foo" class="BarClass" />
</services>
</container>

View File

@ -33,7 +33,7 @@ class TextareaFormField extends FormField
$this->value = null; $this->value = null;
foreach ($this->node->childNodes as $node) { foreach ($this->node->childNodes as $node) {
$this->value .= $this->document->saveXML($node); $this->value .= $node->wholeText;
} }
} }
} }

View File

@ -29,5 +29,18 @@ class TextareaFormFieldTest extends FormFieldTestCase
} catch (\LogicException $e) { } catch (\LogicException $e) {
$this->assertTrue(true, '->initialize() throws a \LogicException if the node is not a textarea'); $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not a textarea');
} }
// Ensure that valid HTML can be used on a textarea.
$node = $this->createNode('textarea', 'foo bar <h1>Baz</h1>');
$field = new TextareaFormField($node);
$this->assertEquals('foo bar <h1>Baz</h1>', $field->getValue(), '->initialize() sets the value of the field to the textarea node value');
// Ensure that we don't do any DOM manipulation/validation by passing in
// "invalid" HTML.
$node = $this->createNode('textarea', 'foo bar <h1>Baz</h2>');
$field = new TextareaFormField($node);
$this->assertEquals('foo bar <h1>Baz</h2>', $field->getValue(), '->initialize() sets the value of the field to the textarea node value');
} }
} }

View File

@ -39,7 +39,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable
public function getParent(); public function getParent();
/** /**
* Adds a child to the form. * Adds or replaces a child to the form.
* *
* @param FormInterface|string|integer $child The FormInterface instance or the name of the child. * @param FormInterface|string|integer $child The FormInterface instance or the name of the child.
* @param string|null $type The child's type, if a name was passed. * @param string|null $type The child's type, if a name was passed.

View File

@ -167,6 +167,9 @@ class XmlFileLoader extends FileLoader
if (null !== $host) { if (null !== $host) {
$subCollection->setHost($host); $subCollection->setHost($host);
} }
if (null !== $condition) {
$subCollection->setCondition($condition);
}
if (null !== $schemes) { if (null !== $schemes) {
$subCollection->setSchemes($schemes); $subCollection->setSchemes($schemes);
} }

View File

@ -146,6 +146,7 @@ class YamlFileLoader extends FileLoader
$requirements = isset($config['requirements']) ? $config['requirements'] : array(); $requirements = isset($config['requirements']) ? $config['requirements'] : array();
$options = isset($config['options']) ? $config['options'] : array(); $options = isset($config['options']) ? $config['options'] : array();
$host = isset($config['host']) ? $config['host'] : null; $host = isset($config['host']) ? $config['host'] : null;
$condition = isset($config['condition']) ? $config['condition'] : null;
$schemes = isset($config['schemes']) ? $config['schemes'] : null; $schemes = isset($config['schemes']) ? $config['schemes'] : null;
$methods = isset($config['methods']) ? $config['methods'] : null; $methods = isset($config['methods']) ? $config['methods'] : null;
@ -157,6 +158,9 @@ class YamlFileLoader extends FileLoader
if (null !== $host) { if (null !== $host) {
$subCollection->setHost($host); $subCollection->setHost($host);
} }
if (null !== $condition) {
$subCollection->setCondition($condition);
}
if (null !== $schemes) { if (null !== $schemes) {
$subCollection->setSchemes($schemes); $subCollection->setSchemes($schemes);
} }

View File

@ -20,4 +20,6 @@
<option key="compiler_class">RouteCompiler</option> <option key="compiler_class">RouteCompiler</option>
<condition>context.getMethod() == "GET"</condition> <condition>context.getMethod() == "GET"</condition>
</route> </route>
<route id="blog_show_inherited" path="/blog/{slug}" />
</routes> </routes>

View File

@ -17,3 +17,6 @@ blog_show_legacy:
condition: 'context.getMethod() == "GET"' condition: 'context.getMethod() == "GET"'
options: options:
compiler_class: RouteCompiler compiler_class: RouteCompiler
blog_show_inherited:
path: /blog/{slug}

View File

@ -8,5 +8,6 @@
<default key="foo">123</default> <default key="foo">123</default>
<requirement key="foo">\d+</requirement> <requirement key="foo">\d+</requirement>
<option key="foo">bar</option> <option key="foo">bar</option>
<condition>context.getMethod() == "POST"</condition>
</import> </import>
</routes> </routes>

View File

@ -5,3 +5,4 @@ _blog:
requirements: { 'foo': '\d+' } requirements: { 'foo': '\d+' }
options: { 'foo': 'bar' } options: { 'foo': 'bar' }
host: "" host: ""
condition: 'context.getMethod() == "POST"'

View File

@ -34,10 +34,12 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$routeCollection = $loader->load('validpattern.xml'); $routeCollection = $loader->load('validpattern.xml');
$routes = $routeCollection->all(); $routes = $routeCollection->all();
$this->assertCount(2, $routes, 'Two routes are loaded'); $this->assertCount(3, $routes, 'Three routes are loaded');
$this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
foreach ($routes as $route) { $identicalRoutes = array_slice($routes, 0, 2);
foreach ($identicalRoutes as $route) {
$this->assertSame('/blog/{slug}', $route->getPath()); $this->assertSame('/blog/{slug}', $route->getPath());
$this->assertSame('{locale}.example.com', $route->getHost()); $this->assertSame('{locale}.example.com', $route->getHost());
$this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller')); $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
@ -72,7 +74,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$routeCollection = $loader->load('validresource.xml'); $routeCollection = $loader->load('validresource.xml');
$routes = $routeCollection->all(); $routes = $routeCollection->all();
$this->assertCount(2, $routes, 'Two routes are loaded'); $this->assertCount(3, $routes, 'Three routes are loaded');
$this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
foreach ($routes as $route) { foreach ($routes as $route) {
@ -81,6 +83,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertSame('\d+', $route->getRequirement('foo')); $this->assertSame('\d+', $route->getRequirement('foo'));
$this->assertSame('bar', $route->getOption('foo')); $this->assertSame('bar', $route->getOption('foo'));
$this->assertSame('', $route->getHost()); $this->assertSame('', $route->getHost());
$this->assertSame('context.getMethod() == "POST"', $route->getCondition());
} }
} }

View File

@ -68,10 +68,12 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$routeCollection = $loader->load('validpattern.yml'); $routeCollection = $loader->load('validpattern.yml');
$routes = $routeCollection->all(); $routes = $routeCollection->all();
$this->assertCount(2, $routes, 'Two routes are loaded'); $this->assertCount(3, $routes, 'Three routes are loaded');
$this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
foreach ($routes as $route) { $identicalRoutes = array_slice($routes, 0, 2);
foreach ($identicalRoutes as $route) {
$this->assertSame('/blog/{slug}', $route->getPath()); $this->assertSame('/blog/{slug}', $route->getPath());
$this->assertSame('{locale}.example.com', $route->getHost()); $this->assertSame('{locale}.example.com', $route->getHost());
$this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller')); $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
@ -89,7 +91,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$routeCollection = $loader->load('validresource.yml'); $routeCollection = $loader->load('validresource.yml');
$routes = $routeCollection->all(); $routes = $routeCollection->all();
$this->assertCount(2, $routes, 'Two routes are loaded'); $this->assertCount(3, $routes, 'Three routes are loaded');
$this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
foreach ($routes as $route) { foreach ($routes as $route) {
@ -98,6 +100,8 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertSame('\d+', $route->getRequirement('foo')); $this->assertSame('\d+', $route->getRequirement('foo'));
$this->assertSame('bar', $route->getOption('foo')); $this->assertSame('bar', $route->getOption('foo'));
$this->assertSame('', $route->getHost()); $this->assertSame('', $route->getHost());
$this->assertSame('context.getMethod() == "POST"', $route->getCondition());
} }
} }
} }

View File

@ -0,0 +1,71 @@
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="1">
<source>An authentication exception occurred.</source>
<target>Terjadi sebuah pengecualian otentikasi.</target>
</trans-unit>
<trans-unit id="2">
<source>Authentication credentials could not be found.</source>
<target>Kredensial otentikasi tidak bisa ditemukan.</target>
</trans-unit>
<trans-unit id="3">
<source>Authentication request could not be processed due to a system problem.</source>
<target>Permintaan otentikasi tidak bisa diproses karena masalah sistem.</target>
</trans-unit>
<trans-unit id="4">
<source>Invalid credentials.</source>
<target>Kredensial salah.</target>
</trans-unit>
<trans-unit id="5">
<source>Cookie has already been used by someone else.</source>
<target>Cookie sudah digunakan oleh orang lain.</target>
</trans-unit>
<trans-unit id="6">
<source>Not privileged to request the resource.</source>
<target>Tidak berhak untuk meminta sumber daya.</target>
</trans-unit>
<trans-unit id="7">
<source>Invalid CSRF token.</source>
<target>Token CSRF salah.</target>
</trans-unit>
<trans-unit id="8">
<source>Digest nonce has expired.</source>
<target>Digest nonce telah berakhir.</target>
</trans-unit>
<trans-unit id="9">
<source>No authentication provider found to support the authentication token.</source>
<target>Tidak ditemukan penyedia otentikasi untuk mendukung token otentikasi.</target>
</trans-unit>
<trans-unit id="10">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>Tidak ada sesi yang tersedia, mungkin waktu sudah habis atau cookie tidak diaktifkan</target>
</trans-unit>
<trans-unit id="11">
<source>No token could be found.</source>
<target>Tidak ada token yang bisa ditemukan.</target>
</trans-unit>
<trans-unit id="12">
<source>Username could not be found.</source>
<target>Username tidak bisa ditemukan.</target>
</trans-unit>
<trans-unit id="13">
<source>Account has expired.</source>
<target>Akun telah berakhir.</target>
</trans-unit>
<trans-unit id="14">
<source>Credentials have expired.</source>
<target>Kredensial telah berakhir.</target>
</trans-unit>
<trans-unit id="15">
<source>Account is disabled.</source>
<target>Akun dinonaktifkan.</target>
</trans-unit>
<trans-unit id="16">
<source>Account is locked.</source>
<target>Akun terkunci.</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,71 @@
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="1">
<source>An authentication exception occurred.</source>
<target>身份验证发生异常。</target>
</trans-unit>
<trans-unit id="2">
<source>Authentication credentials could not be found.</source>
<target>没有找到身份验证的凭证。</target>
</trans-unit>
<trans-unit id="3">
<source>Authentication request could not be processed due to a system problem.</source>
<target>由于系统故障,身份验证的请求无法被处理。</target>
</trans-unit>
<trans-unit id="4">
<source>Invalid credentials.</source>
<target>无效的凭证。</target>
</trans-unit>
<trans-unit id="5">
<source>Cookie has already been used by someone else.</source>
<target>Cookie 已经被其他人使用。</target>
</trans-unit>
<trans-unit id="6">
<source>Not privileged to request the resource.</source>
<target>没有权限请求此资源。</target>
</trans-unit>
<trans-unit id="7">
<source>Invalid CSRF token.</source>
<target>无效的 CSRF token 。</target>
</trans-unit>
<trans-unit id="8">
<source>Digest nonce has expired.</source>
<target>摘要随机串digest nonce已过期。</target>
</trans-unit>
<trans-unit id="9">
<source>No authentication provider found to support the authentication token.</source>
<target>没有找到支持此 token 的身份验证服务提供方。</target>
</trans-unit>
<trans-unit id="10">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>Session 不可用。会话超时或没有启用 cookies 。</target>
</trans-unit>
<trans-unit id="11">
<source>No token could be found.</source>
<target>找不到 token 。</target>
</trans-unit>
<trans-unit id="12">
<source>Username could not be found.</source>
<target>找不到用户名。</target>
</trans-unit>
<trans-unit id="13">
<source>Account has expired.</source>
<target>帐号已过期。</target>
</trans-unit>
<trans-unit id="14">
<source>Credentials have expired.</source>
<target>凭证已过期。</target>
</trans-unit>
<trans-unit id="15">
<source>Account is disabled.</source>
<target>帐号已被禁用。</target>
</trans-unit>
<trans-unit id="16">
<source>Account is locked.</source>
<target>帐号已被锁定。</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -36,10 +36,10 @@ abstract class AbstractLoader implements LoaderInterface
/** /**
* Creates a new constraint instance for the given constraint name. * Creates a new constraint instance for the given constraint name.
* *
* @param string $name The constraint name. Either a constraint relative * @param string $name The constraint name. Either a constraint relative
* to the default constraint namespace, or a fully * to the default constraint namespace, or a fully
* qualified class name * qualified class name
* @param array $options The constraint options * @param mixed $options The constraint options
* *
* @return Constraint * @return Constraint
* *

View File

@ -105,7 +105,7 @@ class XmlFileLoader extends FileLoader
$options = null; $options = null;
} }
$constraints[] = $this->newConstraint($node['name'], $options); $constraints[] = $this->newConstraint((string) $node['name'], $options);
} }
return $constraints; return $constraints;

View File

@ -4,223 +4,279 @@
<body> <body>
<trans-unit id="1"> <trans-unit id="1">
<source>This value should be false.</source> <source>This value should be false.</source>
<target>该变量的值应为 false.</target> <target>该变量的值应为 false</target>
</trans-unit> </trans-unit>
<trans-unit id="2"> <trans-unit id="2">
<source>This value should be true.</source> <source>This value should be true.</source>
<target>该变量的值应为 true.</target> <target>该变量的值应为 true</target>
</trans-unit> </trans-unit>
<trans-unit id="3"> <trans-unit id="3">
<source>This value should be of type {{ type }}.</source> <source>This value should be of type {{ type }}.</source>
<target>该变量的类型应为 {{ type }}.</target> <target>该变量的类型应为 {{ type }}</target>
</trans-unit> </trans-unit>
<trans-unit id="4"> <trans-unit id="4">
<source>This value should be blank.</source> <source>This value should be blank.</source>
<target>该变量值应为空.</target> <target>该变量值应为空</target>
</trans-unit> </trans-unit>
<trans-unit id="5"> <trans-unit id="5">
<source>The value you selected is not a valid choice.</source> <source>The value you selected is not a valid choice.</source>
<target>选定变量的值不是有效的选项.</target> <target>选定变量的值不是有效的选项</target>
</trans-unit> </trans-unit>
<trans-unit id="6"> <trans-unit id="6">
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source> <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
<target>您至少要选择 {{ limit }} 个选项.</target> <target>您至少要选择 {{ limit }} 个选项</target>
</trans-unit> </trans-unit>
<trans-unit id="7"> <trans-unit id="7">
<source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source> <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
<target>您最多能选择 {{ limit }} 个选项.</target> <target>您最多能选择 {{ limit }} 个选项</target>
</trans-unit> </trans-unit>
<trans-unit id="8"> <trans-unit id="8">
<source>One or more of the given values is invalid.</source> <source>One or more of the given values is invalid.</source>
<target>一个或者多个给定的值无效.</target> <target>一个或者多个给定的值无效</target>
</trans-unit> </trans-unit>
<trans-unit id="9"> <trans-unit id="9">
<source>The fields {{ fields }} were not expected.</source> <source>The fields {{ fields }} were not expected.</source>
<target>非预期字段 {{ fields }}.</target> <target>非预期字段 {{ fields }}</target>
</trans-unit> </trans-unit>
<trans-unit id="10"> <trans-unit id="10">
<source>The fields {{ fields }} are missing.</source> <source>The fields {{ fields }} are missing.</source>
<target>遗漏字段 {{ fields }}.</target> <target>遗漏字段 {{ fields }}</target>
</trans-unit> </trans-unit>
<trans-unit id="11"> <trans-unit id="11">
<source>This value is not a valid date.</source> <source>This value is not a valid date.</source>
<target>该值不是一个有效日期date.</target> <target>该值不是一个有效的日期date</target>
</trans-unit> </trans-unit>
<trans-unit id="12"> <trans-unit id="12">
<source>This value is not a valid datetime.</source> <source>This value is not a valid datetime.</source>
<target>该值不是一个有效日期时间datetime.</target> <target>该值不是一个有效的日期时间datetime</target>
</trans-unit> </trans-unit>
<trans-unit id="13"> <trans-unit id="13">
<source>This value is not a valid email address.</source> <source>This value is not a valid email address.</source>
<target>该值不是一个有效邮件地址.</target> <target>该值不是一个有效的邮件地址。</target>
</trans-unit> </trans-unit>
<trans-unit id="14"> <trans-unit id="14">
<source>The file could not be found.</source> <source>The file could not be found.</source>
<target>文件未找到.</target> <target>文件未找到</target>
</trans-unit> </trans-unit>
<trans-unit id="15"> <trans-unit id="15">
<source>The file is not readable.</source> <source>The file is not readable.</source>
<target>文件不可读.</target> <target>文件不可读</target>
</trans-unit> </trans-unit>
<trans-unit id="16"> <trans-unit id="16">
<source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source> <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>文件太大 ({{ size }} {{ suffix }}). 文件大小不可以超过 {{ limit }} {{ suffix }}.</target> <target>文件太大 ({{ size }} {{ suffix }})。文件大小不可以超过 {{ limit }} {{ suffix }} 。</target>
</trans-unit> </trans-unit>
<trans-unit id="17"> <trans-unit id="17">
<source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source> <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
<target>文件类型不合法 ({{ type }}). 合法的文件类型有 {{ types }}.</target> <target>无效的文件类型 ({{ type }}) 。允许的文件类型有 {{ types }} 。</target>
</trans-unit> </trans-unit>
<trans-unit id="18"> <trans-unit id="18">
<source>This value should be {{ limit }} or less.</source> <source>This value should be {{ limit }} or less.</source>
<target>这个变量的值应该小于或等于 {{ limit }}.</target> <target>这个变量的值应该小于或等于 {{ limit }}</target>
</trans-unit> </trans-unit>
<trans-unit id="19"> <trans-unit id="19">
<source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source> <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
<target>字符串太长, 长度不可超过 {{ limit }} 个字符.</target> <target>字符串太长,长度不可超过 {{ limit }} 个字符。</target>
</trans-unit> </trans-unit>
<trans-unit id="20"> <trans-unit id="20">
<source>This value should be {{ limit }} or more.</source> <source>This value should be {{ limit }} or more.</source>
<target>该变量的值应该大于或等于 {{ limit }}.</target> <target>该变量的值应该大于或等于 {{ limit }}</target>
</trans-unit> </trans-unit>
<trans-unit id="21"> <trans-unit id="21">
<source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source> <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
<target>字符串太短, 长度不可少于 {{ limit }} 个字符.</target> <target>字符串太短,长度不可少于 {{ limit }} 个字符。</target>
</trans-unit> </trans-unit>
<trans-unit id="22"> <trans-unit id="22">
<source>This value should not be blank.</source> <source>This value should not be blank.</source>
<target>该变量不应为空.</target> <target>该变量不应为空</target>
</trans-unit> </trans-unit>
<trans-unit id="23"> <trans-unit id="23">
<source>This value should not be null.</source> <source>This value should not be null.</source>
<target>该变量不应为 null.</target> <target>该变量不应为 null</target>
</trans-unit> </trans-unit>
<trans-unit id="24"> <trans-unit id="24">
<source>This value should be null.</source> <source>This value should be null.</source>
<target>该变量应为空 null.</target> <target>该变量应为空 null</target>
</trans-unit> </trans-unit>
<trans-unit id="25"> <trans-unit id="25">
<source>This value is not valid.</source> <source>This value is not valid.</source>
<target>该变量值无效.</target> <target>该变量值无效</target>
</trans-unit> </trans-unit>
<trans-unit id="26"> <trans-unit id="26">
<source>This value is not a valid time.</source> <source>This value is not a valid time.</source>
<target>该值不是一个有效时间.</target> <target>该值不是一个有效的时间。</target>
</trans-unit> </trans-unit>
<trans-unit id="27"> <trans-unit id="27">
<source>This value is not a valid URL.</source> <source>This value is not a valid URL.</source>
<target>该值不是一个有效的 URL 地址.</target> <target>该值不是一个有效的 URL </target>
</trans-unit> </trans-unit>
<trans-unit id="31"> <trans-unit id="31">
<source>The two values should be equal.</source> <source>The two values should be equal.</source>
<target>该两个变量的值应该相同.</target> <target>这两个变量的值应该相等。</target>
</trans-unit> </trans-unit>
<trans-unit id="32"> <trans-unit id="32">
<source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source> <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>文件太大, 文件大小不可以超过 {{ limit }} {{ suffix }}.</target> <target>文件太大,文件大小不可以超过 {{ limit }} {{ suffix }}</target>
</trans-unit> </trans-unit>
<trans-unit id="33"> <trans-unit id="33">
<source>The file is too large.</source> <source>The file is too large.</source>
<target>文件太大.</target> <target>文件太大</target>
</trans-unit> </trans-unit>
<trans-unit id="34"> <trans-unit id="34">
<source>The file could not be uploaded.</source> <source>The file could not be uploaded.</source>
<target>文件不可被上传.</target> <target>无法上传此文件。</target>
</trans-unit> </trans-unit>
<trans-unit id="35"> <trans-unit id="35">
<source>This value should be a valid number.</source> <source>This value should be a valid number.</source>
<target>该值应该为有效的数字.</target> <target>该值应该为有效的数字</target>
</trans-unit> </trans-unit>
<trans-unit id="36"> <trans-unit id="36">
<source>This value is not a valid country.</source> <source>This value is not a valid country.</source>
<target>该值不是有效的国家名.</target> <target>该值不是有效的国家名</target>
</trans-unit> </trans-unit>
<trans-unit id="37"> <trans-unit id="37">
<source>This file is not a valid image.</source> <source>This file is not a valid image.</source>
<target>该文件不是有效的图片.</target> <target>该文件不是有效的图片</target>
</trans-unit> </trans-unit>
<trans-unit id="38"> <trans-unit id="38">
<source>This is not a valid IP address.</source> <source>This is not a valid IP address.</source>
<target>该值不是有效的IP地址.</target> <target>该值不是有效的IP地址</target>
</trans-unit> </trans-unit>
<trans-unit id="39"> <trans-unit id="39">
<source>This value is not a valid language.</source> <source>This value is not a valid language.</source>
<target>该值不是有效的语言名.</target> <target>该值不是有效的语言名</target>
</trans-unit> </trans-unit>
<trans-unit id="40"> <trans-unit id="40">
<source>This value is not a valid locale.</source> <source>This value is not a valid locale.</source>
<target>该值不是有效的区域值.</target> <target>该值不是有效的区域值locale</target>
</trans-unit> </trans-unit>
<trans-unit id="41"> <trans-unit id="41">
<source>This value is already used.</source> <source>This value is already used.</source>
<target>该值已经被使用了.</target> <target>该值已经被使用</target>
</trans-unit> </trans-unit>
<trans-unit id="42"> <trans-unit id="42">
<source>The size of the image could not be detected.</source> <source>The size of the image could not be detected.</source>
<target>不能解析图片大小.</target> <target>不能解析图片大小</target>
</trans-unit> </trans-unit>
<trans-unit id="43"> <trans-unit id="43">
<source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source> <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
<target>图片太宽 ({{ width }}px),最大宽度为 {{ max_width }}px.</target> <target>图片太宽 ({{ width }}px),最大宽度为 {{ max_width }}px</target>
</trans-unit> </trans-unit>
<trans-unit id="44"> <trans-unit id="44">
<source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source> <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
<target>图片宽度不够 ({{ width }}px),最小宽度为 {{ min_width }}px.</target> <target>图片宽度不够 ({{ width }}px),最小宽度为 {{ min_width }}px</target>
</trans-unit> </trans-unit>
<trans-unit id="45"> <trans-unit id="45">
<source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source> <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
<target>图片太高 ({{ height }}px),最大高度为 {{ max_height }}px.</target> <target>图片太高 ({{ height }}px),最大高度为 {{ max_height }}px</target>
</trans-unit> </trans-unit>
<trans-unit id="46"> <trans-unit id="46">
<source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source> <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
<target>图片高度不够 ({{ height }}px),最小高度为 {{ min_height }}px.</target> <target>图片高度不够 ({{ height }}px),最小高度为 {{ min_height }}px</target>
</trans-unit> </trans-unit>
<trans-unit id="47"> <trans-unit id="47">
<source>This value should be the user current password.</source> <source>This value should be the user current password.</source>
<target>该变量应为用户当前的密码.</target> <target>该变量的值应为用户当前的密码。</target>
</trans-unit> </trans-unit>
<trans-unit id="48"> <trans-unit id="48">
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source> <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
<target>该变量应为 {{ limit }} 个字符.</target> <target>该变量应为 {{ limit }} 个字符</target>
</trans-unit> </trans-unit>
<trans-unit id="49"> <trans-unit id="49">
<source>The file was only partially uploaded.</source> <source>The file was only partially uploaded.</source>
<target>该文件的上传不完整.</target> <target>该文件的上传不完整</target>
</trans-unit> </trans-unit>
<trans-unit id="50"> <trans-unit id="50">
<source>No file was uploaded.</source> <source>No file was uploaded.</source>
<target>没有上传任何文件.</target> <target>没有上传任何文件</target>
</trans-unit> </trans-unit>
<trans-unit id="51"> <trans-unit id="51">
<source>No temporary folder was configured in php.ini.</source> <source>No temporary folder was configured in php.ini.</source>
<target>php.ini里没有配置临时文件目录.</target> <target>php.ini 里没有配置临时文件目录。</target>
</trans-unit> </trans-unit>
<trans-unit id="52"> <trans-unit id="52">
<source>Cannot write temporary file to disk.</source> <source>Cannot write temporary file to disk.</source>
<target>临时文件写入磁盘失败.</target> <target>临时文件写入磁盘失败</target>
</trans-unit> </trans-unit>
<trans-unit id="53"> <trans-unit id="53">
<source>A PHP extension caused the upload to fail.</source> <source>A PHP extension caused the upload to fail.</source>
<target>某个PHP扩展造成上传失败.</target> <target>某个 PHP 扩展造成上传失败。</target>
</trans-unit> </trans-unit>
<trans-unit id="54"> <trans-unit id="54">
<source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source> <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
<target>该集合最少应包含 {{ limit }} 个元素.</target> <target>该集合最少应包含 {{ limit }} 个元素</target>
</trans-unit> </trans-unit>
<trans-unit id="55"> <trans-unit id="55">
<source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source> <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
<target>该集合最多包含 {{ limit }} 个元素.</target> <target>该集合最多包含 {{ limit }} 个元素</target>
</trans-unit> </trans-unit>
<trans-unit id="56"> <trans-unit id="56">
<source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source> <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
<target>该集合应包含正好 {{ limit }} 个元素element.</target> <target>该集合应包含 {{ limit }} 个元素 element 。</target>
</trans-unit> </trans-unit>
<trans-unit id="57"> <trans-unit id="57">
<source>Invalid card number.</source> <source>Invalid card number.</source>
<target>无效的信用卡号.</target> <target>无效的信用卡号</target>
</trans-unit> </trans-unit>
<trans-unit id="58"> <trans-unit id="58">
<source>Unsupported card type or invalid card number.</source> <source>Unsupported card type or invalid card number.</source>
<target>不支持的信用卡类型或无效的信用卡号.</target> <target>不支持的信用卡类型或无效的信用卡号。</target>
</trans-unit>
<trans-unit id="59">
<source>This is not a valid International Bank Account Number (IBAN).</source>
<target>该值不是有效的国际银行帐号IBAN。</target>
</trans-unit>
<trans-unit id="60">
<source>This value is not a valid ISBN-10.</source>
<target>该值不是有效的10位国际标准书号ISBN-10。</target>
</trans-unit>
<trans-unit id="61">
<source>This value is not a valid ISBN-13.</source>
<target>该值不是有效的13位国际标准书号ISBN-13。</target>
</trans-unit>
<trans-unit id="62">
<source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
<target>该值不是有效的国际标准书号ISBN-10 或 ISBN-13。</target>
</trans-unit>
<trans-unit id="63">
<source>This value is not a valid ISSN.</source>
<target>该值不是有效的国际标准期刊号ISSN。</target>
</trans-unit>
<trans-unit id="64">
<source>This value is not a valid currency.</source>
<target>该值不是有效的货币名currency。</target>
</trans-unit>
<trans-unit id="65">
<source>This value should be equal to {{ compared_value }}.</source>
<target>该值应等于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="66">
<source>This value should be greater than {{ compared_value }}.</source>
<target>该值应大于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="67">
<source>This value should be greater than or equal to {{ compared_value }}.</source>
<target>该值应大于或等于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="68">
<source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>该值应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
</trans-unit>
<trans-unit id="69">
<source>This value should be less than {{ compared_value }}.</source>
<target>该值应小于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="70">
<source>This value should be less than or equal to {{ compared_value }}.</source>
<target>该值应小于或等于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="71">
<source>This value should not be equal to {{ compared_value }}.</source>
<target>该值不应先等于 {{ compared_value }} 。</target>
</trans-unit>
<trans-unit id="72">
<source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>该值不应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>