novius/laravel-filament-translatable
Adds translation support to Filament in Laravel, helping you manage translatable Eloquent models and localized form fields/resources from one admin panel. Lightweight package to streamline multilingual CRUD for Filament apps.
This package allows you to manage Laravel Models that use Laravel Translatable in Laravel Filament.
You can install the package via composer:
composer require novius/laravel-filament-translatable
Next we need to publish the package's assets. We do this by running the following command:
php artisan vendor:publish --provider="Novius\LaravelFilamentTranslatable\LaravelFilamentTranslatableServiceProvider" --tag="public"
If you want to customize the lang files, you can publish them with:
php artisan vendor:publish --provider="Novius\LaravelFilamentTranslatable\LaravelFilamentTranslatableServiceProvider" --tag="lang"
Add the LocaleFilter filter on your Filament Resource.
use Filament\Resources\Resource;
use Novius\LaravelFilamentTranslatable\Filament\Tables\Filters\LocaleFilter;
class Post extends Resource
{
public static function table(Table $table): Table
{
return $table
/// ...
->filters([
LocaleFilter::make('locale'),
/// ...
]);
}
}
Add the LocaleColumn column on your Filament Resource.
use Filament\Resources\Resource;
use Novius\LaravelFilamentTranslatable\Filament\Tables\Columns\LocaleColumn;
class Post extends Resource
{
public static function table(Table $table): Table
{
return $table
/// ...
->columns([
/// ...
LocaleColumn::make('locale'),
]);
}
}
Add the Locale input on your Filament Resource.
use Filament\Resources\Resource;
use Novius\LaravelFilamentTranslatable\Filament\Forms\Components\Locale;
class Post extends Resource
{
public static function form(Form $form): Form
{
return $form
->schema([
// ...
Locale::make('locale')
->required(),
// ...
]);
}
}
In your Filament Resource.
use Filament\Resources\Resource;
use Novius\LaravelFilamentTranslatable\Filament\Tables\Columns\TranslationsColumn;
class Post extends Resource
{
public static function form(Form $form): Form
{
return $form
->schema([
Hidden::make('locale_parent_id'),
]);
}
public static function form(Form $form): Form
{
return $table
// ...
->columns([
// ...
TranslationsColumn::make('translations')
->locales(['de', 'en']) // Optional. Restricted the locals displayed on this list
->flagWidth(16) // Optional. Width in pixel of the flags
->onlyMissing() // Optional. Will display only translations missing
->withoutMissing() // Optional. Will display only existing translations
,
// ...
]);
}
}
And declare your Create page like this :
<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use LaravelLang\Locales\Facades\Locales;
use Novius\LaravelFilamentPageManager\Filament\PageManagerPlugin;
use Novius\LaravelFilamentTranslatable\Filament\Resources\Pages\CreateRecord;
class CreatePost extends CreateRecord
{
public static function getResource(): string
{
return PageManagerPlugin::getPlugin()->getResource('PostResource');
}
protected function getDataFromTranslate(Model $parent, string $locale): array
{
$data = $parent->attributesToArray();
// Modify data according the parent
$data['title'] = $parent->title.' '.Locales::get($locale)->native;
$data['slug'] = Str::slug($data['title']);
return $data;
}
}
Lint your code with Laravel Pint using:
composer run-script lint
This package is under GNU Affero General Public License v3 or (at your option) any later version.
How can I help you explore Laravel packages today?