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

28

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

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

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

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

只有字面字符串'form.description'被显示,而不是预期的翻译添加描述。

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

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

在控制器中并获得翻译结果。

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

我想我必须无论如何调用它们的trans函数,但是如何使其自动一次性完成呢?


1
好的,很奇怪。现在它可以工作了。我还不知道发生了什么变化,但我会调查一下。我怀疑是一些奇怪的缓存问题,即使在清除缓存后仍然存在。 - k0pernikus
目前遇到了同样的问题。有任何想法是什么原因引起的吗? - ferdynator
1
@ferdynator 对我来说,我怀疑这是一个缓存错误。如果 clear:cache 不起作用,请尝试通过 rm -rf app/cache/dev/* 手动清除开发缓存。此外,请检查您的 yml 名称是否有拼写错误。它也可能是大小写问题。 - k0pernikus
@ferdynator,您的点赞是否表示您已解决了遇到的问题?如果是,我会将其添加为答案。 - k0pernikus
1
一个容易掉进去的陷阱是在配置中也没有激活它:http://symfony.com/doc/current/book/translation.html#configuration - Dragony
4个回答

42

我不得不明确设置翻译域。

例如:

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

如果发生

fooo.de.xlf

很不幸,这种方法对我并没有起作用,但是翻译已经被加载了。我使用了翻译帮手的“trans”函数进行了检查。问题可能在于我在twig模板中使用表单的方式。 {{- form_label(child) -}} - Jakob Alexander Eichler

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

希望它能帮助到某个人 :)

需要以特定的方式打印表格吗? - Jakob Alexander Eichler

5
在表单中添加翻译是最好的想法,因为在twig中查找更加容易。
{% trans_default_domain 'YourNameBundle' %}

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

同时,您需要记住捆绑包中的翻译文件。如果您从另一个捆绑包扩展(例如 - 您扩展了FosUserBundle),则可以从该捆绑包中获取翻译或使用trans函数并带上参数。

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

祝您本地化愉快。


0
假设您想将其翻译成法语。那么您需要使用 filename.en.xlffilename.fr.xlf

现在,对于以下表单元素,您希望使 description 可以被翻译。

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

所以在 filename.en.xlf 文件中

<trans-unit id="17">
    <source>description</source>
    <target>description</target>
</trans-unit>

对于法语,文件名应为filename.fr.xlf,如下所示

<trans-unit id="17">
    <source>description</source>
    <target>fr descrip</target>
</trans-unit>

希望这对某人有所帮助


4
您没有展示如何实际翻译表单标签。您展示了使用标签和设置翻译文件,但默认情况下添加不会进行翻译,尤其是如果您的消息代码在特殊域文件中的话。 - RichieHH

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