0

我的应用程序在 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 选择,如下所示:

// 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 包
4

1 回答 1

4

CakePHP 1.2 不使用“延迟加载”,因此可以在您设置语言/区域设置之前加载/构造模型(例如,在您的AppController::beforeFilter().

需要考虑的事项

可能值得考虑;

  • 如果这些字符串应该已经在构造函数中被翻译(你不会一直使用它们)
  • 如果这些字符串应该在模型内部进行翻译

尤其是最后一点;IMO 翻译字符串是“表示层”的一部分;即属于View(或Helper)。

翻译“按需”;在最后一刻

这也允许您切换语言,而无需模型已经翻译了字符串;

在您的模型中:

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

在“表示”层内翻译;即你的观点:

创建一个简单的助手以使其可重用;

app/views/helpers/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)
));
于 2013-05-07T15:16:07.020 回答