CakePHP 2.4和Timehelper的timeAgoInWords语言环境

时间:2014-01-30 20:48:23

标签: cakephp datetime localization cakephp-2.4

最近我将CakePHP从2.3.9更新为2.4.4。据我记得(我现在无法测试)Timehelper::timeAgoInWords在旧的CakePHP中运行良好。但是在这次更新之后我遇到了语言环境问题。我将语言改为英语,但不久之前仍然使用土耳其语。

core.php我已将默认语言设为土耳其语:

Configure::write('Config.language', 'tur');

在我的视图文件中,我使用了这个:

$d = "2012-05-02 20:17:30"
$myString = $this->Time->timeAgoInWords($d, array('end' => '+10 year')); 

我得到土耳其语的结果如下:

1 yıl, 8 ay, 4 hafta önce

我想要这样的结果:

1 year, 8 months, 4 weeks ago

我的会话变量如下:

[Config] => Array
        (
            [userAgent] => 35db889a82essb4e57b540d52e8a766d
            [time] => 1391121684
            [countdown] => 10
            [language] => eng
        )

虽然我将我的语言设为英语,但结果来自土耳其语。我该如何调试/解决此问题?

修改
我检查了配置语言值。结果如下:

echo Configure::read( 'Config.language' );
result: tur

但是

echo $this->Session->read('Config.language');
result: eng

正如我在问题的顶部所述,我已在我的core.php文件中设置了Configure :: language。 core.php是否会覆盖我的会话值?

EDIT2:
奇怪的是,虽然Config.language看起来像“tur”和“eng”,但我视图文件中的其他部分效果很好。例如,这很有效:

__("string")

EDIT3: 关于此页面:http://book.cakephp.org/2.0/en/core-libraries/internationalization-and-localization.html

我补充说:

class AppController extends Controller {
    public function beforeFilter() {
        if ($this->Session->check('Config.language')) {
            Configure::write('Config.language', $this->Session->read('Config.language'));
        }
    }
}

在此更改后,配置语言的结果如下:

echo Configure::read( 'Config.language' );
result: eng

echo $this->Session->read('Config.language');
result: eng

但我仍然看到timeAgo结果土耳其语...
上周我迁移到新服务器,可能有些设置缺少英语等?我无法理解timeAgo工作时__("string")无效的原因。

Edit4:
我甚至改变了core.php

Configure::write('Config.language', 'eng');
setlocale( LC_TIME, 'en_US.utf8', 'eng', 'en', 'en_US', 'en_UK' );

似乎在我的配置中没有任何改变timeAgoInWords的语言。我在每个beforeFilter中覆盖改变Config.language是英语,但仍然是土耳其语。请注意,我的php.ini时区是这样的:

date.timezone = Europe/Istanbul

Edit5:
似乎翻译中存在问题。我检查了timeago的源代码,这里有一份副本:https://github.com/cakephp/cakephp/blob/2.4.4/lib/Cake/Utility/CakeTime.php#L738

看起来这个方法使用__d和__dn所以我在我的代码中检查了结果。 “azönce”在土耳其语中意为“刚才”。

我确信Config.language是“eng”。所以:

echo __d('cake', 'just now', 'just now'); // results: "az önce"
echo __('just now');                      // results: "just now"
echo __('az önce');                       // results: "az önce"
$days=12; 
echo __dn('cake', '%d day', '%d days', $days, $days); // results: "12 gün"
echo __('gün');                       // results: "days"

3 个答案:

答案 0 :(得分:1)

echo Configure::read( 'Config.language' );电话之前调试timeAgo 。如果您发现它不是“eng”,那么在 timeAgo被调用之后,您将语言设置为英语

如果不起作用,那么您可能还必须调用setlocale

我将此用于英语日期:

setlocale( LC_TIME, 'en_US.utf8', 'eng', 'en', 'en_US', 'en_UK' );

我想这就是征集土耳其语

setlocale(LC_TIME, 'tr_TR.UTF-8', 'tr_TR', 'tr', 'turkish');

PS:查看TimeHelper的历史记录没有任何更改会影响区域设置,但可能会更改依赖关系。

答案 1 :(得分:0)

通常我会更改当前语言:

$this->Session->write('Config.language', $lang);

我在core.php中的每个请求中都设置了这样的默认语言:

Configure::write('Config.language', 'tur');

关于CakePHP documents我必须将此代码添加到我的AppController:

class AppController extends Controller {
    public function beforeFilter() {
        if ($this->Session->check('Config.language')) {
            Configure::write('Config.language', $this->Session->read('Config.language'));
        }
    }
}

将上面的代码添加到AppController的beforeFilter()后,我刷新了/tmp/cache/persistent/文件夹,一切正常。

修改
这种解决方案适用于英语,但对其他语言不起作用 为什么?正如this question cake中所述,在您的Locale文件夹中查找cake.po个文件 例如,如果您想以法语查看cake的消息,那么您需要创建此文件:

/app/Locale/fra/LC_MESSAGES/cake.po

CakePHP在哪里使用cake.po记录? 例如:this method


您可以像这样创建默认的po文件:i18n shell tutorial
创建shell文件后,您可以编辑适合您语言的cake.po文件。


对于某些语言,cake.po文件已准备就绪。例如:french file
你可以从那里找到休息:https://github.com/cakephp/localized

答案 2 :(得分:0)

对于俄语,有必要将cake.po文件编码设置为utf-8,否则您将看到空白选项而不是翻译的月份名称。

我的解决方案是: 1.将文件cake.po放在\ app \ Locale \ rus \ LC_MESSAGES目录中并进行设置 2.在AppController文件中

public function beforeFilter()
    {
        Configure::write('Config.language', 'rus');
    }

您可以在CakePHP本地化插件https://github.com/cakephp/localized

的文件中找到您的语言的翻译文件