کیهان
3 سال پیش توسط کیهان مطرح شد
19 پاسخ

چالش ها در چند زبانه کردن سایت

سلام دوستان
شاید این عنوان تکراری بنظر بیاد یا شاید بعضی از دوستان گارد بگیرن
من خیلی از گفتگو های مرتبط با این موضوع رو خوندم (خیلی هم مفید بود)

من قراره یه سایت سه زبانه ایجاد کنم (فارسی ، انگلیسی ، عربی) ( دو زبانه ارزشی برای اینکار نداره )و شاید بزرگترین چالش ها مربوط به طراحی دیتابیس و تنظیم روت ها باشه که مسئله ی مهمتر برای من طراحی دیتابیسه
آیا باید به ازای هر جدولی که نیاز به ترجمه داشته باشن سه فیلد جداگونه (first_name , en_first_name , ar_first_name) ایجاد کنم !
و اینکه روش هایی که میفرمایید چه مزایا و معایبی دارن
دوستان سوال من فقط مربوط به ترجمه محتوای داینامیک هست و با قسمت استاتیک که با Localization میشه پیاده کرد مشکلی ندارم
این گفتگو رو هم مشاهده کردم اگه نکات جدیدی مد نظرتون هست ممنون میشم به اشتراک بزارید چون خیلی از دوستان از این مطالب استفاده خواهند کرد 🙏
@ehsndvr @Nima.nori @milwad @endworld @Spaceman @asp.gosk @samanzdev @milad @mhyeganeh @alarus7 @null


ثبت پرسش جدید
نیما
تخصص : جوجه برنامه نویسی که میخواد فو...
@Nima.nori 3 سال پیش مطرح شد
0

من خودم باشم این جوری کار می کنم
اول چند تا دامین متفاوت استفاده می کنم
مثل :
https://example.com/fa/posts
https://example.com/ar/posts
https://example.com/en/posts
حالا سه تا هم دیتابیس مختلف مخصوص هر دامین میسازم
fa_database
ar_database
en_database
بعد بر اساس دامین دیتابیس زبان مورد نظر رو فراخونی می کنم
مثلا اگه دامین
https://example.com/en/posts
من از دیتابیس
en_database
استفاده می کنم
روشی که شما مد نظر دارین فکر نکنم پرفورمنسخوبی داشته باشه و فک کنم کوعری ها زمان زیادی رو صرف کنن


احسان داوری
تخصص : برنامه نویس
@ehsndvr 3 سال پیش مطرح شد
0

سلام
شما فرض کنید میخواید کلی زبان به سایتتون اضافه کنید ، میخواید کلی جدول برای زبان های مختلف طراحی بکنید ؟
یکسری از چیز های مثل پیغام ها و یا متون نمایش در سمت کاربر و یا متونید که تغییر نمیکنه (مثل متن دکمه عضویت و ...) که خیلی راحت درست میشن و اصلا نیازی به پایگاه داده نداره ، متون سمت سرور هم که میشه لاراول هم همینطور ، چیزی که مهمه و احتمالا شما درگیر اونید اینکه کاربران با توجه به زبانشون اطلاعاتشون رو وارد میکنن و اینکه شما میخواید بدونید چطوری این عمل صورت میگیره ؟
خب ببینید یکسری مسائل مثل نام کاربری که همیشه انگلیسیه اما چیزی که تغییر میکنه اسم و فامیلی کاربره که شما هم در متنتون به این اشاره کردید ، مثلا برای جدول User در نظر میگیرم ، شما یه اسم کوچیک دارید (FirstName) و یک فایمیلی (LastName) خب اینها برای تمامی زبان ها مشترکه چطوری ؟ شما فقط کافیه از نوع داده ایی UTF-8 برای پایگاه دادتون استفاده کنید، به همین راحتی میتونید کلی اسم با زبان های متختلف داخل پایگاه دادتون ذخیره کنید.
یکسری مسائل اعتبار سنجی اسم هم میاد وسط که چطور باید انجام بشه که معمولا اعتبار سنجی با Regex انجام میشه ... خب شما فقط کافیه نوع زبان کاربر رو بگیرید و بر اساس اون اعتبار سنجی موردنظر رو انجام بدین.
من فکر میکنم شما نمیدونید که چطور باید این 3 زبان رو پیاده سازی بکنید ... حالا اگر شما متونی دارید که مدارم تغییر میکنه مثل تعرفه های و یا پست ها و ... این متون باید وارد پایگاه داده بشه ، حالا شما اینجا باید برای یکسری از جداول مقدار Language در نظر بگیرید ... مثلا شما یه جدول مربوط به اعلان ها دارید ، خب فقط کافیه در جدول مربوط به اعلان ها یه مقدار زبان (Language) اضافه بکنید و اعلان مربوط به زبان کاربر رو از پایگاه داده بگیرید.
چیز اصلا پیچیده ایی نیست اگر درست درکش کنید ... .
مثلا این میشه جدول اعلان ها :
... و id . title . description . language

