CakePHP 2.4 和 Timehelper's timeAgoInWords locale



最近我将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文件中设置了配置::语言。core.php会覆盖我的会话值吗?

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

__("string")

编辑3:关于本页: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不起作用而__("string")工作。

编辑4:
我什至像这样更改core.php

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

似乎,在我的配置中,没有什么改变timeAgoInWords的语言。我覆盖了之前的每一个过滤器,将 Config.language 更改为英语,但单词仍然是土耳其语。请注意,在我的php.ini时区是这样的:

date.timezone = Europe/Istanbul

编辑5:
翻译好像有问题。我检查了很久以前的源代码,这里有一个副本: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"

timeAgo调用之前调试echo Configure::read( 'Config.language' );。如果您发现它不是"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:查看时间助手的历史记录,没有任何更改来影响区域设置,但是可能更改了依赖项。

通常我会像这样更改当前语言:

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

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

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

关于 CakePHP 文档,我必须将此代码添加到我的 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/文件夹,一切正常。

编辑:
此解决方案适用于英语,但不适用于其他语言。
为什么?如此问题中所述,蛋糕在区域设置文件夹中查找cake.po文件。
例如,如果您想查看法语的蛋糕消息,则需要创建此文件:

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

CakePHP 在哪里使用 cake.po 记录? 例如:此方法


您可以像这样创建默认的 po 文件: i18n 外壳教程
创建 shell 的文件后,您可以编辑您的语言的 cake.po 文件。


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

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

我的解决方案是: 1. 将文件 cake.po 放在 \app\Locale\rus\LC_MESSAGES 目录中并设置 2. 在应用程序控制器文件中

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

您可以在CakePHP本地化插件 https://github.com/cakephp/localized 的文件中找到您的语言的翻译文件

最新更新