هل يجب علي استخدام java.text.MessageFormat للرسائل المترجمة بدون العناصر النائبة؟

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

سؤال

نحن نعمل على توطين نص واجهة المستخدم لتطبيق ويب يعمل على Java 5، ونواجه معضلة حول كيفية إخراج الرسائل التي تم تعريفها في ملفات الخصائص - النوع المستخدم بواسطة java.util.Properties.

تتضمن بعض الرسائل عنصرًا نائبًا سيتم ملؤه باستخدام java.text.MessageFormat.على سبيل المثال:

search.summary = Your search for {0} found {1} items.

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

warning.item = This item''s {0} is not valid.

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

help.url = The web page's URL

سؤال: هل يجب أن نستخدمMessageFormat لجميع الرسائل، أو لبناء جملة متسق، أو نتجنبMessageFormat حيثما أمكننا ذلك، لذلك لا تحتاج معظم الرسائل إلى الهروب؟

من الواضح أن هناك إيجابيات وسلبيات في كلتا الحالتين.

لاحظ أن وثائق واجهة برمجة التطبيقات الخاصة بـMessageFormat تعترف بالمشكلة وتقترح حلاً غير موجود:

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

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

المحلول

ما عليك سوى كتابة تطبيقك الخاص لـMessageFormat دون هذه الميزة المزعجة.يمكنك إلقاء نظرة على رمز مسجل SLF4J.

لديهم نسختهم الخاصة من منسق الرسائل والتي يمكن استخدامها على النحو التالي:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

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

نصائح أخرى

في النهاية، قررنا تجنب مشكلة الاقتباس المفرد من خلال استخدام علامات الاقتباس "المتعرجة" دائمًا:

warning.item = This item\u2019s {0} is not valid.

استخدم الحرف "بدلاً من" للاقتباس.نحن نستخدمه طوال الوقت دون مشاكل.

استخدم messageFormat فقط عندما تحتاج إليه، وإلا فسيؤدي ذلك إلى تضخيم الكود وليس له أي قيمة إضافية.

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

بديل آخر...عند تحميل ملف الخصائص، قم فقط بلف تدفق الإدخال في FilterInpuStream الذي يضاعف كل علامة اقتباس.

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