رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
بهترین روش پیاده سازی یک سیستم n زبانه
#1
Information 
سلام
دارم روی یک پروژه کار میکنم و می خواهم این پروژه را به سیستم چند زبانه مجهز کنم.

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

راه حل اول من :

ذخیره سازی ترجمه های انجام شده در فایل های PHP و مدیریت آن در پایگاه داده

راه حل دوم من :

ذخیره سازی ترجمه ها در خود پایگاه

نحوه استفاده در هر دو حالت : بکارگیری شناسه فایل ترجمه در جدول یا یک ارتباط n-n بین جدول ترجمه و جدول مورد نظر

راحل شما ؟

به نظر شما کدام راه حل بهتر است ؟ آیا راه حلی بهتری سراغ دارید ؟
Smile
پاسخ
تشکر شده توسط:
#2
مثل اینکه بحث را خوب مطرح نکردم !

سوال من این است که مثلا شما فکر کنید یک پستی با عنوان "سلام من PHP هستم" و محتوای "PHP یک زبان اسکریپت نویسی ..." داریم.
حال سیستم من یک سیستم چند زبانه است و باید این متن ترجمه بشود.

خوب یک جدول ترجمه داریم که یک شناسه و نوع زبان (مثلا fa,en,fr و ...) و محتوا ترجمه را شامل میشه.

بعد مثلا بین جدول پست و جدول ترجمه ارتباطی بر قرار می کنیم و ترجمه ها را ارتباط می دهیم.

خوب همه چی اینجا درست !

ولی من سوال این هست که این ترجمه ها چون داینامیک هستند در پایگاه باشه بهتره یا در فایل های PHP یعنی بجای ذخیره سازی در پایگاه در PHP ذخیره کنیم.
Smile
پاسخ
تشکر شده توسط:
#3
بنظر من هر دو روش جوابگو هستن. هم میشه از فایلهای mo/po استفاده کرد و هم میشه از سیستم ترجمه مشابه Yii بهره گرفت. البته انعطاف دیتابیس بیشتره ولی سرعت فایل رو نداره.
پاسخ
تشکر شده توسط:
#4
همان انعطاف پذیری را میگم. باید بیشتر تجزیه و تحلیل کنم و موجودیت های سیستم را درگیر این موضوع کنم ببینم کدوم بهتر و جوابگو میشه

mo/po این ویژگی در PHP به نظر شما بهینه است ؟ چون داره از خود رشته برای جستجو و ترجمه استفاده می کنه.(تابع gettext)
Smile
پاسخ
تشکر شده توسط:
#5
من خودم بشخصه به این نتیجه رسیدم که برای ترجمه های استاتیک نظیر قالب و ... از فایل PHP با یک کلید از نوع آرایه ایی استفاده کنم که خیلی سرعت داره
Smile
پاسخ
تشکر شده توسط:
#6
دقیقاً همین ساختار توی فریمورک Yii هم استفاده شده.
پاسخ
تشکر شده توسط:
#7
چه جالب ولی من که هیچ وقت نتونستم با فریم ورک کنار بیام.
Smile
پاسخ
تشکر شده توسط:
#8
توصیه میکنم یه تجدید نظر در این زمینه داشته باشین.
پاسخ
تشکر شده توسط:
#9
من یکم فکر کردم و به این نتیجه رسیدم که اگر بخواهم هر چی تو دیتابیس را ترجمه کنم بهتر است موجودیتی با مشخصات زیر درست کنم.

ترجمه (شناسه - نام جدول - ستون ترجمه - ستون کلید - کلید خارجی - نام استاندارد زبان - ترجمه)

اینطوری دیگر نگران هیچ ویژگی ایی دیگری نیستم که اگر بعدا بخواهد به سیستم اضافه شود و در اینصورت استفاده مجدد افزایش و پیوستگی کاهش پیدا می کند.

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

البته یک مشلی وجود دارد برای آن دسته از جدول هایی که کلید های اصلی آن ها دو تا هستند.(ولی محتوا در این نوع جدول ها خیلی کم پیش میاد وجود داشته باشد)
Smile
پاسخ
تشکر شده توسط:
#10
البته افزونگی داده هم داریم اینجا

ولی به نظر شما چقدر میتونه باشه ؟

