تالار گفتمان nCIS.ir

نسخه‌ی کامل: طراحی دیتابیس چند زبانه (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
با عرض سلام خدمت تمام دوستان گرامی 
دوستان با توجه به نیازم باید  یه وب سایت چند زبانه طراحی کنم می خواستم ببینم آیا با روش زیر صحیح هستش :
id     |    en_menu   | Fa_menu
--------------------------------------------------
صفحه اصلی  | home    |  ش1


البته یه روش دیگه هم امتحان کردم  روی این هم نظر بدین ممنون میشم البته فکر کنم اشتباه باشه  ولی اضافه کردن زبان سوم توش خیلی راحت تره 
جدول اول : زبان ها ( id | lan )
جدول دوم :  ساختار منو ( id | lan _id| menu_name)
[عکس: Capture.PNG]

 اگر راه بهتری هم هست ممنون میشم راهنماییم کنید .
برای چندزبانه‌سازی چندین راه مختلف هست.
  • ساده‌ترینش قراردادن ستون اضافه توی هر جدول برای هر زبان هست که در اکثر مواقع روش مناسبی نیست چون هم افزونگی داره و هم ممکنه تمام رکوردها ترجمه نداشته باشن. ازطرفی اضافه و کم‌کردن زبانهای جدید مستلزم تغییر در Schema یا همون ساختار جداول هست که اصلاً توصیه نمیشه چون احتمالاً مجبورتون میکنه کدها رو هم اصلاح کنید (بخصوص اگه با MVC کار کنید مجبورین مدلها رو اصلاح کنید و درنتیجه کدهایی هم که از مدلها استفاده میکردن، احتمالاً تغییر میکنن).
  • روش بعدی اینه که خیلی هم رایجه، یه جدول languages داشته باشین و توی جداولتون یه فیلد language_id که کلید خارجی هست برای اتصال به جدول languages و اینطوری مشخص کنید که اون رکورد، مربوط به چه زبانی هست. انعطاف این روش خوبه ولی حجم جداول بالا میره چون به‌ازای هر نسخه ترجمه، یه رکورد به جدول اضافه میشه و درنتیجه جداول سنگین میشن.
  • یک روش دیگه اینه که یه جدول جدا برای هر زبان بگذارین. مثلاً posts_en و posts_fa و... که این روش نسبت به روشهای قبلی کمی بهتره چون درصورت افزودن زبان جدید، فقط یه جدول (و احتمالاً مدل مربوطه) اضافه میشه ولی ازنظر کدنویسی یکم باید هوشمندانه عمل کنید تا براساس زبان انتخابی کاربر، مدل مناسب انتخاب و رکوردها استخراج بشه.
  • روش دیگری که به ذهنم میرسه، یه جدول جداگانه برای ترجمه‌هاست. البته از این روش بیشتر برای محتوای خود سایت (مثل عناوین منوها و...) استفاده میشه. در این روش یه جدول دارین برای زمینه‌های ترجمه یا context، یه جدول برای زبان‌ها یا languages و یه جدول هم برای متون که دو کلید خارجی context_id و language_id برای ارتباط با اون دو جدول و یه فیلد term و یه فیلد value یا translation که با کمک این دو فیلد (کلیدواژه و متن ترجمه) و زمینه و زبان، میتونین محتوای دلخواه رو پیدا کنید. کاربرد زمینه، اختیاریه و برای وقتی مناسبه که یه کلمه توی بخشهای مختلف ترجمه‌های متفاوتی داشته باشه. مثلاً کلمه cookie توی زمینه کامپیوتر و آشپزی معنای متفاوتی در زبان فارسی داره (کوکی و کلوچه) و میخواین با مشخص‌کردن زمینه، ترجمه مناسب رو برای اون زبان انتخاب کنید. در اینجا term مقدار cookie و بعنوان مثال context مقدار computer داره و اگه زبان رو fa انتخاب کنید، اونوقت به شما کلمه «کوکی» تحویل داده میشه.

روشهای دیگه مثل استفاده از فایلهای mo/po و... هم هست که چون از فایل بجای دیتابیس استفاده میشه، اینقدر به شما انعطاف‌پذیری نمیده.
ممنون بابت پاسختون ولی امکانش هست روش چهارم رو یکم بیشتر توضیح بدین ؟ یکم برام گنگ بود
من برای چند زبانه سازی از فایل استفاده کردم  
فکر میکنم سرعتش هم بیشتر باشه و بهینه تر هست
یه فایل زبان دارم که یه اراییه دو بعدی توشه و اندیس دوم اسم زبان مورد نظر هست و مقادیر هم کلمات یا جملاتیه که نیاز به ترجمه دارن
اینجوری فکر میکنم نیاز به رکوئیست فرستادن به دیتابیس هم کمتر میشه و بهتره برای سایتتون
این یه تیکه از اوون فایل براتونمیزارم امیدوارم کمک کنه 
class language

{    

   public $lang = array();

   public function __construct(){

       $this->lang['fa']= array(

           'emptyName'              =>  'لطفا نام را وارد کنید',

           'emptyFamily'            =>  'لطفا نام خانوادگی را وارد کنید',

           'emptyUserName'          =>  'لطفا نام کاربری را وارد کنید',

           'emptyPassword'          =>  'لطفا کلمه عبور را وارد کنید',

           'emptyRePassword'        =>  'لطفا تکرار کلمه عبور را وارد کنید',

           'passwordNotMatch'       =>  'کلمه عبور و تکرار آن با هم برابر نیستند',

           'emptyEmail'             =>  'لطفا ایمیل را وارد کنید',
'emptyFieldTitle'        => 'عنوان را وارد کنید',
           'emptyCaptcha'           =>  'لطفا کد امنیتی را وارد کنید', 

           'wrongCaptcha'           =>  ' کد امنیتی اشتباه است',
'emptyAddress'           =>  ' لطفا ادرس را وارد کنید',
'emptyComment'           => 'لطفا متن پیام را وارد کنید',
           'welcome'                =>  'خوش آمدید',

           'publishDate'            =>  'تاریخ انتشار',
'poll'                   => 'نظر سنجی',
'onlineLearning'         =>  'آموزش آنلاین',
           'home'                   =>  'خانه',
           'edite'                  => 'ویرایش',
           'selectSendMethod'        => 'انتخاب روش ارسال',
           'news'                   =>  'اخبار',
'tfap'                   => 'تائید نهایی و پرداخت',

           'profile'                =>  'پروفایل',

           'products'               =>  'محصولات',
           'movieGallery'           =>  'گالری ویدئو',
روش خوبیه ولی استاتیک هست. یعنی توی پنل مدیریت نمیتونید به راحتی این موارد رو ویرایش کنید. باز اگه XML میذاشتین اوضاع بهتر بود. بهرحال هر روشی مزایا و معایب خاص خودش رو داره.
ممنون از دوستان ولی خوب اینجوری اگر بخواهیم به سایت مطلب اضافه کنیم که به مشکل می خورم ( سایت داینامیک هستیش با قابلیت ارسال و ویرایش مطالب ) نکته مهم هم این که این امکان وجود داره که به سایت بعد ها زبان اضافه کنیم
توی روشهایی که بنده اشاره کردم چنین امکانی وجود داره.
(14-05-1395، 12:03 ب.ظ)Mr.naghlani نوشته: [ -> ]ممنون بابت پاسختون ولی امکانش هست روش چهارم رو یکم بیشتر توضیح بدین ؟ یکم برام گنگ بود

چنین جداولی رو درنظر بگیرین:

روش دیگری که به ذهنم میرسه، یه جدول جداگانه برای ترجمه‌هاست. البته از این روش بیشتر برای محتوای خود سایت (مثل عناوین منوها و...) استفاده میشه. در این روش یه جدول دارین برای زمینه‌های ترجمه یا context، یه جدول برای زبان‌ها یا languages و یه جدول هم برای متون که دو کلید خارجی context_id و language_id برای ارتباط با اون دو جدول و یه فیلد term و یه فیلد value یا translation که با کمک این دو فیلد (کلیدواژه و متن ترجمه) و زمینه و زبان، میتونین محتوای دلخواه رو پیدا کنید. کاربرد زمینه، اختیاریه و برای وقتی مناسبه که یه کلمه توی بخشهای مختلف ترجمه‌های متفاوتی داشته باشه. مثلاً کلمه cookie توی زمینه کامپیوتر و آشپزی معنای متفاوتی در زبان فارسی داره (کوکی و کلوچه) و میخواین با مشخص‌کردن زمینه، ترجمه مناسب رو برای اون زبان انتخاب کنید. در اینجا term مقدار cookie و بعنوان مثال context مقدار computer داره و اگه زبان رو fa انتخاب کنید، اونوقت به شما کلمه «کوکی» تحویل داده میشه.


نقل قول:
contexts
+ id (PK)
+ name (varchar(255))

نقل قول:
languages
+ id (PK)
+ locale (varchar(255))

نقل قول:
translations
+ id (PK)
+ context_id (int(11) - index)
+ language_id (int(11) - index)
+ term (varchar(255))
+ value (text)

حالا واسه اینکه فرضاً ببینید عبارت cookie توی زمینه وب (که id اون توی جدول context مقدار 5 هست) و در زبان فارسی (که id اون توی جدول languages مقدار 1 هست) چی میشه، این کوئری رو مینویسید:
SELECT `value` FROM `translations` WHERE (`context_id`='5' AND `language_id`='7' AND `term`='cookie')

البته میتونین برای راحتی بیشتر دو جدول contexts و languages رو هم نادیده بگیرین و مستقیماً context و locale رو توی جدول ترجمه‌ها ذخیره کنید. اونوقت اینطوری کوئری بنویسید:
SELECT `value` FROM `translations` WHERE (`context`='php' AND `locale`='fa_IR' AND `term`='cookie')

برای افزایش سرعت حتماً فیلدهای context و locale رو index کنید.
خیلی ممنون خیلی بهم کمک کردش این مثال شما
یه روش دیگه هم به ذهنم رسید برای مطالب سایت که پویا هستن. توی این روش شما یه جدول دارین واسه مطالب و یه جدول دیگه واسه ترجمه‌ها. جدول مطالب فقط محتوا رو به زبان اصلی سایت ارائه میده و توی جدول ترجمه‌ها نسخه‌ی ترجمه‌شده‌ی هر مطلب رو برای هر زبان میگذارین. جدول ترجمه‌ها شامل این فیلدهاست:
نقل قول:
id
post_id
locale
translation
فیلد id کلید اصلیه و post_id هم کلید خارجی هست برای ارتباط با جدول مطالب. اینطوری برای هر زبان ترجمه رو توی جدول ترجمه‌ها دارین و اگه بخواین ببینید ترجمه‌ای وجود داره یا نه کافیه براساس زبان و شماره پست سرچ کنید. اگه چیزی بود نشون بدین و اگه نبود محتوای اصلی رو از جدول مطالب نشون بدین.