PDA

View Full Version : بهترین راه برای پیاده سازی سایت های چند زبانه



pswin.pooya
جمعه 29 آذر 1392, 00:46 صبح
سلام
دوستان راه حل خوبی برای پیاده سازی سایت های چند زبانه سراغ دارین؟. مخصوصا برای پیام های سیستم مثل پیا های خطا و ...

mroveissi
جمعه 29 آذر 1392, 02:11 صبح
بله. در سایت های چند زبانه شما باید از چند فایل متنی و یک تابع استفاده کنید. البته در نظر داشته باشید که همواره باید زبان فعال و یا انتخابی سایت را در url داشته باشید.
به عنوان مثال در فایلی با نام fa.lang تمامی text های خود را به صورت زیر می نویسید
کاربر=user
سلام=hello
برای هر زبان یک فایل می سازید و در هر فایل هر لغت را با زبان دلخواه نوشته و در مقابلش معادل انگلیسی لغت را می نویسید. بعد تابعی را می نویسید که به عنوان ورودی معادل انگلیسی و زبان را دریافت کند و به عنوان خروجی همان لغت با زبان خواسته شده را بازگرداند. جهت حذف نام تابع و زیبایی کار خود از دو تا آندرلاین استفاده کنید.


function __(){

}

MMSHFE
جمعه 29 آذر 1392, 08:50 صبح
توصیه میکنم از ساختار Internationalization فریمورکهای معروف مثل Yii هم ایده بگیرین. تو این ساختار، یک پوشه messages داریم که برای هر زبان، یک پوشه داخلش میسازیم و برحسب زمینه ترجمه، یک فایل داخل پوشه هر زبان ساخته میشه (مثل default.php و contract.php و...) و یک تابع داره به اسم t (که شما میتونید هر اسم دلخواه دیگه رو براش درنظر بگیرین) که کارش اینه که برحسب زبان انتخابی فعال (که یکبار توی تنظیمات سایت نوشته شده و میشه توسط منوهای موجود در سایت انتخاب و در Session و درصورت لزوم توی جدول اطلاعات کاربر ذخیره بشه) میره و فایل مناسب رو پیدا و ترجمه رو از داخلش استخراج میکنه. ساختار تابع t هم به این صورته که دو پارامتر میگیره. یکی زمینه ترجمه و یکی دیگه، اندیس عبارت موردنظر تا بدونه ترجمه رو از کجا استخراج کنه. توی فایلهای مربوطه هم چنین کدی داریم:


<?php
return array(
'username' => 'نام کاربری',
'password' => 'رمز عبور',
);
?>

تا با includeشدن فایل، به راحتی بشه برحسب اندیسی که توی تابع t مشخص شده، رشته رو استخراج کرد. زمینه ترجمه هم کمک میکنه که بتونید برای یک اندیس، در بخشهای مختلف ترجمه های مختلفی بگذارین. مثلاً کلمه Sign در بخش Contract به معنی امضای قرارداد باشه و در بخش کاربری به معنی ورود یا خروج. ذخیره زبان فعال در تنظیمات سایت و امکان بازنویسی توسط سشن یا اطلاعات موجود در جدول کاربر هم به شما امکان Customizeکردن زبان برای هر کاربر و همچنین عدم نیاز به درج زبان در تمام URLهای سایت رو میده.
امیدوارم خوب توضیح داده باشم.

pswin.pooya
جمعه 29 آذر 1392, 11:31 صبح
یعنی راهی به جزء استفاده از این نوع آرایه ها وجود نداره؟ خب این راهکار که خیلی ها از اون استفاده می کنن. زیاد جالب به نظر نمی یاد

engmmrj
جمعه 29 آذر 1392, 15:46 عصر
از XML هم میتونید استفاده کنید .

pswin.pooya
شنبه 30 آذر 1392, 00:29 صبح
از XML هم میتونید استفاده کنی
مثل دات نت میشه.

