Creating multilingual website using Localization in Laravel 5.4

Creating multilingual website using Localization in Laravel 5.4

Creating multilingual website using Localization in Laravel 5.4

In this tutorial, I will tell you how to create multilingual website in Laravel 5.4

Suppose you had developed phase-1 task and you are going to develop phase-2 task but in mean while, client wants multilingual website so in that case what will you do ? what step you will take ?

You will have to put all string in common string file from where you can get as per selected language. So this should be in practise before developing your application.

Laravel's localization features provide a convenient way to get strings in different languages, allowing you to easily support multiple languages within your application.

Language strings are stored in files within the resources/lang directory. Within this directory there should be a subdirectory for each language supported by the application:

/resources
    /lang
        /en
            alert.php
        /zh
            alert.php

Above directory structure tell us that there is a language file alert.php you can put all alert message in this file.

This file will return array in key value pair.

  1. <?php
  2. return [
  3. 'success' => 'Success message',
  4. 'failure' => 'Failure message'
  5. ];

Kindly follow below step to see how localization work in Laravel 5, In below example i am creating application for two language : English and Chinese

Step 1 : Create Language File

In this step, i will create 2 same language file in different language directory. When you setup your project first time then you will see there will be default language directory for english language in following path resources/lang/en. Now i will create a file alert.php in en diretory.

resources/lang/en/alert.php
  1. <?php
  2. return [
  3. 'success' => 'Success message',
  4. 'failure' => 'Failure message',
  5. ];

Now create a Chinese file at resources/lang/zh/alert.php.

  1. <?php
  2. return [
  3. 'success' => '????',
  4. 'failure' => '????',
  5. ];
Step 2 : Create Language Localization Controller File

Now create a controller LanguageLocalizationController.php in following path app/Http/Controllers and copy the following line of code to file.

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class LanguageLocalizationController extends Controller
  5. {
  6.     public function index(Request $request){
  7.         if($request->lang <> ''){
  8.             app()->setLocale($request->lang);
  9.         }
  10.         echo trans('alert.success');
  11.     }
  12. }

You can see in above code, If language parameter is not null then i change the active language at runtime using app()->setLocale() method and if language parameter is null then default language will be active which you have defined in config/app.php file.

You can also get the translation strings by using __ helper function.

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class LanguageLocalizationController extends Controller
  5. {
  6.     public function index(Request $request){
  7.         if($request->lang <> ''){
  8.             app()->setLocale($request->lang);
  9.         }
  10.         echo __('alert.success');
  11.     }
  12. }

When you need to display translation string in your blade template then you can also use blade syntax {{ }} to echo language based translated string or you can go with @lang directive:. Step 3 : Add route for LanguageLocalizationController

In this step, i will add route in routes/web.php file.

  1. Route::get('localization/{lang?}','LanguageLocalizationController@index');

You will see lang parameter is optional that means if we will not pass language argument then default language will be active.

Now you can visit URLs with different language code in following way :

http://localhost:8000/localization/en

This will give you following output :

Success message

Now change language code in URL and see output :

http://localhost:8000/localization/zh

????
How to use localization in Blade tag templates?

If you need to use translations in your blade view template then you can use @lang command.

For example :

@lang('alert.success')

In above example, There is a key 'success' in the file alert.php for the current locale.

As i have defined success message in key success then it would return the translated message accordingly, but if there is no any messages defined then output will be alert.success.

Sometime, you create sub-directories in your language file then you will have to use file path instead of using dot notation for file paths.

Suppose, you have a file in sub-directories at following path resources/lang/en/admin/alert.php and you are facing issue with sub-directories then you can get translated string by following way :

@lang('admin/alert.success')

If you need to set value in translated strings dynamically then you can easily replace parameters in translated strings.

'success' => 'Success message - :your_message',

As you can see above, a place-holder is prefixed with a :. Now you need to remove place-holders when reading a translation strings then you can pass array of replacements as second argument by following way :

@lang('admin/alert.success',['your_message'=>'This is test message'])

Phone: (+91) 8800417876
Noida, 201301