توطين الألعاب في Unreal Engine 4

يعد إعداد لعبة للترجمة جزءًا مهمًا من تطوير اللعبة.

نحن نعمل على لعبة " أفلام القطط! " في Unreal Engine 4. هذه هي إستراتيجية اقتصادية بها الكثير من النص ، ونخطط لترجمتها إلى لغات مختلفة. مثل العديد من الآخرين (لكن هذا ليس دقيقًا ، وآمل ألا يكون هذا صحيحًا) ، فقد قررنا تأجيل مرحلة إعداد التعريب إلى التكرارات التطويرية اللاحقة ، كما اتضح ذلك ، دون جدوى.

يتم تطبيق التعريب في UE4 بأناقة ، وإذا كنت تتذكر أن جميع النصوص التي سيتم ترجمتها كافية للتخزين في حقول Ftext (نص في Blueprint'ah) ، ثم بشكل عام ، لا توجد مشكلة في الحصول على نص من اللعبة. يكفي أن تفتح لوحة معلومات التعريب ، وتكوّن بضعة أزرار - وفويلا.

وعلى الرغم من بساطة هذا الإجراء ، ما زلنا نواجه عددًا من المشكلات ، والتي بسببها اضطررنا إلى حفر جزء من الكود.

تم التحديث في 10.16.19: تنسيق النص.

كيفية تخزين النص


قام شباب Epic Games بتبسيط عملية تجميع النص إلى الحد الأقصى ، مما يقلل كل شيء بنقرة واحدة وترجمة أخرى.

كل شيء يعمل ببساطة شديدة - للتوطين ، يتم استخدام نوع بيانات FText (النص في المخططات) ، والذي يتم حفظ النص فيه ، ويتم جمع هذا النص من قبل نظام التعريب ويتم توفيره للترجمة.

كيف يعمل؟

FText ليس نوع بيانات قياسي يخزن البيانات في حد ذاته. بطبيعة الحال ، فإنه يخزن البيانات في حد ذاته ، ولكن ليس البيانات التي نتوقعها.

FText هو مؤشر. يشير في أي جدول يتم تخزين النص. أي عندما نخصص نصًا لمتغير من هذا النوع ، يتم تخزين النص في جدول افتراضي ، ويقوم المتغير نفسه الآن بتخزين اسم الجدول والمفتاح للعثور على النص في هذا الجدول.

وبالتالي ، اتضح أن النص نفسه مخزّن في مكان آخر (لن نأخذ في الاعتبار التفاصيل الدقيقة لتنفيذ ذلك ، حيث أننا لسنا مهتمين به بشكل خاص) ، وعند تبديل الترجمة إلى العنوان المطلوب ، يتم استبدال النص (جيدًا ، أو أريد أن أعتقد ذلك).

صورة

عند بدء تشغيل مجموعة النصوص ، يقوم نظام التعريب بجمع كل المتغيرات النصية من جميع المخططات والحاجيات والجداول ، وطرح قائمة ضخمة واحدة من النص يمكن تصديرها إلى * .po وترجمتها.

تحتوي لعبتنا على مجموعة كبيرة من عناصر واجهة المستخدم التي من خلالها يتحكم اللاعب في طريقة اللعب بأكملها تقريبًا. لدينا العديد من الأسماء (على سبيل المثال ، الإدارات أو مراحل إنشاء الأفلام أو بعض المهارات ، والمكافآت ، وما إلى ذلك) التي يتم استخدامها في عناصر واجهة تعامل مستخدم مختلفة لا علاقة لها ببعضها البعض تمامًا. هناك وصف لبعض الكائنات (على سبيل المثال ، وصف للمكافآت) ، ويستخدم هذا أيضًا أكثر من مرة في عناصر واجهة مستخدم متعددة غير مرتبطة.

وهنا تبدأ الصعوبة. إذا أعدنا كتابة أسماء الأقسام في كل عنصر واجهة مستخدم ، فسيتم كتابة اسم الإدارات بشكل خاطئ في مرحلة ما في إحدى عناصر واجهة المستخدم. هذه المسألة معقدة بسبب حقيقة أن "الأوصاف" نفسها (على سبيل المثال ، وصف القسم) في عدد كبير من الشخصيات يصعب تتبعها بحيث تكون متماثلة في كل مكان (وبطبيعة الحال ، لم نفعل ذلك). والأمر الأكثر متعة هو أن لدينا معظم الأدوات المصغّرة المستخدمة كقالب تتحول إليه البيانات من مصادر مختلفة ، وبناءً على المصدر الذي كانت عليه ، تتغير الأسماء والنصوص داخل الشفرة.

لقد جعلنا مهمتنا أسهل من خلال إنشاء جدول بيانات ، بدأنا فيه بتخزين بيانات أنواع محددة. على سبيل المثال ، جدول قسم يحتوي على الاسم والوصف والمستوى الأقصى وعدد الموظفين لكل مستوى ، إلخ. إلخ
يبدو أنه كان من الممكن الخوض في هذا ، ولكن كانت هناك صعوبة في حقيقة أن البيانات الموجودة في الجدول تتغير باستمرار ، وتمت إعادة كتابة شيء ما ، تم حذفه مع نمو الرمز ، وكانت هناك حالات عندما تعطل الجدول بأكمله ، وكان علينا التراجع ، الانسحاب البيانات ، والعودة إلى الحالة الحالية وإدراج البيانات المفقودة مرة أخرى.

أصبح كل شيء أكثر حزنًا عندما قررت الدخول في الترجمة وأخيراً جربها وأخرجها لفهم ما إذا كنا جميعًا نفعل ذلك بشكل صحيح.

لقد سحبت كل النص من اللعبة وأدركت أنه في الكود ، على الرغم من حقيقة أننا حاولنا تجنب التكرار ، كان هناك عدد كبير من العناصر المتكررة للنص.

الترجمة شيء بشري. إذا كانت هناك فرصة لارتكاب خطأ ، فسيرتكب الأشخاص بالضرورة خطأ. ولتجنب هذا أو على الأقل تصغيره ، تحتاج إلى تقليص جميع النصوص إلى قالب واحد. وهذا هو ، الإخراج في مكان ما في مكان واحد ، من حيث سيتم أخذ النص في جميع أجزاء التعليمات البرمجية. والتي سيتم ترجمتها مرة واحدة فقط من أجل تقليل مخاطر الأخطاء. يبدو أنه يمكنك استخدام DataTable ، ولكن هناك عددًا من المشكلات هناك - لحفظ أسماء شيء ما فقط ، نحتاج إلى إنشاء جداول كاملة لتخزين هذه الأسماء.

بعد البحث في وثائق Epic Games ، وجهت انتباهي إلى String Tables (المشار إليها فيما يلي باسم "جداول السلسلة"). اتضح أن هذا هو الخيار المثالي - لتخزين النص في جدول منفصل خاص بالنصوص ، والذي تم إنشاؤه فقط ليتم توصيله بمتغيرات FText -. وهذا يعني أنه يمكننا إنشاء جدول يخزن النص في حد ذاته. ويمكننا توصيل هذا النص بأي متغير - سواء كان متغيرًا في جدول البيانات ، أو متغيرًا في عنصر واجهة المستخدم ، أو متغيرًا في الكود - كل ذلك يأتي إلى مكان واحد حيث يتم تخزين النص.

تسمح لك String Tables بتجنب تكرار النص في مشروع عدة مرات أكثر قليلاً من تمامًا ، وبالتالي تجنب الأخطاء.

يتم إنشاء جداول السلسلة في المحرك ، وكذلك جداول البيانات في القسم المتنوع:

صورة

من السهل جدًا ملء البيانات - يجب أن يحتوي كل سطر جديد على مفتاح فريد يتعين عليك اختراعه. والنص نفسه يمكن أن يكون بالفعل أي. أيضًا ، في الجدول يمكنك تحديد اسم مختلف لمساحة النص من اسم الجدول ، ولكن ، في تجربتنا ، هذا ليس ضروريًا.

بعد إنشاء جدول السلسلة ، يمكن الآن توصيل النص بمتغير FText:

صورة

صورة

وبالتالي ، قمنا بتقليص النص إلى جدول صف واحد ، حيث يسهل السحب منه. للحصول على قائمة إعدادات النص هذه ، ما عليك سوى النقر على السهم لأسفل بجوار متغير النص.

التعريب


الآن علينا فقط جمع كل النص والبدء في العمل به. للقيام بذلك ، نحتاج إلى بدء تشغيل لوحة معلومات الترجمة وبدء إعدادات الترجمة. يمكنك تشغيل الجدول من خلال القائمة Window-> Localization Dashboard.

وقبل أن تفتح شيئا مثل هذه النافذة:

صورة

في هذه النافذة ، يجب عليك تحديد الهدف (الوحدة النمطية) الذي سيتم منه سحب النص. في حالتنا ، هذه لعبة - لعبة.

بعد ذلك ، تحتاج إلى تحديد المكان الذي سيتم فيه سحب النص بالضبط في الوحدة النمطية. في حالتنا ، هذه مجرد أخطاء ، لأننا لا نخزن النص في الدورات التدريبية. لذلك ، نحتاج إلى تحديد "تجميع من الحزم" فقط والإشارة إلى المجلدات والملفات التي يتعين علينا مراعاتها من أجل البحث عن النصوص.

نحتاج أيضًا إلى الإشارة إلى اللغات التي سيتم استخدامها للترجمة وأي لغة ستكون أصلية (أساسية). أوصي بشدة إذا كنت تكتب وتتحدث الروسية - تشير إلى اللغة الروسية (أو أي لغة أخرى لغتك الرئيسية). هذا يرجع إلى حقيقة أنه إذا كنت لا تعرف اللغة الإنجليزية جيدًا ، ثم تشير إلى أنها اللغة الرئيسية ، فإنك تعقد ترجمتك إلى اللغة الإنجليزية من "اللغة الإنجليزية". لذلك ، من الأفضل الإشارة إلى لغتك مسبقًا باعتبارها اللغة الرئيسية ، وكتابة جميع النصوص بلغتك ، حتى تتمكن لاحقًا من تسهيل الترجمات لنفسك وللآخرين.

أيضًا في UE4 هناك فرصة رائعة لإنشاء ترجمات مباشرة في المحرك ، دون تصدير النصوص لبرامج الجهات الخارجية. للقيام بذلك ، تحتاج إلى جمع كل النصوص ذات الصلة في اللعبة من خلال النقر على الزر رقم 1. ثم قم بتشغيل المحرر (الزر رقم 2):

صورة

تفتح نافذة لتحرير الترجمة إلى اللغة التي تحتاجها.

جمعية


عند تجميع مشروع ، يجب عليك تحديد اللغات التي يجب تضمينها في هذا التجميع ، وكذلك مجموعة اللغات التي يجب أن يدعمها مشروعك.

صورة

في حالتنا ، تم تعيين دعم التدويل على الكل. أي أن مشروعنا سيدعم جميع أنواع اللغات من الهيروغليفية المعقدة إلى الحروف الإنجليزية البسيطة. بشكل عام ، هناك 5 حزم:

  • الإنجليزية (الإنجليزية الخالصة).
  • EFIGS (الإنجليزية والفرنسية والإيطالية والألمانية والإسبانية)
  • EFIGSCJK (كما هو مذكور أعلاه + الصينية واليابانية والكورية)
  • CJK (الصينية واليابانية والكورية).
  • الكل (جميع اللغات).

ومع ذلك ، في الحالات التي تكون فيها قيمة كل بايت في المشروع (حزمة All تزن 15 ميغابايت ، و EFIGS 2 ميغابايت) ، يجب أن تولي اهتمامًا أكبر للحزمة التي تحتاج إلى اختيارها.

تبديل التعريب


يحدث تبديل النص في وقت التشغيل ، أي أنك لست بحاجة إلى إعادة تشغيل اللعبة ، ولا داعي للقلق بشأن تبديل التحسين - كل شيء يتم بسهولة وببساطة من خلال طريقة " SetCurrentCulture " ، حيث تحتاج إلى الإشارة مع النص إلى اللغة التي تريد التبديل إليها.

صورة

وهنا هناك بعض هذه العقبة. الحقيقة هي أن البلدان المختلفة لها فروع لغتها الخاصة بها ، على سبيل المثال ، هناك اللغة الروسية الرئيسية (ru) ، ولكن يوجد البيلاروسية (ru-BY) ، الكازاخستانية (ru-KZ) ، المولدافية (ru-MD) ، الأوكرانية (ru) -UA) اللغات التي تندرج تحت فرع اللغة الروسية. لذلك ، عند اختيار لغة ليست هي اللغة الرئيسية ، تحتاج إلى التفكير والإشارة إلى اللغة الصحيحة. إذا قمت بتحديد العنصر الرئيسي فقط ، فعند التبديل ، فقط حدد "رو".

