跳到内容

翻译

编辑此页

在一个 Admin 类中有两个主要的翻译域

  • SonataAdminBundle:此域用于翻译不同 Admin 之间共享的消息
  • messages:此域用于翻译当前 Admin 的消息

理想情况下,应该更改 messages 域以避免与其他 Admin 类发生任何问题。

你可以通过容器注入值来配置 Admin 类的翻译域

1
2
3
4
5
6
7
8
<!-- config/services.xml -->

<service id="sonata.page.admin.page" class="Sonata\PageBundle\Admin\PageAdmin">
    <tag name="sonata.admin" model_class="Application\Sonata\PageBundle\Entity\Page" manager_type="orm" group="sonata_page" label="Page"/>
    <call method="setTranslationDomain">
        <argument>SonataPageBundle</argument>
    </call>
</service>

Admin 实例始终会获取 translator 实例,因此它可以用于翻译 configureFields 方法或模板中的消息。

1
2
3
4
5
6
7
8
{# the classical call by using the twig trans helper #}
{{ 'message_create_snapshots'|trans({}, 'SonataPageBundle') }}

{# by using the admin trans method with hardcoded translation domain #}
{{ 'message_create_snapshots'|trans({}, 'SonataPageBundle') }}

{# by using the admin trans with the configured translation domain #}
{{ 'message_create_snapshots'|trans({}, admin.translationdomain) }}

最后的解决方案是最灵活的,因为没有硬编码翻译参数,并且是推荐使用的一种。

翻译字段标签

Admin bundle 附带一个自定义的表单字段模板。与原始模板最显著的不同是使用了由 Admin 实例或字段描述提供的翻译域来翻译标签。

覆盖翻译域

翻译域可以在表单组级别或单个字段级别被覆盖。

如果在组级别设置了翻译域,它将向下级联到组内的所有字段。

当使用自定义管理时,覆盖翻译域尤其有用,在这种情况下,扩展和翻译将在一个 bundle 中定义,但在许多不同的 Admin 实例中实现。

在单个字段上设置翻译域

1
2
3
4
5
6
7
8
9
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

$form
    ->with('form.my_group')
        ->add('publishable', CheckboxType::class, [], [
            'translation_domain' => 'MyTranslationDomain',
        ])
    ->end()
;

以下示例在表单组上设置默认翻译域,并覆盖其中一个字段的设置

1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType;

$form
    ->with('form.my_group', ['translation_domain' => 'MyDomain'])
        ->add('publishable', CheckboxType::class, [], [
            'translation_domain' => 'AnotherDomain',
        ])
        ->add('start_date', DateType::class, [], [])
    ->end()
;

也可以通过将 translation_domain 设置为 false 来禁用特定字段的翻译。

设置标签名称

默认情况下,标签被设置为字段名称的清理版本。自定义标签可以定义为 add 方法的第三个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// src/Admin/PageAdmin.php

final class PageAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $form): void
    {
        $form
            ->add('isValid', null, [
                'required' => false,
                'label' => 'label.is_valid',
            ])
        ;
    }
}

标签策略

还有另一种选项可以用于快速原型设计,或者避免花费太多时间向所有选项字段添加 label 键:标签策略。默认情况下,标签使用以下规则生成

isValid => Is Valid

AdminBundle 提供了不同的键标签生成策略

  • sonata.admin.label.strategy.native:默认 - 使字符串更易于阅读
    isValid => Is Valid
  • sonata.admin.label.strategy.form_component:来自 Form Component 的默认行为
    isValid => Isvalid
  • sonata.admin.label.strategy.underscore:通过在字段名称的下划线版本前加上 "form.label",将名称更改为适合翻译的令牌 isValid => form.label_is_valid
  • sonata.admin.label.strategy.noop:不更改字符串
    isValid => isValid

sonata.admin.label.strategy.underscore 更适合 i18n 应用,而 sonata.admin.label.strategy.native 更适合基于字段名称的本地(单语言)应用。从 native 策略开始是合理的,然后,当应用程序需要使用通用键进行翻译时,配置可以切换到 underscore

当 Admin 类在容器中注册时,可以快速配置策略

1
2
3
4
5
6
7
8
9
10
11
12
<!-- config/services.xml -->

<service id="app.admin.project" class="App\Admin\ProjectAdmin">
    <tag
        name="sonata.admin"
        model_class="App\Entity\Project"
        manager_type="orm"
        group="Project"
        label="Project"
        label_translator_strategy="sonata.admin.label.strategy.native"
        />
</service>

注意

在所有情况下,标签都将由 Translator 使用。该策略是生成可翻译键的快速方法。这一切都取决于项目的需求。

注意

当调用策略方法时,会传递 context(breadcrumb、datagrid、filter、form、list、show 等)和 type(通常是 link 或 label)参数。例如,调用可能如下所示:getLabel($label_key, 'breadcrumb', 'link')

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本