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.
- <?php
- return [
- 'success' => 'Success message',
- 'failure' => 'Failure message'
- ];
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 FileIn 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.
- <?php
- return [
- 'success' => 'Success message',
- 'failure' => 'Failure message',
- ];
Now create a Chinese file at resources/lang/zh/alert.php.
- <?php
- return [
- 'success' => '????',
- 'failure' => '????',
- ];
Now create a controller LanguageLocalizationController.php
in following path app/Http/Controllers and copy the following line of code to file.
- <?php
- namespace App\Http\Controllers;
- use Illuminate\Http\Request;
- class LanguageLocalizationController extends Controller
- {
- public function index(Request $request){
- if($request->lang <> ''){
- app()->setLocale($request->lang);
- }
- echo trans('alert.success');
- }
- }
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.
- <?php
- namespace App\Http\Controllers;
- use Illuminate\Http\Request;
- class LanguageLocalizationController extends Controller
- {
- public function index(Request $request){
- if($request->lang <> ''){
- app()->setLocale($request->lang);
- }
- echo __('alert.success');
- }
- }
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.
- 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/enThis 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'])