martin6363 / filament-ai-translator
AI-powered auto-translation for Spatie Translatable fields in Filament 4 and 5
Package info
github.com/Martin6363/filament-ai-translator
pkg:composer/martin6363/filament-ai-translator
Requires
- php: ^8.2|^8.3
- filament/filament: ^4.0|^5.0
- google-gemini-php/client: ^2.0
- illuminate/contracts: ^11.0|^12.0|^13.0
This package is auto-updated.
Last update: 2026-06-18 18:54:33 UTC
README
AI-powered, one-click translations for Filament form fields β built for Spatie Translatable and locale-suffixed layouts alike.
Translate content across locales in seconds using Google Gemini β directly inside your Filament admin panel.
β¨ Features
| Feature | Description |
|---|---|
| π Dual-Mode Integration | Works with Spatie Translatable JSON/array field states and separate locale-suffixed columns such as title_en, title_am, title_ru. |
| π§ Smart Suffix & Layout Detection | Detects sibling locale fields inside Tabs, Sections, or any nested Filament layout. Uses Filament's Set Utility and Livewire state paths to populate related fields automatically. |
| π Resilient AI Failover | If the primary Gemini model is under high demand, the package gracefully rotates through gemini-2.5-flash, gemini-2.0-flash, and gemini-1.5-flash to keep translations flowing. |
| π¨ Adaptive UI | Adds a sleek translate action as a suffix on affix-capable fields (TextInput, Select, β¦) or as a hint on complex editors like RichEditor. |
| β‘ Filament 4 & 5 Ready | Built on the modern Filament\Contracts\Plugin architecture with a clean ->aiTranslate() macro on any form Field. |
| π Polished UX | Loading, success, and failure states are surfaced through native Filament notifications. |
πΈ Demo
Screenshot (recommended: Tab layout with
title_en/title_am/title_rufields).
Example: translate from the English tab and instantly populate Russian sibling fields.
Example: Spatie translatable
π¦ Installation
Install the package via Composer:
composer require martin6363/filament-ai-translator
Publish the configuration file:
php artisan vendor:publish --tag=filament-ai-translator-config
Publish the language files (optional β customize notification and action labels):
php artisan vendor:publish --tag=filament-ai-translator-translations
Register the plugin in your Filament panel provider:
use Martin6363\FilamentAiTranslator\FilamentAiTranslatorPlugin; public function panel(Panel $panel): Panel { return $panel ->plugins([ FilamentAiTranslatorPlugin::make(), ]); }
Note: The package auto-registers via Laravel package discovery. You only need to add the plugin to your panel.
π Environment Setup
Add your Google Gemini credentials to .env:
GEMINI_API_KEY=your-google-ai-studio-api-key GEMINI_MODEL=gemini-2.0-flash
| Variable | Required | Description |
|---|---|---|
GEMINI_API_KEY |
Yes | API key from Google AI Studio. |
GEMINI_MODEL |
No | Primary model. Defaults to gemini-2.0-flash. Fallback models are tried automatically on high-demand errors. |
Security: Never commit API keys to version control. Restrict keys in Google AI Studio, rotate them regularly, and use environment-specific secrets in production (e.g. encrypted env, vault, or CI secrets).
βοΈ Configuration
After publishing, customize config/filament-ai-translator.php:
<?php return [ 'api_key' => env('GEMINI_API_KEY'), 'model' => env('GEMINI_MODEL', 'gemini-2.0-flash'), 'default_locales' => [ 'en', 'ru', ], ];
The default_locales array is used when ->aiTranslate() is called without explicit locales. Align these with your Spatie Translatable setup or your _locale field suffixes.
π Usage
Attach ->aiTranslate() to any Filament form field. The macro is registered on Filament\Forms\Components\Field and works with TextInput, Textarea, RichEditor, and more.
Zero-configuration (implicit locales)
Call ->aiTranslate() without arguments to use config('filament-ai-translator.default_locales'):
use Filament\Forms\Components\TextInput; TextInput::make('title') ->aiTranslate();
How it behaves:
- Spatie / JSON fields β reads the active form locale, translates into all other configured locales, and merges the JSON state.
- Suffixed fields (
title_en) β detects the locale from the field name and fills sibling fields (title_am,title_ru) in the same form β including fields inside Tabs or Sections.
Explicit locales (custom)
Override the default locale list per field:
TextInput::make('title_en') ->aiTranslate(['en', 'hy', 'fr', 'es']);
Spatie Translatable (JSON / array state)
Ideal with spatie/laravel-translatable and plugins such as Lara Zeus Spatie Translatable:
use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Section; Section::make('Content') ->schema([ TextInput::make('title') ->required() ->maxLength(255) ->aiTranslate(['en', 'ru']), RichEditor::make('content') ->required() ->aiTranslate(['en', 'ru']) ->columnSpanFull(), ]);
- Switch to your source locale using your translatable locale switcher.
- Type content in the active locale.
- Click the language action on the field.
- Save β translations are written into the multi-locale state.
Separate fields layout (locale suffixes + Tabs)
Perfect when each locale has its own database column (title_en, title_am, title_ru):
use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Tabs; use Filament\Schemas\Components\Tabs\Tab; Tabs::make('Translations') ->tabs([ Tab::make('English') ->schema([ TextInput::make('title_en') ->label('Title') ->aiTranslate(['en', 'ru']) // <-- empty parameter = config('filament-ai-translator.default_locales'), RichEditor::make('description_en') ->label('Description') ->aiTranslate(['en', 'ru']) ->columnSpanFull(), ]), Tab::make('Russian') ->schema([ TextInput::make('title_ru') ->label('Title') ->aiTranslate(['en', 'ru']), RichEditor::make('description_ru') ->label('Description') ->aiTranslate(['en', 'ru']) ->columnSpanFull(), ]), ]) ->columnSpanFull();
Filament 5 note:
Tabslive underFilament\Schemas\Components\Tabs. In Filament 4, you may use the equivalent layout component from your installed Filament version.
When translating from title_en, the plugin:
- Detects base name
titleand source localeen. - Calls Gemini for targets
amandru. - Sets
title_amandtitle_ruvia Filament's Set Utility β even when those fields live in other tabs.
π§© How it works (under the hood)
βββββββββββββββββββ ββββββββββββββββββββββββββββ βββββββββββββββββββ
β User clicks ββββββΆβ AiTranslatorService ββββββΆβ Gemini API β
β translate btn β β (JSON response + β β (with failover)β
βββββββββββββββββββ β model rotation) β βββββββββββββββββββ
ββββββββββββββ¬ββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββ
βΌ βΌ βΌ
Spatie JSON state Lara Zeus otherLocaleData Suffixed siblings
(array merge) (per-locale form cache) (title_am, title_ru)
π Translating UI strings
Publish translations to customize action labels and notifications:
php artisan vendor:publish --tag=filament-ai-translator-translations
Files are published to lang/vendor/filament-ai-translator/.
π§ͺ Requirements
- PHP
^8.2or higher - Laravel
^11.0,^12.0, or^13.0 - Filament
^4.0or^5.0 - google-gemini-php/client
^2.0 - A valid Google Gemini API key
π Changelog
Please see CHANGELOG.md for a history of releases and notable changes.
Unreleased
- Dual-mode translation (Spatie JSON + locale-suffixed fields)
- Gemini model failover for high-demand scenarios
- Adaptive suffix / hint action placement
- Filament 4 & 5 plugin architecture
π€ Contributing
Contributions are welcome and appreciated.
Please keep PRs focused, follow existing code style, and include tests where applicable.
π Credits
- Martin Khachatryan β Author & maintainer
- Filament β Admin panel framework
- Spatie Laravel Translatable β Multi-locale Eloquent attributes
- Google Gemini PHP Client β Community Gemini SDK
- All contributors
π License
The MIT License (MIT). See LICENSE for more information.
Made with β€οΈ for the Filament community Β· GitHub

