1

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

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

模块是否有一种全局方式来覆盖消息或切换语言?

谢谢!

编辑:

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

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

编辑二:

我的自定义翻译文件:

<?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',
        ),
    );
}

编辑三:

我的翻译器看起来像这样。即使使用 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;
4

2 回答 2

1

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

验证器库自己翻译消息。当您为它分配了翻译器时,您的验证消息就可以了。

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

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

  1. 为您的翻译器创建一个工厂类。
  2. 将该工厂注册到 SM。使用“翻译”键。
  3. 如果您需要它,$translation将来通过 SM 检索您的 var。

示例(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;
    }
}

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

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

另请注意:这只是一个示例,说明如何在不进行太多更改的情况下做到这一点。你也可以通过配置来达到这个目标。

于 2013-01-10T10:41:18.393 回答
1

仅供您参考——从昨天开始就有一个模块化的 de_DE 翻译可用(pl_PL 和 ja_JP 也可用)。它仅涵盖ZfcUser消息,因此并非所有验证器,而是表单标签等。https://github.com/websafe/zf-mod-zfc-user-i18n-de-de易于安装,也可通过 Packagist 获得。

于 2013-11-12T15:39:52.203 回答