چند زبانه کردن برنامه
به طور پیش فرض در مسیر resources/lang یک پوشه به نام en وجود دارد که فایل های زبانی انگلیسی در آن قرار دارند. برای چند زبانی کردن کافی است به ازای هرتعداد زبان یک پوشه ایجاد کرده و دقیقا فایل های موجود در پوشه en را در آن هم کپی کنیم. هر فایل زبانی یک آرایه را return میکند که اندیس ها در همه فایل ها باید به انگلیسی باشند اما مقادیر آنها باتوجه زبان موردنظر مقداردهی می شوند. ما در این مثال قصد داریم یک برنامه ساده دوزبانه فارسی و انگلیسی را پیاده سازی کنیم پس با من همراه باشید.
ابتدا دوتا پوشه fa و en در پوشه resources/lang ایجاد کنید و فایل messages.php را ایجاد کنید به این صورت :
/resources
/lang
/en
messages.php
/fa
messages.php
محتویات فایل های messages.php را هم به این صورت تغییر دهید :
//برای فایل انگلیسی
<?php
return [
'welcome' => 'Welcome to our application',
'text' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
];
//برای فایل فارسی
return [
'welcome' => 'به برنامه ما خوش آمدید',
'text' => '
لورم ایپسوم یا طرحنما (به انگلیسی: Lorem ipsum) به متنی آزمایشی و بیمعنی در صنعت چاپ، صفحهآرایی
و طراحی گرافیک گفته میشود. طراح گرافیک از این متن به عنوان عنصری از ترکیب بندی برای پر کردن صفحه
و ارایه اولیه شکل ظاهری و کلی طرح سفارش گرفته شده استفاده می نماید، تا از نظر گرافیکی نشانگر
چگونگی نوع و اندازه فونت و ظاهر متن باشد. معمولا طراحان گرافیک برای صفحهآرایی، نخست از متنهای
آزمایشی و بیمعنی استفاده میکنند تا صرفا به مشتری یا صاحب کار خود نشان دهند که صفحه طراحی یا
صفحه بندی شده بعد از اینکه متن در آن قرار گیرد چگونه به نظر میرسد و قلمها و اندازهبندیها
چگونه در نظر گرفته شدهاست. از آنجایی که طراحان عموما نویسنده متن نیستند و وظیفه رعایت حق
تکثیر متون را ندارند و در همان حال کار آنها به نوعی وابسته به متن میباشد آنها با استفاده
از محتویات ساختگی، صفحه گرافیکی خود را صفحهآرایی میکنند تا مرحله طراحی و صفحهبندی را به
پایان برند.',
];
حالا یک فایل view به نام test.blade.php هم ایجاد کنید و کدهای زیر را در آن قرار دهید :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Multi Languages-Hamo</title>
</head>
<body>
<a href="{{ url('/language') }}">{{ Session::get('locale', 'fa') == 'fa' ? 'English' : 'فارسی' }}</a>
<h1>{{ trans('messages.welcome') }}</h1>
<p>{{ trans('messages.text') }}</p>
</body>
</html>
با استفاده از تابع کمکی trans متن موردنظرمان را چاپ میکنیم. مقداری که این تابع میگرد به این صورت است که ابتدا نام فایل بعد یک نقطه و سپس اندیس آرایه را به آن میدهیم و مقدار ان براساس locale برنامه چاپ می شود مثلا اگر زبان برنامه fa باشد welcome و text فارسی وگرنه انگلیسی نمایش داده خواهد شد. یک لینک هم برای تغییر زبان تعریف کردم که با یک سشن به نام locale که جلوتر تعریف میکنیم زبان جاری را در آن قرار می دهیم و مقدار لینک بر اساس نوع زبان جاری تعیین می شود مثلا اگر زبان فارسی بود لینک زبان انگلیسی نمایش داده می شود و بالعکس این لینک را میتوانید در منوی وبسایت و در قالب اصلی آن قراردهید که بستگی به سلیقه خودتان دارد. این لینک به مسیر language هدایت میشود پس مسیر را در فایل routes.php تعریف میکنیم :
//language
Route::get('/language', 'WelcomeController@language');
مسیر را به کنترلر WelcomeController و اکشن language ارسال کردیم. پس اکشن language را در کلاس کنترلر موردنظر ایجاد میکنیم :
public function language(ChangeLocaleCommand $ChangeLocaleCommand)
{
$this->dispatch($ChangeLocaleCommand);
return redirect()->back();
}
همانطور که می بینید از یک کلاس command استفاده کردیم که در این کلاس نوع زبان را در سشن تغییر می دهیم. یادتان باشد برای استفاده از هرکلاسی در کنترلر باید ابتدا آن را با namespace آن ایمپورت کنید پس ایتدای کلاس این عبارت را ااضفه کنید :
use App\Commands\ChangeLocaleCommand;
اکنون با دستور زیر کلاس ChangeLocaleCommand را ایجاد کنید :
php artisan make:command ChangeLocaleCommand
در مسیر app/commands کلاس ایجاد شده را باز کنید و متد handle را به این صورت تغییر دهید :
<?php namespace App\Commands;
use App\Commands\Command;
use Illuminate\Contracts\Bus\SelfHandling;
class ChangeLocaleCommand extends Command implements SelfHandling {
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
session()->set('locale', session('locale') == 'fa' ? 'en' : 'fa');
}
}
همانطور که می بینید در کلاس بالا مقدار سشن اگر fa بود به en یا بالعکس تغییر میدهیم.
حالا باید یک کلاس command دیگر برای ست کردن locale برنامه ایجاد کنیم پس با دستور زیر آن را ایجاد میکنیم :
php artisan make:command SetLocaleCommand
حالا فایل آن را بازکنید و به این صورت تغییر دهید :
<?php namespace App\Commands;
use App\Commands\Command;
use Request;
use Illuminate\Contracts\Bus\SelfHandling;
class SetLocaleCommand extends Command implements SelfHandling {
/**
* The availables languages.
*
* @array $languages
*/
protected $languages = ['en','fa'];
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
if(!session()->has('locale'))
{
session()->put('locale', Request::getPreferredLanguage($this->languages));
}
app()->setLocale(session('locale'));
}
}
همانطور که مشاهده میکنید در کلاس بالا locale برنامه را با توجه مقدار سشن تغییر می دهیم اگر مقدار سشن fa بود پس locale برنامه هم fa و یا بالعکس شود. در صورتی که سشن ست نشده بود با استفاده از متد getPreferredLanguage و پراپرتی languages که زبان های موردنظرمان را در ان ست کردیم آن را مقداردهی میکنیم.
حالا بایستی از این کلاس command استفاده کنیم پس یک middleware هم در مسیر app/Http/Middleware به نام App ایجاد میکنیم با دستور زیر :
php artisan make:middleware App
فایل آن را باز کنید و به این صورت تغییر دهید :
<?php namespace App\Http\Middleware;
use Closure;
use App\Commands\SetLocaleCommand;
use Illuminate\Bus\Dispatcher as BusDispatcher;
class App {
/**
* The command bus.
*
* @array $bus
*/
protected $bus;
/**
* The command bus.
*
* @array $bus
*/
protected $setLocaleCommand;
/**
* Create a new App instance.
*
* @param Illuminate\Bus\Dispatcher $bus
* @param App\Commands\SetLocaleCommand $setLocaleCommand
* @return void
*/
public function __construct(
BusDispatcher $bus,
SetLocaleCommand $setLocaleCommand)
{
$this->bus = $bus;
$this->setLocaleCommand = $setLocaleCommand;
}
/**
* Handle an incoming request.
*
* @param Illuminate\Http\Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$this->bus->dispatch($this->setLocaleCommand);
return $next($request);
}
}
در سازنده کلاس دوتا پراپرتی bus$ و setLocalCommand$ را با نمونه از کلاس های BusDispatcher و SetLocaleCommand مقداردهی کردیم و در متد handle کلاس SetLocaleCommand را برای اجرای فرمان به bus میدهیم.
در پایان باید این middleware را به فریمورک معرفی کنیم همانظور که در بخش موردنظرش هم توضیح دادم چون میخواهم این middleware عمومی باشد و در کل برنامه اجرا شود پس در فایل Kernel.php در مسیر app/Http به پراپرتی middleware$ که مقدارش آرایه است این middleware را هم اضافه کنید.
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMai ntenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToRe sponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession ',
'App\Http\Middleware\VerifyCsrfToken',
'App\Http\Middleware\App',
];
اگر فایل test.blade.php را رندر کنید به راحتی با کلیک کردن بر لینک تغییر زبان می توانید زبان برنامه را تغییر دهید. امیدوارم که مطلب برایتان مفید باشد.