2010-03-25 73 views
0

从CakePHP的书(版本1.3)报价:CakePHP的,国际化功能,检索翻译记录关联模型

请注意,您直接上会被翻译做find只有模型的领域。通过关联附加的模型将不会被翻译,因为目前不支持在相关模型上触发回调。

有没有人想出了解决方案呢?

如果你不能给我一些关于以下简单情况的指针。我有2个型号:

项目,类别。
项目HABTM分类

我已经正确设置了i18n表,并且我在db中有几个条目,全部翻译了。当我检索一个项目时,它确实检索了翻译,但没有翻译的类别,因为它在cakephp书中说,通过关联附加的模型不会被翻译。

回答

0

好的我找到了解决方案。这主要是一种解决方法。我应该早点想到这一点。

我在做什么是以下内容。我正在查找所有项目并递归与项目相关的所有类别。现在,因为cakephp没有翻译类别,我正在使用初始查询的结果,而我正在为类别执行第二个类别,但使用我在第一个查询中找到的类别ID值。现在cakephp翻译类别,因为我只搜索他们,我可以将他们的数据翻译。

目前我对这个解决方案没问题,但是如果第一个cakephp使翻译行为开箱即用,或者其他人的行为可以支持在相关模型上检索翻译,那么这将会很不错。

+0

1.3中没有更好的解决方案吗? – kicaj 2011-05-21 12:47:12

+1

我不认为2.0中有更好的解决方案。这是**主要的**监督/缺点,它有效地给控制器增加了300%+额外的膨胀,而且它总是令人难以置信的烦恼,因为我一直都在使用多语言网站,几乎所有的模型都使用_Translate_行为,当然有更好的解决方案吗? – brndnmg 2011-10-28 19:25:31

3

我有另一种解决方法;我不知道这是否是任何更好或更坏效果为中心还是风格的角度来看,只知道它适合“胖模型,瘦控制器”的目标:

AppModel.php

public function getTranslatedModelField($id = 0, $field) { 

     $res = false; 

     $db = $this->getDataSource(); 
     $tmp = $db->fetchAll('SELECT content from s2h_i18n WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1', 
      array($this->alias, Configure::read('Config.language'), $id, $field) 
     );  
     if (!empty($tmp)) { 
      $res = $tmp[0]['s2h_i18n']['content']; 
     } 
     return $res; 
} 

SomeModel.php

public function afterFind($results, $primary = false) { 

     foreach ($results as $key => $val) { 
      if (isset($val['SomeOtherModel']) && isset($val['SomeOtherModel']['id'])) { 
       $results[$key]['SomeOtherModel']['name'] = 
    $this->SomeOtherModel->getTranslatedModelField($val['SomeOtherModel']['id'], 'name'); 
      } 
      // other possible queries for other models and/or fields 
     } 

     return $results; 
    } 
0

我概括了afterFind部分一点,因此它会自动抓取的字段从关联模型翻译3210阵列,并且使用相关联的模型的阵列到(可能)翻译:

public function afterFind($results, $primary = false){ 

    $modelsToTranslate = array("SomeModel", "AnotherModel"); 

    foreach ($results as $key => $val){ 
     foreach($modelsToTranslate as $mtt){ 
      if (isset($val[$mtt])){ 
       foreach($val[$mtt] as $fieldname => $fieldval){ 
        foreach ($this->$mtt->actsAs["Translate"] as $fieldToTranslate){ 
         $results[$key][$mtt][$fieldname][$fieldToTranslate] = $this->$mtt->getTranslatedModelField($val[$mtt][$fieldname]['id'], $fieldToTranslate); 
        } 
       }    
      }    
     } 
    } 
    return $results; 
} 
0

我把上述溶液和广义两个功能的位,现在需要将其与翻译行为一起使用,并且两种功能需要进入model.php - 一切都应该自己工作:

public function getTranslatedModelField($id = 0, $field) { 
    $res = false; 
    $translateTable = (isset($this->translateTable))?$this->translateTable:"i18n"; 

    $db = $this->getDataSource(); 
    $tmp = $db->fetchAll(
     "SELECT content from {$translateTable} WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1", 
     array($this->alias, Configure::read('Config.language'), $id, $field) 
    ); 
    if (!empty($tmp)) { 
     $res = $tmp[0][$translateTable]['content']; 
    } 
    return $res; 
} 

public function afterFind($results, $primary = false) { 

    if($primary == false && array_key_exists('Translate', $this->actsAs)) { 
     foreach ($results as $key => $val) { 
      if (isset($val[$this->name]) && isset($val[$this->name]['id'])) { 
       foreach($this->actsAs['Translate'] as $translationfield) { 
        $results[$key][$this->name][$translationfield] = 
        $this->getTranslatedModelField($val[$this->name]['id'], $translationfield); 
       } 
      } else if($key == 'id' && is_numeric($val)) { 
       foreach($this->actsAs['Translate'] as $translationfield) { 
        $results[$translationfield] = 
        $this->getTranslatedModelField($val, $translationfield); 
       }     
      } 
     } 
    } 

    return $results; 
}