سایت چند زبانه با Yii

[rtl]

[font="Arial"][size="3"]یه سایت می خوام بنویسم به زبان های فارسی، عربی و انگلیسی. آقای خلقی مطلبی اینجا نوشتند که خیلی کمکم کرد ولی چندتا موضوع جدید.

۱- برای چیدمان استایل به صورت راست چین چطوری باید عمل کرد؟

۲- برای نگهداری مطالب سایت به چند زبان چه راههایی را پیشنهاد می کنید؟

[/size][/font]

[/rtl]

[font="Tahoma"][rtl]اگر خواستید از دیتابیس استفاده کنید با سه تا فیلد lng,str,trans که اولی پارامترهای en,fa,ir بگیری دومی جملات انگلیسی و سومی ترجمه مناسب . بعد توی سایت هر زبانی که ست شده بود از دیتابیس واکشی کنید . البته از فایل هم میتونید استفاده کنید اما دیتابیس راحتتره و یک کش 72 ساعته روش بذارید فکر نکنم به جایی بربخوره[/rtl][/font]

[rtl][font="Tahoma"]برای سایتهای چند زبانه از Yii::t()‎ استفاده میشه.

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

[/font][font="Tahoma"][/rtl]




Yii::app()->language = 'en'; 



[/font]

[font="Tahoma"] [rtl]بیشتر:

http://www.yiiframew.../en/topics.i18n

http://learnyii.blog…nalization.html

[/font][/rtl]

[rtl]

با تشکر.

فقط این چیزی که شما گفته اید فقط برای نگهداری ۲ زبان انگلیسی و فارسی است پس عربیش چی شد.[/rtl]

برای نگه داری n زبان هست .

[rtl]ببخشید متوجه نمی شم. چطوری میگید برای n زبان.

یکی از فیلدها که انگلیسی را نگه می دارد، یکی هم نوع زبان دیگری ترجمه مناسب به یک زبان است.

حالا برای نگهداری ترجمه مثلا نام یک کالا به زبان انگلیسی که هیچی، میگیم زبان ترجمه فراسی آن را هم تویtrans میزاریم و نوع زبان را هم توی lng می زاریم.

حالا می خوام همین نام کالا را به ترجمه عربی هم نگهدارم، چکار باید بکنم؟

حالا اینم بگم که این موضوع برای چند جدول با چند فیلد باید پیاده سازی بشه.

از اینها گذشته برای واکشی اطلاعات از دیتابیس چطوری باید عمل کرد، توی مدل؟ توی کنترلر؟ یا توی ویو باید زبان را مشخص و براساس آن از دیتابیس واکشی کنم؟

[/rtl]

[rtl]دوستان اینو تازه پیدا کردم. نظرتون درباره اش چیه؟

کلاس: CDbMessageSource

[/rtl]

لینک های زیر آموزش طراحی سایت های چند زبانه در ایی هست مطالعه کنید مشکل داشتید همین جا مطرح کنید.

استفاده از فایل:

http://www.yiiframework.com/forum/index.php?/topic/3182-quick-start-to-internationalize-your-application-in-yii-framework/

مفاهیم کلی:

http://www.yiiframework.com/doc/guide/1.1/en/topics.i18n

استفاده از دیتابیس:

http://www.yiiframework.com/doc/api/1.1/CDbMessageSource

تا بینهایت زبان رو با روش های فوق میتونید در یک سایت پشتیبانی کنیم

[rtl]خیلی ممنون، خدوم هم همین به همین راه رسیده بودم و این کلاس CDbMessageSource را تازه امروز پیداش کردم.

ولی یه موضوع دیگه، اون هم این که توی دیتابیس فرض کنید چندتا جدول دارم که هر کدوم از اونها چند فیلد دارند که باید ترجمه شوند. حالا راه حل چیه؟

از این گذشته چطوری باید اطلاعات را به ازای هر زبان و توی چه مرحله ای واکشی کنم؟

[/rtl]

