翻译
在一个 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')