This package allows you to manage Laravel Models that use Laravel Translatable in Laravel Filament.
- Laravel Filament >= 3.3
- Laravel >= 11.0
- PHP >= 8.2
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.