یکی از تجربه‌هایی که تو پروژه‌ی Eureka برای ما تازگی داشت و چالش‌های زیادی داشتیم برای پیاده‌سازیش، پشتیبانی از زبان‌های مختلف توی بازی بود. احساس کردم این تجربه‌ها ممکنه ارزشمند باشه و تصمیم گرفتم در مورد چیزایی که یاد گرفتم اینجا بنویسم و ازتون می‌خوام که بحث رو تکمیل کنید که ما هم چیزهای بیشتری یاد بگیریم.
اهمیت ترجمه‌ی بازی
توی همه‌ی کشورای شرقی مثل چین و ژاپن و کره و اکثریت کشورهای اروپایی غیر انگلیسی زبان مثل فرانسه و پرتغال و اسپانیا و آلمان و ... و همچنین کشورایی مثل مکزیک و برزیل مردم زبان مادری خودشون رو به شدت نسبت به زبان انگلیسی ترجیح میدن، هرچند که اکثرن انگلیسی رو تا حدی بلدن. این ترجیح جدی باعث میشه نرخ دانلود بره بالا و نرخ ریزش بازی بیاد پایین. اینه که سعی کنید در درجه‌ی اول تمام متن‌های استورهاتون رو ترجمه کنید به زبان‌های مختلف، و حتا موقع جواب دادن به نظرات کاربراتون، جواب رو به زبان خودشون بنویسید. این باعث میشه خیلی بیشتر توجه کنن به جوابی که دادید و شاید حتا باعث افزایش معرفی بازی به دیگران بشه. اگر اچیومنت یا اینها هم دارید با اضافه کردن زبان جدید به استورتون، باید همه‌ی اون‌ها رو هم ترجمه کنید.
در درجه‌ی دوم خوبه که بازیتون توی گیم‌پلی‌اش هم ترجمه بشه که خب خیلی موثره.همین که بازیکن در حین بازی نیاز به ترجمه کردن متون شما نداره باعث میشه ذهنش آزادتر باشه و کیفیت خیلی بهتری رو از بازی تجربه کنه. بگذریم که توی خیلی کشورا اصن ملت انگلیسی بلد نیستن و شما به راحتی کلی کاربر احتمالی و پتانسیل یه درآمد بزرگ رو از دست می‌دید.
اینو اینجا اضافه می‌کنم که به طور کلی این قابلیت از اونی که ممکنه به نظر بیاد از نظر فنی آسون‌تره و ارزش وقتی که می‌ذارید رو داره، این کارا می‌تونه به طور ویژه CPI تون رو کم کنه و معمولن اثر خوبی هم روی افزایش retention و LTV داره(اگر core loop اصلیتون و روش‌های درآمدزاییتون درست باشه).
روش‌های پیدا کردن زبان مناسب برای هر کاربر
راه حلی که اول به ذهن آدم می‌رسه و طبعن راه حل اولیه تیم ما هم همین بود، گذاشتن یه منوی انتخاب زبان توی بازیه و یه لیست بلند و بالا از زبان‌هایی که پشتیبانی می‌کنیم. ایراد این روش اینه که منوی جدید لازم داره و صفحه‌ی اصلی یا تنظیمات بازیتون رو شلوغ می‌کنه که توی موبایل و به ویژه سبک کژوال و هایپرکژوال همیشه ترجیح بر سادگی و کم بودن تعداد دکمه‌هاست.
روش دوم اینه که بر اساس IP کاربر و کشوری که توشه تصمیم بگیرید بازی به چه زبانی باشه که خب اینم به خاطر تعداد زیاد مهاجر تو کشورهای مختلف ممکنه اصلن اون نتیجه‌ای که می‌خواید رو براتون ایجاد نکنه.
اما روش سومی که در نهایت ما همونو انتخاب کردیم، این بود که بازی رو به صورت خودکار بر اساس زبان گوشی کاربر تغییر بدیم. قاعدتن زبانی که کاربر برای گوشیش انتخاب کرده زبانیه که بیشتر از همه باهاش راحته.
برای این کار هم توی یونیتی یه پکیج کم حجم و ساده هست به اسم Precise Locale، این پکیج هم بهتون کشور کاربر رو اطلاع میده هم زبان کاربر رو. قیمتش هم در زمان نگارش این مطلب ۵ دلاره که با قیمت کنونی دلار یکم گرون اما قابل قبوله :دی
اگر توی فهم کدهای دوحرفی زبان‌ها دچار چالش شدید این لینک یه لیست کامل از زبان‌های مختلف و کدهای دوحرفیشونه. (مثلن کد دو حرفی زبان Dutch یا هلندی، nl عه :دی)
روش‌های پیاده‌سازی
ما برای تک تک کلمات، جملات و عبارات داخل بازی‌مون، یه کلید یکتا در نظر گرفتیم و برای هر زبان یک فایل csv ساختیم که در هر ردیف، ستون اول شامل کلیده و ستون دوم شامل مقدار، که ترجمه‌‌شده‌ی اون عبارت به زبان مقصده. تو این مورد ممکنه یه مقدار به مشکل encoder بخورید و اینو در نظر بگیرید که تنها یک روش encode کردن برای هر زبان وجود نداره و حتمن هر زبان رو حداقل یک بار تست کنید که یونیتی متنهاتون رو درست نمایش بده و با کاراکترهای هشلهفت(!) و بی‌معنی مواجه نشید. در مورد فارسی و عربی به صورت جداگونه توضیح دادم در پایین چون مسائل مخصوص خودشون رو دارن.
راستی روشن کردن قابلیت Best fit توی یونیتی هم یادتون نره، چون طول متن‌ها در ترجمه عوض میشه و قطعن متن شما با یک فونت سایز مشترک برای همه‌ی زبان‌ها خوب نمایش داده نخواهد شد.
چالش‌های زبان‌های راست به چپ
اکثر زبان‌های دنیا چپ به راسته و یک مورد جداگونه پشتیبانی از زبان‌های راست به چپه (تا جایی که من می‌دونم فقط فارسی و عربی رو شامل میشه، اگر بازم مثالی دارید بگید اضافه کنم.) که خب احتمالن بدونید چقدر دردسر داره. اگر متن رو همینجوری توی یونیتی بنویسید، تمام حروف رو از آخر به اول نمایش میده و برای درست کردنش می‌تونید آخرین نسخه از ریپوی Arabic Support رو بگیرید. جز در موارد معدودی کاملن درست کار می‌کنه و مشکل رو تا حد خوبی برطرف می‌کنه.
یکی از مشکلاتش متن‌های چندخطیه که کاری روشون انجام نمی‌ده و یونیتی خودش اینتر می‌زنه که چون متن رو از چپ به راست(آخر به اول) پیمایش می‌کنه، باعث میشه از ابتدای جمله، اینتر بزنه و ببره پایین. و خطوط جمله‌تون ترتیب برعکسی پیدا می‌کنه. برای درست کردن این مورد می‌تونید عرض ترجیحی TextComponent مورد نظر رو با عرض rectTransform مربوط به اون آبجکت مقایسه کنید و بفهمید که متن شما پس از تغییر اندازه‌ی فونت به خاطر best fit، چند خطی خواهد بود؛ و بعدش به صورت حدودی تو مناطق مرزی یک کاراکتر space رو با کاراکتر newline جایگزین کنید. اینجوری متنتون تقریبن خوب نمایش داده میشه همه‌جا.
و در نهایت اگر از زبان‌های راست به چپ استفاده می‌کنید ممکنه بخواید UI بازیتون رو به طور کلی در راستای X، flip کنید. به اینم فکر کنید. مثل ویندوز که وقتی فارسی میشه هرچی چپه میاد راست و هرچی راسته میره چپ. چون کتاب‌های راست به چپ هم برعکس ورق می‌خورن خیلی وقتا کاربرا با حالت برعکس راحت‌ترن.
نکات متفرقه در ترجمه‌ی بازی
-  ترجمه‌ی گوگل در زبان‌های خاصی، ممکنه عجیب یا نادرست باشه و اگر پروژه‌تون بزرگه و ظرفیت مالیش رو دارید می‌تونید از مترجم برای ترجمه‌ها استفاده کنید که خب خیلی روی کیفیت موثره. یه ترجمه‌ی بد ممکنه باعث بشه کاربرهای اون زبان بهتون امتیاز یک ستاره بدن چون درست متوجه بازی نمی‌شن.
- پیشنهادم اینه که ترجمه‌ی ژاپنی و چینی و کره‌ای و روسی و عربی و هندی و فنلاندی و حتا فرانسوی و آلمانی رو کلن بدید مترجم ترجمه کنه، ترجمه‌های گوگل گاهی به شدت غلطه در حدی که تو زبان‌هایی مثل چینی و کره‌ای، یهو یه صفت رو از جمله‌تون حذف می‌کنه یا اصلن نمی‌تونه منظور رو برسونه.
- ما این فایل‌ها رو داخل پروژه قرار دادیم چون حجم بالایی نداشتن. اما این مورد باعث شد اصلاح اشتباهاتی که در ترجمه داشتیم خیلی برامون سخت بشه؛ به من اعتماد کنید قطعن در ترجمه‌های بازی اشتباه‌هایی خواهید داشت، ریزه‌کاری زیاد داره. اینه که پیشنهاد می‌دم این فایلا رو روی سروری قرار بدید و یک بار دانلودشون کنید روی گوشی کاربر. اینجوری برای تغییرش نیاز نیست آپدیت بدید و چند روز منتظر باشید  استور ریویو و آپدیت کاربرا اتفاق بیفته.
- این spreadsheet هم توسط یکی از دوستان پیشنهاد شده. برای کارهای ترجمه به خصوص بازی‌هایی که متن‌ زیادی ندارن خیلی منبع خوبیه. اینجا افراد native معادل یه سری کلمات رایج تو بازی‌ها رو نوشتن و بقیه می‌تونن ازشون استفاده کنن.