متن صدای ویدیو :

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

به طور پیش فرض وقتی پلتفرم نصب می شود ، دو زبان انگلیسی و فارسی نصب هست ، که حالا کشور های انگلیسی زبان همشون  آمده اند اینجا و کاربر می تواند با انتخاب پرچم که آنجا هست Switch کند به زبان دیگری که تمایل دارد. نکته ای که اینجا هست ، من اگر برگردم به زبان فارسی و وارد سایت بشوم ، مثلا همین آدرسی که الان اینجا می بینید fa/home ، من اگر به جای  dotnetexper.ir/fa/home،  فقط بزنم home ، می بینید که باز با اینکه fa در URL را مشخص نکردم ، باز صفحه زبان فارسی را برای من میاره ، این به این علت هست که زبان پیشفرض این وب سایت که حالا dotnetexper.ir هست،  زبان فارسی هستش.

برای شناسایی زبان پیش فرض، پلتفرم از 3تا گزینه به ترتیب استفاده می کند، اولین گزینه اش تو خود URL  هست ، اگر تو URL ، language را شناسایی کند ، میره و از همون language استفاده می کند ، اگر تو URL نباشه ، دومین گزینه اش انتخاب کاربر، وقتی که کاربر اینجا از این منو اون زبان مورد نظرش را انتخاب میکنه ، یه کوکی اطلاعات رو ذخیره میکنه و هم تو session مرورگر ذخیره میشه که اگر تو URL ، زبان مشخص نباشه، پلتفرم میره و از این استفاده میکنه ، در نهایت اگر این هم وجود نداشته باشه ، یک زبان پیشفرض را شما تو Webconfig میتونید set کنید که پلتفرم میره و از اون استفاده می کنه.

من اگر تو مدیریت Webconfig تنظیمات بیام ، ما یک  Defaults Country داریم ، ایران برای اون انتخاب پرچم اینجا قرار داده شده ، حالا برنامه نویس میتونه هر استفاده ای که بخواهد ازش بکنه ، یک Defaults  right to left داریم ، باز برنامه نویس میتونه ازش استفاده کنه و یک Defaults language داریم که این همون گزینه سوم هست ، یعنی اگر نه توی URL، language مشخص باشه ، نه از طریق کاربر انتخاب شده باشه ، نهایت پلتفرم سویچ میکنه رو اون مقدار پیش فرضی که از طریق Webconfig انتخاب شده . اما ما یک جای دیگه هم زبان رو set می کنیم ، من اگر بیام توی مدیریت محتوا ، مدیریت صفحات و چارچوب خودکار رو که چارچوب پیش فرض هست رو انتخاب کنم اگر از ویدئو های قبلی یادتون باشه ، من گفتم که asInitApp نقطه ای هست که نقطه شروع برنامه هست و جایی هست که تنظیمات برنامه set میشه ، یکی از تنظیمات هم lang:fa هست. این با زبان پیش فرض فرق داره که تو Webconfig هست ، این زبان این فریم ورک هست یعنی میگه که این Famework یک فریم ورک خودکار فارسی هست ، چون ما اگر دقت کنید خودکار انگلیسی هم داریم که حالا من توضیح میدم.

حالا ما زبان رو داریم ، چجوری باید ترجمه بکنید زبان هارو، ما چند نوع ترجمه داریم ، یکیش تو همین نوع مدیریت صفحات هست که ما برای اینکه مثلا خودکار انگلیسی رو به شما نشان بدم ، اصلا باید کلا Switch کنید تو مود اون زبان و ترجمه را اونجا انجام بدیم . اینجا الان میبینید که این خودکار انگلیسی هست و زبانش هم EN هست.

پس این یک نوع ترجمه هست ، من برمیگردم به حالت فارسی ، نوع دیگر ترجمه توی مثلا اطلاعات پایه هست ، مدیریت اطلاعات پایه . شما هرجا که دکمه ترجمه را بغل اون نوع اطلاعات دیدین ، می تونین روش کلیک کنین و زبان مورد نظرتون را انتخاب کنین و ترجمه تون را انجام بدین. ترجمه هم تو این حالت روی دوتا فیلده ، نام و شرح ، Name و Description  یعنی جداول ما طوری طراحی شده که برای هر رکوردی بشه دو تا ترجمه را انجام داد ، Name و Description  اش را . پس این حالت دوم ترجمه هست ، یه حالت سوم ترجمه هم داریم که توی مثلا مدیریت لینک هاست . شما توی مدیریت لینک ها که میرین ، میتونید زبان پیش فرض را مثلا الان ایرانه و لینک های فارسی آمده ، می تونید زبانتون را بگذارید روی انگلیسی و لینک های انگلیسی را تعریف کنید یعنی یک بار لینک فارسی را تعریف کنید ، یک بار لینک انگلیسی را. پس این شد 3 حالت ترجمه .

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

