【问题标题】:ZF2 Localization TranslatorZF2 本地化翻译器
【发布时间】:2013-09-18 19:17:17
【问题描述】:

我遵循此处指定的翻译方法: 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'])

【问题讨论】:

    标签: localization zend-framework2 language-translation


    【解决方案1】:

    你为什么使用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”。A客户端使用 Accept-Language 'nl-NL' 和 'en-US' 发出请求。您的代码将检查不支持的 'nl-NL',并使用后备 'fr-FR'。但是,第二好的您的应用程序支持来自客户端的选项(“en-US”)。因此,您发送回客户端无法理解的语言环境,而实际上您有一个可协商的语言环境。

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

    【讨论】:

    • +1 用于解释 acceptFromHttp() 部分。我假设要考虑的另一个模块;)
    • 这是一个完美的答案!感谢您的信息。额外的模块超出了我的需要,因为我们只有非常特定数量的翻译可用,所以回到英语是可以的。我不希望有人首选简体中文而不是希望荷兰语作为下一个选择。我们支持的语言没有很多变体,除了中文。
    • 哦,对于您的第一个问题,->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 是示例文档中的写法,这就是我是参考。它一直有效,直到您获得区域变体。
    • 我的浏览器发送的是 nl 而不是 nl_NL,所以这不适用于 2 种字符语言。
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多