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

خوب موضوع خیلی گنگ و نا آشنا نیست . برای همین سریع میریم سر اصل مطلب .

لاراول کنار همه خوبیاش ، دو زبانه کردن و ایجاد 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]);
}

این ساده ترین راهه . اما بهترین نیست .