راهنمای توسعه دهنده برای بومی سازی مؤثر در Unreal Engine

اگر به دنبال آموزش آنریل انجین هستید این مقاله کمک بزرگی به شما می کند.  بومی سازی یکی از مهم ترین و در عین حال اغلب دست کم گرفته شده ترین جنبه های توسعه بازی است. با رشد مخاطبان جهانی، بازیکنان انتظار دارند بازی ها را به زبان مادری خود تجربه کنند، بنابراین بومی سازی مؤثر به یک ضرورت تبدیل شده است و نه یک امتیاز ویژه. اما این موضوع فراتر از ترجمه متن است—این فرآیند شامل مواجهه با چالش های فنی، تفاوت های فرهنگی و بهینه سازی های روند کاری است تا تجربه ای روان و بی وقفه را در چندین زبان فراهم کند.

راهنمای توسعه دهنده برای بومی سازی مؤثر در Unreal Engine

در این مقاله، من شما را با پیچیدگی های بومی سازی در Unreal Engine آشنا خواهم کرد و بینش هایی را بر اساس تجربه ام با بازی Wizard of Legend 2 به اشتراک می گذارم. از جمع آوری و مدیریت متن گرفته تا مقابله با مسائلی مانند فرمت بندی نادرست، زبان خاص جنسیتی و مدیریت فونت ها، نکات کلیدی را که می توانند باعث تأخیر شوند و نحوه کاهش آن ها را برجسته خواهم کرد.

این مقاله یک مقاله مقدماتی نیست، بنابراین انتظار دارم شما با ابزارهای بومی سازی پایه ای Unreal آشنا باشید. اگر تازه با این موضوع آشنا شده اید، منابع زیر برای یادگیری مبانی بسیار مناسب هستند. هنگامی که آماده شدید، بیایید به چالش های واقعی و بهترین شیوه ها بپردازیم تا به شما کمک کنیم فرآیند بومی سازی خود را به طور مؤثرتر برنامه ریزی کنید.

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

چگونه یک رابط کاربری سازگار با بومی سازی بسازیم

حداقل چیزی که باید در مورد یونیکد بدانید این مقاله را مطالعه کنید تا با یونیکد آشنا شوید.

جمع آوری متن

جمع آوری متن کار ساده ای است. پنل مدیریت بومی سازی (Localization Dashboard) را باز کنید، دکمه “Gather Text” را بزنید، و voila! کار تمام است!

با این حال، دو مشکل عمده وجود دارد که زمان زیادی از شما خواهد گرفت:

  1. متن های نامربوط

Unreal متن های زیادی را جمع آوری می کند که مرتبط نیستند. در مورد ما، حدود 80 درصد از متنی که در نتایج جمع آوری ظاهر شد، نامربوط بود. این متون به نظر می رسید که برای بومی سازی موتور بازی است، نه محتوای بازی، اما با وجود تنظیمات فیلتر، این ها همچنان ظاهر می شدند.

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

  1. نوع متن های اشتباه

یکی دیگر از مشکلات رایج، برخورد با متون زیادی است که نوع اشتباهی دارند. در Unreal، هر متن قابل بومی سازی باید از نوع FText باشد، اما توسعه دهندگان گاهی اوقات از FString استفاده می کنند. بدتر از آن، ممکن است در ابتدا از FText استفاده کنند اما بعداً مقدار آن را با استفاده از FString تغییر دهند—که انجام این کار بسیار آسان است، زیرا تبدیل بین FText و FString بسیار ساده است.

ایده خوبی است که کل تیم خود را از ابتدا با اصول بومی سازی در Unreal آشنا کنید و فردی را مسئول نظارت بر فرآیند بومی سازی کنید. شما باید به طور دوره ای دستور “Gather Text” را اجرا کرده و اطمینان حاصل کنید که فیلترهای شما اکثر متون شما را پوشش می دهند. با رشد پروژه شما، پیدا کردن متونی که نیاز به بومی سازی دارند، بسیار سخت تر می شود.

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

جهنم FText و FString