[rtl] دوستان کسی نیست داستان را ادامه بده. بنده همچنان منتظرم. چکار باید بکنم؟ [/rtl]

[rtl]دوستان واقعا کسی نیست که روی i18n کار کرده باشه؟

خیلی خیلی گیج شدم؟

[/rtl]

[right]

سلام

من خودم تو سیستم های خودم از یه تکنیک استفاده می کنم که این اجازه رو بهم می ده که بتونم هر تعداد زبان که می خوام داشته باشم و بتونم در آینده هم ازشون استفاده کنم .

در مرحله اول من تمام جداولی رو که باید به چند زبان داده داشته باشن رو به ۲ جدول تبدیل می کنم ، به عنوان مثال اگر جدول

page

داشته باشم ای جدول رو به ۲ جدول

page و page_info

تبدیل می کنم

که با هم رابطه یک به چند دارند.

در جدول

page

من اطلاعات اصلی بدون ویژگی هایی که نیاز به چند زبانه بودن را دارند را ذخیره می کنم مانند:

active , date , . . .

اما در جدول دوم ویژگی هایی که نیاز به ترجمه دارند را ذخیره می کنم به همراه یک شناسه از جدول اول و یا فیلد که زبان را مشخص می کند .

حالا شما تنها کافیست که یک رابطه بین این دو ایجاد کنید.

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

PageInfo

میبایست یک

default scope

بنویسید که یک شرط به تمام

query

ها اضافه کند و آن هم می تواند چیزی شبیه به این باشد .

[left]

public function defaultScope()

{


	return array(


				


        'condition'=>"page_lang	=	:lang",


		'params'=>array(":lang"	=>	$_GET['language']),


    );


}

[/left]

به واسطه این اسکپ هر زمان شما نیاز به داده داشته باشید داده ها با فرمت مورد نیاز برای شما ایجاد خواهد شد .

فقط شما باید به این نکته توجه داشته باشید که برای فرم هایی که میخواهید به منظور ورود اطلاعات از آن ها استفاده نمایید باید ۲ مدل ارسال کنید ، هم مدل اصلی و هم مدل اینفو .

اگه بازم نیاز به توضیح داشتی بگو تا بیشتر برات بگم

[/right]

[rtl]ممنون از توجهتان.

ولی اینطوری افزونگی داده های دیتابیس زیاد نمیشه. به نظرم راه آقا رضا بهتره جواب بده که همه توی یک جدول و برای هر زبان یه رکورد ذخیره میشه؟ نه؟

[/rtl]

[right]

سلام

نه ، زمانی میگیم افزونگی داریم که یک داده رو چند جای مختلف ذخیره کنید ، در حالی که شما داده ی تکراری ندارید .

من این روش رو تست گرفتم و روی یه پایگاه داده ای ۵۰۰۰ داده ای بدون مشکل کار می کنه

[/right]

[rtl]ممنون. از راهنمایتان.

آیا راههای دیگری هم برای این کار وجو دارد؟

راستی نظرتان درباره روش کلاس خود YII به نام CDbMessageSource چیه؟

[/rtl]

[rtl][font=“Tahoma”]راستش راهی که جناب mereeelin فرمودند نمیدونم چرا یه جوری بهم نمیچسبه!! نمیدونم چرا :D البته جسارت کردم.

@Shahcheraghean ، لطفاً شما اول مشخص کنید که میخواهید محتوا که قراره در دیتابیس ذخیره بشن رو برای زبان های مختلف مجزا ذخیره کنید و یا اینکه صرفاً میخواهید پیغام های درون سایت رو به زبان های مختلف به کاربر نمایش بدید.

یعنی روی DATA میخواهید چند زبانه بودن رو داشته باشید و یا روی VIEW

یا بازهم آیا یعنی میخواهید متن یک خبر به زبان های مختلف توسط کاربر وارد و در دیتابیس ذخیره بشه و یا اینکه خبر تک زبانه درج میشه و سپس تنها منوی اخبار، کلمه تاریخ و کلماتی که به view مربوط هستند رو میخواهید با زبان های مختلف نمایش بدید؟

