如何在Symfony2表单中翻译"(optional)"

4

我有一些表单类型不是必填项。表单标签应该本地化,这很容易。

但是当你将某个表单类型配置为'required'=>'false'时,在类型标签后面会出现一个单词"(optional)"。

如何正确翻译"optional"或禁用它呢?

顺便说一下,我现在完全看不到任何方法。

谢谢

 "require": {
     "php": ">=5.3.3",
     "symfony/symfony": "v2.3.0",
     "doctrine/orm": ">=2.2.3,<2.4-dev",
     "doctrine/doctrine-bundle": "1.2.*",
     "twig/extensions": "1.0.*",
     "symfony/assetic-bundle": "2.1.*",
     "symfony/swiftmailer-bundle": "2.3.*",
     "symfony/monolog-bundle": "2.3.*",
     "sensio/distribution-bundle": "2.3.*",
     "sensio/framework-extra-bundle": "2.3.*",
     "sensio/generator-bundle": "2.3.*",
     "jms/security-extra-bundle": "1.4.*@dev",
     "jms/di-extra-bundle": "1.3.*@dev",
     "twitter/bootstrap" : "dev-master",
     "cg/kint-bundle": "dev-master",
     "raveren/kint": "dev-master",
     "mopa/bootstrap-bundle": "dev-master",
     "sonata-project/intl-bundle": "dev-master",
     "egeloen/ckeditor-bundle": "2.*"
},

你使用的Symfony2版本是哪个?请提供你的composer.json!这种在标签后面渲染可选字符串的行为 - 据我所知 - 不是标准行为,所以可能是由你使用的某个bundle渲染的。 - Nicolai Fröhlich
我从composer.json中添加了依赖项列表。Symfony版本为2.3.0。 - Đuro Mandinić
2个回答

10

“optional”字符串渲染是由mopa/bootstrap-bundle引入的。

可以在捆绑包的Resources/views/Form/fields.html.twig中找到。

“optional”字符串添加在块form_label_asterisk中:

{% block label_asterisk %}
    {% if required %}
        {% if render_required_asterisk %}
             <span>*</span>
        {% endif %}
    {% else %}
        {% if render_optional_text %}
            <span>{{ "(optional)"|trans({}, translation_domain) }}</span>
        {% endif %}
    {% endif %}
{% endblock label_asterisk %}

正如你所看到的,渲染需要你为可选字符串设置一个translation_domain以进行翻译。正确的实现应该使用'messages'作为fallback。

...
<span>{{ "(optional)"|trans({}, translation_domain|default('messages')) }}</span>
...

解决方案:

通过在config.yml中添加以下内容,完全删除可选渲染:

# app/config/config.yml
parameters:
    mopa_bootstrap.form.render_optional_text: false

...或者在您的表单选项中添加render_optional_text => false

BootstrapBundle覆盖默认表单类型的代码可以在这里找到。

另外,您也可以通过在单个表单中覆盖该块来删除可选字符串。

{% form_theme form _self %}

{% block label_asterisk %}
    {% if required %}
        {% if render_required_asterisk %}
             <span>*</span>
        {% endif %}
    {% endif %}
{% endblock label_asterisk %}

有关覆盖表单元素的更多信息,请参阅此处我的答案


当然,我觉得应该给它点个赞。现在知道在哪里点击了 :) - Đuro Mandinić

0
在bundle的存储库上查看允许翻译(可选)#277问题。自从这个问题的被接受答案以来,这段代码已经发生了很大变化。
现在它使用translation_domain,像这样:
{%- if render_optional_text %}&nbsp;<span>{{ "(optional)"|trans({}, translation_domain) }}</span>{% endif %}

我个人使用JMSTranslationBundle,所以为了提取它,我编写了一个快速的简单类,如下:

<?php
namespace ACME\Bundle\ACMEBundle\Tools;

use Symfony\Bundle\FrameworkBundle\Translation\Translator;

class TranlsationsOverrides {
    /**
     * @param Translator $translator
     */
    function __construct(Translator $translator) {
        $this->translator = $translator;
        /**
         * @see vendor/mopa/bootstrap-bundle/Mopa/Bundle/BootstrapBundle/Resources/views/Form/fields.html.twig:653
         * https://github.com/phiamo/MopaBootstrapBundle/pull/277
         */
        /** @desc("(optional)") */
        $translator->trans('(optional)');
    }
}

因此,当运行php app/console translation:extract my_local时,它会被提取并可以进行翻译 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接