如何使用messages.en.yml翻译symfony2表单中的标签?

时间:2014-01-20 14:32:43

标签: php forms symfony translation formbuilder

我正在尝试将表单字段的翻译工作。我在Bundle的Ressource文件夹中有messages.en.yml

test: it works
form:
    description: Add a description.

我想在EntityType中构建一个表单,相应地转换表单字段的标签。

$builder->add(
    'description',
    null,
    array('label' => 'form.description', 'required' => false)
);

但只显示文字字符串'form.description',而不是Add a description.的预期翻译

我可以调用正确加载翻译服务和messages.en.yml

var_dump($this->get('translator')->trans('test'));

在控制器中

并获得翻译结果。

当我想将字符串'form.description'视为应翻译的内容时,我错过了什么?

我想我无论如何都必须在它们上面调用trans功能,但是如何自动完成它?

4 个答案:

答案 0 :(得分:38)

我必须明确设置翻译域

e.g

->add('description','hidden',
 array(
   "label"=>"form.description",
   "required"=>true,
   'translation_domain' => 'fooo'
 )
);

的情况

fooo.de.xlf

答案 1 :(得分:6)

在symfony 3.1中您不需要将转换器传递给表单类型构造函数。它将由表单字段名称自动翻译,如下所示:

控制器操作:

$form = $this->createForm(LoginType::class);

FormType类:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('username',
            TextType::class, ['label_format' => '%name%',]
        );
}

您的翻译文件(yml):

username: Your translation for username field

希望它会帮助某人:)

答案 2 :(得分:4)

在形式中添加翻译是最好的主意 - 因为如果在枝条中发现更容易

{% trans_default_domain 'YourNameBundle' %}

{{'shot.tag.for.transle'|trans }}

您还必须记住捆绑中的翻译文件, 如果你从另一个扩展bundle(例如 - 你扩展了FosUserBundle) 你可以从这个包中翻译或使用带有参数的func trans

{{'shot.tag.for.transle'|trans({}, 'TranslationNameBundle') }}

有一个很好的本地化。

答案 3 :(得分:1)

假设你要翻译成法语。然后你有 filename.en.xlf filename.fr.xlf

现在,您希望将以下表单元素设为 description 可翻译。

while (true) {
    try{
        ConsumerRecords records = consumer.poll(100);
        for (ConsumerRecord record : records) {
            if(record.value()!=null){
                TextAnalysisRequest textAnalysisObj = record.value();
                if(textAnalysisObj!=null){
                    // Process record
                    requests.offer(textAnalysisObj);
                }
            }
     }    
}
catch(Exception ex){
    LOGGER.error("Error in Full Consumer group worker", ex);
}

所以在 filename.en.xlf

            while (!Thread.currentThread().isInterrupted()) {
                try {
                    TextAnalysisRequest textAnalysisObj = requests.take();
                    PreProcessorUtil.submitPostProcessRequest(textAnalysisObj);
                } catch (InterruptedException e) {
                    LOGGER.info("Process thread interrupted", e);
                    Thread.currentThread().interrupt();
                } catch (Throwable t) {
                    LOGGER.warn("Unexpected throwable while processing.", t);
                }
            }

和法语,所以在 filename.fr.xlf 中如下

$builder->add(
    'description',
    null,
    array('label' => 'form.description', 'required' => false)
);

希望这会对某人有所帮助