مثلا برای فرهنگ حتما باید از حروف بزرگ باشه ، زبان حروف کوچک ، این ها را در گوگل سرچ کنید برای هر زبان و فرهنگی که بخواهین می تونید پیداش کنید . بعد گفتم این زبان، زبان پیش فرض منه و زبان راست به چپ هست و حالا آن 3 تا نقش دسترسی و مشاهده هم بهش دادم و خود ترجمه هم اینجا انجام شده باJavaScript . ما یک Object داریم به نام $.asRes کهLanguage  های ما میان خودشان به عنوان یک Object در اون. این یک لیستی از Object هاست که اون Object ها Language ها هستن. مثلا fa ، خودش این ترجمه ها را داره.

مثلا واسه Plugin BootGrid که پلاگین  grid من هست حالا توی ویدئو های قبلی دیدین ، این قسمت جاهایی هست که ترجمه میشه و میتونید که حتی پارامتریک هم باشه این ترجمه هاتون . حالا من grid فارسی انگلیسی را الان به شما نشان میدهم جلوتر، و حالا سایر ترجمه های دیگه ای که مثلا Title، عنوان ، OK، تایید ، من اگر انگلیسیش را انتخاب کنم ، میبینید که مثلا زبان EN، فرهنگ US، پیش فرض راست به چپ نیست و این هم ترجمه هاش . مثلا برای همون BootGrid میبینید که اینهاس . حالا من مثلا خود BootGrid رو می خواهم به شما نشان بدهم ، توی مدیریت فایل ها و دایرکتری  ها ، الان میبینید که مثلا این جستجو فارسی هست یا بازیابی ، من اگر برم توی انگلیسی میبینید که این مثلا Refresh و اینجا هم مثلا Search ، بنابراین این ترجمه از آنجا میاد .

اما خود این فایل ترجمه ای که شما وقتی این ذخیره را میزنید و یک دکمه انتشار هم اینجا هست که باز برای اون حالت Debug or release  هست ، این را من اگر بیام توی مدیریت فایل ها و سیستم ها به شما نشان می دهم کجا ذخیره میشه. توی فولدر Script ما یک جایی داریم به اسم Recourse که تو این Recourse مثلا  faرا من انتخاب کنم ، میبینید که این همون Recourse من هست که حالا اینجا minify  هم شده . البته این نکته را بگم ، این دکمه انتشار اینجا برای این است که بره آپدیت بشه وگرنه اینجا حالت Debug or release  نداره . دکمه ذخیره ، ذخیره میکنه و انتشار می بره توی اون فولدر ، Recourses ها و اونجا اون را آپدیت میکنه.

اما نحوه استفاده از این ترجمه ها را هم من یک توضیحی بدم ، ما اگه بیایم توی مدیریت محتوا ، مدیریت صفحات ، این ترجمه ها هم میتونه تو Plugin ها باشه ، هم توی صفحات یعنی هرجا JavaScript باشه یا  HTMLباشه شما میتوانید از این ترجمه ها استفاده کنید . من مثلا یه صفحه را انتخاب میکنم توی JavaScript اش ، من اگر asRes رو سرچ کنم ، خوب اینجا می بینید این همون $.asRes، همون Object هستش که گفتم ترجمه ها توشه و یک آرایه ای است که زبان ها توش قرار می گیرند، Fa/EN اینجا$.asLang  هم زبان جاری که انتخاب شده ، گفتم سه حالت دیگه یا از طریق URL یا انتخاب کاربر یا پیشفرضی که تو وبکانفیگ set شده. این $.asLang تو JavaScript داره اون را به ما نشان میده. پس توی آبجکت $.asRes با اون زبان که میتونه فارسی یا EN باشه اون کلید ترجمه اش را به من بده.

مثلا اینجا success.operation  را من اگر کپی کنم این ور میتونم اینجا ببینم که مقدارش این است ، the operation ended successfully  ، پس این طریقه استفاده از ترجمه ها توJavaScript ، ولی ما تو خود HTML هم میتونیم از ترجمه ها استفاده کنیم ، ما یک چیزی داریم به اسم data-localize  که شما میتونید کلید ها را به این data-localize بدید یعنی این Title باز یه کلیدی هست، اینجا ببینید کلیدش هست ، بعد دقت کنید که مثلا تو  Input،  data-localize میاد به عنوان   placeholder قرار می گیره ولی همین data-localize توی مثلا Label میاد بعنوان آن متنی که کنار textbox  هست قرار میگیره . پس این تو هر المانی data-localize اون مقداری که برای المان مهم هست را مقدار دهی میکنه ، که source اش هم باز تو همون asCore  هست ، در ascore.js میتونید برید source اش هم ببینید. این هم طریقه استفاده از این ترجمه ها بود.

