سؤال

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

ذهب الحل الذي توصلت إليه شيء من هذا القبيل:

public class ExpandingResourceBundleControl extends ResourceBundle.Control {
  public static final ResourceBundle.Control EXPANDING =
    new ExpandingResourceBundleControl();

  private ExpandingResourceBundleControl() { }

  @Override
  public ResourceBundle newBundle(String baseName, Locale locale, String format,
                                  ClassLoader loader, boolean reload)
    throws IllegalAccessException, InstantiationException, IOException {

      ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
      return inner == null ? null : new ExpandingResourceBundle(inner, loader);
  }
}

ExpandingResourceBundle المندوبين إلى حزمة الموارد الحقيقية ولكنها تؤدي تحويل {{this.kind.of.thing}} للبحث عن المفتاح في الموارد.

في كل مرة تريد الحصول على واحدة من هذه ، عليك أن تذهب:

ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);

وهذا يعمل بشكل جيد - لفترة من الوقت.

ما يحدث في نهاية المطاف هو أن بعض التعليمات البرمجية الجديدة (في الكود المولد التلقائي الذي تم خلطه من Matisse) يبحث عن حزمة الموارد نفسها دون تحديد عنصر التحكم المخصص. يبدو أن هذا غير قابل للتعليم إذا كتبت اختبار وحدة بسيط يتصل به وبعد ذلك ، ولكنه يحدث عند تشغيل التطبيق بشكل حقيقي. بطريقة ما ذاكرة التخزين المؤقت في الداخل ResourceBundle يطرد القيمة الجيدة ويحل محلها بالذات المكسورة. لا يمكنني بعد معرفة السبب وتجميع ملفات Sun's Jar دون معلومات تصحيح ، لذا فإن تصحيح الأخطاء هو عمل روتيني.

أسئلتي:

  1. هل هناك طريقة لضبط ResourceBundle.Control الافتراضي الذي قد لا أكون على دراية به؟ من شأنه أن يحل كل شيء بأناقة إلى حد ما.

  2. هل هناك طريقة أخرى للتعامل مع هذا النوع من الأشياء بأناقة ، ربما دون العبث بفصول ResourceBundle على الإطلاق؟

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

المحلول

أعتقد أن هذا عيب أساسي في الطريقة التي يتم بها تصميم أجهزة الموارد لتعمل: مفاتيح تشير إلى مفاتيح أخرى تنتهك تلقائيًا مبدأ الجاف (لا تكرر نفسك). كانت الطريقة التي تجولت بها هذا مشابهاً لطريقتك: إنشاء فئة متعسعة لـ ServensiveresourceBundle تتيح لك تحديد مفاتيح الموارد في الرسائل باستخدام EL TOCATION.

الطريقة الخاطئة:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

الطريق الصحيح:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

لقد قمت تحميل الرمز إلى github لذلك يمكنك أنت أو أي شخص آخر تنزيله. بالإضافة إلى ذلك ، لقد أضفت بعض رمز العينة لأي شخص يستخدم إطار عمل Stripes (http://www.stripesframework.org/) لتحصل على الصعود والركض بسرعة.

كانت خدعة الحصول على هذا العمل مع JSTL FMT Taglibs القياسية هي إعداد اعتراض يحل محل مورد HttPservletRequest معنا. الرمز يشبه هذا:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

ألقِ نظرة على حزمة InternInteres.Interceptor في الرابط أعلاه لمزيد من التفاصيل.

نصائح أخرى

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

  1. "روبن المغطى باللون الأحمر هو طائر صغير من المارة الأصليين في أستراليا."
  2. "تم العثور على Robin Red المغطى باللون الأحمر في مناطق المجفف عبر معظم القارة."

يمكن أن تكون حزمة الموارد كما يلي:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

ثم الجمع بين الأجزاء المطلوبة عند الحاجة bundle.getString("robin.name")+bundle.getString(robin.native).

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

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