ایجاد یک سایت دو زبانه در لاراول

خوب موضوع خیلی گنگ و نا آشنا نیست . برای همین سریع میریم سر اصل مطلب . لاراول کنار همه خوبیاش ، دو زبانه کردن و ایجاد 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]); }این ساده ترین راهه . اما بهترین نیست .