solution-forest/filament-translate-field
Installation:
composer require solution-forest/filament-translate-field
php artisan filament:assets
php artisan optimize
Basic Usage:
Add the TranslateField to a Filament form/resource:
use SolutionForest\FilamentTranslateField\Fields\TranslateField;
TranslateField::make('title')
->languages(['en', 'fr', 'de'])
->required(),
First Use Case:
Post with title and content fields).TranslateField.Multi-Language Forms:
TranslateField::make('description')
->languages(config('app.locales'))
->columnSpanFull(),
Conditional Translations:
TranslateField::make('name')
->languages(fn ($record) => $record->available_locales)
->defaultLanguage('en'),
Integration with Existing Models:
spatie/laravel-translation-loader or spatie/laravel-translatable.Translatable trait on Filament EditPage (per README warning).Dynamic Language Selection:
TranslateField::make('bio')
->languages(fn () => Language::query()->pluck('code')->toArray()),
TranslateField::make('metadata.key')
->languages(['en', 'es'])
->json(),
TranslateField::make('slug')
->languages(['en', 'fr'])
->rules([
'en' => 'required|unique:posts,slug',
'fr' => 'required|unique:posts,slug_fr',
]),
TranslateField::make('live_content')
->languages(['en', 'ja'])
->livewire(),
Trait Conflict:
Translatable trait conflicts with filament/spatie-laravel-translatable-plugin on EditPage.use Spatie\Translatable\HasTranslations; from the model or use CreatePage/UpdatePage separately.Database Schema:
locale column in pivot tables for many-to-many relationships.locale column and update migrations:
Schema::table('post_tag', function (Blueprint $table) {
$table->string('locale')->nullable();
});
Asset Loading:
filament:assets not run.php artisan filament:assets after installation.tail -f storage/logs/laravel.log | grep "TranslateField"
json() fields are valid JSON arrays/objects per language.Custom Rendering: Override the view:
TranslateField::make('custom_field')
->view('filament-translate-field::custom-field'),
Language Switcher: Extend the language selector:
TranslateField::make('extended_title')
->languages(['en', 'zh'])
->languageSelectorView('filament-translate-field::custom-selector'),
Middleware: Restrict translations to authenticated users:
TranslateField::make('admin_only')
->middleware([Authorize::class]),
updateOrCreate for bulk translations:
$post->translations()->updateOrCreate(
['locale' => 'fr'],
['title' => 'Nouveau titre']
);
Cache::remember('app.locales', now()->addHours(1), fn () => config('app.locales'));
How can I help you explore Laravel packages today?