ایده آرایه کلا خوبه اما آرایه های بزرگ میتونه حافظه زیادی رو اشغال کنه و سرعت رو کاهش بده. منتها فکر کنم XML از آرایه هم بدتر باشه. این اولین باری هست که واقعا هیچ چیز خاصی تو ذهنم نیست و هیچ ایده ای در موردش ندارم

MMSHFE
شنبه 30 آذر 1392, 01:06 صبح
یعنی راهی به جزء استفاده از این نوع آرایه ها وجود نداره؟ خب این راهکار که خیلی ها از اون استفاده می کنن. زیاد جالب به نظر نمی یاد
صرفاً اینکه یک ایده رو خیلیها استفاده میکنن، به معنای بد بودنش نیست. اختراع مجدد چرخ فقط زمانی معنا داره که چرخ جدید، بهتر از قبلی باشه. میتونید از دیتابیس هم برای نگهداری مقادیر استفاده کنید. به این ترتیب که یک جدول Language دارین که هر رکورد، یک کلید داره و برای هر زبان، یک فیلد که ترجمه موردنظر داخلش ذخیره میشه. حالا با کمک کلید و استخراج فیلد موردنظر میتونید ترجمه دلخواه رو بدست بیارین. برای اضافه کردن زبان جدید هم کافیه یک ستون به جدول مذکور اضافه کنید و ترجمه ها رو داخلش بنویسید. برای کاهش دسترسیها به دیتابیس هم میتونید کوئریها رو Cache کنید.

eshpilen
شنبه 30 آذر 1392, 08:26 صبح
ایده آرایه کلا خوبه اما آرایه های بزرگ میتونه حافظه زیادی رو اشغال کنه و سرعت رو کاهش بده. منتها فکر کنم XML از آرایه هم بدتر باشه. این اولین باری هست که واقعا هیچ چیز خاصی تو ذهنم نیست و هیچ ایده ای در موردش ندارم
premature optimization is the root of all evil

eshpilen
شنبه 30 آذر 1392, 08:37 صبح
شما صرفا چون در برنامه نویسی تاحالا با چنین مواردی برخورد نکردید (یا خیلی کم برخورد کردید)، بنظرتون غیرعادی و ناخوشایند میاد.
منظورم مواردی هست که یه چیزی وجود داره که چندان نمیشه فشردش کرد، راه هوشمندانه و نبوغ آمیز و چند مدل الگوریتم جالب براش وجود نداره، قاعدهء روشن و ریاضی نمیشه براش پیدا کرد، و اینطور چیزها.
بنابراین سعی کنید منشاء فکر خودتون رو بشناسید که از روی احساسات غریزی است یا منطق و تحلیل علمی. غرایز همیشه درست و کارا نیست.
این جملهء « premature optimization is the root of all evil » جملهء معروفی است و مفهوم واقعی و عمیقی داره.
بیشتر برنامه نویسان درمورد ضرورت بهینه سازی اغلب تصور درستی ندارن و اشتباهات بزرگی در این زمینه مرتکب میشن.
ضرورت و شکل و مکان بهینه سازی چیزیه که در خیلی موارد نمیشه بر روی حدس و تصور درموردش اتکا کرد، و نیاز به تست/تجربهء عملی داره تا ثابت بشه (بعضی وقتها حتی با وجود تجربیات مشابهی در گذشته، بازم نمیشه خیلی مطمئن بود و مورد تا مورد ممکنه تفاوتهای قابل توجهی دیده بشه).

