最近我将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 的文件中找到您的语言的翻译文件