امیدوارم خوب توضیح داده باشم.
اگر متوجه نشدید بنده رو مخاطب (Mention) قراربدید/بکنید .


نیما
تخصص : جوجه برنامه نویسی که میخواد فو...
@Nima.nori 3 سال پیش آپدیت شد
0

@ehsndvr اخه این فیلد اضافه پرفورمنس کار رو میاره پایین این رو چی کار می کنین ؟چون باید اول از یک فیلتری رد کرد مثلا زبان امگلیسی کوعری فقط جواب هایی رو بیاره که زبانشون مثلا انگلیسی هست خب سرعت رو کم می کنه
مال منم همچین چیز زیادی برای ساخت نمی بره کوعری همون کوعری و ... فقط اول نگاه می کنه باید اتصال رو باید با کدوم دیتابیس انجام بده میشه بگین مشکلش چیه ؟(قصد بی احترامی ندارم و واقعا دارم می پرسم بد برداشت نکنین)
منظور من از مال من اینه که نوع جداول یکی باشه همچی یکی باشه کلا انگار همون دیتابیس زبان دیگه باشه با این تفاوت که توش فقط اطلاعات مربوط به اون زبان ذخیره شه


کیهان
تخصص : PHP programmer
@keyhan 3 سال پیش مطرح شد
0

@Nima.nori
ممنون از پاسختون 🙏
@ehsndvr
فک کنم متوجه منظور بنده نشدید
منظورم از first_name فقط یک مثال بود حالا میتونه title برای مقاله ها باشه یا name برای دسته بندی ها
من سوالم به صورت کلی پیاده سازی دیتابیس برای محتوای داینامیکه که نیاز به ترجمه دارن ، و با توجه به این که سه زبانه هستش بهتره ساختار جدول به چه شکلی پیاده سازی بشه
جایی که فقط تو بخش کوچکی بهش اشاره کردین اگه قسمتی که درباره فیلد language صحبت کردین رو یکم با جزئیات بیشتر بیان کنید ممنون میشم


نیما
تخصص : جوجه برنامه نویسی که میخواد فو...
@Nima.nori 3 سال پیش مطرح شد
0

@keyhan منظور ایشون اینه که همه رو توی یک دیتا بیس ذخیره کنن مثلا عنوان رو بعد اگه عنوان به صورت انگلیسی بود توی فیلد زبان اون انگلیسی ذخیره کنین و اگه عربی بود عنوان وارد شده زبان رو عربی وارد کنین و..


ASPgo
تخصص : HTML، CSS، PHP و JS، طراح قالب...
@asp.gosk 3 سال پیش آپدیت شد
1

میتونی مثل وردپرس یه سیستم طراحی کنی و به وسیله فایل po و mo ترجمه رو تنظیم کنی
راه دیگش اینکه یه فانکشن بنویسی و یه تیبل تو دیتابیس بسازی که مربوط به ترجمه متن ها هست. هر جا نیاز شد یه متنی به کاربر نمایش بدی با توجه به زبان کاربر متن ترجمه بشه. مثلا میتونی فانکشن رو طوری بنویسی که دو تا متغیر/ورودی بگیره. ورودی اول متنیه که قراره ترجمه بشه و ورودی دوم زبانی که قراره بهش ترجمه بشه. ساختار تیبل دیتابیس هم باید به این شکل باشه(متن های زیر توضیح ستون های جدولیه که قراره تو دیتابیس بسازی):