بنظر بنده در آرایه ذخیره کردن اتفاقا میتونه از هر روش دیگری بهینه تر باشه در کل. البته به شرطی که حجمش از حدی که دیگه برای آرایه ها بهینه نباشه تجاوز نکنه. ولی خب بدون تست و تجربهء عملی بهتره آدم از خودش قضاوتی نکنه که واقعا این حد چقدره. من فکر میکنم برای بیشتر سایتها هیچ مشکل جدی ای ایجاد نکنه. الان دیگه RAM در اون حد محدودیت و مشکلی نداره که با دوتا متن بخواد چیزی بشه. نهایت میخواد حجمش چقدر بشه مثلا؟ 100 کیلوبایت؟ کمتر؟ بیشتر؟ بعد حساب کنید سرور چقدر رم داره و چقدر از رمش مال شماست قاعدتا، و چه تعداد درخواست همزمان رو با احتساب منابع و محدودیت ها و bottleneck های دیگرش میتونه جواب بده (و اصلا آیا ترافیک همزمان سایت شما محتمل هست که بطور معمول اونقدر باشه یا نه؟)، و بعد مقدار حافظهء مصرف شده برای این آرایه رو در تعداد درخواستهای همزمان ضرب کنید ببینید چقدر میشه و آیا به حداکثر ظرفیت رم حتی نزدیک هم میشه یا نه!
اگر بخواید متون رو از دیتابیس بخونید، حتی باوجود کش کردن، یا بجای آرایه بیاید و فایل رو parse کنید، خب اینا در ظاهر و وهلهء اول شاید هوشمندانه تر/پیشرفته تر بنظر بیان، اما برنامه رو حجیم و پیچیده کردید بخاطر یک مسئلهء ساده ای که احتمالا میتونست با روش بسیار ساده تر و کوتاهتری هم حل بشه، و از طرف دیگر خیلی محتمل هست که این روشها بهینه تر نباشن و حتی نابهینه تر هم باشن! واقعا ارتباط با دیتابیس، در کل منابع کمتری مصرف میکنه تا استفاده از آرایه؟ اونم با اون الگوریتم و تشکیلات افزوده و کش و غیره؟ آیا bottleneck فقط RAM است؟ اتفاقا خیلی وقتا bottleneck جاهای دیگری است؛ مثلا در میزان پردازش مورد نیاز (CPU)، در سرعت ارتباطات اجزای مختلف، و غیره.
همینطور خواندن از و parse کردن فایل هم فکر نمیکنم در بیشتر سناریوها بهینه تر باشه.
آرایه یک ساختمان دادهء نسبتا ساده است در RAM که درکل با کمتر جزء و جریان و الگوریتم های پیچیدهء دیگری درگیر است که در کل (در مقایسه با روشهای دیگری که ذکر شد) کمترین و ساده ترین فرایندها برای واکشی ازش استفاده میشن و بنابراین کمترین محدودیت و پارامترهای درگیر رو وارد برنامه میکنه. سرعت RAM هم که از منابع ذخیره سازی دیگر بسیار بیشتره.
بقولی میگن که ساده ترین راه حل معمولا بهینه ترین راه حل هم هست.
البته من خودم به این «معمولا» شک دارم، اما شک ندارم که حداقل «خیلی وقتها» اینطوره!

MMSHFE
شنبه 30 آذر 1392, 08:46 صبح
کاملاً موافقم. اینکه فریمورکی مثل Yii با اون Performance مثال زدنی درمقابل سایر فریمورکها (که نشون میده همه جا Optimization و Performance براشون یک اصل بوده)، اومده و از آرایه استفاده کرده فکر میکنم به خودی خود نشون میده که دیگه راه بهتری سراغ نداشتن.

MMSHFE
شنبه 30 آذر 1392, 12:16 عصر
اگر بتونیم آرایه یا هر فایل رو جوری بارگذاری کنیم که فقط قسمتی که بهش نیاز داریم رو حافظه قرار بگیره ۱۰۰ درصد کارایی بهتری رو میتونیم داشته باشیم.خوب یکی از مزیتهای تعیین محدوده که در Yii در سیستم ترجمه وجود داره (مثال default و contract که قبلاً گفتم) همینه که مثلاً اگه یکسری کلمات و عبارات توی فرم لاگین فقط استفاده شده، اونها رو توی فایلی مثل login.php بگذارین و محدوده ترجمه رو login تعیین کنید و اینطوری دیگه بقیه کلمات و اصطلاحات سایت که احتمالاً زیاد هم هستن، Load نمیشن و فقط همین فایل خونده میشه. یعنی اینکه اصطلاحات و کلمات رو برحسب زمینه ترجمه توی فایلهای جداگانه بگذاریم و موقع ترجمه، همون فایل بخصوص بارگذاری بشه.