نظر خودم : فکر نکنم اینقدر مهم باشه
Smile
پاسخ
تشکر شده توسط:
#11
ساختار Yii به این صورته که یک پوشه درست میکنید به اسم messages و برای هر زبان، یک پوشه داخلش میسازین (مثلاً fa و en و...) و داخل هر پوشه، یک فایل php. برای هر دسته بندی از ترجمه ها میگذارین. مثلاً config.php و alerts.php و...) و بعد، توی هر فایل، یک آرایه بصورت key => value میسازین.

مثلاً توی فایل messages/en/alerts.php این کد رو مینویسید:
return array(
    // ...
    'operation-success' => 'Operation was successful.',
    // ...
);

و توی فایل messages/fa/alerts.php این کد رو مینویسید:
return array(
    // ...
    'operation-success' => 'عملیات موفقیت آمیز بود.',
    // ...
);

حالا توی کدتون میتونید این شکلی زبان رو عوض کنید:
Yii::app()->language = 'fa'; // or 'en';

و اینطوری میتونید ترجمه موردنظر رو نمایش بدین:
echo Yii::t('alerts', 'operation-success');

و این متد خودش برحسب language انتخابی میره فایل موردنظر رو بارگذاری میکنه و اندیس مشخص شده رو پیدا کرده و مقدارش رو نمایش میده.
پاسخ
تشکر شده توسط:
#12
البته این سیستم برای پیامهای خود سایت مناسبه ولی اگه فرضاً یه سایت خبری چند زبانه دارین میسازین، ساده ترین کار اینه که برای هر زبان، یک فیلد به جدول news اضافه کنید که Nullable هم هست (برای جلوگیری از مصرف بیهوده حافظه) و ترجمه خبر به هر زبانی رو توی فیلد مربوطه بگذارین. بعد موقع بارگذاری، اگه ترجمه به اون زبان وجود داشت (فیلدش Null نبود) نشون بدین وگرنه محتوای ستون مربوط به زبان پیشفرض رو لود کنید.
پاسخ
تشکر شده توسط:
#13
(20-03-1394، 11:47 ق.ظ)ADMIN نوشته: البته این سیستم برای پیامهای خود سایت مناسبه ولی اگه فرضاً یه سایت خبری چند زبانه دارین میسازین، ساده ترین کار اینه که برای هر زبان، یک فیلد به جدول news اضافه کنید که Nullable هم هست (برای جلوگیری از مصرف بیهوده حافظه) و ترجمه خبر به هر زبانی رو توی فیلد مربوطه بگذارین. بعد موقع بارگذاری، اگه ترجمه به اون زبان وجود داشت (فیلدش Null نبود) نشون بدین وگرنه محتوای ستون مربوط به زبان پیشفرض رو لود کنید.

الان به نظر خودتون برای همه نوع موارد جوابگو نیست ؟

همین خبری که گفتین مثلا یک title و content داره دیگه درسته

خوب این به راحتی به جدول ترجمه ما ضاافه میشه

نقل قول:البته این سیستم برای پیامهای خود سایت مناسبه

یعنی چی ؟
Smile
پاسخ
تشکر شده توسط:
#14
البته این راه حلی که شما گفتین فقط قابلیت استفاده مجدد را میکشه پایین

من شاید بخواهم تمام زمان زنده دنیا را بزارم اونقت برای هر کدوم یک فیلد بزارم ؟ اصلا منطقی نیست !
Smile
پاسخ
تشکر شده توسط:
#15
خوب برای مواردی که چند فیلد دارین که قراره ترجمه بشن (مثل عنوان و متن و چکیده و...) بهتره از ارتباطها استفاده کنید. یک جدول برای زبانهای مختلف که میتونید هرکدوم رو خواستین، فعال یاغیرفعال کنید. حالا یک جدول برای اخبار دارین که بجز فیلد id که کلید اصلی هست، یک فیلد news_id هم داره که شماره خبر رو مشخص میکنه و برای تمام ترجمه های یک خبر، یک رکورد با news_id یکسان درج میکنید و توی فیلد language_id هم مشخص میکنید که ترجمه مربوط به چه زبانی هست. اینطوری تمام ترجمه های یک زبان رو هم به راحتی با کوئری میتونید دریافت کنید و برای سرعت بیشتر، این فیلد رو index هم میکنید.
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان