2014-01-30 43 views
0

最近我將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" 

回答

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')); 
     } 
    } 
} 

將代碼abov e到AppController的beforeFilter(),我刷新/tmp/cache/persistent/文件夾,一切正常。

編輯:
該解決方案行之有效的英語,但它並沒有爲其他語言。
爲什麼?如this question中所述,蛋糕在您的Locale文件夾內查找cake.po文件。
例如,如果你想看到在法國蛋糕的消息,因此你需要創建這個文件:

/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

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的歷史記錄,沒有更改爲af對區域設置有影響,但可能會改變依賴關係。

+0

謝謝伊利,就在時間之前我檢查了Config.language。我得到英文和土耳其文。我將結果添加到問題的結尾。 – trante

+1

好的,在你的過濾器之前,用下面的代碼替換你的代碼:'Configure :: write('Config.language','eng')'強制英語在每個地方並檢查timeAgo()的行爲。如果它有效,那麼在你的代碼中的某處你將切換到土耳其語。 –

+0

我向控制器的beforeFilters添加了'Configure :: write('Config.language','eng')'。我甚至在我的視圖文件中的'timeAgoInWords'行之前寫了它。當我檢查時,我可以看到Config.language設置爲「eng」。 – trante

0

對於俄語它`必要cake.po文件的編碼設置爲UTF-8,否則你會看到空白的選項,而不是翻譯月份名稱。

我的解決辦法是: 1.將文件cake.po在\程序\區域\ RUS \ LC_MESSAGES目錄,並設置 2. AppController的文件

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

翻譯文件爲你的語言,你可以找到在CakePHP本地化插件的文件https://github.com/cakephp/localized