یه برنامه نویس معمولی لینوکس کار
ایجاد یک سایت دو زبانه در لاراول
خوب موضوع خیلی گنگ و نا آشنا نیست . برای همین سریع میریم سر اصل مطلب .
لاراول کنار همه خوبیاش ، دو زبانه کردن و ایجاد Locale رو هم به ما داده . کارمون رو راحت میکنه .
من هرچی که اینجا میگم داخل داکیومنت لاراول 5.7 هست و چیزی فراتر از اون نیست . فقط مراحل رو کنار هم چیدیم .
ما برای اینکه یک سایت دو زبانه داشته باشیم نیاز به چند مورد داریم :
1- به چه شکل دو زبان ترجمه بسازم؟
2- استایل برای زبان های rtl تغییر کنه
3- متن ها برای هر زبان تغییر کنه
این سه مورد رو با هم میریم جلو .
1- به چه شکل فایل ترجمه بسازیم ؟
من اول میخوام بگم چجوری می دوتا فایل ترجمه داشته باشیم؟
این کاری که انجام میدیم static هست و از دیتابیس نمیخونه . برای اون دسته از داده هایی که به صورت static تعریف میشن کاربرد داره . مرحله آخر متن هامون رو هم میتونیم dynamic کنیم .
خوب برای اینکه بتونیم فایل ترجمه بسازیم که راحت قابل ویرایش باشه باید کلید های یکسان داشته باشیم و اون کلید رو داخل blade صدا کنیم و زمانی که زبان تغییر کنه ، لاراول خودش میره و زبان مورد نظر رو دریافت میکنه .
برای این کار داخل resources به پوشه lang برید . دوتا فایل ایجاد کنید . یکی به اسم fa.json و یکی en.json . من ساختار جی سون رو ترجیح میدم به ساختار آرایه درphp . ویرایشش راحتتره برای کسی که بعدا میخواد کار ترجمه انجام بده .
حالا داخل fa.json میام به این شکل مینویسم . :
{
"contact_us":"تماس با ما",
"helloworld":"سلام دنیا"
}
و داخل e.json هم میام به شکل زیر مینویسم :
{
"contact_us":"contact us",
"helloworld":"Hello world , hello every body"
}
خوب من دوتا فایل دارم که کلید ها عین هم، اما سمت چپ، مقادیر با هم فرق دارن و مرتبط با زبان خودشونن .
حالا میرم به فایل blade پروژه . فرض کنیم فایل welcome.blade.php یا هر فایل دیگه که میخوام اونجا نمایش بدم .
@extends('layouts.app')
@section('content')
<div id="ContactUs">
{{__('contact_us')}}
</div>
<div id="hello">
{{__('helloworld')}}
</div>
@endsection
خوب دیدید که داخل blade به چه شکلی مقادیر اومد . با قرار دادن {{__('key')}}. به جای key ، کلید اون ترجمه رو داخل فایلش رو میزارم . مثلا contact_us با helloworld .
حالا داخل کنترلر میرم و بهش میگم که از کدوم فایل استفاده کنه .
public function index(){
App::setLocale('fa');
return view('welcome');
}
خوب ما اینجا گفتیم که روی fa بزار زبان سایت رو . میتونه داینامیک باشه .
2- تغییر css در زبان های rtl :
خوب معلومه که یک سایت انگلیسی باید چپ چین و یک سایت فارسی باید راست چین باشه .
برای این کار ما میدونیم که اگر fa باشه ، باید rtl باشه و در غیر این صورت ltr. خوب این کار رو میکنیم :
$locale = App::getLocale();
if ($locale=='fa')) {
//so we have to write rtl css link
}
3-متن ها برای هر زبان تغییر کنه :
برای این کار باید داخل جدول پست دوتا ستون بزاریم و فارسی و انگلیسی رو معرفی کنیم .
این کار برای دوتا زبانه معلومه . برای زبان های بی نهایت و نا معلوم بهتره که یک جدول language_post ایجاد کنید و داخل اون بگید که هر پست به زبان خودش چی میشه مقدارش .
خوب حالا باید migration بسازیم :
php artisan make:migration CreatePostTable
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title_en');
$table->string('title_fa');
$table->string('message_en');
$table->string('message_fa');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
php artisan migrate
حالا موقع ذخیره سازی میگیم که داخل کدوم ستون ها باید ذخیره سازی انجام بشه . این خیلی مهم نیست .
اصل داستان موقع دریافت از دیتابیسه.
برای دریافت از دیتابیس، یک راه ساده هست که میگم .
اما راه های بهتری هم هستن . من میخوام فقط موضوع باز بشه . راه بهتر با خودتون :
public function index(){
$locale = App::getLocale();
$titleColumn=$locale=='fa'?'title_fa':'title_en';
$messageColumn=$locale=='fa'?'message_fa':'message_en';
$selectPost=$this->posts->select(['id',$titleColumn,'$messageCloumn])->get();
return view('welcome',['posts'=>$selectPost]);
}
این ساده ترین راهه . اما بهترین نیست .
مطلبی دیگر از این انتشارات
آمادهسازی یک پروژه فولاستک لاراول + VueJS و TailwindCss
مطلبی دیگر از این انتشارات
استفاده از seed ها در لاراول
مطلبی دیگر از این انتشارات
از دورهمی لاراول تا صندلی داغ برنامه نویسان