Недавно я обновил 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
Как я уже отметил в начале своего вопроса, я уже установил Configure::language внутри своего файла core.php
. 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"