The validation framework can handle different locales.
  Here is an excerpt of the validation.xml file (I've
attached the full version).  The xml file lets you
define your validation rules, define global constants,
locale constants, and a formset has country, language,
and variant just like locale.  If you don't specify
any of these, it will use the default locale.  You can
pass in variables with each locale, override the
default error message (message resource key), and have
parameters for the error message.  The global constant
can be overridden by a locale level constant.  So some
basic constants could be made for the most commonly
used locales or we could leave it up to the user and
just have examples.

<form-validation>
   <global>
      <constant name="zipPostal" value="^\d{5}\d*$" />
   </global>

   <formset>
      <constant name="zipPostal"
value="^\d{5}(-\d{4})?$" />
      
      <form    name="profileForm">
         <field    property="firstName"
                   depends="required">
                     <arg0
key="profileForm.firstName.displayname"/>
         </field>
         <field    property="zipPostal"
                   depends="required,mask">
                     <var name="mask" value="${zipPostal}"/>
                     <msg name="mask"
key="profileForm.zipPostal.maskmsg"/>
                     <arg0
key="profileForm.zipPostal.displayname"/>
         </field>
      </form>
   </formset>
   <formset language="fr" country="CA">
      <constant name="zip" value="^\d{5}(-\d{4})?$" />
      
      <form    name="profileForm">
         <field    property="firstName"
                   depends="required">
                     <arg0
key="profileForm.firstName.displayname"/>
         </field>
         <field    property="zipPostal"
                   depends="required,mask">
                     <var name="mask" value="${zipPostal}"/>
                     <msg name="mask"
key="profileForm.zipPostal.maskmsg"/>
                     <arg0
key="profileForm.zipPostal.displayname"/>
         </field>
      </form>
   </formset>
   
</form-validation>

Everything is online at my site if you want to look at
it.  The source, documentation, javadocs, and example
webapps are all available.

David Winterfeldt
http://home.earthlink.net/~dwinterfeldt

--- Michael Westbay <[EMAIL PROTECTED]> wrote:
> Richards-san wrote:
> 
> > >[...] where they had made a nice method to change
> the language
> > > of the screens, but all the input field
> validation were based on American
> > > standard. Not very smart.
> 
> I've used a number of such pages where I was unable
> to enter a valid phone 
> numbers and/or zip code due to such server-side
> checks.
> 
> > Things to note like this, in Australia we call
> them postcode, and have four
> > digits, in England they have letters and numbers.
> 
> And in Japan it's ###, ###-##, or ###-####.  While
> the 3-4 version is the 
> "official" one now, the others get the mail there
> still.  It's like just 
> using the 5-digit version in the U.S.
> 
> > We have 8 digit local
> > phone numbers (everywhere else has 6 or 7 I think
> and a 3 digit area code).
> 
> This is a tough one in Japan.  The area code always
> begins with 0 (unless 
> calling form outside of Japan) and may have 1,2, or
> 3 digits afterword.  The 
> next part could be 2, 3, or 4 digits depending on
> the size of the "area."  
> Then the last part is always 4 digits.  And, no,
> they don't always add up to 
> the same number of digits overall.  I think that
> keitai (cellular) phones are 
> all now 12 digits, with a given 4 digit "area code"
> given to each service 
> provider.  (Don't quote me on that one, though, as
> I'm still holding out on 
> being on call 7/24, so don't quite know all the
> facts.)
> 
> Also, there was something about currency mentioned. 
> When localizing for 
> currency, wouldn't some sort of logic have to be
> added to convert from a base 
> currency to the one of the locale?  Geneally, when I
> purchase something over 
> the Internet from a foreign country, it's in the
> currency of that country.  
> So I don't understand why this would be a feature of
> the presentation section 
> and not be part of the back-end logic (separate from
> Struts).  I think I 
> would need an example before I could comment any
> further on the merrit of 
> this one.
> 
> -- 
> Michael Westbay
> Work: Beacon-IT http://www.beacon-it.co.jp/
> Home:           http://www.seaple.icc.ne.jp/~westbay
> Commentary:     http://www.japanesebaseball.com/


