我们正在使用Silverstripe和Fluent module来启用多个翻译的项目。
这里是启用Fluent的示例数据对象。首先,我们创建数据对象并显式设置CMS字段:
namespace Yard;
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
class Milkshake extends DataObject {
private static $table_name = 'Milkshake';
private static $db = [
'Title' => 'Varchar(255)'
]
public function getCMSFields() {
$fields = new FieldList(
new TextField('Title', 'Milkshake Title', null, 255)
);
$this->extend('updateCMSFields', $fields);
return $fields;
}
}
然后我们将Title
设置为可在YML文件中翻译:
Yard\Milkshake:
extensions:
- 'TractorCow\Fluent\Extension\FluentExtension'
translate:
- 'Title'
这为我们提供了一个具有可翻译Title
字段的对象,该字段在不同的区域可以具有不同的值。它创建以下数据库表:
Milkshake_Localized
ID | RecordID | Locale | Title
到目前为止很好,除了使用:
[$milkshake = Milkshake::get()->first()
不返回本地化数据并从Milkshake
表中提取。
我认为可以使用:
$locale= FluentState::singleton()->getLocale();
$milkshake = Milkshake_Localised::get()->filter(['Locale' => $locale])->first();
但是,如果该字段的语言环境数据不存在,这会显得很笨拙,并且没有回退(这时,它应该回退到默认语言环境,否则将失败为原始的Milkshake
字段。
在Fluent中访问语言环境数据的正确方法是什么,如果需要的话会有一个后备方法?
我通过将get命令包装在“ withState”中来获得所需的行为
use TractorCow\Fluent\State\FluentState;
$milkshake = FluentState::singleton()->withState(function (FluentState $state) {
return Milkshake::get()->first();
});