2016-07-26 6 views
1

私は単に_t()を使用して、DataObjectのCMSフィールドを翻訳します:TextField::create('Title', _t('cms.TitleField', 'Title'));。私は$summary_fieldsと同じように翻訳されたと思ったが、単純ではなかった。SilverStripe translate fieldlabels

の代わりに別々のフィールドとそれに付随するsummary_fieldsを翻訳しようと、私はこれらのフィールドはSiteTreeに使用されるような機能FieldLabelsを使用して変換する方法より良い方法に気づいたと信じています。

これらの両方のフィールドを1つの場所(DRYの原則)に変換して両方に簡単に適用できる方法はありますか?

答えて

1

はい、私は確かにFieldLabelsの使用が原因で、コメントのローカリゼーション/翻訳のためであると言うでしょう「ローカライズフィールド(可能な場合)」のDataObjectコードで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()'を定義しようとしていますが、DataObjectクラスは 'summary_fields'を設定するときにこれを自動的に選択しますか? – Faloude

+0

関数fieldLabelsは静的field_labelsを検索してこの情報を取得していますが、その関数は作成しません – Barry