col1 -> text -> type : string - e.g. سلام
col2 -> translated text -> type : string - e.g. hello
col3 -> translate from to -> type : string -  e.g. 'fa to en'

بعد باید فانکشن رو طوری تنظیم کنی که بره دنبال اون متن تو دیتابیس و اگه وجود داشت ترجمه شدش رو برگردونه(return کنه)
و هرجا قرار شد یه متنی قرار بدی از فانکشنی که نوشتی استفاده کنی. مثلا:

<?php echo translateText($string, 'fa to en');?>

میتونی translate from to رو هم کوتاه کنی تا ساده تر بشه نوشتنش

<?php echo translateText($string, 'fte');?>

اگه میخوای از فایل mo و po استفاده کنی از این مقاله استفاده کن در مورد ساخت سایت چند زبانه با php و فایل mo و po توضیح داده


محمد مهدی امیری
تخصص : جوجه برنامه نویس PHP
@wpuser 3 سال پیش مطرح شد
-3

میتونید این کارو با css انجام بدین بجای اینکه از دیتابیس استفاده کنید البته روش های زیادی وجود داره که یکی دیگه ساخت ساب دامین هستش
من پیشنهاد میکنم که ساب دامین درست کنید


امیر خاکی
تخصص : Golang developer
@amirkhaki 3 سال پیش آپدیت شد
0

خب یک جدولی داشته باشین برای زبان ها
حالا میخواد 3 تا باشه یا n تا
و بعد هر دیتایی که ذخیره میکنین یک کلید خارجی هم داشته باشین به جدول زبان ها تا مشخص بشه به چه زبانی هست
مثلا اگه انگلیسی آیدیش 1 باشه و فارسی 2:

post_id=2 
post_title=hello
post_content=blah blah
lang_id=1
-----------
post_id=2
post_title=سلام
post_content=بلاه براه
lang_id=2

و حالا کوئری میزنی مثلا:

SELECT * FROM tbl_name WHERE post_id=2 AND lang_id=1

کیهان
تخصص : PHP programmer
@keyhan 3 سال پیش مطرح شد
1

برای سه تا زبان فک میکنین این روش مناسب باشه ؟


علی فرمانی
تخصص : فرانت اند
@farmani 3 سال پیش مطرح شد
0

سلام
میتونید یه جدول posts داشته باشید یا یه مقدار داخل همون جدول مشخص کنید زبان چی هست همین.
مثلا بزارید lang دیفالت بزارید حالا en یا fa با هرچی باشه
برای هر زبان همین فرق کنه
شما قرار نیست ساختارو تغییر بدید فقط متون و نوشته ها فرق میکنه
در هر صورت نیازه کوئری زده بشه به دیتابیس بیاید هر زبان دیتابیس جدا درست کنید دو فردا دیگه 200 تا زبان باشه بد میشه
وردپرسم همین کار میکنه با یه متا تگ جدا میکنه تو یه جدول بعد میشناسه نوع پست چیه و دیتاش چیه


علی فرمانی
تخصص : فرانت اند
@farmani 3 سال پیش مطرح شد
0

سلام
میتونید یه جدول posts داشته باشید یا یه مقدار داخل همون جدول مشخص کنید زبان چی هست همین.
مثلا بزارید lang دیفالت بزارید حالا en یا fa با هرچی باشه
برای هر زبان همین فرق کنه
شما قرار نیست ساختارو تغییر بدید فقط متون و نوشته ها فرق میکنه
در هر صورت نیازه کوئری زده بشه به دیتابیس بیاید هر زبان دیتابیس جدا درست کنید دو فردا دیگه 200 تا زبان باشه بد میشه
وردپرسم همین کار میکنه با یه متا تگ جدا میکنه تو یه جدول بعد میشناسه نوع پست چیه و دیتاش چیه


علی فرمانی
تخصص : فرانت اند
@farmani 3 سال پیش مطرح شد
0

