演示
一、安装拓展包outerweb/filament-translatable-fields
shell
composer require outerweb/filament-translatable-fields
配置模型
该套件包含一个名为 HasTranslations 的特性,用于使 Eloquent 模型具备多语言功能。翻译值以 JSON 格式存储,并不需要额外的表来保存这些翻译。
php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Spatie\Translatable\HasTranslations;
class Article extends Model
{
use HasFactory,HasTranslations;
protected $casts = [
'id' => 'integer',
'category_id' => 'integer',
];
//数据库中 相关字段需要配置 json 或者 text 数据类型
public array $translatable = ['title','desc','content'];
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
}
- 将插件添加到所需的 Filament 面板中
php
use Outerweb\FilamentTranslatableFields\Filament\Plugins\FilamentTranslatableFieldsPlugin;
class FilamentPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugins([
FilamentTranslatableFieldsPlugin::make(),
]);
}
}
- 您可以设置指定支持的区域:
php
use Outerweb\FilamentTranslatableFields\Filament\Plugins\FilamentTranslatableFieldsPlugin;
class FilamentPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugins([
FilamentTranslatableFieldsPlugin::make()
->supportedLocales([
'zh_CN' => '中文',
'en' => 'English',
]),
]);
}
}
- 默认情况下,如果未指定 locales,那么软件包将使用 app.locale 中的默认配置
- 用法
你可以将
->translatable()
添加到任何你想翻译的字段。
php
use Filament\Forms\Components\TextInput;
TextInput::make('title')
->label('标题')
->translatable(),
- 动态禁用翻译
如果要动态禁用翻译,可以将
->translatable()
函数的第一个参数设置为true
或false
。
php
use Filament\Forms\Components\TextInput;
TextInput::make('title')
->label('标题')
->translatable(false),
- 覆盖区域设置
如果要覆盖特定字段上的区域设置,可以通过
->translatable()
函数的第二个参数来设置区域。
php
use Filament\Forms\Components\TextInput;
TextInput::make('title')
->label('标题')
->translatable(true, ['en' => 'English', 'nl' => 'Dutch', 'fr' => 'French']),
- 设置指定区域的验证规则
您可以使用
->translatable()
函数的第三个参数来添加指定区域的验证规则
php
use Filament\Forms\Components\TextInput;
TextInput::make('name')
->label('Name')
->translatable(true, null, [
'en' => ['required', 'string', 'max:255'],
'nl' => ['nullable', 'string', 'max:255'],
]);
注意:
此包outerweb/filament-translatable-fields
将用组件 Filament\Forms\Components\Tabs
替换原始字段。此组件将呈现每个 locale
的原始字段。
在调用 ->translatable()
之前添加的所有链式方法都使用原始字段。
在调用 ->translatable()
之后添加的所有链接方法都使用Filament\Forms\Components\Tabs
组件。