spatie / nova-translatable
使Nova字段可翻译
Requires
- php: ^7.3|^8.0
- laravel/nova: ^4.0
- spatie/laravel-translatable: ^5.0|^6.0
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^5.0|^6.0|^7.0
- phpunit/phpunit: ^8.5|^9.0
README
此包包含一个Translatable
类,您可以使用它来使任何Nova字段类型可翻译。
假设您有一个fields
方法在Post
Nova资源中
public function fields(Request $request) { return [ ID::make()->sortable(), Translatable::make([ Text::make('title'), Trix::make('text'), ]), ]; }
该Post
Nova资源将被渲染成这样。
支持我们
我们在创建最好的开源包上投入了大量资源。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从您的家乡寄来明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将发布所有收到的明信片在我们的虚拟明信片墙上。
要求
此Nova字段需要特定于Nova 3和MySQL 5.7.8或更高版本。
安装
首先,您必须在您的Laravel应用程序中安装spatie/laravel-translatable。简而言之,此包将在您的表中为您的模型存储翻译,并在表中创建一个json列。除此之外,它还提供了许多方便的函数来存储和检索翻译。在使用此Nova包之前,请务必阅读laravel-translatable的整个readme。
接下来,您可以通过composer将此Nova包安装到使用Nova的Laravel应用程序中
composer require spatie/nova-translatable
使用
为了使用此包,您必须首先使用Translatable::defaultLocales()
方法让Translatable
知道您的应用程序使用哪些语言环境。您可以将此代码放在AppServiceProvider
或您自己的专用服务提供者中。
// in any service provider \Spatie\NovaTranslatable\Translatable::defaultLocales(['en', 'fr']);
接下来,您必须按照laravel-translatable的readme中的说明准备您的模型。简而言之:您必须为要翻译的每个字段在您的模型表上添加json
列。您的模型必须在您的模型上使用Spatie\Translatable\HasTranslations
。最后,您还必须在您的模型上添加一个$translatable
属性,它包含一个包含可翻译属性名称的数组。
现在,您的模型已配置为支持翻译,您可以在相关的Nova资源中使用Translatable
。任何您想要以多语言方式显示的字段都可以作为数组传递给Translatable
。
public function fields(Request $request) { return [ ID::make()->sortable(), Translatable::make([ Text::make('title'), Trix::make('text'), ]), ]; }
使翻译可搜索
应将每个翻译字段的内容分别添加到$search
数组中。
/** * The columns that should be searched. * * @var array */ public static $search = [ 'id', 'name->en', 'name->fr', ];
按可翻译项自定义语言环境
如果您有一个Nova资源,其中您想要使用与全局配置不同的语言环境,您可以在Translatable
上调用locales
方法。
Translatable::make([ Text::make('title'), Trix::make('text'), ])->locales(['de', 'es']),
这些字段现在将使用de
和es
语言环境。
自定义可翻译名称
默认情况下,可翻译字段将附加 ($locale)
到其名称。您可以通过向Translatable
上的displayLocalizedNameByDefaultUsing
提供闭包来自定义这种行为。此回调将用于渲染本地化字段名称。
Translatable::displayLocalizedNameByDefaultUsing(function(Field $field, string $locale) { return ucfirst($field->name) . " [{$locale}]"; })
这样一来,所有可翻译字段的名称都将附加 [$locale]
。
您还可以通过传递一个闭包给 displayLocalizedNameUsing
函数,为每个资源自定义本地化字段名称。
Translatable::make([ Text::make('title'), Trix::make('text'), ])->displayLocalizedNameUsing(function(Field $field, string $locale) { return ucfirst($field->name) . " --- {$locale}]"; }),
启用此功能后,本地化字段名称将附加 --- $locale
后缀。
当然,您仍然可以像往常一样自定义字段名称。
Translatable::make([ Text::make('My title', 'title'), Trix::make('text'), ])->displayLocalizedNameUsing(function(Field $field, string $locale) { return ucfirst($field->name) . " [{$locale}]"; }),
使用上面提到的代码,title
字段的名称将为 "我的标题 ['en']"。
自定义可翻译的规则
您可以使用 Nova 的常规功能来定义 Translatable 字段集合内部字段的规则。然而,这将将这些规则应用于所有区域。如果您想为每个区域定义不同的规则,可以在 Translatable 集合中这样做。
Translatable::make([ Text::make('My title', 'title'), Trix::make('text'), ])->rules([ 'title' => ['en' => 'required', 'nl' => 'nullable'], 'text' => ['en' => 'required|min:10', 'nl' => 'nullable|min:10'], ] ),
您还可以使用更流畅的 rulesFor()
方法,它允许您为每个字段和每个区域定义规则。
Translatable::make([ Text::make('My title', 'title'), Trix::make('text'), ])->rulesFor('title', 'en', 'required') ->rulesFor('title', 'nl', 'nullable'),
还有用于更新和创建规则的 creationRules()
、updateRules()
、creationRulesFor()
和 updateRulesFor()
方法。它们的功能与 rules()
和 rulesFor()
方法相同。
自定义界面
您可能会想知道为什么我们没有在选项卡、面板或旁边显示神奇独角兽的情况下渲染可翻译字段。事实是,每个人都希望翻译显示得有所不同。这就是为什么我们决定现在保持它们非常简单。
如果 Nova 能够原生地更好地结构化长表单,我们可能会在包的新主要版本中开始利用这一点。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅 变更日志。
贡献
有关详细信息,请参阅 贡献指南。
安全
如果您发现有关安全性的错误,请通过电子邮件 security@spatie.be 联系,而不是使用问题跟踪器。
鸣谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。