یه قاعده توی گرافیک هست که میگه فقط اونچیزی که دیده میشه رو رسم کن که منجر شده الان به مدت چندین سال مرتبا الگوریتم های جدیدتری برای بهینه سازی اینکار عرضه شه و هر وقت همه میگن این دیگه تهشه. یکی دیگه الگوریتم بهتر رو ارائه میکنه. اینکه یک چیزی رو قبول کنیم و بگیم بهتر نمیشه دقیقا همون نقطه ای هست که یه چیزی شبیه مردن رو یا مغلوب شدن رو قبول می کنیمبله به این مسئله واقفم و الگوریتمهایی مثل ZBuffer و Viewport Rendering و LOD و... نمونه هایی هستن که به مرور تکمیل شدن و توی زمینه های دیگه هم قطعاً این قانون وجود داره که «هیچ چیزی تحت عنوان بهترین وجود نداره» (There is no best) و بخاطر همینه که معتقدم باید برحسب سرور و تنظیمات سایتتون، Benchmark بگیرین. شاید برای مثال، توی یک سرور خاص بخاطر یکسری مسائل سرعت DB بیشتر از فایل بشه. شاید بگین ممکن نیست ولی فقط بعنوان مثال میگم (میدونم احتمال بروزش نزدیک به صفره) فرض کنید دیسک به خوبی Defrag نشده باشه و درمقابل دیتابیس جدول Index خوبی داشته باشه. بهرحال هیچ چیز رو نباید بدون تست و مدرک عملی قبول کرد. برنامه نویسی سرور هم فقط شامل چند خط کدنویسی نیست و باید تنظیمات و شرایط سرور رو هم درنظر گرفت و همه چیز رو Optimizeشده انجام داد.

omidabedi
شنبه 30 آذر 1392, 12:37 عصر
تجربه ی شخصی من در این قسمت :
برای معادل سازی های هر قسمت از یک فایل text که حالا بهتر بگم .po و .mo استفاده بشه هم توسعه ی راحتتری داره (نرم افزار مخصوص) هم اینکه شاید از ارایه سریعتر عمل کنه.
دوست عزیز قرار نیست کل ترجمه های یک سایت رو تو یک فایل و توی یک ارایه قرار بدیم
شما با خلاقیت خودتون میتونید تفکیک کنید که هر فایل در صورتی که به ترجمه نیاز داشته باشه فایل ترجمش با فلان نام کنارش هست که در یک صفحه اگر 10 تا از اینجور فایل های چند زبانه هم باشه فوقش بشه kb 200


ببخشید فقط تجربه ی شخصی خودمو گفتم

navid3d_69
یک شنبه 01 دی 1392, 16:02 عصر
به نظر من این موضوع خیل یهم مهم نیست یعنی ما تمام کوئری تمام کد نویسی و الگوریتمون بهینه هست که حالا این باشه؟

این بستگی به سیستم داره من یک پروژه رو حدود 2 سال و خورده ای پیش انجام دادم برای یه شرکت بزرگ هست و نه کش نه بهینگی کلا هیچی بعد چند وقت پیش دیدم توی یک روز حدودا 1500 تا آنلاین همزمان داره روی سرور من و خیلی کم از منابع استفاده می کنه

یا سیستمی مثل نیوک از define یا همون ثابت های خودمون برای چند زبانه استفاده می کنه و این همه سایت با بزدید روزی حدود 500 هزار و .... هست که مشکلی نداره

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

بحث برنامه نوسیی سی با وب فرق داره برنامه وب در لحظه شایت 1000 تا اجرا داشته باشه ولی تحت ویندوز 1 بار اجرا داره

ابوذر محمودی
سه شنبه 03 دی 1392, 09:20 صبح
حالا نمیشه این مباحث به بحث و جدل کشیده نشه ؟
خیلی اوقات شده یه سوال پرسیده شده ، همون دو سه تا پست اول مربوط به موضوع تاپیک میشده مابقیش مربوط به مسائل حاشیه که اونم واسه کل کل و کم نیاوردنه .

