最近我將CakePHP從2.3.9更新到2.4.4。據我記得(我現在不能測試)Timehelper::timeAgoInWords
在舊的CakePHP中運行良好。但是在更新之後,我遇到了locale問題。我改變語言爲英語,但時間仍然是土耳其語。CakePHP 2.4和Timehelper的timeAgoInWords區域設置
在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看起來既「圖爾」和「工程」,我認爲文件中其他部分效果很好。例如,這工作得很好:
__("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"
謝謝伊利,就在時間之前我檢查了Config.language。我得到英文和土耳其文。我將結果添加到問題的結尾。 – trante
好的,在你的過濾器之前,用下面的代碼替換你的代碼:'Configure :: write('Config.language','eng')'強制英語在每個地方並檢查timeAgo()的行爲。如果它有效,那麼在你的代碼中的某處你將切換到土耳其語。 –
我向控制器的beforeFilters添加了'Configure :: write('Config.language','eng')'。我甚至在我的視圖文件中的'timeAgoInWords'行之前寫了它。當我檢查時,我可以看到Config.language設置爲「eng」。 – trante