سلام
میتونید یه جدول posts داشته باشید یا یه مقدار داخل همون جدول مشخص کنید زبان چی هست همین.
مثلا بزارید lang دیفالت بزارید حالا en یا fa با هرچی باشه
برای هر زبان همین فرق کنه
شما قرار نیست ساختارو تغییر بدید فقط متون و نوشته ها فرق میکنه
در هر صورت نیازه کوئری زده بشه به دیتابیس بیاید هر زبان دیتابیس جدا درست کنید دو فردا دیگه 200 تا زبان باشه بد میشه
وردپرسم همین کار میکنه با یه متا تگ جدا میکنه تو یه جدول بعد میشناسه نوع پست چیه و دیتاش چیه


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 3 سال پیش آپدیت شد
0

درود خوبی...
روش متداول اینه که در جدول posts برای هر زبان مثلا fa-title و en-title و fr-des برای عنوان ایجاد کنید و برای متن به ترتیب fa-des و en-des و fr-des همین طور ...
اما احساس می کنم این روش می تونه پایگاه داده رو سنگین تر کنه و سرعت خواندن پایگاه داده رو پایین بیاره و این برای سایت هایی که محتوا محور داره مثل خبری ...
روش دوم اینه استفاده از وابستگی Google Translate API است که ترجمه متن ها رو از سرور گوگل در لاراول انجام میده و این روش بهترین است از نظر من ...
چرا که مثل روش اول نیازی نیست جدول مورد نظر برای ترجمه متون ایجاد کنیم ...
https://github.com/JoggApp/laravel-google-translate


احسان داوری
تخصص : برنامه نویس
@ehsndvr 3 سال پیش مطرح شد
2

سلام
چقدر دوستان روش های سختی رو ارائه کردن 😅

خب ببینید من با روش تمام دوستان مخالفم و روش بهتری مد نظرم بود میخواستم ببینم کسی مینویسه یا نه ... که خب میخوام الان بنویسم.
ببینید ما در برنامه نویسی همیشه باید آینده نگری داشته باشیم و برنامه نویسی برای این اومده که کارهای تکراری انسان رو کم و ساده بکنه.
این 2 تا نکته رو درنظر داشته باشید ، حالا شما میخواید یه جدول درست بکنید که داخل جدول ستون های en و fa داشته باشه ؟ خب فردا اگر برای پروژه زبان عربی یا مثلا هندی خواستن چی ؟ شما میخواید برید دیتابیس رو تغییر بدید یا مثلا آقا نیما گفته بودن که @Nima.nori برای هر زبان یه دیتابیس ،... شما میخواید برای هرزبانی که اضافه میکنید یه دیتابیس بزنید ؟
بنده یکسری نکات رو نمینویسم چون برای یادگیریشون زحمت کشیدم و معمولا پول میگیرم از افراد ... اما برای این سوال استثنائاً پاسخ میدم تا افراد ببین چقدر راحت میشه یکسری متون چند زبانه به هر جدول پایگاه داده اضافه کرد.

اولا که باید بنده بدونم موضوع سایت شما چیه ...
چون راهکار ها برای هر سایت فرق میکنه و باید نسبت اون به سایت اون موضوع تصمیم گیری کنیم که چه کاری بهتره ، مثلا شما وقتی میرید پیش دکتر همینطوری که بهتون دارو نمیده ، اول معاینتون میکنه و بعد با توجه به مشکلی که دارین دارویی مرتبط با اون مشکل میده ...

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

