Symfony2,奏鸣曲:翻译并显示翻译后的角色名称
Symfony2, Sonata : translate and show translated roles name
第一步更多是关于 Symfony2,
我有不同的角色:
role_hierarchy:
ROLE_INVESTOR: [ROLE_USER]
ROLE_PROJECT_OWNER: [ROLE_USER]
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN]
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, SONATA]
我想要每一个的法语翻译。
使用 roles.fr.yml、roles.fr.xml 或 roles.fr.xliff(不确定必须使用哪一个)。
这是我实际的 yml:
'ROLE_PROJECT_OWNER': Porteur de projet
'ROLE_INVESTOR': Investisseur
'ROLE_USER': Utilisateur
或 xliff :
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="" >
<body>
<trans-unit id="ROLE_PROJECT_OWNER">
<source>ROLE_PROJECT_OWNER</source>
<target>Porteur de projet</target>
</trans-unit>
</body>
</file>
</xliff>
(均未测试)
然后我想在 Sonata Admin 中展示它们,目前它根本不是用户友好的:
他们是这样 "auto" 在这部分列出的:
/**
* {@inheritdoc}
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('username')
->add('email')
->add('enabled', null, array('editable' => true))
->add('locked', null, array('editable' => true))
->add('roles', null, array('editable' => true))
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
))
;
}
所以不知道怎么加上他们的相关翻译。
有什么办法吗?
更新:
我设法获得了更具可读性但尚未使用自定义模板进行翻译的内容 (Sonata Doc)。
{% block field %}
<div>
{% for role in object.roles %}
<strong>{{ role }}</strong> <br/>
{% endfor %}
</div>
{% endblock %}
好的,我终于设法在我的 yml 中声明了翻译。
提醒一下,我的翻译角色已在 Resources/translations/roles 中声明。fr.yml
'ROLE_PROJECT_OWNER': Porteur de projet
'ROLE_INVESTOR': Investisseur
'ROLE_USER': Utilisateur
我正在使用来自奏鸣曲 doc 的自定义模板。
所以我可以在这里做一个树枝和直接翻译:
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% trans_default_domain "roles" %}
{% block field %}
<div>
{% for role in object.roles %}
<strong>{{ role|trans }} </strong>
{% endfor %}
</div>
{% endblock %}
您还可以在您的管理员 class 中设置翻译域,例如:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('username')
->add('email')
->add('enabled', null, array('editable' => true))
->add('locked', null, array('editable' => true))
->add('roles', null, array('editable' => true), array('translation_domain' => 'roles')))
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
))
;
}
如果可行,您甚至可能不需要覆盖模板。
Sonata Admin 文档中的详细信息:http://sonata-project.org/bundles/admin/master/doc/reference/translation.html#overriding-the-translation-domain
UDPATE
要翻译过滤器,您必须执行以下操作:
如果您的角色来自实体
protected function configureDatagridFilters(DatagridMapper $filterMapper)
{
$filterMapper
->add('roles', null, array('translation_domain' => 'roles'), 'entity')
;
}
如果您的角色不是来自实体
protected function configureDatagridFilters(DatagridMapper $filterMapper)
{
// get all your availables roles
$roles = array('ROLE_OWNER' => 'ROLE_OWNER');
$filterMapper
->add('roles', 'doctrine_orm_choice', array('translation_domain' => 'roles'), 'choice', array('choices' => $roles))
;
}
我不知道在最后一种情况下翻译是否可用,您可能需要在控制器中翻译角色的值。
UDPATE 2
这是第二种情况的更详细说明,您必须创建一个方法来转换数组的值。例如:
class ChallengeManager
{
public function getStatuses($translate = false)
{
$statuses = array(
ChallengeInterface::STATUS_DRAFT => 'challenge.status.draft',
ChallengeInterface::STATUS_PUBLISHED => 'challenge.status.published',
ChallengeInterface::STATUS_PENDING => 'challenge.status.pending',
ChallengeInterface::STATUS_FINISHED => 'challenge.status.finished',
ChallengeInterface::STATUS_PUBLISHING => 'challenge.status.publishing'
);
if ($translate == true) {
$statusesTranslated = array();
foreach ($statuses as $key => $status) {
$statusesTranslated[$key] = $this->translator->transChoice($status, 0);
}
return $statusesTranslated;
}
return $statuses;
}
}
class ChallengeAdmin
{
protected configureDatagridFilters(DatagridMapper $datagridMapper)
{
$statuses = $this->getConfigurationPool()->getContainer()->get('managers.challenge_manager')->getStatuses(true);
$datagridMapper
->add('status',
'doctrine_orm_choice',
array(),
'choice',
array('choices' => $statuses))
}
}
我使用一项服务来处理翻译和检索状态,并在我的 Sonata Admin 中使用它。
目前没有找到更好的方法来翻译选择字段。
第一步更多是关于 Symfony2,
我有不同的角色:
role_hierarchy:
ROLE_INVESTOR: [ROLE_USER]
ROLE_PROJECT_OWNER: [ROLE_USER]
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN]
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, SONATA]
我想要每一个的法语翻译。
使用 roles.fr.yml、roles.fr.xml 或 roles.fr.xliff(不确定必须使用哪一个)。
这是我实际的 yml:
'ROLE_PROJECT_OWNER': Porteur de projet
'ROLE_INVESTOR': Investisseur
'ROLE_USER': Utilisateur
或 xliff :
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="" >
<body>
<trans-unit id="ROLE_PROJECT_OWNER">
<source>ROLE_PROJECT_OWNER</source>
<target>Porteur de projet</target>
</trans-unit>
</body>
</file>
</xliff>
(均未测试)
然后我想在 Sonata Admin 中展示它们,目前它根本不是用户友好的:
他们是这样 "auto" 在这部分列出的:
/**
* {@inheritdoc}
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('username')
->add('email')
->add('enabled', null, array('editable' => true))
->add('locked', null, array('editable' => true))
->add('roles', null, array('editable' => true))
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
))
;
}
所以不知道怎么加上他们的相关翻译。
有什么办法吗?
更新:
我设法获得了更具可读性但尚未使用自定义模板进行翻译的内容 (Sonata Doc)。
{% block field %}
<div>
{% for role in object.roles %}
<strong>{{ role }}</strong> <br/>
{% endfor %}
</div>
{% endblock %}
好的,我终于设法在我的 yml 中声明了翻译。
提醒一下,我的翻译角色已在 Resources/translations/roles 中声明。fr.yml
'ROLE_PROJECT_OWNER': Porteur de projet
'ROLE_INVESTOR': Investisseur
'ROLE_USER': Utilisateur
我正在使用来自奏鸣曲 doc 的自定义模板。
所以我可以在这里做一个树枝和直接翻译:
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% trans_default_domain "roles" %}
{% block field %}
<div>
{% for role in object.roles %}
<strong>{{ role|trans }} </strong>
{% endfor %}
</div>
{% endblock %}
您还可以在您的管理员 class 中设置翻译域,例如:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('username')
->add('email')
->add('enabled', null, array('editable' => true))
->add('locked', null, array('editable' => true))
->add('roles', null, array('editable' => true), array('translation_domain' => 'roles')))
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
))
;
}
如果可行,您甚至可能不需要覆盖模板。 Sonata Admin 文档中的详细信息:http://sonata-project.org/bundles/admin/master/doc/reference/translation.html#overriding-the-translation-domain
UDPATE
要翻译过滤器,您必须执行以下操作:
如果您的角色来自实体
protected function configureDatagridFilters(DatagridMapper $filterMapper)
{
$filterMapper
->add('roles', null, array('translation_domain' => 'roles'), 'entity')
;
}
如果您的角色不是来自实体
protected function configureDatagridFilters(DatagridMapper $filterMapper)
{
// get all your availables roles
$roles = array('ROLE_OWNER' => 'ROLE_OWNER');
$filterMapper
->add('roles', 'doctrine_orm_choice', array('translation_domain' => 'roles'), 'choice', array('choices' => $roles))
;
}
我不知道在最后一种情况下翻译是否可用,您可能需要在控制器中翻译角色的值。
UDPATE 2
这是第二种情况的更详细说明,您必须创建一个方法来转换数组的值。例如:
class ChallengeManager
{
public function getStatuses($translate = false)
{
$statuses = array(
ChallengeInterface::STATUS_DRAFT => 'challenge.status.draft',
ChallengeInterface::STATUS_PUBLISHED => 'challenge.status.published',
ChallengeInterface::STATUS_PENDING => 'challenge.status.pending',
ChallengeInterface::STATUS_FINISHED => 'challenge.status.finished',
ChallengeInterface::STATUS_PUBLISHING => 'challenge.status.publishing'
);
if ($translate == true) {
$statusesTranslated = array();
foreach ($statuses as $key => $status) {
$statusesTranslated[$key] = $this->translator->transChoice($status, 0);
}
return $statusesTranslated;
}
return $statuses;
}
}
class ChallengeAdmin
{
protected configureDatagridFilters(DatagridMapper $datagridMapper)
{
$statuses = $this->getConfigurationPool()->getContainer()->get('managers.challenge_manager')->getStatuses(true);
$datagridMapper
->add('status',
'doctrine_orm_choice',
array(),
'choice',
array('choices' => $statuses))
}
}
我使用一项服务来处理翻译和检索状态,并在我的 Sonata Admin 中使用它。
目前没有找到更好的方法来翻译选择字段。