Строки в модели не переведены

Мое приложение имеет модель контакта в 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)
));
Другие вопросы по тегам