{{ locked_reason }} لاراول {{ (replies_count ? replies_count : 'هیچ') | farsi }} جواب ١۵ بار دیده شده

{{ thread.title }}

@matin {{ experience | farsi }} تجربه ۵ ماه پیش

سلام.

من یه پروژه داشتم که توی اون از شیوه های مختلف و موءثری برای ایجاد دو جهت rtl و ltr و چندین زبان استفاده نمودم. این شیوه ها رو جایی دیگری برای laravel ندیدم برای همین خواستم با شما در میان بذارم ، امید است که مفید باشد.

  • ذخیره زبانها و ترجمه هاشون توی دیتابس.

  • ایجاد دو جهت طوری که از یه تمپلیت استفاده شده باشه و یو آر ال متفاوت باشه.

این شیوه ها هر کدوم فایده های داره که به نوبت شرح داده میشه، در ضمن منتظر نظرات و انتقادات سازنده تون استم، برای بهتر کردن این شیوه ها یا استفاده از راه حل های مناسبتر.


ذخیره زبانها توی دیتابس

فایده ها
  • ممکن بخواهیم بعد از تکمیل پروژه ، زبانهای دیگر و ترجمه های دیگری ایجاد کنیم ، یا ترجمه های موجود رو ویرایش کنیم ، برای همین خیلی بهتره تا زبانها و ترجمه هاشون توی دیتابس ذخیره بشه. و این برای طراحان هم راحت تره بخصوص برای فارسی زبانها ها. حتی اگر ادیتور ها زبان فارسی رو پشتیبانی کنه بازهم در وقت نوشتن متن فارسی توی فایلها به خاطری راست به چپ بودنش به مشکل بر میخوریم.

  • درین روش دوتا TABLE بصورت واضح و روشن در نظر گرفته شده که خیلی راحت میشه زبان افزود یا ترجمه رو ویرایش کرد.

شرح

جدول اولی که موجوده شامل لیست زبانها است.

CREATE TABLE `languages` (
  `language_id` int(11) NOT NULL,
  `name` longtext,
  `db_field` longtext,
  `lan_dir` varchar(100) DEFAULT NULL,
  `align` varchar(100) DEFAULT NULL,
  `dif_align` varchar(100) DEFAULT NULL,
  `status` longtext,
  `img` varchar(150) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `languages` (`language_id`, `name`, `db_field`, `lan_dir`, `align`, `dif_align`, `status`, `img`) VALUES
(1, 'English', 'en', 'ltr', 'left', 'right', 'ok', 'language_list_english.jpg'),
(2, 'Persian', 'fa', 'rtl', 'right', 'left', 'ok', 'language_list_farsi.jpg');

ALTER TABLE `languages`
  ADD PRIMARY KEY (`language_id`);

ALTER TABLE `languages`
  MODIFY `language_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
COMMIT;

در جدول زبانها من دوتا Data هم وارد کردم تا بهتر درکش کرد. و ستون های مثل align ، dif_align رو برای استفاده توی css و انداختن باکس ها در جاهای مختلف با تغییر زبان درست کردم، status هم برای نمایش یا عدم نمایش زبان توی View استش.

جدول بعدی برای ذخیره کردن ترجمه ها استش.

CREATE TABLE `translates` (
  `word_id` int(11) NOT NULL,
  `word` longtext,
  `en` varchar(500) DEFAULT NULL,
  `fa` varchar(500) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `translates` (`word_id`, `word`, `en`, `fa`) VALUES
(1, 'Home', 'Home', 'صفحه اصلی'),
(2, 'Who_We_Are', 'Who We Are', 'ما که هستیم'),
(3, 'About_Us', 'About Us', 'در باره ما'),
(4, 'Our_Services', 'Our Services', 'خدمات ما');

ALTER TABLE `translates`
  ADD PRIMARY KEY (`word_id`);

ALTER TABLE `translates`
  MODIFY `word_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
COMMIT;

پسوند هر زبان درین جدول به یه ستون تبدیل شده و ترجمه هاش توی اون ستون قرار میگیره. برای استفاده ازین ترجمه ها نیاز بود یه کمک کننده یا helper بسازم.

یک کمک کننده به اسم Translate ساختم که شامل کدهای زیر است.

class Translate {
    public static function translate($word,$locale) {
        $find_word = DB::table('translates')->where('word', $word);
        if($find_word->count() > 0){
            if($find_word->first()->$locale !== null  && $find_word->first()->$locale !== ''){
                $return = $find_word->first()->$locale;
            }
            else{
                $return = ucwords(str_replace('_', ' ', $word));
            }
        }
        else{
            $data['word'] = $word;
            $data['en'] = ucwords(str_replace('_', ' ', $word));
            DB::table('translates')->insert($data);
            $return = ucwords(str_replace('_', ' ', $word));
            $locale = 'en';
        }
        return $return;
    }
}

بعد از صدا زدنش همراه دو پارامتر که یکی کلمه است و دومی زبان برای ترجمه لغات. در صورتی که کلمه صدا زده شده توی دیتابس وجود نداشته باشه این کمک کننده قدرت اینو داره تا اون کلمه رو ایجاد کنه. کلمه ها در View باید به زبان انگلیسی نوشته بشه و عوض Space از Underscore باید استفاده کرد.

برای ایجادhelper از این لینک آموزشی میشه استفاده کرد.بعد از ساخت کمک کننده میریم و یه مشخصه برای صدا زدنش توی config/app.php در قسمت 'aliases' => درست میکنیم. مشخصه که من ساختم اینه Trans یعنی با این کد

{{'{{'}} Trans::translate('Who_We_Are',$locale) }}

