Skip to content
This repository was archived by the owner on Jan 27, 2020. It is now read-only.

themsaid/laravel-multilingual

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Laravel 5 Multilingual Models

This laravel package makes Eloquent Models attributes translatable without the need to separate database tables for translation values.

You simply call $country->name and you get a value based on your application's current locale.

You can also call $country->nameTranslations->en to get the value of a specific locale.

You can check all the translations of a given attributes as easy as $country->nameTranslations->toArray().

Installation

Begin by installing the package through Composer. Run the following command in your terminal:

composer require themsaid/laravel-multilingual

Once composer is done, add the package service provider in the providers array in config/app.php

Themsaid\Multilingual\MultilingualServiceProvider::class

Finally publish the config file:

php artisan vendor:publish

That's all, you are now good to go.

Usage

First you need to make sure that the translatable attributes has a mysql field type of text or json, if you are building the database from a migration file you may do this:

<?php

Schema::create('countries', function (Blueprint $table)
{
	$table->increments('id');
	$table->json('name');
});

Now that you have the database ready to save a JSON string, you need to prepare your models:

<?php

class Country extends Model
{
    use Themsaid\Multilingual\Translatable;

    protected $table = 'countries';
    public $translatable = ['name'];
    public $casts = ['name' => 'array'];
}
  • Add the Translatable trait to your model class
  • Add a public class property $translatable as an array that holds the names of the translatable fields in your model.
  • Remember to cast the translatable attribute as 'array' in the $casts property of the model.

Now our model has the name attribute translatable, so on creating a new Model you may specify the name field as follow:

<?php

Country::create([
	'name' => [
		'en' => "Spain",
		'sp' => 'España'
	]
]);

It'll be automatically converted to a JSON string and saved in the name field of the database, you can later retrieve the name like this:

$country->name

This will return the country name based on the current locale, if the current locale doesn't have a value then the fallback_locale defined in the config file will be used.

In case nothing can be found an empty string will be returned.

You may also want to return the value for a specific locale, you can do that using the following syntax:

$country->nameTranslations->en

This will return the English name of the country.

To return an array of all the available translations you may use:

$country->nameTranslations->toArray()

Validation

A validation rule is included in this package that deals with required translation fields, for example if the name field is required and translatable you may use the following translation rule:

<?php

$validator = Validator::make(
    ['name' => ['en'=>'One', 'sp'=>'Uno']],
    ['name' => 'translatable_required']
);

The translatable_required rule will make sure all the values of the available locales are set.

You may define the available locales as well as the fallback_locale from the package config file.

Now you only need to add the translated message of our new validation rule, add this to the validation.php translation file:

'translatable_required' => 'The :attribute translations must be provided.',

About

Easy multilingual laravel models

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 5

Languages