# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET Core >  بهترین راه برای سایت چند زبانه با قابلیت مدیریت زبان و ترجمه ها

## EnKamran

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

----------


## jamal_ch

سلام 
من قبلا تو یک پروژه دات نت نیوک دیدم برای هر زبان یک فایل xml  بود که کلمات توش نوشته بود و موقع تفیر زبان نام مسیر فایل xml رو تغییر  میداد 
بنظرم دیتابیس روش خوبی نیست 
اگه سرچی بزنید فکر کنم به نتیجه برسید
لینک زیر رو هم ببینید
https://stackoverflow.com/questions/...ge-net-project

----------


## moslem.hady

من از Westwind.Globalization استفاده کردم. خیلی ساده و خوبه. تا الانم که به مشکلی نخوردم.
https://github.com/RickStrahl/Westwind.Globalization
ضمن اینکه در حین اضافه کردن قابلیت چندزبانی، از روی smart Store ایده میگرفتم و یه سری بخش ها رو مشابه اون زدم

----------


## EnKamran

سلام و ممنون از راهنمایی ها، تجربه خودم رو خدمتتون عرض میکنم شاید به درد کسی بخوره.
در بیشتر موارد راه های استانداردي که موجود هست بهترین هستن!
اگر به هر دلیلی نمیتونستید از راه استاندارد استفاده کنید بهترین راه پکیجی هست که دوستمون معرفی کردن که باز هم از همون ریسورس استفاده می شه فقط ریسورس ادیتور آنلاین داریم (در دات نت کور کامل تست نکردم اما ام وی سی و وب فرمز مطمعنا جواب می ده چون قبلا همچین چیزی رو نوشتم).
حالا با توجه به نکاتی که عرض شد اگر باز هم اصرار داشتید از دیتابیس استفاده کنید (البته یک نکته ای هم جلوتر عرض می کنم اون رو هم بخونید.) بهینه ترین روش همونی هست که در پست اول عرض کردم، بر اساس آدرس صفحه ترجمه ها رو توی یک ردیف ذخیره کنید (مثل جی سان) یعنی جدول ترجمه به این صورت باشه که یک فیلد آدرس صفحه داشته باشید و یک فیلد ترجمه های این صفحه که توی این فیلد با فرمت جی سان کلید:مقدار ذخیره کنید، وقتی اکشن یا ویو رو لود میکنید با استفاده از آدرس اون صفحه رکورد ترجمه ها رو واکشی کنید و به جی سان یا لیست تبدیل کنید و توی صفحه استفاده کنید، اینجوری یک کوئری به دیتابیس زده میشه که اگر هر کلمه یا جمله رو جداگانه در یک رکورد ذخیره کنید برای هر صفحه ممکنه صدها کوئری زده بشه!

نکته:مترجم رو با لوکالایزر اشتباه نگیرید، لوکالایزیشن ای که همه جا توضیح داده شده مربوط به محتوی استتیک هست شما اخبار رو نمیتونید با این روش لوکالایز کنید.

----------


## moslem.hady

اگه منظورتون از 



> بهترین راه پکیجی هست که دوستمون معرفی کردن


چیزیه که من گفتم، اون هم توی دیتابیس ذخیره میکنه. که خودش مدیریتش رو داره، خودتون هم بخواید میتونید بنویسید. این برای متن های جزئی و استاتیک هست.
برای داینامیک هم من اطلاعات مثلا page رو توی یه جدول دارم. بعد یه جدول دیگه دارم برای زبان های دیگه که همه مدل هام توی اون ذخیره میشه. و فیلد هاش تغریبا اینه:
EntityType: اسم جدول
EntityColumn: اسم ستونی از اون جدول که قراره ترجمه براش قرار داده بشه
Lang: زبان
Content: محتوای اون ستون برای این زبان
(ساختار دقیقش یادم نیست. همچین چیزیه. اگه کسی دقیقشو خواست بگه که بذارم.)
و بعد موقع درخواست محتوا، کوئری رو طوری مینویسیم که برای زبان غیر پیشفرض بره از این جدول بخونه.

----------