میشه توی View یه متنی رو به زبانهای موجود هرچی $locale باشه ترجمه کرد. اینکه $locale چه میتوانه باشه و چه هست اینو توی قسمت دوم مقاله شرح میدم.


ایجاد یو آر ال های جدا گانه برای هر زبان

فایده ها
  • موتور های جستجو قادر به index کردن همه زبانهای موجود در وبسایت میشن.

  • درین روش دیگه نیازی نیست چندین تیمپلیت استفاده نماییم.

  • اگر وبسایت مون Cache هم شود. بازهم قادر به تغییر زبانش استیم. در حالیکه وقتی یک URL باشه Cache جلو تغییر زبان و جهت رو میگیره.

شرح

برای استفاده ازین روش ضرور است هر Route که میسازیم متغییر locale رو هم داشته باشه مثال

Route::get('/{locale}/about','ViewController@about');

بعداً توی کنترولر ازین کدها

public function about($locale='en')
{
    $language = DB::table('languages')->where('db_field', $locale);
    if ($language->count() > 0){
        $data['dir'] = $dir = $language->first()->lan_dir;
        $data['locale'] = $locale = $locale;
        $data['lan_dir'] = $lan_dir = $language->first()->align;
        $data['dif_lan'] = $dif_lan = $language->first()->dif_align;
    }
    else{
        $data['dir'] = $dir =  'ltr';
        $data['locale'] = $locale = 'en';
        $data['lan_dir'] = $lan_dir = 'left';
        $data['dif_lan'] = $dif_lan = 'right';
    }
    return view('about_us')->with($data);
}

استفاده میکنیم، تا ضروریات مون رو برای زبان و جهت مورد نظر از دیتابس بگیریم. بعداً توی View استایل های مختلف رو برای هر جهت که در فولدر های مختلفی موجوده صدا میزنیم، مثلا.

<link rel="stylesheet" type="text/css" href="{{'{{'}} 'assets/'.$dir.'/style.css' }}">

لینک های هم که درست میکنیم باید $locale رو توش داشته باشه، مثلاً.

<a class="nav-link" href="{{'{{'}} URL::to($locale.'/about') }}"> {{'{{'}} Trans::translate('Who_We_Are',$locale) }}</a>

پایان