symfony 5.2 gettext 更新 po 文件,标签来自 php 个文件

symfony 5.2 gettext update po file with labels from php files

我在表单类型中有翻译标签,例如:

$builder->add('island', EntityType::class, [
            'class' => Island::class,
            'choices' => $options['islands'],
            'choice_attr' => function(Island $choice) {
                // TODO move to template
                return ['data-content' => $choice->getParent()
                    ? '<span>&nbsp;&nbsp;' . $choice->getName() . '</span>'
                    : '<b>' . $choice->getName() . '</b>'
                ];
            },
            'choice_label' => 'name',
            'attr' => ['class' => 'selectpicker', 'title' => _('form.cafe.island.title')],
            'required' => true,
            'label' => false
        ])

如您所见,我尝试使用传统的 _() 方式,但没有成功。 我试图在 po 文件中为 poedit 生成新标签,如下所示: php bin/console translation:update --output-format=po --force hu 任何建议或想法都非常受欢迎。 提前致谢!

最佳做法是不翻译形式 class。尝试将未翻译的标签放在那里,然后在模板中翻译。这不能解决自动生成“.po”文件的问题,但可以简化类型 class,即。不需要注入翻译器,不需要在每个带有 title 属性字段的 FormType class 中进行翻译。否则以后需要在每个Typeclass中加入translator和translate属性

翻译模板中的表单字段属性,需要重载 build-in 表单模板,如 Creating your Own Form Theme 中所述。

在这种情况下要简化流程:

  • 从 build-in 模板复制块 widget_attributes 用于拥有干净的模板。即:templates/form/my_theme.html.twig

  • 将此模板添加到标签 form_themes 中的 config/packages/twig.yaml,即:

      twig:
          form_themes: ['form/my_theme.html.twig']
    
  • 使用 extend 原始模板向此模板添加内容

      {% extends 'bootstrap_3_horizontal_layout.html.twig' %}
    
  • 和重载块widget_attributes

      {% block widget_attributes -%}
          {% if attr.title is not empty %}
              {% set attr = attr|merge({title: attr.title|trans({}, translation_domain)}) %}
          {{ parent() }}
      {%- endblock widget_attributes %}
    

通过这种方法,我们需要在一个地方进行更改并获取表单字段中所有标题属性的翻译。

正如我所说,这不会解析自动生成的“.po”文件,因为生成器无法从 PHP classes 中获取翻译标签。它仅适用于模板文件。

值得注意的是,并非每个表单小部件模板都使用 widget_attribute 来格式化字段属性,因此在某些情况下需要重载特定的小部件模板块。