2010-03-25 75 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; 
}