【发布时间】:2020-02-13 20:29:53
【问题描述】:
我们正在开发一个项目,使用 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;
}
}
然后我们在 YML 文件中设置 Title 为可翻译:
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 中访问区域设置数据的正确方法是什么,以便在需要时进行回退?
【问题讨论】:
-
全局后备语言环境是否适合您?见github.com/tractorcow-farm/silverstripe-fluent/blob/master/docs/…如果太笼统,可以通过“withState”调用对象,见github.com/tractorcow-farm/silverstripe-fluent/blob/master/docs/…
-
@wmk - 调用对象“withState”有效。如果您想将其放入答案中,我可以将其标记为正确:
$milkshake = FluentState::singleton()->withState(function (FluentState $state) { return Milkshake::get()->first(); });
标签: silverstripe silverstripe-4