__________________________________________________
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail - only $35 
a year!  http://personal.mail.yahoo.com/
<form-validation>
   <global>
      <constant name="phone" value="^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$" />
      <constant name="zip" value="^\d{5}\d*$" />

      <validator name="required"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateRequired"
                 msg="errors.required"
                 javascript="
                    function validateRequired(form) {                                                                       
                        var bValid = true;                                                                                  
                        var i = 0;                                                                                          
                        var fields = new Array();                                                                           
                        oRequired = new required();                                                                         
                                                                                                                            
                        for (x in oRequired) {                                                                              
                            if ((form[oRequired[x][0]].type == 'text' || form[oRequired[x][0]].type == 'textarea' || form[oRequired[x][0]].type == 'password') &amp;&amp; form[oRequired[x][0]].value == '') {      
                                fields[i++] = oRequired[x][1];
                                bValid = false;                                                                             
                            }                                                                                               
                        }                                                                                                   
                                                                                                                           
                        if (fields.length > 0) {                                                                            
                           alert(fields.join('\n'));                                                                      
                        }                                                                                                   
                                                                                                                           
                        return bValid;                                                                                      
                    }"
      />

      <validator name="mask"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateMask"
                 depends="required"
                 msg="errors.invalid"
                 javascript="
                    function validateMask(form) {                                                                                                    
                        var bValid = true;                                                                                                            
                        var i = 0;                                                                                                                    
                        var fields = new Array();                                                                                                     
                        oMasked = new mask();                                                                                                        
                                                                                                                                                      
                        for (x in oMasked) {                                                                                                          
                            if ((form[oMasked[x][0]].type == 'text' || form[oMasked[x][0]].type == 'textarea' || form[oMasked[x][0]].type == 'password') &amp;&amp; form[oMasked[x][0]].value.length > 0) {   
                               if (!matchPattern(form[oMasked[x][0]].value, oMasked[x][2](&quot;mask&quot;))) {
                                  fields[i++] = oMasked[x][1];
                                  bValid = false;                                                                                                     
                               }                                                                                                                      
                            }                                                                                                                         
                        }                                                                                                                             
                                                                                                                                                      
                        if (fields.length > 0) {                                                                                                      
                           alert(fields.join('\n'));                                                                                                  
                        }                                                                                                                             
                                                                                                                                                      
                        return bValid;                                                                                                                
                    }                                                                                                                                 
                                                                                                                                                      
                    function matchPattern(value, mask) {
                       var bMatched = mask.exec(value);
                                                                                                                                                      
                       if(!bMatched) {                                                                                                                
                          return false;                                                                                                               
                       }                                                                                                                              
                                                                                                                                                      
                       return true;                                                                                                                   
                    }"
      />

      <validator name="byte"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateByte"
                 depends="required"
                 msg="errors.byte"/>
      <validator name="short"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateShort"
                 depends="required"
                 msg="errors.short"/>
      <validator name="integer"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateInteger"
                 depends="required"
                 msg="errors.integer"/>
      <validator name="long"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateLong"
                 depends="required"
                 msg="errors.long"/>
      <validator name="float"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateFloat"
                 depends="required"
                 msg="errors.float"/>
      <validator name="double"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateDouble"
                 depends="required"
                 msg="errors.double"/>

      <validator name="date"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateDate"
                 depends="required"
                 msg="errors.date"/>

      <validator name="range"
                 classname="com.wintecinc.struts.validation.Validator"
                 method="validateRange"
                 depends="required,integer"
                 msg="errors.range"
                 javascript="
                    function validateRange(form) {                                                                                                    
                        var bValid = true;                                                                                                            
                        var i = 0;                                                                                                                    
                        var fields = new Array();                                                                                                     
                        oRange = new range();                                                                                                        
                                                                                                                                                      
                        for (x in oRange) {                                                                                                          
                            if ((form[oRange[x][0]].type == 'text' || form[oRange[x][0]].type == 'textarea') &amp;&amp; form[oRange[x][0]].value.length > 0) {   
                               var iMin = parseInt(oRange[x][2](&quot;min&quot;));
                               var iMax = parseInt(oRange[x][2](&quot;max&quot;));
                               var iValue = parseInt(form[oRange[x][0]].value);

                               if (&#33;(iValue &gt;= iMin &amp;&amp; iValue &lt;= iMax)) {
                                  fields[i++] = oRange[x][1];
                                  bValid = false;                                                                                                     
                               }                                                                                                                      
                            }                                                                                                                         
                        }                                                                                                                             
                                                                                                                                                      
                        if (fields.length > 0) {                                                                                                      
                           alert(fields.join('\n'));                                                                                                  
                        }                                                                                                                             
                                                                                                                                                      
                        return bValid;                                                                                                                
                    }"
      />

   </global>
   <formset>
      <constant name="zip" value="^\d{5}(-\d{4})?$" />
      
      <form    name="registrationForm">
         <field    property="firstName"
         	   depends="required,mask">
         	     <var name="mask" value="^\w+$"/>
         	     <arg0 key="registrationForm.firstname.displayname"/>
         </field>
         <field    property="lastName"
         	   depends="required,mask">
         	     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <msg name="mask" key="registrationForm.lastname.maskmsg"/>
         	     <arg0 key="registrationForm.lastname.displayname"/>
         	     <arg0 key="registrationForm.lastname.displayname"/>
         </field>
         <field    property="addr"
         	   depends="required">
         	     <arg0 key="registrationForm.addr.displayname"/>
         </field>
         <field    property="cityStateZip.city"
         	   depends="required,mask">
         	     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.city.displayname"/>
         </field>
         <field    property="cityStateZip.stateProv"
         	   depends="required,mask">
         	     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.stateprov.displayname"/>
         </field>
         <field    property="cityStateZip.zipPostal[1]"
         	   depends="required,mask">
         	   <var name="mask" value="${zip}"/>
         	   <arg0 key="registrationForm.zippostal.displayname"/>
         </field>
         <field    property="phone"
         	   depends="mask">
         	     <var name="mask" value="${phone}"/>
         	     <arg0 key="registrationForm.phone.displayname"/>
         </field>
         <field    property="email"
         	   depends="required,mask">
         	     <var name="mask" value="^\w+@\w+.\w{3}$"/>
         	     <arg0 key="registrationForm.email.displayname"/>
         </field>
      </form>
      <form    name="multiRegistrationForm">
         <field    property="firstName"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^\w+$"/>
         	     <arg0 key="registrationForm.firstname.displayname"/>
         </field>
         <field    property="lastName"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <msg name="mask" key="registrationForm.lastname.maskmsg"/>
         	     <arg0 key="registrationForm.lastname.displayname"/>
         </field>
         <field    property="addr"
         	   depends="required"
                   page="1">
         	     <arg0 key="registrationForm.addr.displayname"/>
         </field>
         <field    property="cityStateZip.city"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.city.displayname"/>
         </field>
         <field    property="cityStateZip.stateProv"
         	   depends="required,mask"
                   page="2">
                     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.stateprov.displayname"/>
         </field>
         <field    property="cityStateZip.zipPostal[1]"
         	   depends="required,mask"
                   page="2">
                     <var name="mask" value="${zip}"/>
         	     <arg0 key="registrationForm.zippostal.displayname"/>
         </field>
         <field    property="phone"
         	   depends="mask"
                   page="2">
                     <var name="mask" value="${phone}"/>
         	     <arg0 key="registrationForm.phone.displayname"/>
         </field>
         <field    property="email"
         	   depends="required,mask"
                   page="2">
                     <var name="mask" value="^\w+@\w+.\w{3}$"/>
         	     <arg0 key="registrationForm.email.displayname"/>
         </field>
      </form>
      <form    name="typeForm">
         <field    property="byte"
         	   depends="required,byte">
         	     <arg0 key="typeForm.byte.displayname"/>
         </field>
         <field    property="short"
         	   depends="required,short">
         	     <arg0 key="typeForm.short.displayname"/>
         </field>
         <field    property="integer"
         	   depends="required,integer,range">
         	     <var name="min" value="10"/>
         	     <var name="max" value="20"/>
         	     <arg0 key="typeForm.integer.displayname"/>
         	     <arg1 name="range" key="${var:min}" resource="false"/>
         	     <arg2 name="range" key="${var:max}" resource="false"/>
         </field>
         <field    property="long"
         	   depends="required,long">
         	     <arg0 key="typeForm.long.displayname"/>
         </field>
         <field    property="float"
         	   depends="required,float">
         	     <arg0 key="typeForm.float.displayname"/>
         </field>
         <field    property="double"
         	   depends="required,double">
         	     <arg0 key="typeForm.double.displayname"/>
         </field>
         <field    property="date"
         	   depends="required,date">
         	     <arg0 key="typeForm.date.displayname"/>
         </field>
      </form>
   </formset>
   <formset language="fr">
      <form    name="registrationForm">
         <field    property="firstName"
         	   depends="required,mask">
         	     <var name="mask" value="^\w+$"/>
         	     <arg0 key="registrationForm.firstname.displayname"/>
         </field>
         <field    property="lastName"
         	   depends="required,mask">
         	     <var name="mask" value="^\w+$"/>
         	     <msg name="mask" key="registrationForm.lastname.maskmsg"/>
         	     <arg0 key="registrationForm.lastname.displayname"/>
         </field>
         <field    property="addr"
         	   depends="required">
         	     <arg0 key="registrationForm.addr.displayname"/>
         </field>
         <field    property="cityStateZip.city"
         	   depends="required,mask">
         	     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.city.displayname"/>
         </field>
         <field    property="cityStateZip.stateProv">
         	     <arg0 key="registrationForm.stateprov.displayname"/>
         </field>
         <field    property="cityStateZip.zipPostal[1]"
         	   depends="required,mask">
         	     <var name="mask" value="${zip}"/>
         	     <arg0 key="registrationForm.zippostal.displayname"/>
         </field>
         <field    property="phone">
         	     <arg0 key="registrationForm.phone.displayname"/>
         </field>
         <field    property="email"
         	   depends="required,mask">
         	     <var name="mask" value="^\w+@\w+.\w{3}$"/>
         	     <arg0 key="registrationForm.email.displayname"/>
         </field>
      </form>
      <form    name="multiRegistrationForm">
         <field    property="firstName"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^\w+$"/>
         	     <arg0 key="registrationForm.firstname.displayname"/>
         </field>
         <field    property="lastName"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^\w+$"/>
                     <msg name="mask" key="registrationForm.lastname.maskmsg"/>
         	     <arg0 key="registrationForm.lastname.displayname"/>
         </field>
         <field    property="addr"
         	   depends="required"
                   page="1">
         	     <arg0 key="registrationForm.addr.displayname"/>
         </field>
         <field    property="cityStateZip.city"
         	   depends="required,mask"
                   page="1">
                     <var name="mask" value="^[a-zA-Z]*$"/>
         	     <arg0 key="registrationForm.city.displayname"/>
         </field>
         <field    property="cityStateZip.stateProv"
                   page="2">
         	     <arg0 key="registrationForm.stateprov.displayname"/>
         </field>
         <field    property="cityStateZip.zipPostal[1]"
         	   depends="required,mask"
                   page="2">
                     <var name="mask" value="${zip}"/>
         	     <arg0 key="registrationForm.zippostal.displayname"/>
         </field>
         <field    property="phone"
                   page="2">
         	     <arg0 key="registrationForm.phone.displayname"/>
         </field>
         <field    property="email"
         	   depends="required,mask"
                   page="2">
                     <var name="mask" value="^\w+@\w+.\w{3}$"/>
         	     <arg0 key="registrationForm.email.displayname"/>
         </field>
      </form>
   </formset>   
</form-validation>

Reply via email to