0

我正在寻找有关在 Zend 2 中处理本地化的首选方法的教程,但到目前为止我还没有找到任何教程。我能找到的最好的是这个页面,它没有详细解释实现本地化(特别是应用程序消息)的实际过程,或者这个问题,它在 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

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

4

1 回答 1

5

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

这是我的设置方式:

在您的模块文件夹中创建另一个名为“语言”的文件夹。

打开你的 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 示例中所示的那样使用文本域,那么默认情况下,所有翻译都将使用“默认”文本域。所以你可以这样做:

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

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

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

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

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

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

让我知道这是否有帮助或我是否遗漏了什么。

于 2013-03-02T20:43:43.190 回答