Zend Framework 2 - ZFCUser - 翻译登录表单

时间:2013-01-10 09:45:42

标签: php authentication zend-framework2 zfcuser

我正在使用ZFCUser,需要开发一个德国项目。

不幸的是,登录表单是英文的,我找不到将表单字段或特别是错误消息翻译成英文的方法。

模块是否可能采用全局方式覆盖消息或切换语言?

谢谢!

修改

这是我在我的引导程序中的翻译:

$translator = new Translator();
    $translator->addTranslationFile(
        'phpArray',
        'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php',
        'default',
        'de_DE'
    );
    AbstractValidator::setDefaultTranslator($translator);

编辑II:

我的自定义翻译文件:

<?php

return array(

    // ZFCUser
    "Authentication failed. Please try again." => "test"

);

我的工厂:

<?php

class CustomTranslatorFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $sl)
    {
        $translator = new Translator();
        $translator->addTranslationFile(
            'phpArray',
            'vendor/.../TranslationTable.php',
            'default',
            'de_DE'
        );
        return $translator;
    }
}

我的用户模块中的Module.php:

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'translator' => 'Path\To\Translator\CustomTranslatorFactory',
        ),
    );
}

编辑III:

My Translator看起来像这样。即使使用PHP文件而不是数组也没有任何反应。没有错误,没有翻译。我有什么想法吗?

    $custom_translations = array(
        "Authentication failed. Please try again." => "test",

    );

    $translator = new Translator();
    $translator->addTranslationFile(
        'phpArray',
        'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php',
        'default',
        'de_DE'
    );
    $translator->addTranslationFile(
        'phpArray',
        $custom_translations
    );
    return $translator;

2 个答案:

答案 0 :(得分:1)

我正在为此创建答案,因为它对于评论部分来说变得过于复杂。

验证器库可以自行转换消息。正如您已为其分配了翻译器,您的验证消息就可以了。

但是,表单标签翻译属于另一个库。因此,他们还需要分配给他们的翻译。如上面评论中所述,您可以手动(通过调用$viewHelper->setTranslator($translator))或让ViewHelperManager为您执行此操作。

您可以轻松地重构代码以支持第二种情况。

  1. 为翻译人员创建工厂类。
  2. 将该工厂注册到SM。使用“翻译”键。
  3. 如果您需要,请在将来通过SM检索$translation var。
  4. 示例(跳过use):

    /** One of your modules, should be a base module that's always loaded */
    class Module
    {
    
        // ...
    
        public function getServiceConfig()
        {
            return array(
                'factories' => array(
                    'translator' => 'Your\Translator\Factory', // could also be a closure (anonymous function)
                )
            );
        }
    }
    

    -

    class YourTranslatorFactory implements FactoryInterface
    {
        public function createService(ServiceLocatorInterface $sl)
        {
            $translator = new Translator();
            $translator->addTranslationFile(
                'phpArray',
                'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php',
                'default',
                'de_DE'
            );
            return $translator;
        }
    }
    

    如果您需要访问它,simpyl会像您习惯的那样从SM中检索它($translator = $sm->get('translator');)。

    注意:验证者实现TranslatorAwareInterface。这意味着,如果您已将translator密钥注册到SM,则它们也应自动注入验证器。因此,您甚至可以跳过静态方法调用。

    另请注意:这只是一个如何在不做太多改变的情况下做到这一点的示例。您也可以通过配置实现此目标。

答案 1 :(得分:1)

仅供您参考 - 从昨天起,可以使用模块化de_DE翻译(pl_PL和ja_JP也可用)。它仅涵盖ZfcUser条消息,因此不是所有验证方,而是表单标签等。https://github.com/websafe/zf-mod-zfc-user-i18n-de-de易于安装,也可通过Packagist提供。