Строки в модели не переведены
Мое приложение имеет модель контакта в app/models/contact.php. Я использовал конструкцию _ для добавления некоторого списка в массив, значения которого должны быть переведены с помощью _ ('some text', true) следующим образом:
class Contact extends AppModel{
var $sex;
function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->sex =array(
'U' => __('Choose Sex', true),
'M' => __('Male', true),
'F' => __('Female', true)
);
}
}
Вышеупомянутая переменная $sex используется для заполнения HTML select следующим образом:
// From contacts controller index function
function index(){
$this->set('sex', $this->Contact->sex);
.....
}
// From index view index.ctp
<?php echo $form->input('sex', array('type' => 'select', 'options' => $sex)); ?>
После запуска cake i18n, перевода строк с использованием Poedit версии 1.5.5 и удаления файлов в app/tmp/cache я обнаружил, что строки в списке по-прежнему без перевода.
Как я могу решить эту проблему с помощью строк перевода в модели?
Главные примечания:
- CakePHP версия 1.2.10
- Пакет XAMPP AMP в Windows7 64 бит
1 ответ
CakePHP 1.2 не использует "отложенную загрузку", поэтому модель может быть загружена / построена до того, как вы установите язык / локаль (например, внутри вашего AppController::beforeFilter()
).
Что нужно учитывать
Это может стоить задуматься;
- Если эти строки уже должны быть переведены внутри конструктора (вы не будете использовать их все время)
- Если эти строки должны быть переведены внутри модели вообще
Особенно этот последний пункт; IMO, переводящий строки, является частью "уровня представления"; то есть принадлежит внутри представления (или помощника).
Перевести "по требованию"; в последний момент
Это также позволяет вам переключать язык без того, чтобы Модель уже перевела строки;
В вашей модели:
class Contact extends AppModel
{
protected $_sexOptions = array(
'U' => 'Choose Sex',
'M' => 'Male',
'F' => 'Female',
);
public function getSexOptions()
{
$out = array();
foreach ($this->_sexOptions as $k => $v) {
$out[$k] = __($v, true);
}
return $out;
}
}
Внутри вашего контроллера;
$this->set('sex', $this->Contact->getSexOptions());
Перевести внутри слоя "презентация"; т.е. ваш взгляд:
Создайте простой помощник, чтобы сделать его повторно используемым;
приложение / просмотров / помощники /options.php
class OptionsHelper extends AppHelper
{
/**
* translates options
*/
public function translate($options)
{
$out = array();
foreach (options as $k => $v) {
$out[$k] = __($v, true);
}
return $out;
}
}
Добавьте этот помощник в свой контроллер;
public $helpers = array(
// ... other helpers
'options',
);
Внутри вашего взгляда;
echo $this->Form->input('sex', array(
'type' => 'radio',
'options' => $this->Options->translate($sex)
));