صورة

إضافة بيانات أخرى إلى النص في Blueprint.


إذا تم الإشارة إلى الأقواس المعقوفة في النص نفسه ، وتم الإشارة إلى اسم البيانات فيها ، في المستقبل ، يمكنك استخدام استبدال هذه البيانات نفسها في النص.
على سبيل المثال: "هل ترغب في معرفة تقنية {Tech_Name}؟"
علاوة على ذلك ، في BP ، يمكنك استخدام العقدة "Format Text" ، والتي ستأخذ بعين الاعتبار النص نفسه والمعلمات المشار إليها هناك وإنشاء دبابيس إضافية لتوصيل هذه البيانات بالذات:
صورة

الآن سيتم تضمين معلومات إضافية في النص ، والتي يمكن تصحيحها دون تصحيح النص نفسه. على سبيل المثال ، يمكنك إدخال أسماء الأقسام أو التقنيات ، ويمكنك تحديد مستويات أو شيء آخر.

استنتاج


بعد أن جمعت كل هذه المعلومات معًا ، أدركت أننا منذ البداية لم نقترب بشكل صحيح من إنشاء نص في اللعبة وقمنا بالكثير من العمل غير الضروري. بالطبع ، لم نعيد صياغة الكود لأشهر ، لكننا أمضينا 1.5 ساعة كحد أقصى في هذا ، لكن سيكون من الجيد معرفة مبادئ التوطين في UE4 مقدمًا ومراعاة ذلك عند بناء بنية المشروع.

الشيء نفسه ينطبق على حفظ وتحميل في الألعاب. تبين أن هذه ليست مهمة سهلة في ظروف استراتيجية حيث يجب إصلاح كل شيء صغير في مكانه / أكاذيبه / لديه حالة معينة. لكنني سأكتب عن هذا بعض الوقت. والآن يمكنك متابعة مشاهدة لعبتنا في مجموعتنا =)

Source: https://habr.com/ru/post/ar470205/


All Articles