اگر آموزش های ذکر شده قبلاً را دیده باشید، می دانید که تبدیل FString به FText (یا برعکس) ایده بدی است. اما چون انجام این کار خیلی آسان است، می خواهم دوباره به شما یادآوری کنم!

ما برخی موارد داشتیم که در آن FText به FString تبدیل می شد، به یک تابع ارسال می شد و سپس در داخل تابع دوباره به FText تبدیل می شد. متن به نظر FText معمولی می آمد مگر اینکه تلاش می کردید به رشته اصلی آن دسترسی پیدا کنید یا آن را از طریق شبکه به یک کلاینت با زبان متفاوت ارسال کنید.

تبدیل خودکار از FString به FText توسط سیستم Blueprint نیز زمانی که نوع متن خود را از FString به FText یا برعکس تغییر می دهید، انجام می شود. پس مراقب این تبدیل ها باشید و به محض شناسایی یکی، آن را اصلاح کنید.

چند مورد وجود دارد که تبدیل FString به FText منطقی است (مثلاً برای چاپ متن دیباگ روی صفحه)، اما به طور کلی، این یک هشدار قرمز است.

زبان های انسانی یک آشفتگی هستند!

ما تصمیم گرفتیم شخصی سازی جنسیتی را بسیار دیر در فرآیند توسعه معرفی کنیم. از منظر گیم پلی، به نظر ساده می رسید: یک مدل زنانه بسازید، یک رابط کاربری برای انتخاب جنسیت جادوگر توسط بازیکن اضافه کنید. تمام شد، درست است؟ متأسفانه، نه!

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

Unreal قبلاً از ساختار {var}|gender(masculine, feminine, neuter) پشتیبانی می کند. اگر ETextGender را به پارامتر var در تابع FormatText ارسال کنید، کاملاً درست عمل می کند. با این حال، ما از این ویژگی استفاده نکردیم.

زبان توسعه ما انگلیسی بود که به طور عمده جنسیتی نیست. اما برای پشتیبانی از جنسیت با استفاده از ساختار Unreal، باید یک {var} برای جنسیت در تمام متون خود تعریف می کردیم. این امکان را به ما می داد تا ETextGender را به تابع FormatText ارسال کنیم، که زبان های دیگر می توانستند در صورت نیاز از آن استفاده کنند. این رویکرد به راحتی فراموش می شود و پیاده سازی آن در مراحل پایانی توسعه به تلاش زیادی نیاز دارد.

در عوض، من یک ساختار سفارشی نوشتم که می توانست در متن اصلی غایب باشد، و یک پردازشگر پیاده سازی کردم که می توانست ساختار را تجزیه کند و رشته صحیح را بر اساس جنسیت شخصیت انتخاب کند. این به متن انگلیسی ما اجازه می داد تا تمیز باقی بماند. این ساختار بسیار مشابه ساختار Unreal [masculine|feminine] است.

علاوه بر این، این ساختار انعطاف پذیر است. اگرچه ما به آن نیاز نداشتیم، اما می توانید یک هدر مانند [header: masculine|feminine|neuter] اضافه کنید تا از جنسیت های مختلف برای سخنگو و هدف پشتیبانی کنید.

مشکل دیگری که باید به آن توجه کنید، تکثیر و اشکال مفرد است. به شما پیشنهاد می کنم از ساختار {number} {number}|plural(one=,few=,many=,other=) در Unreal استفاده کنید.

برخی زبان ها ممکن است چالش های دیگری را ایجاد کنند. برای مثال، در زبان ترکی، نماد درصد قبل از عدد می آید (مثلاً %5 به جای 5%). علاوه بر این، برجسته سازی متن ممکن است در زبان هایی مانند چینی که در آن کلمات با فاصله از هم جدا نمی شوند، کار نکند. این مسائل دشوار هستند که شناسایی شوند، بنابراین زمان لازم برای رسیدگی به آن ها را اختصاص دهید.

فونت ها

مدیریت فونت ها برای زبان های مختلف می تواند دردسر بزرگی باشد.

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

