【问题标题】:Strings in model are not translated模型中的字符串未翻译
【发布时间】:2013-05-01 12:44:28
【问题描述】:

我的应用程序在 app/models/contact.php 中有联系人模型。我已经使用 _construct 在数组中添加了一些列表,其值应该使用 _('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 包

【问题讨论】:

  • 对于这样的枚举,我建议使用类常量 - 以及像 dereuromark.de/2010/06/24/… 这样的方法你也可以使用这个枚举来烘焙你的文件,比如支持。但是你的代码本身对我来说看起来不错。如果对象被构造,它应该翻译这些字符串。 PS:顺便推荐升级到2.x。
  • @mark 很遗憾,目前无法升级。

标签: php cakephp internationalization cakephp-1.2 poedit


【解决方案1】:

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

【讨论】:

  • 非常感谢,我使用了依赖模型的解决方案,取消了构造函数的工作,get方法工作得很好。
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 2015-12-13
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多