如何使用 messages.en.yml 翻译 symfony2 形式的标签?

Posted

技术标签:

【中文标题】如何使用 messages.en.yml 翻译 symfony2 形式的标签?【英文标题】:How to translate labels in symfony2 forms with messages.en.yml? 【发布时间】:2014-02-09 18:38:13 【问题描述】:

我正在尝试翻译表单字段。我的 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',而不是 Add a description. 的预期翻译

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

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

在控制器中获取翻译结果。

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

我想无论如何我都必须调用它们的 trans 函数,但我怎样才能自动完成呢?

【问题讨论】:

好的,很奇怪。现在它只是工作。我还不知道发生了什么变化,但我会调查一下。我怀疑即使在缓存之后仍然存在一些奇怪的缓存问题:清除 目前有同样的问题。知道是什么原因造成的吗? @ferdynator 对我来说,我怀疑这是一个缓存错误。如果clear:cache 不起作用,请尝试通过rm -rf app/cache/dev/* 手动清除开发缓存。另外,请检查 yml 名称中是否有拼写错误。这也可能是小写与大写的问题。 @ferdynator 是否得到了您的支持,是否解决了您面临的问题?如果是这样,我将其添加为答案。 一个容易掉入的陷阱是也没有在配置中激活它:symfony.com/doc/current/book/translation.html#configuration 【参考方案1】:

我必须明确设置翻译域

例如

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

如果是

fooo.de.xlf

【讨论】:

对我来说不幸的是这种方法不起作用,但翻译已加载。我用翻译助手的 trans 函数检查了这个问题可能是我在树枝模板中使用表单的方式。 - form_label(child) -【参考方案2】:

在 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

希望对某人有所帮助:)

【讨论】:

是否有特定的方式来打印所需的表格?【参考方案3】:

在表格中添加翻译是最好的主意 - 因为如果在树枝中找到更容易

% trans_default_domain 'YourNameBundle' %

'shot.tag.for.transle'|trans 

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

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

有一个很好的本地化。

【讨论】:

【参考方案4】:

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

现在对于您希望使描述可翻译的以下表单元素。

$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>

希望这对某人有所帮助

【讨论】:

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

以上是关于如何使用 messages.en.yml 翻译 symfony2 形式的标签?的主要内容,如果未能解决你的问题,请参考以下文章

Scala Slick 如何将 Scala 代码翻译成 JDBC?

[翻译]The Neophyte's Guide to Scala Part 12: Type Classes

OpenGL,第一人称相机翻译

LINQ 表达式 - 使用 .Any in s Select 无法翻译

C# 有道API翻译

如何在 WordPress 中翻译 Vue 输出?