In a vanilla Laravel installation you can use language files to localize your app. This package will enable the translations to be stored in the database. You can still use all the features of the trans
function you know and love.
trans('messages.welcome', ['name' => 'dayle']);
You can even mix using language files and the database. If a translation is present in both a file and the database, the database version will be returned.
Want to use a different source for your translations? No problem! The package is easily extendable.
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciated you sending us a postcard from your hometown, mentioning which of our package(s) you are using.
Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium.
All postcards are published on our website.
You can install the package via composer:
composer require spatie/laravel-translation-loader
In config/app.php
you should replace Laravel's translation service provider
Illuminate\Translation\TranslationServiceProvider::class,
by the one included in this package:
Spatie\TranslationLoader\TranslationServiceProvider::class,
You must publish and run the migrations to create the language_lines
table:
php artisan vendor:publish --provider="Spatie\TranslationLoader\TranslationServiceProvider" --tag="migrations"
php artisan migrate
Optionally you could publish the config file using this command.
php artisan vendor:publish --provider="Spatie\TranslationLoader\TranslationServiceProvider" --tag="config"
This is the contents of the published config file:
return [
/*
* Language lines will be fetched by these loaders. You can put any class here that implements
* the Spatie\TranslationLoader\TranslationLoaders\TranslationLoader-interface.
*/
'translation_loaders' => [
Spatie\TranslationLoader\TranslationLoaders\Db::class,
],
/*
* This is the model used by the Db Translation loader. You can put any model here
* that extends Spatie\TranslationLoader\LanguageLine.
*/
'model' => Spatie\TranslationLoader\LanguageLine::class,
];
You can create a translation in the database by creating and saving an instance of the Spatie\TranslationLoader\LanguageLine
-model:
use Spatie\TranslationLoader\LanguageLine;
LanguageLine::create([
'group' => 'validation',
'key' => 'required',
'text' => ['en' => 'This is a required field', 'nl' => 'Dit is een verplicht veld'],
]);
You can fetch the translation with Laravel's default trans
function:
trans('validation.required'); // returns 'This is a required field'
app()->setLocale('nl');
trans('validation.required'); // returns 'Dit is een verplicht veld'
You can still keep using the default language files as well. If a requested translation is present in both the database and the language files, the database version will be returned.
This package ships with a translation provider than can fetch translations from the database. If you're storing your translations in a yaml-file, a csv-file, or ... you can easily extend this package by creating your own translation provider.
A translation provider can be any class that implements the Spatie\TranslationLoader\TranslationLoaders\TranslationLoader
-interface. It contains only one method:
namespace Spatie\TranslationLoader\TranslationLoaders;
interface TranslationLoader
{
/*
* Returns all translations for the given locale and group.
*/
public function loadTranslations(string $locale, string $group): array;
}
Translation providers can be registered in the translation_loaders
key of the config file.
Please see CHANGELOG for more information what has changed recently.
$ composer test
Please see CONTRIBUTING for details.
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker.
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
The MIT License (MIT). Please see License File for more information.