Laravel With dynamic columns Translatable and Multi Lang in slug
Published: 2022-02-04 01:30:23

## Aloha There !

in this tutorial
Use this package to make transtable columns dynamic and make slug transtable because it so useful in SEO 
We are using this two packages :

- https://github.com/spatie/laravel-translatable
- https://github.com/spatie/laravel-sluggable

This package provides to us To make the column contain many lang without need to make 3 or 4 columns  to one lang 
as example If we have title in arabic , english and Spanish 
we will have 
title_ar
title_en
title_es 
another columns if we make have column called description 
it is not good to performance , more data in db and not perfectly when get data 

[](https://github.com/spatie/laravel-translatable)

install this package with this 
`composer require spatie/laravel-translatable
`
If you want to have another fallback_locale than the app fallback locale (see config/app.php), you could publish the config file:

`php artisan vendor:publish --provider="Spatie\Translatable\TranslatableServiceProvider"`

in our modal add this trait 
`    use HasTranslations;
`
then make install to sluggable package 
from there 
`composer require spatie/laravel-sluggable
`

and add this trait in modal 

`HasTranslatableSlug`

and put every column who have translate in this variable in this like it 

`    public $translatable = ['name', 'slug'];`

Add This function in modal 
this function create slug and when we reterive the slug with two langague 
put
` usingLanguage(false) 
`

```
/**
     * Get the options for generating the slug.
     */
    public function getSlugOptions() : SlugOptions
    {
        return SlugOptions::createWithLocales(['en', 'ar'])
            ->generateSlugsFrom(function($model, $locale) {
                return "{$model->name}";
            })
            ->saveSlugsTo('slug')
            ->usingLanguage(false);
    }

```
**the final view for modal 
**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rs8dvl9egw1puud7tdb6.png)

in the migration we create the column in this way 
`            $table->json('name');
            $table->json('slug');
`
**in create form 
**
```
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<a href="{{route('posts.create')}}">Create</a>
<form action="{{route('posts.store')}}" method="post">
    @csrf
    <input type="text" name="name[ar]">
    <input type="text" name="name[en]">

    <input type="submit" value="Save">
</form>

</body>
</html>
```
**in web.php 
**
```
Route::group(['prefix' => LaravelLocalization::setLocale()], function()
{
    Route::get('/', function () {
        return view('welcome');
    });

       Route::resource('/posts',PostController::class)->except('delete','update');

});
```

**in Post Controller
**
```
/**
     * 
     * Get All posts
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
     */
    public function index()
    {
        $posts = Post::all();
        return view('index', compact('posts'));
    }


    /**
     * Create new post 
     * 
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
     */
    public function create()
    {
        return view('create');
    }

    /**
     * Store new post 
     * 
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        $post = Post::create($request->all());
        return redirect()->route('posts.index');
    }

    /**
     * Show post
     * @param $slug
     * @return \Illuminate\Http\JsonResponse
     */
    public function show($slug)
    {
        $post = Post::where('slug','like','%"'.$slug.'"%')->first();
        return response()->json($post);
    }
```

You Can see all of  this code in this repo 
https://github.com/salmazz/Multi-Langague-Example-Laravel-

If u have any question please contact to me ! 
hope it will be useful thank u