2014-01-30 2 views
0

Недавно я обновил CakePHP с 2.3.9 по 2.4.4. Насколько я помню (я не могу проверить сейчас) Timehelper::timeAgoInWords хорошо работал в старом CakePHP. Но после этого обновления я получаю локальную проблему. Я меняю язык на английский, но время назад все еще приходит на турецкий язык.CakePHP 2.4 и Timehelper's timeAgoInWords locale

В 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 
     ) 

Хотя я установил мой язык, как английский, результат АМСВО на турецком языке. Как я могу отладить/исправить это?

Редактировать:
Я проверил значения Configure-language. Результаты, как это:

echo Configure::read('Config.language'); 
result: tur 

Но

echo $this->Session->read('Config.language'); 
result: eng 

Как я уже отмечал в верхней части моего вопроса, я уже выставиться Настройка :: язык внутри моего core.php файла. core.php переопределяет значение моего сеанса?

Edit2:
И странное дело, хотя config.language выглядит как «TUR» и «рус», другие части внутри моего файла вида работает хорошо. Например, это хорошо работает:

__("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 «s. Я переопределяю в каждом 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 до beforeFilter() AppController, я обновил папку /tmp/cache/persistent/ и все работает нормально.

Edit:
Это решение хорошо работает для английского языка, но он не работает на других языках.
Почему? Как отмечено в this question торт ищет файлы cake.po внутри вашей папки Locale.
Например, если вы хотите увидеть сообщения торта на французском, так что вам нужно создать этот файл:

/app/Locale/fra/LC_MESSAGES/cake.po 

Где CakePHP использовать cake.po записи? Например: this method


Вы можете создать стандартные файлы Ро как это: i18n shell tutorial
После создания файла оболочки, вы можете редактировать файл 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 fect locale, но может быть изменена зависимость.

+0

Спасибо, Или, незадолго до этого времени. Я проверил для Config.language. Я получаю как английский, так и турецкий. Я добавил результаты к концу вопроса. – trante

+1

ОК, в вашем перед фильтре замените свой код просто следующим образом: 'Configure :: write ('Config.language', 'eng')', чтобы принудительно вывести английский язык и проверить, как ведет себя timeAgo(). Если это работает, то где-то в вашем коде вы переходите на турецкий язык. –

+0

Я добавил 'Configure :: write ('Config.language', 'eng')' to beforeFilters контроллеров. Я даже написал это непосредственно перед строкой 'timeAgoInWords' внутри моих файлов вида. Когда я проверяю, я вижу, что Config.language установлен на «eng». – trante

0

Для русского языка `s необходимо установить cake.po кодировку файла UTF-8, или вы будете видеть пустые варианты вместо переведенных названий месяцев.

Мое решение: 1. Поместите файл cake.po в \ приложение \ Locale \ рус \ LC_MESSAGES каталог и установить 2. в AppController файл

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

Translation файл для языка, который вы можете найти в файлы CakePHP Локализованный плагин https://github.com/cakephp/localized

 Смежные вопросы

  • Нет связанных вопросов^_^