bambolee-digital / filament-translate
为 Filament 添加翻译功能的插件,允许在 FilamentPHP 管理界面直接翻译内容字段。
1.0.4
2024-09-24 01:45 UTC
Requires
- php: ^8.1
- deeplcom/deepl-php: ^1.9
- filament/filament: ^3.0
- guzzlehttp/guzzle: ^7.9
- laravel/framework: ^10.0|^11.0
- spatie/laravel-translatable: ^6.8
README
Filament Translate 是一个强大且灵活的包,它为您的 Filament PHP 管理面板添加了翻译功能。它允许您在 Filament 界面中轻松翻译字段。
要求
- PHP 8.0+
- Laravel 8.0+
- Filament PHP 2.0+
- Spatie Laravel Translatable
安装
- 通过 Composer 安装包
composer require bamboolee-digital/filament-translate
- 发布配置文件
php artisan vendor:publish --tag="filament-translate-config"
- 发布翻译文件(可选,但推荐用于自定义)
php artisan vendor:publish --tag="filament-translate-translations"
- 将
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 引擎的示例
- 创建一个新的类,该类实现了
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); } }
- 在配置文件中注册您的自定义引擎
'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 ], ], ],
- 将其设置为默认引擎或在字段中选择性使用
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' 字段不可翻译。
故障排除
如果翻译不起作用
- 确保已正确将
HasTranslations
特性添加到您的模型中。 - 验证字段是否列在您的模型中的
$translatable
数组中。 - 检查您的
config/filament-translate.php
文件中是否设置了正确的语言。 - 确认您的翻译引擎(例如,DeepL)已正确配置,并具有有效的 API 密钥。
- 清除 Laravel 的缓存:
php artisan cache:clear
- 如果包翻译字符串未出现,请尝试使用
trans('filament-translate::filament-translate.key')
而不是__()
。
贡献
欢迎贡献!请随时提交拉取请求。
许可
此包是开源软件,受 MIT 许可证 许可。
作者
Kellvem Barbosa (kellvembarbosa)# filament-translate