Language Tabs plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Language Tabs

Group multilingual fields into tabs. It can be configured which languages are required to be filled out.

Tags: Form Layout Form Field
Supported versions:
4.x 3.x 2.x
pixelpeter avatar Author: pixelpeter

Documentation

Version:

Latest Version on Packagist Total Downloads Software License Coverage Status Tests Fix PHP code style issues PHPStan dependabot-auto-merge

This package is a Filament plugin that allows you to group multilingual fields into tabs. It can be configured which languages are required to be filled out.

#Compatibility

Filament branch/tag
v4.x main
v3.x v2.x
v2.x v1.x

#Installation

Install the package via composer:

composer require pixelpeter/filament-language-tabs

Publish the config file with:

php artisan vendor:publish --tag="filament-language-tabs-config"

Optionally, publish the view:

php artisan vendor:publish --tag="filament-language-tabs-views"

This is the contents of the published config file:

return [
    /*
    |--------------------------------------------------------------------------
    | Default Locales
    |--------------------------------------------------------------------------
    |
    | These are the locales this package will use generate the tabs
    |
    */
    'default_locales' => ['de', 'en', 'fr'],
    /*
    |--------------------------------------------------------------------------
    | Required Locales
    |--------------------------------------------------------------------------
    |
    | These are the locales this package will use to set the field as required
    | This can be used if one translation or language is optional
    |
    */
    'required_locales' => ['de', 'en'],
];

#Prerequisites

#Install spatie-translatable

composer require spatie/laravel-translatable

#Create a model and make it translatable

// Models/Post.php
class Post extends Model
{
    use HasFactory, HasTranslations;

    public $translatable = ['headline', 'body', 'slug'];

    protected $casts = [
        'headline' => 'array',
        'body' => 'array',
        'slug' => 'array',
    ];

    protected $guarded = ['id'];
}

#Create a migration for the model

// database/migrations
...    
public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->json('headline');
            $table->json('slug');
            $table->json('body');
            $table->timestamps();
        });
    }
...

#Setup & configuration

#FilamentPHP V4.x

#Method 1 (preferred): Add the LanguageTabs component to the PostForm schema
// app/Filament/Resources/Posts/Schemas/PostForm.php
...
use Pixelpeter\FilamentLanguageTabs\Forms\Components\LanguageTabs;

class PostForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                LanguageTabs::make([
                    TextInput::make('headline')->label('headline')->required(),
                    TextInput::make('slug')->label('slug'),
                    MarkdownEditor::make('body')->label('body'),
                ]),
            ]);
    }
}
#Method 2: Add the LanguageTabs component directly to the Filament resource
// app/Filament/Resources/PostResource.php
...
use Pixelpeter\FilamentLanguageTabs\Forms\Components\LanguageTabs;

class PostResource extends Resource
{
    public static function form(Form $form): Form
    {
        return $form
            ->components([
                LanguageTabs::make([
                    Forms\Components\TextInput::make('headline')->label('headline')->required(),
                    Forms\Components\TextInput::make('slug')->label('slug'),
                    Forms\Components\MarkdownEditor::make('body')->label('body'),   
                ]),
            ]);
    }

#FilamentPHP V3.x

#Add the LanguageTabs component to your Filament resource
// app/Filament/Resources/PostResource.php
...
use Pixelpeter\FilamentLanguageTabs\Forms\Components\LanguageTabs;

class PostResource extends Resource
{
    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                LanguageTabs::make([
                    Forms\Components\TextInput::make('headline')->label('headline')->required(),
                    Forms\Components\TextInput::make('slug')->label('slug'),
                    Forms\Components\MarkdownEditor::make('body')->label('body'),   
                ]),
            ]);
    }

#Configure which languages to add to the tabs

// config/filament-language-tabs.php
return [
    'default_locales' => ['de', 'en', 'fr'],
]

#Configure for which languages a field is required

If a field is defined as required

...
->schema([
    Forms\Components\TextInput::make('headline')->label('headline')->required(),
    ...
]),    
...

it will only be set as required for the languages configured in required_locals

// config/filament-language-tabs.php
return [
    'required_locales' => ['de', 'en'],
]

The headline is not (marked as) required for French language

#Testing

./vendor/bin/pest

#Changelog

Please see CHANGELOG for more information on what has changed recently.

#Contributing

Please see CONTRIBUTING for details.

#Security Vulnerabilities

Please review the security policy on how to report security vulnerabilities.

#Credits

#License

The MIT License (MIT). Please see License File for more information.

The author

pixelpeter avatar Author: pixelpeter

Full-Stack Engineer from 🇩🇪 who is in ❤️ with the TALL stack and also proficient with Javascript, Typescript, Python and a lot of other stuff because he has to 🤪. Maybe someday there will be a real homepage

Plugins
1
Stars
10