Skip to content

5. المثال 04 – التدويل

يعود هذا المثال إلى موضوع التدويل الذي تمت دراسته في المثال الأول.

5.1. مشروع NetBeans

Image

Image

يحتوي على:

  • عرض [Page1.jsp]
  • ملفان للرسائل [messages*.properties]
  • لا توجد إجراءات

5.2. إعدادات المشروع

الملف [struts.xml] هو كما يلي:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <!-- التدويل -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- الحزمة الافتراضية -->
  <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <!-- حزمة الإجراءات -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1">
      <result name="success">/vues/Page1.jsp</result>
    </action>
  </package>
</struts>
  • يحدد السطر 8 ثابت Struts، وهو الذي يحدد اسم ملف الرسائل المُترجمة، وهو هنا messages. سيتم البحث عن ملفات [messages_xx.properties] في ملف ClassPath الخاص بالمشروع. ولهذا السبب، تم وضعها هنا في الجذر لـ [Source Packages] و [1].
  • الأسطر 21-23: تُعرّف إجراءً [Action1] بدون فئة مرتبطة به. عندئذٍ سيتم استخدام فئة افتراضية من Struts، حيث تُرجع طريقة execute المفتاح success. وبالتالي، سيتم إرجاع العرض [/vues/Page1.jsp] إلى العميل. من المهم فهم أن هذا لا يعادل استدعاء العرض [/vues/Page1.jsp] مباشرةً. ففي الواقع، يؤدي استدعاء إجراء ما إلى تشغيل المعترضات، وهو ما لا يحدث عند الاستدعاء المباشر لعرض ما. وتقوم إحدى المعترضات بإدارة عملية التدويل.

5.3. ملفات الرسائل

messages.properties


page.texte=Ici, on met un texte fran\u00e7ais...
page.titre1=Fran\u00e7ais
page.titre2=Fran\u00e7ais

messages_en.properties


page.texte=Here, we put some english text...
page.titre1=English
page.titre2=English

وهي تحدد ثلاث مفاتيح هي: page.texte، وpage.titre1، وpage.titre2. سيتم استخدام الملف [messages_en.properties] إذا كانت لغة الصفحة هي الإنجليزية (en). سيتم استخدام الملف [messages.properties] لجميع اللغات الأخرى. هذا هو ملف الرسائل الافتراضي. اللغة المستخدمة هي إما:

  • لغة متصفح العميل في تفضيلاته المرسلة إلى الخادم
  • أو اللغة المطلوبة في استعلام من العميل باستخدام المعلمة request_locale=xx.

5.4. طريقة العرض [Page1.jsp]

الطريقة هي كما يلي:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="page.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="page.titre2"/></h1>
    <s:text name="page.texte"/>
  </body>
</html>
  • السطر 7: يعرض رسالة المفتاح page.titre1
  • السطر 10: يعرض رسالة المفتاح page.titre2
  • السطر 11: يعرض رسالة المفتاح page.texte

5.5. الاختبارات

لنقم بتشغيل المشروع:

  • في [1]، عُرضت الصفحة باللغة الفرنسية. تم استخدام الملف [messages.properties] لأن المتصفح المستخدم كان يفضل اللغة الفرنسية.
  • في [3]، عُرضت الصفحة باللغة الإنجليزية. تم استخدام الملف [messages_en.properties] لأن عنوان URL [2] استخدم المعلمة request_locale=en.

في [4]، تم طلب صفحة باللغة الألمانية (de). ونظرًا لعدم وجود ملف [messages_de.properties]، يتم استخدام الملف الافتراضي [messages.properties] بدلاً من [5].

في [6]، يتم تعيين اللغة الإنجليزية كلغة مفضلة للمتصفح.

في [7]، يتم طلب الإجراء [Action1] بدون معلمات لغة. يأتي الطلب من متصفح لغته المفضلة هي الإنجليزية (en). وبالتالي، يتم استخدام الملف [messages_en.properties] بدلاً من [8].

من الآن فصاعدًا، سيكون لكل مشروع ملف [messages.properties] فريد سيُستخدم لجميع اللغات. وهذا سيجبرنا على كتابة طرق عرض تستخدم مفاتيح هذا الملف. وستتم عملية التدويل إلى اللغة الإنجليزية عن طريق إنشاء ملف [messages_en.properties] للرسائل الإنجليزية. ولا توجد أي تعديلات أخرى يجب إجراؤها.