Zend 2中首选的本地化方法是什么?

时间:2013-03-01 19:30:25

标签: localization zend-framework2

我正在寻找关于在Zend 2中处理本地化的首选方法的教程,但到目前为止我还没有找到任何方法。我能找到的最好的是this page,它没有详细解释实现本地化(特别是应用程序消息)的实际过程,或者this question,这是在Zend 2发布之前提出的,并且是现在已经过时了。

如果在该页面上给出了选择,请说我选择GNU Gettext作为翻译格式。在这种情况下是否有关于本地化ZF2应用程序的教程?

或者说,我将网站上的页面文本存储在数据库表中,例如

CREATE TABLE `page` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `body` blob,
  `locale` int(11) NOT NULL,
  `creator` int(11) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `pagecreatorfk_idx` (`creator`),
CONSTRAINT `pagecreatorfk` FOREIGN KEY (`creator`)
REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

那么如何提供本地化消息?

1 个答案:

答案 0 :(得分:5)

好的,对于初学者,您需要一个翻译程序,例如http://www.poedit.net/

以下是我的设置:

在Module文件夹中,创建另一个名为“language”的文件夹。

打开你的module.config.php并添加以下内容:

'translator' => array(
    'translation_file_patterns' => array(
        array(
            'type'        => 'gettext',
            'base_dir'    => __DIR__ . '/../language',
            'pattern'     => '%s.mo',
            'text_domain' => 'account'
        )
    )
)

让我感到轻松的是创建一个language.php文件并添加如下行:

echo _('text_to_translate_here');

配置PoEdit时,您将扫描此文件,该文件会将翻译ID添加到PoEdit。现在您可以添加要显示的真实文本,保存后它将输出2个文件,如account.mo和account.po。您需要上传到语言文件夹的唯一文件是account.mo

由于我在我的应用程序中使用翻译,因此我将工厂添加到我的global.php文件中:

return array(
    'service_manager' => array(
        'factories' => array(
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
        )
    )
);

在我的view.phtml文件中,我现在可以翻译:

<?php echo $this->translate('text_to_translate_here', 'account'); ?>

现在,如果您不想使用我在module.config.php示例中显示的textdomains,则默认情况下所有翻译都将使用“default”textdomain。所以你可以这样做:

<?php echo $this->translate('text_to_translate_here'); ?>

这也适用于FormLabel :(这将输出Priroity作为标签名称)

<?php echo $this->formLabel($this->form->get('prio')); ?>

如果您想使用“默认”以外的文本域翻译Form对象,则可以将其添加到view.phtml

$this->formSubmit()->setTranslatorTextDomain('account');

现在,您提交的FormLabel将使用该textdomain而不是默认的textdomain。任何其他类型的表单对象也是如此。只需将formSubmit替换为元素类型。

请告诉我这是否有所帮助,或者我是否遗漏了什么。