【问题标题】:Symfony2, Sonata : translate and show translated roles nameSymfony2,奏鸣曲:翻译并显示翻译后的角色名称
【发布时间】:2015-05-19 15:06:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: php symfony sonata-admin sonata


    【解决方案1】:

    您还可以在 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

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

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

    来自文档的详细信息: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 中使用它。

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

    【讨论】:

    • 听起来很完美,我仍然会使用模板,因为我需要添加一些样式。但我想将它用于过滤器部分。你知道它是否以同样的方式工作吗?基本上我需要用户使用翻译后的角色名称搜索用户并使用 ROLE_XXXXX 进行注释。
    • 在这种情况下您必须使用选择类型,您的翻译值将显示给您的用户,每个选项的值字段将为 ROLE_XXXX
    • 好的,这就是我现在要做的。这似乎很容易做到,但我什至无法在 $filterMapper 上添加选择类型。
    • 谢谢你这确实有效(除了第二种方法的翻译,但这对那部分来说应该很容易),我可以选择。但是使用该方法没有找到结果。我很确定这是要走的路。我会继续挖掘它。
    • 我添加了更多关于如何使用教义_orm_choice 进行翻译的详细信息,这不是最漂亮的方式,但这是我找到的唯一方式。
    【解决方案2】:

    好的,我终于设法在我的 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 %}
    

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      相关资源
      最近更新 更多