Stars: 608
Forks: 81
Pull Requests: 75
Issues: 0
Watchers: 14
Last Updated: 2023-03-15 09:57:14
Store your translations in the database or other sources
License: MIT License
Languages: PHP
https://freek.dev/593-a-laravel-package-to-store-language-lines-in-the-database
In a vanilla Laravel or Lumen 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.
We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.
You can install the package via composer:
composer require spatie/laravel-translation-loader
In config/app.php
(Laravel) or bootstrap/app.php
(Lumen) 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,
/*
* This is the translation manager which overrides the default Laravel `translation.loader`
*/
'translation_manager' => Spatie\TranslationLoader\TranslationLoaderManager::class,
];
Note: publishing assets doesn't work out of the box in Lumen. Instead you have to copy the files from the repo.
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.
If you need to store/override json translation lines, just create a normal LanguageLine with group => '*'
.
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've found a bug regarding security please mail [email protected] instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.