翻译不适用于ZF2

时间:2014-01-17 12:54:27

标签: php internationalization zend-framework2

感谢您抽出时间帮助我。

我一直在关注本教程:

http://samminds.com/2012/09/zend-framework-2-translate-i18n-locale/

http://samminds.com/2012/09/create-po-language-files-using-poedit/

我认为我已经遵循了所有步骤,但翻译机制无效。

INLT扩展已在系统上安装并处于活动状态。

在模块配置中,我添加了:

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

并在Module.php内添加了一行来定义翻译方法。

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator
        ->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        ->setFallbackLocale('fr_FR');

    ...
    ...

我已成功创建了po和mo文件,并在正确的位置上传到服务器。

vmamp@AMP30:/users/p0100/web/module/Application/language> ls -l
total 20
-rw-r--r-- 1 vmamp users 2652 Jan 16 23:46 es_ES.mo
-rw-r--r-- 1 vmamp users 4582 Jan 16 23:46 es_ES.po

例如,这是可能发生翻译的视图之一的片段:

            <li class="moteur"><?php echo $this->translate('Moteur')?></li>
            <li class="couleur"><?php echo $this->translate('Couleur')?></li>
            <?php if (count($this->universeData['garnissage']) > 1):?>
            <li class="selle"><?php echo $this->translate('Selle')?></li>
            <?php endif;?>
            <?php if (count($this->universeData['jonc']) > 1):?>
            <li class="jonc"><?php echo $this->translate('Jonc')?></li>
            <?php endif;?>
            <?php if (count($this->universeData['retros']) > 1):?>
            <li class="retros"><?php echo $this->translate('Retros')?></li>
            <?php endif;?>
            <?php if (count($this->universeData['signature']) > 1):?>
            <li class="signature"><?php echo $this->translate('Signature')?></li>
            <?php endif;?>
            <li class="rangement"><?php echo $this->translate('Rangement')?></li>
            <li class="confort"><?php echo $this->translate('Confort')?></li>
            <li class="perso"><?php echo $this->translate('Perso')?></li>

这是.po文件(es_ES.po)

内容的一部分
msgid "Couleur"
msgstr "Color"

#: view/application/application/configure.phtml:56
msgid "Selle"
msgstr "Asiento"

#: view/application/application/configure.phtml:59
msgid "Jonc"
msgstr "Embellecedores"

#: view/application/application/configure.phtml:62
msgid "Retros"
msgstr "Retrovisores"

#: view/application/application/configure.phtml:65
msgid "Signature"
msgstr "Luminosidad"

#: view/application/application/configure.phtml:67
msgid "Rangement"
msgstr "Orden"

#: view/application/application/configure.phtml:68
msgid "Confort"
msgstr "Confort"

我检查$ _SERVER ['HTTP_ACCEPT_LANGUAGE']返回的是什么:

es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3

所以我假设字符串可能会被翻译成西班牙语,但他们却没有。由于翻译文件被命名为es_ES,并且我看到HTTP_ACCEPT_LANGUAGE将密钥作为es-ES返回,我尝试将它们重命名为es-ES,但这并没有解决问题。

考虑编码问题我已经检查了文件的字符集,并且它们在utf8上,因为我将它们设置在相应的元标记上,以及它也是我为charset为charset和source charset选择的字符集的编码。

vmamp@AMP30:/users/p0100/web/module/Application/language> file -i es_ES.po
es_ES.po: text/x-po charset=utf-8

顺便说一句,当我从服务器端显示文件时,我很欣赏字符集错误(如果我从我的地方编辑它,例如使用记事本+,特殊字符是正确的编码)。为什么我遇到这个问题,我该如何解决?

无论如何,我已经在这里展示了那些没有特殊字符的字符串,如果我能正确实现这个过程,我想它们可能会很好地翻译,但似乎我错过了一些东西......

这个领域有经验的人吗?

应用程序行为就像没有添加转换机制一样,没有任何错误。

提前感谢您的时间和精力。

最诚挚的问候。

修改

我需要将文本域添加到翻译行:

<?php echo $this->translate('Moteur', 'Application')?>

添加后,翻译工作正常。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。也许我的解决方案也可以帮到你。

在module.config.php中我有:

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

确保你必须创建* .mo文件(你已经展示过了。我写这篇文章是为了帮助别人。)我在一个教程中读到,你应该在保存poedit时禁用自动创建mo文件。原来我根本没有任何mo文件。 我的代码中的第二个错误如下。我建立了一个测试页面来显示调试消息。在这里,您可以输出使用的区域设置。所以你可以看看你是否拿到了正确的。在底部,我添加了一个小的翻译测试,看看它是否按预期工作:

<?php
    echo "<br /><h1>DEBUG</h1><br />";
    echo "Translator-Textdomain: " . $this->formLabel()->getTranslatorTextDomain() . "<br />";
    echo "Translator-Locale: " . $this->formLabel()->getTranslator()->getLocale() . "<br />";
    echo "Translator->FallbackLocale: " . $this->formLabel()->getTranslator()->getFallbackLocale() . "<br />";
    echo "Translate-Test: Password -> ". $this->translate('Password');
?>

毋庸置疑,它没有用。我搜索了两天的错误。你看到错误吗?我忘记将__NAMESPACE__放在要翻译的文本之后。正确的应该是:

<?php
    echo "<br /><h1>DEBUG</h1><br />";
    echo "Translator-Textdomain: " . $this->formLabel()->getTranslatorTextDomain() . "<br />";
    echo "Translator-Locale: " . $this->formLabel()->getTranslator()->getLocale() . "<br />";
    echo "Translator->FallbackLocale: " . $this->formLabel()->getTranslator()->getFallbackLocale() . "<br />";
    echo "Translate-Test: Password -> ". $this->translate('Password', __NAMESPACE__);
?>

经过这些改变后,它对我有用。

希望有所帮助, 亚历