A laravel-translatable extension for Laravel Nova.

2.2.0 2023-06-30 09:22 UTC


Latest Version on Packagist Total Downloads

This Laravel Nova allows you to make any input field spatie/laravel-translatable compatible and localisable.


  • PHP: ^8.0
  • laravel/nova: ^4.12
  • spatie/laravel-translatable: ^4.0 || ^5.0 || ^6.0


  • Supports almost all fields (including third party ones)
  • Supports default validation automatically
  • Simple to implement with minimal code changes (after spatie/laravel-translatable support)
  • Locale tabs to switch between different locale values of the same field
  • Double click on a tab to switch all fields to that locale
  • Supports nova-settings package

Known non-working fields


  • The following methods can not be used, as this package uses them internally:
    • resolveUsing
    • fillUsing


Detail View Form View Form View w/ Validation Errors


Firstly, set up spatie/laravel-translatable.

Install the package in a Laravel Nova project via Composer:

# Install nova-translatable
composer require outl1ne/nova-translatable

# Publish configuration (optional, but useful for setting default locales)
php artisan vendor:publish --tag="nova-translatable-config"


Call ->translatable() on any field, like so:

// Any Nova field
  ->rules('required', 'min:2')

// Any third-party input field
Multiselect::make('Football teams')

// Optionally pass custom locales on a per-field basis
    'en' => 'English',
    'et' => 'Estonian',


It's possible to define locale specific validation rules.

To do so, add the ->rulesFor() on your field and the HandlesTranslatable trait to your Nova resource.

->rulesFor accepts array|string|callable locales and array|callable rules.

use Outl1ne\NovaTranslatable\HandlesTranslatable;

class Product extends Resource
    use HandlesTranslatable;

    public function fields(Request $request)
        return [
            Text::make(__('Name'), 'name')
                ->rulesFor('en', [
                ->rulesFor(['en', 'et'], function ($locale) {
                    return ["unique:products,name->$locale{{resourceId}}"];

In this example, rules will be added to the following values

max: name.*
required: name.en
unique: name.en & name.et


You can define default locales for all the translatable fields in the config file. The config file can be published using:

php artisan vendor:publish --tag="nova-translatable-config"

Fill other locales from config option

The configuration option fill_other_locales_from allows you to pre-fill other locales from just one locale. This requires the resources to also have the HandlesTranslatable trait.

One select for all fields on a page

If you don't want to display the locale select next to each field, you can set the display_type to none and add a Outl1ne\NovaTranslatable\Fields\LocaleSelect field to your Nova resource. This will render a single select for all fields.

Edge cases

BelongsToMany allowDuplicateRelations corner-case

When using this field inside a BelongsToMany as a pivot field with ->allowDuplicateRelations() and you want to filter out exact matches using the NotExactlyAttached rule, use the BelongsToManyTranslatable field instead of the regular BelongsToMany.



This project is open-sourced software licensed under the MIT license.