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