模型中的字符串未翻译

时间:2013-05-07 14:08:40

标签: php cakephp internationalization cakephp-1.2 poedit

我的应用程序在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
  • Windows7 64位上的XAMPP AMP软件包

1 个答案:

答案 0 :(得分:4)

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