ZF2本地化翻译器

时间:2013-09-18 19:17:17

标签: localization zend-framework2 language-translation

我正在按照此处指定的翻译方法进行操作: http://framework.zend.com/manual/2.2/en/modules/zend.i18n.translating.html#setting-a-locale

因为我的大多数字符串已经存在于数据库中而且我不想将它们传输到POEdit,所以我生成了一堆PHP数组文件,如en_US.php,de_DE.php等。

在module / Application / config / module.config.php中,模式定义为:

        array(
            'type'     => 'phparray',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.php',
        ),

在module / Applicaation / Module.php中设置这样的翻译器:

   public function onBootstrap($e)
   {
    // ...snip...

   $sm = $e->getApplication()->getServiceManager();
   $sm->get('translator')
       ->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']))
       ->setFallbackLocale('en_US');

    // ...snip...

}

在视图中执行转换,如:

<th><?= $this->translate('Date Created'); ?></th>

一切正常,除了......传统和简体中文。如果我正确地阅读文档,那么应该为使用简体中文作为设置的用户选择zh_CN.php,并且应该为具有繁体中文的用户选择zh_HK。但它不起作用。它只会拿起zh.php而我会失去我的变化。

我在Mac上,所以要测试,我只是更改系统首选项并重新启动浏览器。我所有的西方语言(en_US.php,fr_FR.php,it_IT.php,nl_NL.php等)都按预期工作。但是,对于日语,我不得不将我的文件命名为ja.php,而且我不能使用中文来容纳不同的国家代码。

有什么想法吗?我如何排除问题是否在我的命名约定中,另外一个设置(我的模式是错误的)还是在调用translate时需要传递更多参数?

更多调查  查看从标题返回的内容有所不同:

 $locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
 var_dump($locale);

将打印字符串(2)“zh”zh

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

将打印字符串(5)“zh-tw”

所以也许我应该使用下面的内容,但它绝对不是文档中指定的内容

        ->setLocale($_SERVER['HTTP_ACCEPT_LANGUAGE'])

1 个答案:

答案 0 :(得分:2)

您为什么使用Locale::acceptFromHttp()?您可以使用ZF2请求对象轻松编写自己的解析器。

$headers = $request->getHeaders();
if ($headers->has('Accept-Language')) {
    $locales = $headers->get('Accept-Language')->getPrioritized();
    $first   = array_shift($locales);

    // "language" here is the full locale, though it's quite confusing :s
    return $first->getLanguage();
}

还有其他人在抱怨acceptFromHttp()的魔力以及这部分中明显的错误。

请注意,检查此代码(以及使用acceptFromHttp())并不会寻找备用替代方案。假设您的应用程序默认为“fr-FR”而您支持“fr-FR”和“en-US”客户端使用Accept-Language'nl-NL'和'en-US'发出请求。您的代码将检查不支持的'nl-NL',并使用后备'fr-FR'。但是,您的应用程序支持来自客户端的第二个最佳选项('en-US')。因此,您发送的是客户端无法理解的区域设置,而您实际上可以使用可协商的区域设置。

NB。您可以使用SlmLocale为ZF2通过回退和区域设置协商自动检测区域设置。语言环境设置为php的Locale对象setDefault(),因此翻译人员等会自动选择此语言环境。 免责声明我写了那个库:)