5. المثال 04 – التدويل
يعيد هذا المثال تناول موضوع التدويل الذي تم تناوله في المثال الأول.
5.1. مشروع NetBeans


ويشمل:
- عرض [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>
<!-- internationalization -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- default package -->
<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>
<!-- equity 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 الخاص بالمشروع. ولهذا السبب، تم وضعها هنا في جذر [حزم المصدر] [1].
- الأسطر 21–23: تحدد إجراء [Action1] بدون فئة مرتبطة به. سيتم بعد ذلك استخدام فئة Struts افتراضية، حيث تُرجع طريقة التنفيذ الخاصة بها المفتاح "success". سيتم بعد ذلك إرجاع العرض [/views/Page1.jsp] إلى العميل. من المهم أن نفهم أن هذا يختلف عن استدعاء العرض [/views/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.text و page.title1 و page.title2. سيتم استخدام ملف [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.title1
- السطر 10: يعرض الرسالة ذات المفتاح page.title2
- السطر 11: يعرض الرسالة باستخدام المفتاح page.text
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] للرسائل باللغة الإنجليزية. ولا حاجة لأي تغييرات أخرى.