بهتر نیست از ادبیات مناسب تری استفاده کنید ؟
خیلی مباحث بزرگتر و پیچیده تری بین علما فقها دانشمندان فیلسفوفان هست ، اونها هم به همین شکل رفتار میکردن؟؟؟

اگه راه حلی دارین خوبه که ارائه بدین ، بعد نقدش کنین ، نقد سازنده ، نیاین با تبر تیشه به ریشه هم بزنین.

ابوذر محمودی
سه شنبه 03 دی 1392, 09:35 صبح
سلام
دوستان راه حل خوبی برای پیاده سازی سایت های چند زبانه سراغ دارین؟. مخصوصا برای پیام های سیستم مثل پیا های خطا و ...
شاید بررسی CMS هایی مثل همین ویبولتین ، وردپرس و جوملا و .. که قابلیت سوئیچ بین زبان ها رو دارن بتونه بهتون کمک کنه تا ایده های بهتری به ذهنتون برسه

MMSHFE
سه شنبه 03 دی 1392, 09:57 صبح
دیگه رسماً زدین جاده خاکی! پستهای فاقد ارتباط با موضوع تاپیک حذف میشه.

pswin.pooya
سه شنبه 03 دی 1392, 09:59 صبح
اگه راه حلی دارین خوبه که ارائه بدین ، بعد نقدش کنین ، نقد سازنده ، نیاین با تبر تیشه به ریشه هم بزنین. گل گفتی.

کاش مدیر تالار. پستهای اضافی رو حذف کنه.


تا اونجا که من بررسی کردم. بعضی ها از gettext توی لینوکس استفاده می کنن و دلیل اون هم اینه که همه چیز رو نمیشه ریخت توی آرایه. چون قواعد زبانی زبانهای مختلف فرق میکنه. (حالا با یکم ماکارونی کاری میشه یه راه های میانبر هم برای اینجور موارد پیدا کرد)

http://stackoverflow.com/questions/14343577/whats-the-best-fastest-method-to-support-multi-language-in-php-application

پس چند راه بیشتر نداریم:


استفاده از فایل ها ( مثلا xml و ... )
استفاده از دیتابیس
استفاده از آرایه ها در php
استفاده از template engine اختصاصی

اگر بخواییم از آرایه ها استفاده کنیم. باید اونها رو به شکل مدیریت شده استفاده کنیم. تا منابع به حداقل برسه. معقولانه ترین کاری که به ذهن میرسه تقسیم کردن آرایه در فایلهای جداگاه برای جلوگیری از بارگذاری تمام اون است. اما همین فایلهای جداگاهنه هم میتونن دردسر ساز شن. مثلا شما باید اسم یه عالمه فایل رو بدونین برای این مورد هم فکر میکنم باید از یه چیزی شبیه routing استفاده کرد تا کار راحتر بشه. اما مشکل دیگه ای که هنوز پا بر جاست این که زبونهای مختلف ساختار مختلف صفحه رو هم لازم دارن. (مثلا یه مورد راست چین و چپ چین بودن ) برای این هم باید از قالبهای جدا استفاده شه. خب پس ما باید یه template engine هم داشته باشیم.


حالا مثلا در برنامه یه همچین پیامی تولید میشه:



set_error('errors/file_not_found' ,array ( 'file' => 'test.txt' ) );


حالا وظیفه. template engine است که زبان مناسب و قالب مناسب رو انتخاب کنه و پیام رو نشون بده.



تا اینجا فکر کنم از نظر مقیاس پذیری چندان بد نباشه. حالا بحثی که هست اینه که چه شکلی ابعاد آرایه رو برای سرعت بیشتر بهینه کنیم که باید برای اون هم دنبال یه راهکار باشیم.

MMSHFE
سه شنبه 03 دی 1392, 10:08 صبح
دوستان لطفاً بحث درمورد اینکه بهینگی اصلاً چه موقع لازمه و چه موقع نیست و... رو به تاپیک جداگانه ای منتقل کنید. اینجا نیاز Starter اینه که بدونه اگه خواست چند زبانه سازی کنه، بهترین ایده بنظر دیگران چیه. لطفاً فقط در همین مورد مباحثه کنید.