یک رویکرد دیگر استفاده از بومی سازی دارایی های Unreal است که نسخه های بومی شده ای از دارایی فونت شما ایجاد می کند. متأسفانه، این رویکرد معایب خود را دارد. زمانی که زبان بازی تغییر می کند، متون درون بازی بلافاصله تغییر می کنند، اما Unreal تنها زمانی دارایی های فونت بومی شده را بارگذاری می کند که بازی از نو راه اندازی شود. این باعث می شود که بازیکنان تا زمانی که بازی را دوباره راه اندازی نکنند یا به زبان اصلی بازنگردند، علامت سوال ها را ببینند.

راه حل بهتری این است که از ویژگی مدیریت فونت Unreal استفاده کنید که به شما این امکان را می دهد تا بر اساس محل زبان فعلی، فونت خاصی را انتخاب کنید. در حالی که این روش کار می کند، ایده آل نیست. به عنوان مثال، در منوی تنظیمات، ممکن است بخواهید نام هر زبان را هم به زبان فعلی و هم به اسکریپت بومی آن نمایش دهید (برای مثال، “فارسی (Farsi)”). اگر فونت فقط بر اساس منطقه انتخاب شود، یا باید حروف فارسی را در تمام فونت های خود پشتیبانی کنید یا علامت سوال ها را خواهید دید.

بهترین رویکرد چیست؟

رویکردی که من بهترین پیدا کردم، استفاده از بازه های یونیکد و اختصاص هر فونت به یک بازه خاص است.

فونت پیش فرض ما تمام زبان های اروپایی را پوشش می داد، اما زبان های چینی و ژاپنی چالش برانگیزتر بودند. از آنجا که بازه یونیکد برای کاراکترهای کانجی ترکیبی است و چینی ساده، چینی سنتی و ژاپنی هر سه از همان بازه استفاده می کنند، امکان داشتن فونت های جداگانه برای هر زبان وجود نداشت. ما فونت های مختلفی را امتحان کردیم، برخی از آن ها وعده پشتیبانی از چینی و ژاپنی را می دادند، اما زمانی که آن ها را تست کردیم، متوجه شدیم که کاراکترهای گمشده وجود دارند. برخی فونت ها قابل قبول بودند، اما کاربران چینی آن ها را غیرقابل خواندن می دانستند. در نهایت، مترجمان به کمک آمدند و لینک زیر را به من دادند که فونت های استاندارد چینی را ارائه می دهد: https://github.com/wordshub/freefont.

پایپ لاین ترجمه

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

به عنوان یک برنامه نویس، شما باید یک پایپ لاین ایجاد کنید که ارتباط بین تیم شما و تیم ترجمه را تسهیل کند. از آنجا که ساختار هر تیم متفاوت است، وارد جزئیات نمی شوم، اما برخی نکات کلی را ارائه می دهم.

اول و مهم تر از همه، نرم افزاری که تیم ترجمه شما استفاده می کند را درک کنید. اطمینان حاصل کنید که کدگذاری (encoding) در سراسر پایپ لاین یکسان باشد. در غیر این صورت، ممکن است با مسائلی مانند نمایش اعداد به جای بازگشت خط یا خراب شدن متون ترجمه شده قبلی مواجه شوید. یک قاعده کلی این است که تبدیل ها را خودتان انجام دهید. برای مثال، اگر آن ها از Excel استفاده می کنند، به جای فایل های CSV، فایل های Excel به آن ها بدهید (خصوصاً چون Microsoft Excel هنگام وارد کردن CSVها از شما کدگذاری نمی خواهد!). بسته به روند کاری شما، ممکن است نیاز به نوشتن برخی از تبدیل کننده ها یا حتی ایجاد فرمت خودتان (برای مثال برای نسخه بندی یا برچسب گذاری) داشته باشید.