حالا شما @Nima.nori جان ، حتی همون کوئری زدن هم قائده داره ... الان گوگل چطوری اطلاعات رو کمتر از یک ثانیه نمایش میده ؟ با این همه زبان و مطالب .... ؟
گفتم تا وقتی درکه نباشه حل کردن یکسری مسائل سخت ، سخت باقی خواهد ماند ... چندین بار از درک کردن توی راکت نوشتم ...
شما میتونید MRS1367 رو توی گوگل سرچ کنید و صفحه StackOwerflow ایشون رو نگاه کنید ، اکثر سوالاتی که پرسیدن رو خودشون بهشون جواب دادن یعنی کسی نتونسته بهشون پاسخ بده.
ایشون یعنی جناب آقای محسن رستمی ، استاد بنده هستن و من حدود یک سال هست که با ایشون کار میکنم... ایشون در طول پروژه های مختلف کار هایی رو انجام دادن که توی اینترنت جواب براشون وجود نداشته و کسی نتونسته حل بکنه ... سوال هایی که رو در راکت و یا ... پرسیده میشه معمولا سوال هایی هستن که هزاران نفر دیگه هم همین سوال رو داشتن و به پاسخ رسیدن ، مثلا سوال همین دوستمون آقا کیهان ، توی اینترنت پره ، فقط کافیه که درست جستجو بشه...
اما سوالات ایشون توی اینترنت نیست ، مثلا من یادمه سر پروژه بهشت مارکت که باهم کار میکردیم ایشون توی پروژه Nuxt.js یه کارای عجیب غریبی کرده بودن که نمونش توی اینترنت نبود ، یا خیلی کار دیگه ...
یا مثلا لاگین با چنتا حالت مختلف که افراد دیده بودن خیلی خوششون اومده بود ، البته خیلی ها میگفتن کاری نداره ، اما نمیتونستن اجراش بکنن که البته پروژه بهشت مارکت به دلیل یکسری مسائل بسته شد ، اما افرادی که دیدن خیلی خوششون اومده بود...
همه اینا با درک کردن مسائل انجام میشه ، در برنامه نویسی شما باید خودتون رو جای چند نفر قرار بدید مثلا شما وقتی برنامه نویس Back-end هستید ، باید جوری کد نویسی بکنید که هم همکارتون راحت باشه ، هم برنامه نویس Front-end هم کاربری که داره با سرویس شما کار میکنه و .... اکثر افراد فقط با دید خودشون مسائل رو نگاه میکنن و برای همین خیلی اختلافات در جامعه ما زیاد شده ، چون فقط از دید خودمون به مسائل نگاه میکنیم ...
بیل گیتس اگه بیل گیتس شد برای این نبود که کد نویس خوبی بود ...
بیل گیتس همزمان جای چند نفر فکر میکرد، جای کسی که این کد رو زده ، جای کسی که میخواد این کد استفاده بکنه ، جای کسی که قراره از این محصول استفاده بکنه و...
و الان محصولات شرکت مایکروسافت دنیارو گرفته چون فقط به فکر راحتی کاربره ... مثلا پدر من که خیلی کامپیوتر نداشته ، الان با ویندوز خیلی راحت کار میکنه ... چون مایکروسافت حتی به کسی که با کامپیوتر تا حالا کار نکرده فکر میکنه ... اما ما چی ؟ ما فقط به خودمون فکر میکنیم ...

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


نیما
تخصص : جوجه برنامه نویسی که میخواد فو...
@Nima.nori 3 سال پیش مطرح شد
-1

@ehsndvr عجب راه حل خوبی اصلا این شکلی به ذهنم نیومده بود
کاش من هم یه استاد داشتم 😢خودآموزی کسی بهت نکته نمی گه


کیهان
تخصص : PHP programmer
@keyhan 3 سال پیش مطرح شد
0

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


احسان داوری
تخصص : برنامه نویس
@ehsndvr 3 سال پیش مطرح شد
0

@keyhan سلام
خواهش میکنم
من متوجه منظورتون نشدم ، ایندکس کردن یعنی چی ؟ اگر میشه یکم بیشتر توضیح بدید که دقیقا چی میخواید.


احسان داوری
تخصص : برنامه نویس
@ehsndvr 3 سال پیش مطرح شد
1

@Nima.nori
سلام نمیا جان
ببخشید بابت اینکه یکم در پاسخ میدم ، بعضی از پیام هارو بات راکت نمیفرسته ...
اگر دوست داشتید شماهم تجزیه و تحلیلتون قوی بشه میتونید تشریف بیارید روبیکا، استاد اونجا تشریف دارن.
https://rubika.ir/joing/CBBFJEDF0KXDOAOYZSZUYNTXVXRPJOFL


نیما
تخصص : جوجه برنامه نویسی که میخواد فو...
@Nima.nori 3 سال پیش مطرح شد
1

@ehsndvr واقعا ممنونم😘


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام