bambolee-digital/filament-translate

为 Filament 添加翻译功能的插件,允许在 FilamentPHP 管理界面直接翻译内容字段。

1.0.4 2024-09-24 01:45 UTC

This package is auto-updated.

Last update: 2024-09-24 01:46:55 UTC


README

Filament Translate 是一个强大且灵活的包,它为您的 Filament PHP 管理面板添加了翻译功能。它允许您在 Filament 界面中轻松翻译字段。

要求

  • PHP 8.0+
  • Laravel 8.0+
  • Filament PHP 2.0+
  • Spatie Laravel Translatable

安装

  1. 通过 Composer 安装包
composer require bamboolee-digital/filament-translate
  1. 发布配置文件
php artisan vendor:publish --tag="filament-translate-config"
  1. 发布翻译文件(可选,但推荐用于自定义)
php artisan vendor:publish --tag="filament-translate-translations"
  1. Spatie\Translatable\HasTranslations 特性添加到您的模型
use Spatie\Translatable\HasTranslations;

class Post extends Model
{
    use HasTranslations;

    public $translatable = ['title', 'content'];
}

配置

config/filament-translate.php 文件中,您可以进行配置

return [
    'default_engine' => 'deepl',
    'engines' => [
        'deepl' => [
            'name' => 'DeepL',
            'class' => \BambooleeDigital\FilamentTranslate\Engines\DeepLEngine::class,
            'api_key' => env('DEEPL_API_KEY'),
            'available_locales' => [
                'en-us' => 'English (American)',
                'es' => 'Spanish (Spain)',
                'pt-br' => 'Portuguese (Brazil)',
            ],
        ],
        // Add other engines here
    ],
    'languages' => [
        'en-US' => 'English (American)',
        'es-ES' => 'Spanish (Spain)',
        'pt-BR' => 'Portuguese (Brazil)',
        // Add more languages as needed
    ],
    'default_source_language' => null,
    'source_locale_strategy' => 'dynamic', // or 'fixed'
];

使用方法

使字段可翻译

在您的 Filament 资源中使字段可翻译,请使用 translatable() 方法

use Filament\Resources\Form;
use Filament\Forms\Components\TextInput;

public static function form(Form $form): Form
{
    return $form
        ->schema([
            TextInput::make('title')
                ->translatable()
                ->required(),
            // ... other fields
        ]);
}

指定活动区域

当使用 translatable() 方法时,您可以指定活动区域

TextInput::make('title')
    ->translatable(activeLocale: 'en')

activeLocale 决定了字段中将首先显示哪个翻译。

工作原理

当您对一个字段调用 ->translatable() 时,该包会在字段旁边添加一个操作按钮。点击此按钮会打开一个模态框,允许您使用配置的翻译引擎将字段内容翻译成不同语言。

自定义翻译

您可以根据需要自定义包使用的翻译字符串。发布翻译文件后,您可以在 resources/lang/vendor/filament-translate 中编辑它们。

例如,要自定义英文翻译,请编辑文件 resources/lang/vendor/filament-translate/en/filament-translate.php

return [
    'modal_title' => 'Translate Content',
    'engine' => 'Translation Service',
    'source' => 'Original Language',
    'target' => 'Target Language',
    'translate' => 'Translate Now',
    // ... other translations
];

创建自定义翻译引擎

以下是一个创建 Google Translate 引擎的示例

  1. 创建一个新的类,该类实现了 TranslationEngine 接口
use BambooleeDigital\FilamentTranslate\Contracts\TranslationEngine;
use Google\Cloud\Translate\V2\TranslateClient;

class GoogleTranslateEngine implements TranslationEngine
{
    protected TranslateClient $client;

    public function __construct(string $apiKey)
    {
        $this->client = new TranslateClient([
            'key' => $apiKey
        ]);
    }

    public function translate(string $text, string $targetLanguage, ?string $sourceLanguage = null): string
    {
        $result = $this->client->translate($text, [
            'target' => $targetLanguage,
            'source' => $sourceLanguage,
        ]);

        return $result['text'];
    }

    public function getSupportedLanguages(): array
    {
        $languages = $this->client->languages();
        return array_combine($languages, $languages);
    }
}
  1. 在配置文件中注册您的自定义引擎
'engines' => [
    'google' => [
        'name' => 'Google Translate',
        'class' => \App\TranslationEngines\GoogleTranslateEngine::class,
        'api_key' => env('GOOGLE_TRANSLATE_API_KEY'),
        'available_locales' => [
            'en' => 'English',
            'es' => 'Spanish',
            'fr' => 'French',
            // Add more as needed
        ],
    ],
],
  1. 将其设置为默认引擎或在字段中选择性使用
TextInput::make('title')
    ->translatable()
    ->translateEngine('google')

完整示例

以下是在 Filament 资源中使用 Filament Translate 的完整示例

use App\Models\Post;
use Filament\Forms;
use Filament\Resources\Form;
use Filament\Resources\Resource;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->translatable(activeLocale: app()->getLocale()),
                
                Forms\Components\RichEditor::make('content')
                    ->required()
                    ->translatable(),
                
                Forms\Components\TextInput::make('author')
                    ->required(),
                
                // This field won't be translatable
                Forms\Components\DatePicker::make('published_at'),
            ]);
    }

    // ... other resource methods
}

在此示例中

  • 'title' 和 'content' 字段是可翻译的。
  • 'title' 字段使用当前应用程序的区域设置作为活动区域。
  • 'content' 字段使用包的默认区域设置。
  • 'author' 和 'published_at' 字段不可翻译。

故障排除

如果翻译不起作用

  1. 确保已正确将 HasTranslations 特性添加到您的模型中。
  2. 验证字段是否列在您的模型中的 $translatable 数组中。
  3. 检查您的 config/filament-translate.php 文件中是否设置了正确的语言。
  4. 确认您的翻译引擎(例如,DeepL)已正确配置,并具有有效的 API 密钥。
  5. 清除 Laravel 的缓存: php artisan cache:clear
  6. 如果包翻译字符串未出现,请尝试使用 trans('filament-translate::filament-translate.key') 而不是 __()

贡献

欢迎贡献!请随时提交拉取请求。

许可

此包是开源软件,受 MIT 许可证 许可。

作者

Kellvem Barbosa (kellvembarbosa)# filament-translate