2016-07-26 106 views
1

我只需使用_t()即可翻譯DataObject中的CMS字段:TextField::create('Title', _t('cms.TitleField', 'Title'));。我認爲翻譯$summary_fields同樣簡單,但事實並非如此。SilverStripe翻譯字段標籤

與其單獨嘗試翻譯字段及其伴隨的摘要字段,我相信我注意到使用SiteTree中使用的函數FieldLabels來翻譯這些字段的更好方法。

是否有辦法在一個地方翻譯這兩個字段(DRY原則),並通過調用var來輕鬆應用這兩個字段?

回答

1

是的,我肯定會說使用FieldLabels是因爲評論的本地化/翻譯「本地化字段(如果可能)」 here在數據對象代碼...

public function summaryFields() { 
    $fields = $this->stat('summary_fields'); 

    // if fields were passed in numeric array, 
    // convert to an associative array 
    if($fields && array_key_exists(0, $fields)) { 
     $fields = array_combine(array_values($fields), array_values($fields)); 
    } 

    if (!$fields) { 
     $fields = array(); 
     // try to scaffold a couple of usual suspects 
     if ($this->hasField('Name')) $fields['Name'] = 'Name'; 
     if ($this->hasDatabaseField('Title')) $fields['Title'] = 'Title'; 
     if ($this->hasField('Description')) $fields['Description'] = 'Description'; 
     if ($this->hasField('FirstName')) $fields['FirstName'] = 'First Name'; 
    } 
    $this->extend("updateSummaryFields", $fields); 

    // Final fail-over, just list ID field 
    if(!$fields) $fields['ID'] = 'ID'; 

    // Localize fields (if possible) 
    foreach($this->fieldLabels(false) as $name => $label) { 
     // only attempt to localize if the label definition is the same as the field name. 
     // this will preserve any custom labels set in the summary_fields configuration 
     if(isset($fields[$name]) && $name === $fields[$name]) { 
      $fields[$name] = $label; 
     } 
    } 

    return $fields; 
} 
+0

多麼有趣的發現。我將花費下一小時重新編碼我在我的cms中命名所有字段名的方式。 – Faloude

+0

我將在自定義的PageType中定義一個'public function fieldLabels()',當填充'summary_fields'時,DataObject類會自動選擇它? – Faloude

+0

函數fieldLabels正在尋找靜態field_labels來獲取這些信息,我不會創建該函數 – Barry