سلام.
من یه پروژه داشتم که توی اون از شیوه های مختلف و موءثری برای ایجاد دو جهت 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>
تمام حقوق © 2014 - 2024برای شرکت خدماتی تکنالوژی معلوماتی زروان محفوظ است
یا درخواستی ارسال کنید