rahmanramsi / laravel-translatable
This is my package laravel-translatable
Fund package maintenance!
rahmanramsi
Requires
- php: ^8.1
- illuminate/contracts: ^10.0||^11.0||^12.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.0.0||^8.22.0
- pestphp/pest: ^2.3||^3.0
- pestphp/pest-plugin-arch: ^2.7||^3.0
- pestphp/pest-plugin-laravel: ^2.4||^3.2
README
Laravel Translatable is a package for easily attaching arbitrary translation data to Eloquent Models.
Features
- One-to-many polymorphic relationship allows attaching translated data to Eloquent models without needing to adjust the database schema.
Installation & Setup
You can install the package via composer:
composer require rahmanramsi/laravel-translatable
You can publish and run the migrations with:
php artisan vendor:publish --tag="translatable-migrations"
php artisan migrate
You can publish the config file with:
php artisan vendor:publish --tag="translatable-config"
This is the contents of the published config file:
return [ 'model' => Translate::class, ];
Making a model translatable
The required steps to make a model translatable are:
- First, you need to add the
RahmanRamsi\LaravelTranslatable\HasTranslations
trait. - Next, you should create a public property $translatable which holds an array with all the names of attributes you wish to make translatable.
Here's an example of a prepared model:
use Illuminate\Database\Eloquent\Model; use RahmanRamsi\LaravelTranslatable\HasTranslations; class Post extends Model { use HasTranslations; public array $translatable = ['title']; }
Basic Usage
Getting and setting translations
First, you must prepare your model as instructed in the installation instructions.
Setting a translation
Here's an example, given that name is a translatable attribute:
$post->title = 'hello';
Changes automatically saved
To set a translation for a specific locale you can use this method:
public function setTranslation(string $key, string $locale, string $value)
You can set translations for multiple languages with
$translations = ['en' => 'hello', 'es' => 'hola']; $post->setTranslations('title', $translations);
Getting a translation
The easiest way to get a translation for the current locale is to just get the property for the translated attribute. For example (given that name is a translatable attribute):
$post->title;
You can also use this method:
public function getTranslation(string $key, string $locale, bool $useFallbackLocale = true)
Getting all translations
You can get all translations by calling getTranslations() without an argument:
$post->getTranslations();
Or you can use the accessor:
$post->translations
The methods above will give you back an array that holds all translations, for example:
$post->getTranslations('title'); // returns ['en' => 'hello', 'es' => 'hola']
The method above returns, all locales. If you only want specific locales, pass that to the second argument of getTranslations
.
public function getTranslations(string $attributeName)
Here's an example:
$translations = [ 'en' => 'Hello', 'fr' => 'Bonjour', 'de' => 'Hallo', ]; $newsItem->setTranslations('hello', $translations); $newsItem->getTranslations('hello', ['en', 'fr']); // returns ['en' => 'Hello', 'fr' => 'Bonjour']
Get locales that a model has
You can get all locales that a model has by calling locales() without an argument:
$translations = ['en' => 'hello', 'es' => 'hola']; $post->name = $translations; $post->locales(); // returns ['en', 'es']
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see License File for more information.