اما نکته بعدی که می خواهم بگم راجب ترجمه ای هست که من مثلا رو مدیریت اطلاعات پایه گفتم که ما روی هر رکوردی توی دیتابیس میتونیم فیلد name و  description اون رکورد را در اصل ترجمه اش کنیم. منتها این ترجمه ای که ما روی فیلد name و description  انجام میدیم کجا ذخیره میشه ؟ در دیتابیس ، ما تو دیتابیس  برای هر جدولی که ترجمه لازم داشته باشه مثلا جدول MasterdataKey Values  یه جدولی هم داریم به اسم MasterdataLocalKeyValues که اون name و description  ترجمه شده که حالا برای هر زبانی که شما بخواهین ترجمه کنین انگلیسی، فارسی، عربی، فرانسوی خود برنامه نویس میتونه زبان را تعریف کنه و ترجمه کنه. توی این MasterdataLocalKeyValues ذخیره میشن یا مثلا برای جدول AspNetRoles ما یه جدولی هم داریم به اسم AspNetLocalRoles یا AspNetGroups  یا AspNetLocalGroups  اینها ترجمه آن گروه ها و نقش  ها هستن ، بقیه جداول هم همین جوریه ، هر جدولی که این ترجمه را نیاز داشته باشه ، براش انجام شده .

اما حالا این اطلاعاتی که سمت سرور ذخیره شد چجوری توی صفحات ما در صفحات انگلیسی و فارسی که حالا به صورت پیش فرض نصب هست ، چجوری نمایش داده میشه ، من تو قسمت مدیریت صفحات که بیام ، اینجا یک صفحه را انتخاب میکنم ، خود مثلا مدیریت صفحات و از نوع فرم که برمیداره برای من JavaScript اش را میاره و تو قسمت سرویس ها هم سرویس هایی که استفاده شده مثلا سرویس های امنیتی ، سرویس های مدیریت نقش ها ، سرویس های OData  نقش ها ، دریافت تمام نقش ها به زبان پیش فرض ، خب من اگه تو قسمت مدیریت سرویس ها بیام و سرویس های امنیتی ، سرویس های مدیریت نقش ها ، سرویس های OData  نقش ها ، دریافت تمام نقش ها به زبان پیش فرض ، اولا یک ترجمه داره که خود این رکورد را ترجمه میکنه تو دیتابیس اما این به این معنی نیست که ترجمه شد حالا نقش های پیشفرض را به زبان انگلیسی برمیداره و میاره ، نه ،  من اگر توی کد این سرویس OData  بیام ، شما میبینید که در اصل آمده اون Id و ParentId و name و description  را از روی جدول نقش ها برداشته و آورده و جدول Roles هم میدونید که اون جدول پیشفرض هست و سایر ترجمه ها توی LocalRoles ما در اصل قرار می گیرند.

حالا ایندفعه میرم توی حالت انگلیسی و ODataServiceForTranslateRole، GetAllRoleByOtherLangueg ، را انتخاب می کنم و شما اینجا میتونید ببینید که اولا یه شرطی داره که language = EN  و اینکه اومده از جدول LocalRoles  هم استفاده کرده که بره آن name و description  هم برداره بیاره. پس از LocalRoles ، Expand زده روی جدول Roles. منتهی برای اینکه این language پارامتریک بشه ما تو URL نهایی آمدیم از یک پارامتر @lang  استفاده کردیم که حالا توی صفحه مون من اگر این صفحه را انگلیسیش کنم ، source  صفحه انگلیسی را بخواهیم نگاه کنیم من میرم توی مود انگلیسی و باز همون مدیریت صفحه ها و این دفعه ورژن انگلیسیش را انتخاب می کنم و @lang را ، اینجا میبینید که مثلا برای این سرویس ، وقتی داریم initService  میکنیم پارامتر هاش را بهش پاس میدیم ، پارامتر @lang ، اومدیم $.asLang که زبان انتخاب شده جاری هست را پاس دادیم به صورت پارامتریک ، پس ما توی سرویس هامون یدونه GetAllRoleByOtherLangueg ، یدونه هم GetAllRoleByDefaultsLangueg  ، من اگر این را برگردانم به حالت فارسی بهتر میبینید، توی OData   ترجمه نقش ها دریافت تمام نقش ها با سایر زبان ها توی سرویس های OData   نقش ها دریافت تمام نقش ها به زبان پیش فرض ، پس من زبان پیشفرض را انتخاب کنم ، اینجا خبری از شرط زبان یا جدول LocalRoles  نیست و اگر برم توی قسمت ترجمه نقش ها ، سرویس های OData   ترجمه نقش ها و دریافت تمام نقش ها با سایر زبان ها را بزنم ، اینجا میبینید که اولا هم شرط زبان ها هست و هم جدول LocalRoles  استفاده شده.

تمام جداول ما همینجوریه یعنی تمام سرویس های ما که قسمت بار ترجمه را به دوش میکشند همینجوریه مثلا مدیریت سرویس ها را که تو ترجمه اش میریم ، تمام اطلاعات ترجمه شده ، همشون به همین طریق به دست اومدن توی حالا چه سرویس مون OData   باشه چه سرویس مون HTTP باشه.