localization - ZF2 本地化翻译器

标签 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...

}

并在 View 中执行翻译,例如:

<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,并且我无法让中文来适应不同的国家/地区代码。

有什么想法吗?如何排除问题是否出在我的命名约定、附加设置(我的模式是否错误)中,或者在调用翻译时是否需要传递更多参数?

更多调查 看看从 header 返回的内容有一个区别:

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

将打印 string(2) "zh"zh

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

将打印 string(5) "zh-tw"

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

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

最佳答案

为什么使用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')。因此,您将发回客户端无法理解的区域设置,而实际上您有一个可协商的区域设置可用。

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

关于localization - ZF2 本地化翻译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880510/

相关文章:

wordpress - 如何使用 wordpress 运行 zf2 ..?

php - 没有原始文本弹出窗口的 Bing 翻译器小部件

php - Laravel trans 辅助函数未选择正确的文件

android - 翻译Toast消息android studio

asp.net-mvc-3 - ASP.NET-MVC 3:本地化

java - 翻译 APK GPlay 中的字符串

date - 从用户的本地时间到网站上的UTC的日期/时间转换

php - Zend Framework 2 文件下载

php - 基于 accept header 的 ZF2 返回格式