روند کاری ایده آل این است که یک فایل واحد را در اختیار تیم ترجمه قرار دهید و پس از ترجمه، همان فایل را دریافت کنید. با این حال، از آنجا که مهلت های ترجمه معمولاً قبل از تاریخ انتشار است، برخی محتوا ممکن است آماده نباشد. در چنین مواقعی می توانید از جداول رشته ها (string tables) استفاده کنید: متن ها را در آن ها بنویسید و زمانی که محتوا آماده شد، می توانید به جدول رشته ها برای متن بومی شده ارجاع دهید. اما به تدریج که ترجمه پیش می رود، ممکن است تیم شما متوجه شود که برخی متن ها از دست رفته اند و نیاز به ارائه فایل های اضافی دارید. نحوه مدیریت چندین فایل بستگی به پایپ لاین شما خواهد داشت، اما برای این موضوع آماده باشید.

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

شما می توانید با استفاده از دستورات موجود در پنل مدیریت بومی سازی Unreal شروع کنید. این دستورات به راحتی می توانند در یک اسکریپت پایتون بدون نیاز به باز کردن موتور فراخوانی شوند. در انتهای مستندات یک مثال ساده اضافه کرده ام.

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

یکی دیگر از کاربردهای مفید این است که تمام متن های خود را جمع آوری کرده و از خدمات ترجمه AI برای ترجمه آن ها استفاده کنید، سپس تیم کنترل کیفیت داخلی خود را برای تست بازی و شناسایی متن های بدون بومی سازی پیش از ارسال به تیم ترجمه به کار گیرید.

در نهایت، توجه داشته باشید که کمپایل متون (text compilation) زمانی که بازی را می سازید، فراخوانی نمی شود، بنابراین باید آن را به صورت دستی فراخوانی کنید—یا بهتر است، پایپ لاین ساخت خود را تنظیم کنید تا به طور خودکار CompileText را فراخوانی کند.

ملاحظات مربوط به پلتفرم ها

اگر قصد دارید بازی خود را بر روی پلتفرم هایی مانند PlayStation و Xbox منتشر کنید، باید بدانید که سخت افزار، نرم افزار و مفاهیم در پلتفرم های مختلف به طور متفاوتی نام گذاری می شوند. مالکان پلتفرم از شما انتظار دارند که استانداردهای آن ها را در تمام زبان هایی که پشتیبانی می کنید، رعایت کنید؛ در غیر این صورت، ممکن است بازی شما رد شود. به عنوان مثال، شما نمی توانید به سادگی از کلمه “Controller” در همه پلتفرم ها استفاده کنید. اصطلاح “Controller” در هر پلتفرم به طور متفاوتی نام گذاری شده است، بنابراین بازی شما باید آن را بر اساس اصطلاحات خاص هر پلتفرم ارجاع دهد.

شما می توانید یک ساختار ایجاد کنید که پلتفرم فعلی را به عنوان پارامتر دریافت کرده و اصطلاح مناسب را بر اساس پلتفرم انتخاب کند، یا به طور متناوب می توانید برای هر پلتفرم متن های متفاوتی استفاده کنید.

ایده خوبی است که یک جدول از این اصطلاحات همراه با ترجمه های مورد انتظار آن ها در زبان های مختلف برای هر پلتفرم ایجاد کرده و آن را به تیم بومی سازی خود در ابتدای فرآیند ارائه دهید. بررسی تمام متن ها بعداً ممکن است زمان بر و پر از اشتباهات باشد.

نتیجه گیری

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

آیا شما به دنبال کسب اطلاعات بیشتر در مورد "راهنمای توسعه دهنده برای بومی سازی مؤثر در Unreal Engine" هستید؟ با کلیک بر روی تکنولوژی, کسب و کار ایرانی، به دنبال مطالب مرتبط با این موضوع هستید؟ با کلیک بر روی دسته بندی های مرتبط، محتواهای دیگری را کشف کنید. همچنین، ممکن است در این دسته بندی، سریال ها، فیلم ها، کتاب ها و مقالات مفیدی نیز برای شما قرار داشته باشند. بنابراین، همین حالا برای کشف دنیای جذاب و گسترده ی محتواهای مرتبط با "راهنمای توسعه دهنده برای بومی سازی مؤثر در Unreal Engine"، کلیک کنید.