php - Symfony2,奏鸣曲 : translate and show translated roles name

标签 php symfony sonata-admin sonata

第一步更多的是关于 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 中展示它们,因为现在它根本不是用户友好的:

Roles

这就是它们在这部分中“自动”列出的方式:

/**
 * {@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 %}

最佳答案

您还可以在 Admin 类中设置翻译域,例如:

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

更新

要翻译过滤器,您必须执行以下操作:

如果您的角色来自实体

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))
    ;
}

我不知道在最后一种情况下翻译是否可用,您可能需要在 Controller 中翻译角色的值。

文档中的详细信息:http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html

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 中使用它。

目前没有找到更好的方法来翻译选择字段。

关于php - Symfony2,奏鸣曲 : translate and show translated roles name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29094821/

相关文章:

javascript - 如何在不刷新的情况下显示php传递的结果给ajax

php - 使用 PHP fopen 和/或 cURL 下载外部文件

javascript - div 中两个变量的总和

php - Symfony2 : PHPUnit How to use 'OR' condition in an assertion?

symfony - Sonata Admin 中的自定义批处理操作

select - Symfony2 : Sonata Admin: Chained selectors, 奏鸣曲_type_model_reference

symfony - SonataAdminBundle 自定义组图标

php - 将 XML 存储在数据库中以获得灵活的内容

php - 我需要将数据库中的数据显示到下拉模式 CodeIgniter

forms - 如何为我自己的类型设置我自己的表单表示