filament/spatie-laravel-translatable-plugin

支持 `spatie/laravel-translatable` 的 Filament。

v3.2.113 2024-07-31 11:53 UTC

This package is auto-updated.

Last update: 2024-09-17 08:30:44 UTC


README

安装

使用 Composer 安装插件

composer require filament/spatie-laravel-translatable-plugin:"^3.2" -W

将插件添加到面板

要将插件添加到面板,您必须使用 plugin() 方法在配置文件中包含它

use Filament\SpatieLaravelTranslatablePlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugin(SpatieLaravelTranslatablePlugin::make());
}

设置默认可翻译区域

要设置可以用来翻译内容的区域,您可以将区域数组传递给 defaultLocales() 插件方法

use Filament\SpatieLaravelTranslatablePlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugin(
            SpatieLaravelTranslatablePlugin::make()
                ->defaultLocales(['en', 'es']),
        );
}

准备您的模型类

您需要使您的模型可翻译。您可以在 Spatie 的文档 中阅读如何做到这一点。

准备您的资源类

您必须将 Filament\Resources\Concerns\Translatable 特性应用到您的资源类中

use Filament\Resources\Concerns\Translatable;
use Filament\Resources\Resource;

class BlogPostResource extends Resource
{
    use Translatable;
    
    // ...
}

使资源页面可翻译

准备资源类 之后,您还必须使您每个资源的页面可翻译。您可以在每个资源文件夹的 Pages 目录中找到您的资源页面。为了准备一个页面,您必须将相应的 Translatable 特性应用到它上,并安装一个 LocaleSwitcher 标题操作

use Filament\Actions;
use Filament\Resources\Pages\ListRecords;

class ListBlogPosts extends ListRecords
{
    use ListRecords\Concerns\Translatable;
    
    protected function getHeaderActions(): array
    {
        return [
            Actions\LocaleSwitcher::make(),
            // ...
        ];
    }
    
    // ...
}
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;

class CreateBlogPost extends CreateRecord
{
    use CreateRecord\Concerns\Translatable;
    
    protected function getHeaderActions(): array
    {
        return [
            Actions\LocaleSwitcher::make(),
            // ...
        ];
    }
    
    // ...
}
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;

class EditBlogPost extends EditRecord
{
    use EditRecord\Concerns\Translatable;
    
    protected function getHeaderActions(): array
    {
        return [
            Actions\LocaleSwitcher::make(),
            // ...
        ];
    }
    
    // ...
}

如果您为您的资源有一个 ViewRecord 页面

use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;

class ViewBlogPost extends ViewRecord
{
    use ViewRecord\Concerns\Translatable;
    
    protected function getHeaderActions(): array
    {
        return [
            Actions\LocaleSwitcher::make(),
            // ...
        ];
    }
    
    // ...
}

如果您使用的是简单资源,您可以使 ManageRecords 页面可翻译

use Filament\Actions;
use Filament\Resources\Pages\ManageRecords;

class ManageBlogPosts extends ListRecords
{
    use ManageRecords\Concerns\Translatable;
    
    protected function getHeaderActions(): array
    {
        return [
            Actions\LocaleSwitcher::make(),
            // ...
        ];
    }
    
    // ...
}

为特定资源设置可翻译区域

默认情况下,可翻译区域可以 在插件配置中全局设置所有资源的。或者,您可以通过在资源类中重写 getTranslatableLocales() 方法来自定义特定资源可翻译的区域

use Filament\Resources\Concerns\Translatable;
use Filament\Resources\Resource;

class BlogPostResource extends Resource
{
    use Translatable;
    
    // ...
    
    public static function getTranslatableLocales(): array
    {
        return ['en', 'fr'];
    }
}

翻译关系管理器

首先,您必须将 Filament\Resources\RelationManagers\Concerns\Translatable 特性应用到关系管理器类中

use Filament\Resources\RelationManagers\Concerns\Translatable;
use Filament\Resources\RelationManagers\RelationManager;

class BlogPostsRelationManager extends RelationManager
{
    use Translatable;
    
    // ...
}

现在,您可以在关系管理器的 table() 标题中添加一个新的 LocaleSwitcher 操作

use Filament\Tables;
use Filament\Tables\Table;

public function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->headerActions([
            // ...
            Tables\Actions\LocaleSwitcher::make(),
        ]);
}

从资源页面继承关系管理器的活动区域

如果您希望反应性地从 Translatable 资源页面继承关系管理器正在显示的区域,您可以重写 $activeLocale 属性并添加 Livewire 的 Reactive 属性到它

use Filament\Resources\RelationManagers\Concerns\Translatable;
use Filament\Resources\RelationManagers\RelationManager;
use Livewire\Attributes\Reactive;

class BlogPostsRelationManager extends RelationManager
{
    use Translatable;
    
    #[Reactive]
    public ?string $activeLocale = null;
    
    // ...
}

如果您这样做,您就不再需要在 table() 中使用 LocaleSwitcher 操作。

为特定关系管理器设置可翻译区域

默认情况下,可翻译区域可以 在插件配置中全局设置所有关系管理器的。或者,您可以通过在关系管理器类中重写 getTranslatableLocales() 方法来自定义特定关系管理器的可翻译区域

use Filament\Resources\RelationManagers\Concerns\Translatable;
use Filament\Resources\RelationManagers\RelationManager;

class BlogPostsRelationManager extends RelationManager
{
    use Translatable;
    
    // ...
    
    public function getTranslatableLocales(): array
    {
        return ['en', 'fr'];
    }
}

发布翻译

如果您希望翻译该包,您可以使用以下方法发布语言文件

php artisan vendor:publish --tag=filament-spatie-laravel-translatable-plugin-translations