بست الممارسات ترجمة النصوص في C++ عبر منصة التطبيقات ؟

StackOverflow https://stackoverflow.com/questions/403747

  •  03-07-2019
  •  | 
  •  

سؤال

في التيار C++ (C++03) ، وهناك عدد قليل جدا من المواصفات حول النص التعريب أن يجعل C++ المطور الحياة أصعب من المعتاد عند العمل مع النصوص المترجمة (بالتأكيد C++0x القياسية سوف تساعد هنا في وقت لاحق).

على افتراض السيناريو التالي (وهو من PC-Mac تطوير اللعبة الحالات):

  1. استجابة (الوقت الحقيقي) التطبيق:التطبيق يحتوي على تقليل عدم استجابة مرات "غير واضحة" ، حيث سرعة التنفيذ هو المهم.
  2. مترجم النصوص:عرض النصوص المترجمة من اللغات ، يحتمل أن تكون أكثر - لا تتوقع عدد ثابت من اللغات ، ينبغي أن يكون بسهولة الموسعة.
  3. لغة محددة في وقت التشغيل:النصوص يجب أن لا تكون مجمعة في تطبيق (ولا وجود تطبيق واحد لكل لغة), يمكنك الحصول على اللغة المختارة المعلومات في إطلاق تطبيق - الذي يعني نوعا من نص التحميل.
  4. عبر منصة:التطبيق هو أن تكون مشفرة عبر منصة في الاعتبار (ويندوز - لينكس/أوبونتو - Mac/OSX) وبالتالي فإن النص المترجم النظام يجب أن يكون عبر منصة أيضا.
  5. تطبيق مستقل:التطبيق يوفر كل ما هو ضروري لتشغيل ؛ وأنها لن تستخدم أي بيئة المكتبة أو يحتاج المستخدم إلى تثبيت أي شيء آخر من نظام التشغيل (مثل معظم الألعاب على سبيل المثال).

ما هي أفضل الممارسات لإدارة ترجمة النصوص في C++ في هذا النوع من التطبيق ؟

لقد بحثت في هذا العام الماضي أن والشيء الوحيد الذي أنا متأكد من أنك يجب أن تستخدم std::wstring أو std::basic_string<ABigEnoughType> التعامل مع النصوص في التطبيق.توقفت بحثي لأني كنت أعمل أكثر على "نص العرض" المشكلة (في حالة 3D في الوقت الحقيقي) ، ولكن أعتقد أن هناك بعض أفضل الممارسات لإدارة مترجم النصوص الخام C++ إلى أبعد من ذلك و "استخدام يونيكود".

لذا كل أفضل الممارسات ، الاقتراحات والمعلومات (عبر منصة يجعل من الصعب على ما أظن) هي موضع ترحيب!

هل كانت مفيدة؟

المحلول

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

أنا يمكن أن تعطيك معلومات عن بعض الأشياء التي فعلناها.لدينا سلاسل تم تحميلها إلى مجموعة عند بدء التشغيل على أساس اختيار اللغة من لاعب.كل فرد لغة ذهب إلى ملف منفصل مع كل الخيوط في نفس الترتيب.سلسلة 1 كان دائما عنوان اللعبة ، سلسلة 2 دائما أول خيار القائمة ، وهلم جرا.نحن مرتبطا المصفوفات من enum, ، integer فهرسة سريعة جدا, و في ألعاب السرعة هي كل شيء.( الحل مرتبط في واحدة من إجابات أخرى يستخدم string عمليات البحث التي كنت تميل إلى تجنب.) عند عرض الجمل ، استخدمنا printf() نوع الوظيفة إلى استبدال علامات مع القيم."تدريب 3 تغادر المدينة 1."

الآن بعض المزالق.

1) من بين اللغات العبارة أمر مختلف تماما."تدريب 3 تغادر المدينة 1."ترجم إلى الألمانية والعودة ينتهي "من 1 القطار 3 المغادرين".إذا كنت تستخدم شيئا مثل printf() و السلسلة "قطار %d تغادر المدينة %d."الألمانية في نهاية المطاف قائلا "من المدينة 3, تدريب 1 المغادرين."وهو أمر خاطئ تماما.لقد حل هذا عن طريق إجبار الترجمة إلى الإبقاء على نفس ترتيب الكلمات ، ولكن انتهى بنا المطاف مع بعض كسر الألمانية.كان لي أن تفعل ذلك مرة أخرى, أود أن أكتب دالة التي تأخذ سلسلة صفر على أساس مجموعة من القيم لوضع فيه.ثم أود أن استخدام علامات مثل %0 و %1, أساسا تضمين مؤشر مجموعة في السلسلة. تحديث:@جوناثان Leffler أشار إلى أن متوافقة مع POSIX printf() يدعم استخدام %2$s اكتب علامات فيها 2$ جزء يكلف printf() لملء هذا علامة الثانية معلمة إضافية.سيكون ذلك مفيد جدا ، طالما هو سريع بما فيه الكفاية.حل مخصص قد لا يزال يكون أسرع ، لذلك سوف تحتاج إلى تأكد من اختبار على حد سواء.

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

3) بقدر ما عبر منصة يذهب كتبنا كثيرا نقية C++ لدينا تعريب النظام.كتبنا مخصص ترميز الملفات الثنائية إلى تحميل ، برنامج مخصص لتحويل من CSV من نص اللغة إلى .h مع enum و ملف اللغة الخريطة ، .lang لكل لغة.الأكثر منصة محددة الشيء كنا وكان الخطوط ، printf() وظيفة, ولكن سيكون لديك شيء مناسبة أينما كنت النامية ، أو يمكن أن الكتابة الخاصة بك إذا لزم الأمر.

نصائح أخرى

GNU Gettext يفعل كل شيء.

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

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

  1. تخطيط الوقت إلى استخدام التعريب المكتبة هو أسهل بكثير ثم التخطيط من الوقت لكتابة التعريب المكتبة.التعريب المكتبات موجودة ، فإنها العمل ، وقد استخدمت العديد من الناس لهم.

  2. التعريب هو صعب, لذلك سوف تحصل على أشياء خاطئة.كل لغة يضيف جديدا شاءت ، مما يعني كلما إضافة لغة جديدة إلى الخاصة بك محلية التعريب المكتبة سوف تحتاج إلى تغيير التعليمات البرمجية مرة أخرى إلى حساب المراوغات.هل تعلم أن بعض اللغات أكثر من 2 صيغ الجمع ، اعتمادا على عدد من العناصر في السؤال ؟ أكثر من 2 الجنسين (أكثر من 10 ، حتى)?أيضا عدد و تاريخ صيغ تختلف كثيرا بين في العديد من اللغات.

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

معروف جدا و التعريب الكامل المكتبة GNU Gettext, والذي يستخدم GPL ، ولذلك ينبغي تجنب العمل التجاري.يمكنك بدلا من ذلك استخدام دفعة المكتبة دفعة.الإعدادات المحلية الذي يعمل مع ملفات Gettext و هي حرة في استخدام و تعديل التجارية وغير التجارية مشاريع من أي نوع.

لن يكون هناك أي ميزات إضافية في C++0x القياسية ، بقدر ما استطيع ان اقول.وأظن وترى اللجنة أن هذه مسألة تخص طرف ثالث المكتبات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top