[/font][/rtl]

[rtl]ببینید. یه چیزی شبیه به همان.

می خواهم که کاربر مطالبی را که وارد می کند به چند زبان مثلا ۲،۳ یا حتی ۴ زبان وارد کند. حالا اینجا هم باید مطالب توی دیتابیس چند زبان باشند و هم مطالب خود view. برای ترجمه مطالب view مشکلی نیست می دونم که بامتد Yii::t() انجام میشه ولی برای مطالب توی دیتابیس نمی دونم از چه راههی برم یا حتی چطوری توی مدلم و ویو پیاده سازی کنم.

[/rtl]

[rtl][font="Tahoma"]بیشتر که فکر کردم دیدم راه جناب mereeelin ، راه بدی هم نیست و میشه گفت منطقی هم هست!

من مشکلم با دو تکه کردن جدول بود که با توجه به نوع مسئله، نمیتونه غلط باشه. البته با کمی هم ارفاق میشه دو جدول رو یکی کرد. که خب یک سری فیلد تکراری بوجود میاد مثل status و ویژگی هایی از این دست، که خب میشه اینطور استدلال کرد که هر رکورد دیتا در سایت برای هر زبان ماهیت مستقل داره و برای هر رکورد محتوا علاوه بر عنوان و متن و غیره، میتونه ویژگی های متفاوتی وجود داشته باشه، اینطور ادغام دو جدول میتونه توجیح پذیر باشه. یعنی فرض میکنیم یک مطلب در زبان انگلیسی ممکنه فعال باشه ولی در زبان فارسی غیرفعال. یا حتی یک مطلب ممکنه برای زبان انگلیسی وجود داشته باشه ولی برای زبان فارسی وجود نداشته باشه.

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

البته پیاده سازی هر یک از روشهای فوق بستگی به نوع سناریوی پروژه داره.

ضمناً در حالت بهینه تر میشه به هر یک از روشهای فوق یک جدول دیگه هم اضافه کرد. یعنی برای نگهداری خود زبان ها هم از یک جدول مستقل استفاده کنیم که دیگه یک فیلد enum برای en و fa و… نگذاریم و یک رابطه چند به یک با جدول زبان برقرار کنیم.

برای استفاده از روشهای فوق، فکر میکنم این اکستنشن بهتون کمک کنه:

http://www.yiiframew…l-active-record

البته باش کار نکردم ولی به نظر میرسه به چیزی که درموردش صحبت شد نزدیک باشه.

اینها همه برای نگهداری دیتا ها بود.

اما برای چندزبانه کردن کلمات درون سایت هم از همون توابع I18N که yii در اختیارمون میگذاره استفاده میشه که به سه روش CPhpMessageSource و CGettextMessageSource و CDbMessageSource نگهداری و مدیریت میشه و قابل استفاده هستند.

[/font][/rtl]

[rtl]با اجازه آقا نبی. ببخشید اگه جسارت میشه.

ولی راه آقا رضا بیشتر بهم می چسبه تا راهی که شما پیشنهاد دادید.

تو راه اقا رضا ما توی جداول برای ترجمه به ازا هر فیلد فقط یه فیلد تکراری خواهیم داشت ولی توی اون روش شما به هر فیلد توی جدول دیگه چند فیلد دارید که این علاوه بر یک جدول اضافه دو فیلد id نیز اضافه می کند.

حال شما فرض بگیرید تعداد جداولی که قرار است مطالبش ترجمه شوند ۳ عدد باشند. تو اون حالت باید ۳ جدول اضافه دیگر نیز داشته باشیم.

[/rtl]

[font="Tahoma"][rtl]میتونی همون روشی رو که گفتم رو با دو تا جدول پیاده کنی و از طریق id به هم وصل کنی راحت یعنی در کل اون فیلدهای تکراری شناسه های عدد میشن ک[/rtl][/font]

[font="Tahoma"][rtl]اما یه سوال ، نهایتا چند تا زبان داری؟[/rtl][/font]