claw-cvs
  Threads by month 
                
            - ----- 2025 -----
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2024 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2023 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2022 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2021 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2020 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2019 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2018 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2017 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2016 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2015 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2014 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2013 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2012 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2011 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2010 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2009 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2008 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 
March 2008
- 1 participants
 - 11 discussions
 
                    
                        Author: achiumenti
Date: Sun Mar 30 23:48:36 2008
New Revision: 24
Modified:
   trunk/main/claw-core/src/validators.lisp
Log:
beginning of local-time integration
Modified: trunk/main/claw-core/src/validators.lisp
==============================================================================
--- trunk/main/claw-core/src/validators.lisp	(original)
+++ trunk/main/claw-core/src/validators.lisp	Sun Mar 30 23:48:36 2008
@@ -30,10 +30,10 @@
 (in-package :claw)
 
 (defgeneric translator-encode (translator wcomponent)
-  (:documentation "Encodes the input component value, used when rendering the component"))
+  (:documentation "Encodes the input component value, used when rendering the component (Encodes from type to string)."))
 
 (defgeneric translator-decode (translator wcomponent)
-  (:documentation "Decodes the input component value after a form submit."))
+  (:documentation "Decodes the input component value after a form submit (Decodes from string to type)."))
 
 (defclass translator () 
   ()
@@ -63,6 +63,11 @@
   "*SIMPLE-TRANSLATOR* is the default translator for any CINPUT component. 
 Its encoder and decoder methods pass values unchanged")
 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;; Integer translator ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
 (defclass translator-integer (translator) 
   ((thousand-separator :initarg :thousand-separator
 	 :reader translator-thousand-separator
@@ -115,7 +120,9 @@
 	  (parse-integer (regex-replace-all (format nil "~a" thousand-separator) new-value ""))
 	  (parse-integer new-value)))))
 
-;;=========================================
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;Folating point number translator ;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defclass translator-number (translator-integer) 
   ((decimals-separator :initarg :decimals-separator
@@ -197,7 +204,83 @@
 	    (coerce result type))))))
 
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;; Dates translator ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(defclass translator-date (translator) 
+  ((date-format :initarg :date-format
+		:reader translator-date-fromat
+		:documentation "Sets the format of a date using a list where element are joined together and :DATE :MONTH and :YEAR are
+expanded into day of the month for :DATE, month number for :MONTH and the year for :YEAR. The Default is the list '(:month \"/\" :date \"/\" :year)"))   
+  (:default-initargs :date-format '(:month "/" :date "/" :year))
+  (:documentation "A translator object encodes and decodes local-date object value passed to a html input component"))
+
+
+#|
+(defmethod translator-encode ((translator translator-number) (wcomponent wcomponent))
+  (let* ((page (htcomponent-page wcomponent))
+	 (visit-object (wcomponent-parameter-value wcomponent :visit-object))
+	 (accessor (wcomponent-parameter-value wcomponent :accessor))
+	 (reader (wcomponent-parameter-value wcomponent :reader))
+	 (thousand-separator (translator-thousand-separator translator))
+	 (grouping-size (translator-grouping-size translator))
+	 (decimal-digits (translator-decimal-digits translator))
+	 (decimals-separator (translator-decimals-separator translator))
+	 (signum-directive (if (translator-always-show-signum translator)
+			       "@"
+			       ""))
+	 (integer-control-string (if thousand-separator			   
+			     (format nil "~~~d,' ,v:~aD"  grouping-size signum-directive)
+			     (format nil "~~~ad"  signum-directive)))
+	 
+	 (value (page-req-parameter page (htcomponent-client-id wcomponent) nil)))    
+    (if (component-validation-errors wcomponent)
+	value
+	(progn 
+	  (when (null visit-object)
+	    (setf visit-object (htcomponent-page wcomponent)))
+	  (multiple-value-bind (int-value dec-value)
+	      (floor (cond
+		       ((and (null reader) accessor) (funcall (fdefinition accessor) visit-object))
+		       (t (funcall (fdefinition reader) visit-object))))
+	    (progn 	      
+	      (setf dec-value (coerce dec-value 'float))
+	    (format nil "~a~a" (if thousand-separator
+				 (string-trim " " (format nil integer-control-string thousand-separator int-value))
+				 (format nil integer-control-string int-value))		    
+		    (cond 
+		      ((and (= 0.0 (coerce dec-value 'double-float)) decimal-digits)
+		       (format nil "~a~a" decimals-separator (make-string decimal-digits :initial-element #\0)))
+		      (decimal-digits 
+		       (let ((frac-part (subseq (format nil "~f" dec-value) 2)))
+			 (if (> (length frac-part) decimal-digits)
+			     (setf frac-part (subseq frac-part 0 decimal-digits))
+			     (setf frac-part (concatenate 'string frac-part (make-string (- decimal-digits (length frac-part)) :initial-element #\0))))
+			 (format nil "~a~a" decimals-separator frac-part)))
+		      (t (format nil "~a~a" decimals-separator (subseq (format nil "~f" dec-value) 2)))))))))))
+
 
+(defmethod translator-decode ((translator translator-number) (wcomponent wcomponent))
+  (let* ((thousand-separator (translator-thousand-separator translator))
+	 (type (translator-coerce translator)) 
+	 (int-value)
+	 (dec-value))
+    (multiple-value-bind (client-id new-value)	
+	(component-id-and-value wcomponent)
+      (declare (ignore client-id))
+      (when thousand-separator
+	(setf new-value (regex-replace-all (format nil "~a" thousand-separator) new-value "")))
+      (let ((decomposed-string (all-matches-as-strings "[0-9]+" new-value))
+	    (result))
+	(setf int-value (parse-integer (concatenate 'string (first decomposed-string) (second decomposed-string)))
+	      dec-value (expt 10 (length (second decomposed-string)))
+	      result (/ int-value dec-value))
+	(if (integerp result)
+	    result
+	    (coerce result type))))))
+|#
 ;;----------------------------------------------------------------------------------------
 (defun add-exception (id reason) 
 "Adds an exception for the given input component identified by its ID with the message expressed by REASON"
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    29 Mar '08
                    
                        Author: achiumenti
Date: Sat Mar 29 01:54:18 2008
New Revision: 23
Modified:
   trunk/main/claw-core/src/misc.lisp
   trunk/main/claw-core/src/packages.lisp
   trunk/main/claw-core/src/tags.lisp
   trunk/main/claw-core/src/validators.lisp
   trunk/main/claw-core/tests/test1.lisp
Log:
finishing commenting validators forms
corrected some validators quirks
added content type property to page compoenent
Modified: trunk/main/claw-core/src/misc.lisp
==============================================================================
--- trunk/main/claw-core/src/misc.lisp	(original)
+++ trunk/main/claw-core/src/misc.lisp	Sat Mar 29 01:54:18 2008
@@ -177,7 +177,9 @@
 	   (if ,result
 	       ,result
 	       ,default-val)))))
-	   
+
+(defun do-message (key &optional (default "") locale)
+  (funcall (with-message key default locale)))
   
 (defun user-locale (&optional (request *request*) (session *session*))
   (let ((locale (when session
Modified: trunk/main/claw-core/src/packages.lisp
==============================================================================
--- trunk/main/claw-core/src/packages.lisp	(original)
+++ trunk/main/claw-core/src/packages.lisp	Sat Mar 29 01:54:18 2008
@@ -75,6 +75,7 @@
 	   :page-xmloutput
 	   :page-doc-type
 	   :page-current-component
+	   :page-content-type
 	   :htclass-body
 	   :htcomponent	
 	   :htcomponent-page
@@ -282,6 +283,7 @@
 	   :simple-message-dispatcher
 	   :simple-message-dispatcher-add-message	   
 	   :with-message
+	   :do-message
 	   ;;validation
 	   :translator
 	   :translator-integer
Modified: trunk/main/claw-core/src/tags.lisp
==============================================================================
--- trunk/main/claw-core/src/tags.lisp	(original)
+++ trunk/main/claw-core/src/tags.lisp	Sat Mar 29 01:54:18 2008
@@ -363,7 +363,7 @@
 	  :accessor page-xmloutput :documentation "Determine if the page must be rendered as an XML")
    (current-form :initform :nil
 		 :accessor page-current-form :documentation "During the rewinding phase the form or the action-link whose action has been fired")
-   (content-type :initarg :doc-type
+   (doc-type :initarg :doc-type
 		 :accessor page-doc-type :documentation "The DOCUMENT TYPE of the page (default to HTML 4.01 STRICT)")
    (lasttag :initform nil 
 	     :accessor page-lasttag :documentation "Last rendered tag. Needed for page output rendering")
@@ -372,7 +372,10 @@
    (request-parameters :initarg :request-parameters)
    (components-stack :initform nil
 		     :accessor page-components-stack
-		     :documentation "A stack of components enetered into rendering process.")
+		     :documentation "A stack of components enetered into rendering process.")   
+   (content-type :initarg :content-type
+		 :accessor page-content-type
+		 :documentation "Define the content type of the page when rendered")
    (url :initarg :url
 	:accessor page-url :documentation "The URL provided with this page instance"))
   (:default-initargs :writer t
@@ -386,6 +389,7 @@
     :xmloutput nil
     :doc-type *html-4.01-strict*
     :request-parameters nil
+    :content-type hunchentoot:*default-content-type*
     :url nil)
   (:documentation "A page object holds claw components to be rendered") )
   
@@ -585,6 +589,7 @@
 (defmethod page-render ((page page))    
   (let ((body (page-content page))
 	(jsonp (page-json-id-list page)))
+    (setf (hunchentoot:content-type) (page-content-type page))
     (if (null body)
 	(format nil "null body for page ~a~%" (type-of page))	
 	(progn
@@ -802,8 +807,6 @@
       (htcomponent-json-print-start-component tag))
     (when (or (page-can-print page) previous-print-status)
       (tag-render-starttag tag page))
-    (when (string-equal "messaged" (htcomponent-client-id tag))
-	  (log-message :info "RENDEING ~a: body ~a" (htcomponent-client-id tag) body-list))
     (dolist (child-tag body-list)
       (when child-tag 	
 	(cond 	  
@@ -822,6 +825,7 @@
     (let ((body-list (htcomponent-body hthead))
 	  (injections (page-init-injections page)))
       (tag-render-starttag hthead page)
+      (htcomponent-render (meta> :http-equiv "Content-Type" :content (page-content-type page)) page)
       (dolist (child-tag body-list)	
 	(when child-tag
 	  (cond 
Modified: trunk/main/claw-core/src/validators.lisp
==============================================================================
--- trunk/main/claw-core/src/validators.lisp	(original)
+++ trunk/main/claw-core/src/validators.lisp	Sat Mar 29 01:54:18 2008
@@ -33,7 +33,7 @@
   (:documentation "Encodes the input component value, used when rendering the component"))
 
 (defgeneric translator-decode (translator wcomponent)
-  (:documentation "Decodes the input component value"))
+  (:documentation "Decodes the input component value after a form submit."))
 
 (defclass translator () 
   ()
@@ -59,30 +59,38 @@
     (declare (ignore client-id))
     new-value))
 
-(defvar *simple-translator* (make-instance 'translator))
+(defvar *simple-translator* (make-instance 'translator) 
+  "*SIMPLE-TRANSLATOR* is the default translator for any CINPUT component. 
+Its encoder and decoder methods pass values unchanged")
 
 (defclass translator-integer (translator) 
   ((thousand-separator :initarg :thousand-separator
-	 :reader translator-thousand-separator)
+	 :reader translator-thousand-separator
+	 :documentation "If specified (as character), it is the thousands separator. Despite of
+its name, grouping is done following the TRANSLATOR-GROUPING-SIZE, so it's not a real 'tousands' separator")
    (always-show-signum :initarg :always-show-signum
-	 :reader translator-always-show-signum)
+	 :reader translator-always-show-signum
+	 :documentation "When true the signum is used also for displaying positive numbers.")
    (grouping-size :initarg :grouping-size
-	 :reader translator-grouping-size))
+	 :reader translator-grouping-size
+	 :documentation "Used only if TRANSLATOR-THOUSAND-SEPARATOR is defined. Default to 3"))
   (:default-initargs :thousand-separator nil
+    :grouping-size 3
     :always-show-signum nil)
-  (:documentation "a translator object encodes and decodes integer values passed to a html input component"))
+  (:documentation "A translator object encodes and decodes integer values passed to a html input component"))
 
 (defmethod translator-encode ((translator translator-integer) (wcomponent wcomponent))
   (let* ((page (htcomponent-page wcomponent))
 	 (visit-object (wcomponent-parameter-value wcomponent :visit-object))
 	 (accessor (wcomponent-parameter-value wcomponent :accessor))
 	 (reader (wcomponent-parameter-value wcomponent :reader))
+	 (grouping-size (translator-grouping-size translator))
 	 (thousand-separator (translator-thousand-separator translator))
 	 (signum-directive (if (translator-always-show-signum translator)
 			       "@"
 			       ""))
 	 (control-string (if thousand-separator			   
-			     (format nil "~~3,' ,v:~aD"  signum-directive)
+			     (format nil "~~~d,' ,v:~aD" grouping-size signum-directive)
 			     (format nil "~~~ad"  signum-directive)))
 	 
 	 (value (page-req-parameter page (htcomponent-client-id wcomponent) nil)))    
@@ -109,21 +117,19 @@
 
 ;;=========================================
 
-(defclass translator-number (translator) 
-  ((thousand-separator :initarg :thousand-separator
-	 :reader translator-thousand-separator)
-   (decimals-separator :initarg :decimals-separator
-	 :reader translator-decimals-separator)
+(defclass translator-number (translator-integer) 
+  ((decimals-separator :initarg :decimals-separator
+	 :reader translator-decimals-separator
+	 :documentation "The decimal separator of the rendered number. Default to #\.")
    (decimal-digits :initarg :decimal-digits
-		   :reader translator-decimal-digits)
-   (always-show-signum :initarg :always-show-signum		       
-	 :reader translator-always-show-signum)
+		   :reader translator-decimal-digits
+		   :documentation "force the rendering of the value to a fixed number of decimal digits")   
    (coerce :initarg :coerce
-	   :accessor translator-coerce))
-  (:default-initargs :thousand-separator nil :decimals-separator #\.
+	   :accessor translator-coerce
+	   :documentation "Coerces the decoded input value to the given value type"))
+  (:default-initargs :decimals-separator #\.
 		     ;:integer-digits nil
-		     :decimal-digits nil
-		     :always-show-signum nil
+		     :decimal-digits nil		     
 		     :coerce 'ratio)
   (:documentation "a translator object encodes and decodes integer values passed to a html input component"))
 
@@ -134,13 +140,14 @@
 	 (accessor (wcomponent-parameter-value wcomponent :accessor))
 	 (reader (wcomponent-parameter-value wcomponent :reader))
 	 (thousand-separator (translator-thousand-separator translator))
+	 (grouping-size (translator-grouping-size translator))
 	 (decimal-digits (translator-decimal-digits translator))
 	 (decimals-separator (translator-decimals-separator translator))
 	 (signum-directive (if (translator-always-show-signum translator)
 			       "@"
 			       ""))
 	 (integer-control-string (if thousand-separator			   
-			     (format nil "~~3,' ,v:~aD"  signum-directive)
+			     (format nil "~~~d,' ,v:~aD"  grouping-size signum-directive)
 			     (format nil "~~~ad"  signum-directive)))
 	 
 	 (value (page-req-parameter page (htcomponent-client-id wcomponent) nil)))    
@@ -180,15 +187,20 @@
       (declare (ignore client-id))
       (when thousand-separator
 	(setf new-value (regex-replace-all (format nil "~a" thousand-separator) new-value "")))
-      (let ((decomposed-string (all-matches-as-strings "[0-9]+" new-value)))
-	(setf int-value (parse-integer (concatenate 'string (first decomposed-string) (second decomposed-string))))
-	(setf dec-value (expt 10 (length (second decomposed-string))))
-	(coerce (/ int-value dec-value) type)))))
+      (let ((decomposed-string (all-matches-as-strings "[0-9]+" new-value))
+	    (result))
+	(setf int-value (parse-integer (concatenate 'string (first decomposed-string) (second decomposed-string)))
+	      dec-value (expt 10 (length (second decomposed-string)))
+	      result (/ int-value dec-value))
+	(if (integerp result)
+	    result
+	    (coerce result type))))))
 
 
 
 ;;----------------------------------------------------------------------------------------
 (defun add-exception (id reason) 
+"Adds an exception for the given input component identified by its ID with the message expressed by REASON"
   (let* ((validation-errors (aux-request-value :validation-errors))
 	 (component-exceptions (assoc id validation-errors :test #'equal)))
     (if component-exceptions
@@ -199,6 +211,7 @@
     
 
 (defun validate (test &key component message)
+"When test is nil, an exception message given by MESSAGE is added for the COMPONENT. See: ADD-EXCEPTION..."
   (let ((client-id (htcomponent-client-id component)))
     (unless test      
       (add-exception client-id message))))
@@ -213,12 +226,19 @@
     (assoc client-id (validation-errors request) :test #'equal)))
 
 (defun validator-required (component value)
+  "Checks if the required input field VALUE is present.  If not, a localizable message \"Field ~a may not be null.\" is sent with key \"VALIDATOR-REQUIRED\".
+The argument for the message will be the :label attribute of the COMPONENT."
   (when (stringp value)
     (validate (and value (string-not-equal value "")) 
 	      :component component	      
-	      :message (format nil "Field ~a may not be null." (wcomponent-parameter-value component :label)))))
+	      :message (format nil (do-message "VALIDATOR-REQUIRED" "Field ~a may not be null.") (wcomponent-parameter-value component :label)))))
 
 (defun validator-size (component value &key min-size max-size)
+"Checks if the input field VALUE legth is less then or greater then rispectively of the form keywords :MIN-SIZE and :MAX-SIZE.  
+If less then :MIN-SIZE, a localizable message \"Size of ~a may not be less then ~a chars.\" is sent with key \"VALIDATOR-SIZE-MIN\".
+The argument for the message will be the :label attribute of the COMPONENT and the :MIN-ZIZE value.
+If greater then :MAX-SIZE, a localizable message \"Size of ~a may not be more then ~a chars\" is sent with key \"VALIDATOR-SIZE-MAX\".
+The argument for the message will be the :label attribute of the COMPONENT and the :MAX-ZIZE value."
   (let ((value-len 0))
     (when value
       (setf value (format nil "~a" value))
@@ -227,22 +247,27 @@
 	  (when min-size 
 	    (validate (>= value-len min-size)
 		      :component component		      
-		      :message (format nil "Size of ~a may not be less then ~a" 
+		      :message (format nil (do-message "VALIDATOR-SIZE-MIN" "Size of ~a may not be less then ~a chars." )
 				       (wcomponent-parameter-value component :label) 
 				       min-size)))
 	  (when max-size 
 	    (validate (<= value-len max-size)
 		      :component component		      
-		      :message (format nil "Size of ~a may not be more then ~a" 
+		      :message (format nil (do-message "VALIDATOR-SIZE-MAX" "Size of ~a may not be more then ~a chars." )
 				       (wcomponent-parameter-value component :label) 
 				       max-size)))))))
 
 (defun validator-range (component value &key min max)
+"Checks if the numeric input field VALUE is less then or greater then rispectively of the form keywords :MIN and :MAX.  
+If less then :MIN, a localizable message \"Field ~a is not less then or equal to ~d.\" is sent with key \"VALIDATOR-RANGE-MIN\".
+The argument for the message will be the :label attribute of the COMPONENT and the :MIN value.
+If greater then :MIN, a localizable message \"Field ~a is not greater then or equal to ~d.\" is sent with key \"VALIDATOR-RANGE-MAX\".
+The argument for the message will be the :label attribute of the COMPONENT and the :MAX value."
   (when value              
     (or (when min
 	  (validate (>= value min)
 		    :component component		
-		    :message (format nil "Field ~a is not greater then or equal to ~d" 
+		    :message (format nil (do-message "VALIDATOR-RANGE-MIN" "Field ~a is not greater then or equal to ~d")
 				     (wcomponent-parameter-value component :label) 
 				     (if (typep min 'ratio)
 					 (coerce min 'float)
@@ -250,26 +275,32 @@
 	(when max
 	  (validate (<= value max)
 		    :component component		
-		    :message (format nil "Field ~a is not less then or equal to ~d" 
+		    :message (format nil (do-message "VALIDATOR-RANGE-MAX" "Field ~a is not less then or equal to ~d")
 				     (wcomponent-parameter-value component :label) 
 				     (if (typep max 'ratio)
 					 (coerce max 'float)
 					 max)))))))
 
 (defun validator-number (component value &key min max)
+"Checks if the input field VALUE is a valid number and then passes the validation to VALIDATION-RANGE.
+If not a number, a localizable message \"Field ~a is not a valid number.\" is sent with key \"VALIDATOR-NUMBER\".
+The argument for the message will be the :label attribute of the COMPONENT."
   (when value        
     (let ((test (numberp value)))
       (or (validate test
 		    :component component		    
-		    :message (format nil "Field ~a is not a valid number" (wcomponent-parameter-value component :label)))
+		    :message (format nil (do-message "VALIDATOR-NUMBER" "Field ~a is not a valid number.") (wcomponent-parameter-value component :label)))
 	  (validator-range component value :min min :max max)))))
 
 (defun validator-integer (component value &key min max)
+"Checks if the input field VALUE is a valid number and then passes the validation to VALIDATION-RANGE.
+If not a number, a localizable message \"Field ~a is not a valid integer.\" is sent with key \"VALIDATOR-INTEGER\".
+The argument for the message will be the :label attribute of the COMPONENT."
   (when value        
     (let ((test (integerp value)))
       (or (validate test
 		    :component component		    
-		    :message (format nil "Field ~a is not a valid integer" (wcomponent-parameter-value component :label)))
+		    :message (format nil (do-message "VALIDATOR-INTEGER" "Field ~a is not a valid integer.") (wcomponent-parameter-value component :label)))
 	  (validator-range component value :min min :max max)))))
 
 
Modified: trunk/main/claw-core/tests/test1.lisp
==============================================================================
--- trunk/main/claw-core/tests/test1.lisp	(original)
+++ trunk/main/claw-core/tests/test1.lisp	Sat Mar 29 01:54:18 2008
@@ -29,6 +29,8 @@
 
 (in-package :claw-tests)
 
+(setf *default-content-type* "text/html; charset=UTF-8")
+
 (setf *rewrite-for-session-urls* nil)
 (defvar *this-file* (load-time-value
                      (or #.*compile-file-pathname* *load-pathname*)))
@@ -40,9 +42,13 @@
 
 (simple-message-dispatcher-add-message *lisplet-messages* "en" "NAME" "Name")
 (simple-message-dispatcher-add-message *lisplet-messages* "en" "SURNAME" "Surname")
+(simple-message-dispatcher-add-message *lisplet-messages* "en" "WELCOME" "Welcome")
 
 (simple-message-dispatcher-add-message *lisplet-messages* "it" "NAME" "Nome")
 (simple-message-dispatcher-add-message *lisplet-messages* "it" "SURNAME" "Cognome")
+(simple-message-dispatcher-add-message *lisplet-messages* "it" "WELCOME" "Benvenuto")
+
+(simple-message-dispatcher-add-message *lisplet-messages* "it" "VALIDATOR-REQUIRED" "Il campo ~a non può essere vuoto!")
 
 (defvar *test-lisplet*)
 (setf *test-lisplet* (make-instance 'lisplet :realm "test1" :base-path "/test" 
@@ -56,8 +62,8 @@
 
 (defparameter *clawserver* (make-instance 'clawserver :port 4242 :sslport 4445 
 					  :mod-lisp-p nil
-					:ssl-certificate-file #P"/home/kiuma/pem/cacert.pem" 
-					:ssl-privatekey-file #P"/home/kiuma/pem/privkey.pem"))
+					  :ssl-certificate-file #P"/home/kiuma/pem/cacert.pem" 
+					  :ssl-privatekey-file #P"/home/kiuma/pem/privkey.pem"))
 
 (setf (lisplet-redirect-protected-resources-p *test-lisplet*) t)
 
@@ -256,7 +262,8 @@
   ((username :initform ""
 	 :accessor login-page-username)
    (passowrd :initform ""
-	 :accessor login-page-password)))
+	 :accessor login-page-password))
+  (:default-initargs :message-dispatcher *lisplet-messages*))
 
 (defmethod page-content ((login-page login-page))
   (let ((princp (current-principal)))
@@ -280,7 +287,7 @@
 				  (td> :colspan "2"
 				       (csubmit> :id "submit" :value "Login")))))
 			(p> 
-			 "Welcome " 
+			 (with-message "WELCOME" "WELCOME") " " 
 			 (principal-name princp)
 			 (a> :href "index.html" "home"))))))
 
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Author: achiumenti
Date: Tue Mar 25 10:42:54 2008
New Revision: 22
Modified:
   trunk/main/claw-core/src/i18n.lisp
Log:
continuning on l13n
Modified: trunk/main/claw-core/src/i18n.lisp
==============================================================================
--- trunk/main/claw-core/src/i18n.lisp	(original)
+++ trunk/main/claw-core/src/i18n.lisp	Tue Mar 25 10:42:54 2008
@@ -37,8 +37,8 @@
 * 'SEC seconds
 * 'MIN minutes
 * 'HR hours
-* 'DAYS days
-* 'MONTH month
+* 'DAY days
+* 'MONTH monthes
 * 'YEARS years.
 And other FIELD value will produce an error condition."))
 
@@ -82,8 +82,8 @@
   (multiple-value-bind (d-month d-year)
       (floor (abs value) 12)
     (when (< value 0)
-      (setf d-month (* d-month -1)
-	    d-year (* d-year -1))	     
+      (setf d-month (- d-month)
+	    d-year (- d-year))	     
       (multiple-value-bind (ns ss mm hh day month year)
 	  (decode-local-time local-time)
 	(multiple-value-bind (ns ss mm hh day month-ignore year)
@@ -101,11 +101,63 @@
     local-time-result))
 
 (defun local-time-add-hour (local-time value)
-  (multiple-value-bind (d-hour d-day)
-      (floor (abs value) 24)
+  (multiple-value-bind (ns ss mm hh day month year)
+	  (decode-local-time local-time)
+    (multiple-value-bind (d-hour d-day)
+	(floor (abs value) 24)
+      (when (< value 0)
+	(setf d-hour (- d-hour)
+	      d-day (- d-day)))
+      (let ((local-time-result (local-time-add-day local-time d-day)))
+	(multiple-value-bind (ns2 ss2 mm2 hh2 day2 month2 year2)
+	    (decode-local-time local-time-result)
+	  (encode-local-time ns2 ss2 mm2 (+ hh d-hour) day2 month2 year2))))))
+
+(defun local-time-add-min (local-time value)
+  (multiple-value-bind (ns ss mm hh day month year)
+	  (decode-local-time local-time)
+    (multiple-value-bind (d-min d-hour)
+	(floor (abs value) 60)
+      (when (< value 0)
+	(setf d-min (- d-min)
+	      d-hour (- d-hour)))
+      (let ((local-time-result (local-time-add-hour local-time d-hour)))
+	(multiple-value-bind (ns2 ss2 mm2 hh2 day2 month2 year2)
+	    (decode-local-time local-time-result)
+	  (encode-local-time ns2 ss2 (+ mm d-min) hh2 day2 month2 year2))))))
 
-#|
+(defun local-time-add-sec (local-time value)
+  (multiple-value-bind (ns ss mm hh day month year)
+	  (decode-local-time local-time)
+    (multiple-value-bind (d-sec d-min)
+	(floor (abs value) 60)
+      (when (< value 0)
+	(setf d-sec (- d-sec)
+	      d-min (- d-min)))
+      (let ((local-time-result (local-time-add-min local-time d-min)))
+	(multiple-value-bind (ns2 ss2 mm2 hh2 day2 month2 year2)
+	    (decode-local-time local-time-result)
+	  (encode-local-time ns2 (+ ss d-sec) mm2 hh2 day2 month2 year2))))))
+
+(defun local-time-add-nsec (local-time value)
+  (multiple-value-bind (ns ss mm hh day month year)
+	  (decode-local-time local-time)
+    (multiple-value-bind (d-nsec d-sec)
+	(floor (abs value) 10000000)
+      (when (< value 0)
+	(setf d-nsec (- d-nsec)
+	      d-sec (- d-sec)))
+      (let ((local-time-result (local-time-add-sec local-time d-sec)))
+	(multiple-value-bind (ns2 ss2 mm2 hh2 day2 month2 year2)
+	    (decode-local-time local-time-result)
+	  (encode-local-time (+ ns d-nsec) ss2 mm2 hh2 day2 month2 year2))))))
+	  	
 (defmethod local-time-add ((local-time local-time) field value)
   (ccase field 
-    ('NSEC 
-|#
\ No newline at end of file
+    (NSEC (local-time-add-nsec local-time value))
+    (SEC (local-time-add-sec local-time value))
+    (MIN (local-time-add-min local-time value))
+    (HR (local-time-add-hour local-time value))
+    (DAY (local-time-add-day local-time value))
+    (MONTH (local-time-add-month local-time value))
+    (YEAR (local-time-add-year local-time value))))
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    25 Mar '08
                    
                        Author: achiumenti
Date: Tue Mar 25 10:42:37 2008
New Revision: 21
Modified:
   trunk/main/claw-core/generators/GenerateLocales.java
Log:
continuning on l13n
Modified: trunk/main/claw-core/generators/GenerateLocales.java
==============================================================================
--- trunk/main/claw-core/generators/GenerateLocales.java	(original)
+++ trunk/main/claw-core/generators/GenerateLocales.java	Tue Mar 25 10:42:37 2008
@@ -108,8 +108,8 @@
                         "\" *locales*)" +
                         "\n      (list ");
                 sw.append("\n        :NUMBER-FORMAT " +
-                        "(list :GROUPING-SEPARATOR #\\" + dfs.getGroupingSeparator() +
-                        " :DECIMAL-SEPARATOR #\\" + dfs.getDecimalSeparator() +
+                        "(list :GROUPING-SEPARATOR " + encodeLispChar(dfs.getGroupingSeparator()) +
+                        " :DECIMAL-SEPARATOR " + encodeLispChar(dfs.getDecimalSeparator()) +
                         " \"" + dfs.getInternationalCurrencySymbol() + "\"" + ")");
 
                 sw.append("\n        :DATE-FORMAT (list");
@@ -133,6 +133,15 @@
         System.out.println(fileName + " successfully generated.");
     }
 
+    private String encodeLispChar(char ch) {
+        switch (ch) {
+            case ' ': return "#\\SPACE";
+            case 0: return "nil";
+            default: return "#\\" + ch;
+        }
+                
+                
+    }
     /**
      * @param args the command line arguments
      */
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    25 Mar '08
                    
                        Author: achiumenti
Date: Tue Mar 25 05:55:14 2008
New Revision: 20
Added:
   trunk/main/claw-core/generators/
   trunk/main/claw-core/generators/GenerateLocales.java
Log:
continuning on l13n
Added: trunk/main/claw-core/generators/GenerateLocales.java
==============================================================================
--- (empty file)
+++ trunk/main/claw-core/generators/GenerateLocales.java	Tue Mar 25 05:55:14 2008
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2008, Andrea Chiumenti.  All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials
+ *     provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.IOException;
+import java.text.DateFormatSymbols;
+import java.text.DecimalFormatSymbols;
+import java.util.Calendar;
+import java.util.Locale;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.StringWriter;
+
+/**
+ *
+ * @author Andrea Chiumenti
+ */
+public class GenerateLocales {
+
+    private StringWriter sw;
+    private String fileName;
+
+    public GenerateLocales() {
+        fileName = "locales.lisp";
+    }
+
+    public void generateFile(String fileName) throws IOException {
+        sw = new StringWriter();
+        //sw.append("(defvar *locales* (make-hash-table :test 'equal))\n");
+        sw.append(";;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-\n").
+                append(";;; $Header: src/locales.lisp $\n").
+                append("\n").
+                append(";;; Copyright (c) 2008, Andrea Chiumenti.  All rights reserved.\n").
+                append("\n").
+                append(";;; Redistribution and use in source and binary forms, with or without\n").
+                append(";;; modification, are permitted provided that the following conditions\n").
+                append(";;; are met:\n").
+                append("\n").
+                append(";;;   * Redistributions of source code must retain the above copyright\n").
+                append(";;;     notice, this list of conditions and the following disclaimer.\n").
+                append("\n").
+                append(";;;   * Redistributions in binary form must reproduce the above\n").
+                append(";;;     copyright notice, this list of conditions and the following\n").
+                append(";;;     disclaimer in the documentation and/or other materials\n").
+                append(";;;     provided with the distribution.\n").
+                append("\n").
+                append(";;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED\n").
+                append(";;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n").
+                append(";;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n").
+                append(";;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n").
+                append(";;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n").
+                append(";;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n").
+                append(";;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n").
+                append(";;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n").
+                append(";;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n").
+                append(";;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n").
+                append(";;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n").
+                append(";;; --*-- AUTOMATICALLY GENERATED - DO NOT EDIT !!!!! --*--\n\n").
+                append("(in-package :claw)\n\n");
+        File f = new File(fileName);
+        if (f.exists()) {
+            f.delete();
+        }
+        FileWriter fw = null;
+        try {
+            fw = new FileWriter(f);
+
+            Locale[] locales = Locale.getAvailableLocales();
+
+            for (int i = 0; i < locales.length; i++) {
+
+                DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(new Locale(locales[i].getLanguage(), locales[i].getCountry()));
+                DateFormatSymbols datefs = DateFormatSymbols.getInstance(new Locale(locales[i].getLanguage(), locales[i].getCountry()));
+                Calendar cal = Calendar.getInstance(new Locale(locales[i].getLanguage(), locales[i].getCountry()));
+
+                String locale;
+                if (locales[i].getCountry().equals("")) {
+                    locale = locales[i].getLanguage();
+                } else {
+                    locale = locales[i].getLanguage() + "_" + locales[i].getCountry().toUpperCase();
+
+                }
+                sw.append("(setf (gethash \"" + locale +
+                        "\" *locales*)" +
+                        "\n      (list ");
+                sw.append("\n        :NUMBER-FORMAT " +
+                        "(list :GROUPING-SEPARATOR #\\" + dfs.getGroupingSeparator() +
+                        " :DECIMAL-SEPARATOR #\\" + dfs.getDecimalSeparator() +
+                        " \"" + dfs.getInternationalCurrencySymbol() + "\"" + ")");
+
+                sw.append("\n        :DATE-FORMAT (list");
+                printDateSymbols("ampm", datefs.getAmPmStrings());
+                printDateSymbols("months", datefs.getMonths());
+                printDateSymbols("short-months", datefs.getShortMonths());
+                printDateSymbols("first-day-of-the-week", cal.getFirstDayOfWeek());
+                printDateSymbols("weekdays", datefs.getWeekdays());
+                printDateSymbols("short-weekdays", datefs.getShortWeekdays());
+                printDateSymbols("eras", datefs.getEras());
+
+                sw.append(")))\n\n");
+
+            }
+            fw.write(sw.toString());
+        } finally {
+            if (fw != null) {
+                fw.close();
+            }
+        }
+        System.out.println(fileName + " successfully generated.");
+    }
+
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String[] args) throws IOException {
+
+
+        GenerateLocales app = new GenerateLocales();
+
+        if (args.length > 0) {
+            String arg0 = args[0];
+            if (arg0.equals("--help")) {
+                app.printUsage();
+                return;
+            }
+        }
+
+        app.generateFile(app.fileName);
+    }
+
+    private void printUsage() {
+        System.out.println("Usage:");
+        System.out.println("  java " + GenerateLocales.class.getSimpleName() +
+                " --help (prints usage)");
+        System.out.println("  java " + GenerateLocales.class.getSimpleName() +
+                " (generates output file)");
+    }
+
+    private void printDateSymbols(String symbol, String[] vals) {
+        sw.append("\n                       :" +
+                symbol.toUpperCase() +
+                " '(");
+        int i = 0;
+        for (int x = 0; x < vals.length; x++) {
+            if (!vals[x].equals("")) {
+                if (i > 0) {
+                    sw.append(" ");
+                }
+                sw.append("\"" +
+                        vals[x] +
+                        "\"");
+                i++;
+            }
+        }
+        sw.append(")");
+    }
+    
+    private void printDateSymbols(String symbol, Number val) {
+        sw.append("\n                       :" +
+                symbol.toUpperCase() +
+                " " + val);
+        
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+}
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Author: achiumenti
Date: Tue Mar 25 05:54:19 2008
New Revision: 19
Added:
   trunk/main/claw-core/src/i18n.lisp
   trunk/main/claw-core/src/locales.lisp
Modified:
   trunk/main/claw-core/claw.asd
   trunk/main/claw-core/src/packages.lisp
   trunk/main/claw-core/src/validators.lisp
Log:
continuning on l13n
Modified: trunk/main/claw-core/claw.asd
==============================================================================
--- trunk/main/claw-core/claw.asd	(original)
+++ trunk/main/claw-core/claw.asd	Tue Mar 25 05:54:19 2008
@@ -31,10 +31,12 @@
   :name "claw"
   :author "Andrea Chiumenti"
   :description "Common Lisp Active Web.A famework to write web applications"
-  :depends-on (:hunchentoot :alexandria :cl-ppcre :cl-fad)
+  :depends-on (:hunchentoot :alexandria :cl-ppcre :cl-fad :local-time)
   :components ((:module src 
 			:components ((:file "packages")
 				     (:file "misc" :depends-on ("packages"))
+				     (:file "i18n" :depends-on ("packages"))
+				     (:file "locales" :depends-on ("i18n"))
 				     (:file "hunchentoot-overrides" :depends-on ("packages"))
 				     (:file "tags" :depends-on ("misc"))
 				     (:file "validators" :depends-on ("tags"))				     
Added: trunk/main/claw-core/src/i18n.lisp
==============================================================================
--- (empty file)
+++ trunk/main/claw-core/src/i18n.lisp	Tue Mar 25 05:54:19 2008
@@ -0,0 +1,111 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+;;; $Header: src/components.lisp $
+
+;;; Copyright (c) 2008, Andrea Chiumenti.  All rights reserved.
+
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+
+;;;   * Redistributions of source code must retain the above copyright
+;;;     notice, this list of conditions and the following disclaimer.
+
+;;;   * Redistributions in binary form must reproduce the above
+;;;     copyright notice, this list of conditions and the following
+;;;     disclaimer in the documentation and/or other materials
+;;;     provided with the distribution.
+
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(in-package :claw)
+
+(defgeneric local-time-add (local-time field value)
+  (:documentation "Adds the specified amount of VALUE to the LOCAL_TIME.
+FIELD may be any of: 
+* 'NSEC nano-seconds
+* 'MSEC milli-seconds
+* 'SEC seconds
+* 'MIN minutes
+* 'HR hours
+* 'DAYS days
+* 'MONTH month
+* 'YEARS years.
+And other FIELD value will produce an error condition."))
+
+
+(defvar *locales* (make-hash-table :test 'equal))
+
+(defun number-format-grouping-separator (&optional (locale (user-locale)))
+  (getf (getf (gethash locale *locales*) :number-format) :grouping-separator))
+  
+(defun number-format-decimal-separator (&optional (locale (user-locale)))
+  (getf (getf (gethash locale *locales*) :number-format) :decimal-separator))
+  
+(defun ampm (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :ampm))
+
+(defun months (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :months))
+
+(defun short-months (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :short-months))
+
+(defun first-day-of-the-week (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :first-day-of-the-week))
+
+(defun weekdays (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :weekdays))
+
+(defun short-weekdays (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :short-weekdays))
+
+(defun eras (&optional (locale (user-locale)))
+  (getf (gethash locale *locales*) :eras))
+
+
+(defun local-time-add-year (local-time value)
+  (multiple-value-bind (ns ss mm hh day month year)
+      (decode-local-time local-time)
+    (encode-local-time ns ss mm hh day month (+ year value))))
+
+(defun local-time-add-month (local-time value)  
+  (multiple-value-bind (d-month d-year)
+      (floor (abs value) 12)
+    (when (< value 0)
+      (setf d-month (* d-month -1)
+	    d-year (* d-year -1))	     
+      (multiple-value-bind (ns ss mm hh day month year)
+	  (decode-local-time local-time)
+	(multiple-value-bind (ns ss mm hh day month-ignore year)
+	    (decode-local-time (encode-local-time ns ss mm hh day 1 (+ year d-year)))     
+	    (encode-local-time ns ss mm hh day month year))))))
+
+(defun local-time-add-day (local-time value)
+  (let* ((curr-day (day-of local-time))
+	 (local-time-result (make-instance 'local-time
+					  :day curr-day
+					  :sec (sec-of local-time)
+					  :nsec (nsec-of local-time)
+					  :time-zone (timezone-of local-time))))
+    (setf (day-of local-time-result) (+ curr-day value))
+    local-time-result))
+
+(defun local-time-add-hour (local-time value)
+  (multiple-value-bind (d-hour d-day)
+      (floor (abs value) 24)
+
+#|
+(defmethod local-time-add ((local-time local-time) field value)
+  (ccase field 
+    ('NSEC 
+|#
\ No newline at end of file
Added: trunk/main/claw-core/src/locales.lisp
==============================================================================
--- (empty file)
+++ trunk/main/claw-core/src/locales.lisp	Tue Mar 25 05:54:19 2008
@@ -0,0 +1,1857 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+;;; $Header: src/locales.lisp $
+
+;;; Copyright (c) 2008, Andrea Chiumenti.  All rights reserved.
+
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+
+;;;   * Redistributions of source code must retain the above copyright
+;;;     notice, this list of conditions and the following disclaimer.
+
+;;;   * Redistributions in binary form must reproduce the above
+;;;     copyright notice, this list of conditions and the following
+;;;     disclaimer in the documentation and/or other materials
+;;;     provided with the distribution.
+
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+;;; --*-- AUTOMATICALLY GENERATED - DO NOT EDIT !!!!! --*--
+
+(in-package :claw)
+
+(setf (gethash "ja_JP" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "JPY")
+        :DATE-FORMAT (list
+                       :AMPM '("午前" "午後")
+                       :MONTHS '("1月" "2月" "3月" "4月" "5月" "6月" "7月" "8月" "9月" "10月" "11月" "12月")
+                       :SHORT-MONTHS '("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("日曜日" "月曜日" "火曜日" "水曜日" "木曜日" "金曜日" "土曜日")
+                       :SHORT-WEEKDAYS '("日" "月" "火" "水" "木" "金" "土")
+                       :ERAS '("紀元前" "西暦"))))
+
+(setf (gethash "es_PE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "PEN")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ja_JP" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "JPY")
+        :DATE-FORMAT (list
+                       :AMPM '("午前" "午後")
+                       :MONTHS '("1月" "2月" "3月" "4月" "5月" "6月" "7月" "8月" "9月" "10月" "11月" "12月")
+                       :SHORT-MONTHS '("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("日曜日" "月曜日" "火曜日" "水曜日" "木曜日" "金曜日" "土曜日")
+                       :SHORT-WEEKDAYS '("日" "月" "火" "水" "木" "金" "土")
+                       :ERAS '("紀元前" "西暦"))))
+
+(setf (gethash "es_PA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "PAB")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sr_BA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "BAM")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануар" "фебруар" "март" "април" "мај" "јуни" "јули" "август" "септембар" "октобар" "новембар" "децембар")
+                       :SHORT-MONTHS '("јан" "феб" "мар" "апр" "мај" "јун" "јул" "авг" "сеп" "окт" "нов" "дец")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("недеља" "понедељак" "уторак" "сриједа" "четвртак" "петак" "субота")
+                       :SHORT-WEEKDAYS '("нед" "пон" "уто" "сри" "чет" "пет" "суб")
+                       :ERAS '("п. н. е." "н. е"))))
+
+(setf (gethash "mk" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануари" "февруари" "март" "април" "мај" "јуни" "јули" "август" "септември" "октомври" "ноември" "декември")
+                       :SHORT-MONTHS '("јан." "фев." "мар." "апр." "мај." "јун." "јул." "авг." "септ." "окт." "ноем." "декем.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("недела" "понеделник" "вторник" "среда" "четврток" "петок" "сабота")
+                       :SHORT-WEEKDAYS '("нед." "пон." "вт." "сре." "чет." "пет." "саб.")
+                       :ERAS '("пр.н.е." "ае."))))
+
+(setf (gethash "es_GT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "GTQ")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_AE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "AED")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "no_NO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "NOK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "mars" "april" "mai" "juni" "juli" "august" "september" "oktober" "november" "desember")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "mai" "jun" "jul" "aug" "sep" "okt" "nov" "des")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("søndag" "mandag" "tirsdag" "onsdag" "torsdag" "fredag" "lørdag")
+                       :SHORT-WEEKDAYS '("sø" "ma" "ti" "on" "to" "fr" "lø")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sq_AL" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "ALL")
+        :DATE-FORMAT (list
+                       :AMPM '("PD" "MD")
+                       :MONTHS '("janar" "shkurt" "mars" "prill" "maj" "qershor" "korrik" "gusht" "shtator" "tetor" "nëntor" "dhjetor")
+                       :SHORT-MONTHS '("Jan" "Shk" "Mar" "Pri" "Maj" "Qer" "Kor" "Gsh" "Sht" "Tet" "Nën" "Dhj")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("e diel" "e hënë" "e martë" "e mërkurë" "e enjte" "e premte" "e shtunë")
+                       :SHORT-WEEKDAYS '("Die" "Hën" "Mar" "Mër" "Enj" "Pre" "Sht")
+                       :ERAS '("p.e.r." "n.e.r."))))
+
+(setf (gethash "bg" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Януари" "Февруари" "Март" "Април" "Май" "Юни" "Юли" "Август" "Септември" "Октомври" "Ноември" "Декември")
+                       :SHORT-MONTHS '("I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" "XI" "XII")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Неделя" "Понеделник" "Вторник" "Сряда" "Четвъртък" "Петък" "Събота")
+                       :SHORT-WEEKDAYS '("Нд" "Пн" "Вт" "Ср" "Чт" "Пт" "Сб")
+                       :ERAS '("пр.н.е." "н.е."))))
+
+(setf (gethash "ar_IQ" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "IQD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "ar_YE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "YER")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "hu" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("DE" "DU")
+                       :MONTHS '("január" "február" "március" "április" "május" "június" "július" "augusztus" "szeptember" "október" "november" "december")
+                       :SHORT-MONTHS '("jan." "febr." "márc." "ápr." "máj." "jún." "júl." "aug." "szept." "okt." "nov." "dec.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("vasárnap" "hétfő" "kedd" "szerda" "csütörtök" "péntek" "szombat")
+                       :SHORT-WEEKDAYS '("V" "H" "K" "Sze" "Cs" "P" "Szo")
+                       :ERAS '("i.e." "i.u."))))
+
+(setf (gethash "pt_PT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Janeiro" "Fevereiro" "Março" "Abril" "Maio" "Junho" "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro")
+                       :SHORT-MONTHS '("Jan" "Fev" "Mar" "Abr" "Mai" "Jun" "Jul" "Ago" "Set" "Out" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Domingo" "Segunda-feira" "Terça-feira" "Quarta-feira" "Quinta-feira" "Sexta-feira" "Sábado")
+                       :SHORT-WEEKDAYS '("Dom" "Seg" "Ter" "Qua" "Qui" "Sex" "Sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "el_CY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "CYP")
+        :DATE-FORMAT (list
+                       :AMPM '("ΠΜ" "ΜΜ")
+                       :MONTHS '("Ιανουάριος" "Φεβρουάριος" "Μάρτιος" "Απρίλιος" "Μάιος" "Ιούνιος" "Ιούλιος" "Αύγουστος" "Σεπτέμβριος" "Οκτώβριος" "Νοέμβριος" "Δεκέμβριος")
+                       :SHORT-MONTHS '("Ιαν" "Φεβ" "Μαρ" "Απρ" "Μαϊ" "Ιουν" "Ιουλ" "Αυγ" "Σεπ" "Οκτ" "Νοε" "Δεκ")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Κυριακή" "Δευτέρα" "Τρίτη" "Τετάρτη" "Πέμπτη" "Παρασκευή" "Σάββατο")
+                       :SHORT-WEEKDAYS '("Κυρ" "Δευ" "Τρι" "Τετ" "Πεμ" "Παρ" "Σαβ")
+                       :ERAS '("π.Χ." "μ.Χ."))))
+
+(setf (gethash "ar_QA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "QAR")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "mk_MK" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "MKD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануари" "февруари" "март" "април" "мај" "јуни" "јули" "август" "септември" "октомври" "ноември" "декември")
+                       :SHORT-MONTHS '("јан." "фев." "мар." "апр." "мај." "јун." "јул." "авг." "септ." "окт." "ноем." "декем.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("недела" "понеделник" "вторник" "среда" "четврток" "петок" "сабота")
+                       :SHORT-WEEKDAYS '("нед." "пон." "вт." "сре." "чет." "пет." "саб.")
+                       :ERAS '("пр.н.е." "ае."))))
+
+(setf (gethash "sv" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januari" "februari" "mars" "april" "maj" "juni" "juli" "augusti" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("söndag" "måndag" "tisdag" "onsdag" "torsdag" "fredag" "lördag")
+                       :SHORT-WEEKDAYS '("sö" "må" "ti" "on" "to" "fr" "lö")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "de_CH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\' :DECIMAL-SEPARATOR #\. "CHF")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mrz" "Apr" "Mai" "Jun" "Jul" "Aug" "Sep" "Okt" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
+                       :SHORT-WEEKDAYS '("So" "Mo" "Di" "Mi" "Do" "Fr" "Sa")
+                       :ERAS '("v. Chr." "n. Chr."))))
+
+(setf (gethash "en_US" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "USD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "fi_FI" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("tammikuu" "helmikuu" "maaliskuu" "huhtikuu" "toukokuu" "kesäkuu" "heinäkuu" "elokuu" "syyskuu" "lokakuu" "marraskuu" "joulukuu")
+                       :SHORT-MONTHS '("tammi" "helmi" "maalis" "huhti" "touko" "kesä" "heinä" "elo" "syys" "loka" "marras" "joulu")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("sunnuntai" "maanantai" "tiistai" "keskiviikko" "torstai" "perjantai" "lauantai")
+                       :SHORT-WEEKDAYS '("su" "ma" "ti" "ke" "to" "pe" "la")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "is" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janúar" "febrúar" "mars" "apríl" "maí" "júní" "júlí" "ágúst" "september" "október" "nóvember" "desember")
+                       :SHORT-MONTHS '("jan." "feb." "mar." "apr." "maí" "jún." "júl." "ágú." "sep." "okt." "nóv." "des.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("sunnudagur" "mánudagur" "þriðjudagur" "miðvikudagur" "fimmtudagur" "föstudagur" "laugardagur")
+                       :SHORT-WEEKDAYS '("sun." "mán." "þri." "mið." "fim." "fös." "lau.")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "cs" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("dop." "odp.")
+                       :MONTHS '("leden" "únor" "březen" "duben" "květen" "červen" "červenec" "srpen" "září" "říjen" "listopad" "prosinec")
+                       :SHORT-MONTHS '("I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" "XI" "XII")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Neděle" "Pondělí" "Úterý" "Středa" "Čtvrtek" "Pátek" "Sobota")
+                       :SHORT-WEEKDAYS '("Ne" "Po" "Út" "St" "Čt" "Pá" "So")
+                       :ERAS '("př.Kr." "po Kr."))))
+
+(setf (gethash "en_MT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "MTL")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sl_SI" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "marec" "april" "maj" "junij" "julij" "avgust" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "avg" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Nedelja" "Ponedeljek" "Torek" "Sreda" "Četrtek" "Petek" "Sobota")
+                       :SHORT-WEEKDAYS '("Ned" "Pon" "Tor" "Sre" "Čet" "Pet" "Sob")
+                       :ERAS '("pr.n.š." "po Kr."))))
+
+(setf (gethash "sk_SK" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "SKK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("január" "február" "marec" "apríl" "máj" "jún" "júl" "august" "september" "október" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "máj" "jún" "júl" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Nedeľa" "Pondelok" "Utorok" "Streda" "Štvrtok" "Piatok" "Sobota")
+                       :SHORT-WEEKDAYS '("Ne" "Po" "Ut" "St" "Št" "Pi" "So")
+                       :ERAS '("pred n.l." "n.l."))))
+
+(setf (gethash "it" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("gennaio" "febbraio" "marzo" "aprile" "maggio" "giugno" "luglio" "agosto" "settembre" "ottobre" "novembre" "dicembre")
+                       :SHORT-MONTHS '("gen" "feb" "mar" "apr" "mag" "giu" "lug" "ago" "set" "ott" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domenica" "lunedì" "martedì" "mercoledì" "giovedì" "venerdì" "sabato")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mer" "gio" "ven" "sab")
+                       :ERAS '("BC" "dopo Cristo"))))
+
+(setf (gethash "tr_TR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "TRY")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Ocak" "Şubat" "Mart" "Nisan" "Mayıs" "Haziran" "Temmuz" "Ağustos" "Eylül" "Ekim" "Kasım" "Aralık")
+                       :SHORT-MONTHS '("Oca" "Şub" "Mar" "Nis" "May" "Haz" "Tem" "Ağu" "Eyl" "Eki" "Kas" "Ara")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Pazar" "Pazartesi" "Salı" "Çarşamba" "Perşembe" "Cuma" "Cumartesi")
+                       :SHORT-WEEKDAYS '("Paz" "Pzt" "Sal" "Çar" "Per" "Cum" "Cmt")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "zh" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("上午" "下午")
+                       :MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :SHORT-MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :SHORT-WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :ERAS '("公元前" "公元"))))
+
+(setf (gethash "th" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("ก่อนเที่ยง" "หลังเที่ยง")
+                       :MONTHS '("มกราคม" "กุมภาพันธ์" "มีนาคม" "เมษายน" "พฤษภาคม" "มิถุนายน" "กรกฎาคม" "สิงหาคม" "กันยายน" "ตุลาคม" "พฤศจิกายน" "ธันวาคม")
+                       :SHORT-MONTHS '("ม.ค." "ก.พ." "มี.ค." "เม.ย." "พ.ค." "มิ.ย." "ก.ค." "ส.ค." "ก.ย." "ต.ค." "พ.ย." "ธ.ค.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("วันอาทิตย์" "วันจันทร์" "วันอังคาร" "วันพุธ" "วันพฤหัสบดี" "วันศุกร์" "วันเสาร์")
+                       :SHORT-WEEKDAYS '("อา." "จ." "อ." "พ." "พฤ." "ศ." "ส.")
+                       :ERAS '("ปีก่อนคริสต์กาลที่" "ค.ศ."))))
+
+(setf (gethash "ar_SA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SAR")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "no" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "mars" "april" "mai" "juni" "juli" "august" "september" "oktober" "november" "desember")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "mai" "jun" "jul" "aug" "sep" "okt" "nov" "des")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("søndag" "mandag" "tirsdag" "onsdag" "torsdag" "fredag" "lørdag")
+                       :SHORT-WEEKDAYS '("sø" "ma" "ti" "on" "to" "fr" "lø")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en_GB" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "GBP")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sr_CS" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "CSD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануар" "фебруар" "март" "април" "мај" "јун" "јул" "август" "септембар" "октобар" "новембар" "децембар")
+                       :SHORT-MONTHS '("јан" "феб" "мар" "апр" "мај" "јун" "јул" "авг" "сеп" "окт" "нов" "дец")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("недеља" "понедељак" "уторак" "среда" "четвртак" "петак" "субота")
+                       :SHORT-WEEKDAYS '("нед" "пон" "уто" "сре" "чет" "пет" "суб")
+                       :ERAS '("п. н. е." "н. е"))))
+
+(setf (gethash "lt" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Sausio" "Vasario" "Kovo" "Balandžio" "Gegužės" "Birželio" "Liepos" "Rugpjūčio" "Rugsėjo" "Spalio" "Lapkričio" "Gruodžio")
+                       :SHORT-MONTHS '("Sau" "Vas" "Kov" "Bal" "Geg" "Bir" "Lie" "Rgp" "Rgs" "Spa" "Lap" "Grd")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sekmadienis" "Pirmadienis" "Antradienis" "Trečiadienis" "Ketvirtadienis" "Penktadienis" "Šeštadienis")
+                       :SHORT-WEEKDAYS '("Sk" "Pr" "An" "Tr" "Kt" "Pn" "Št")
+                       :ERAS '("pr.Kr." "po.Kr."))))
+
+(setf (gethash "ro" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("ianuarie" "februarie" "martie" "aprilie" "mai" "iunie" "iulie" "august" "septembrie" "octombrie" "noiembrie" "decembrie")
+                       :SHORT-MONTHS '("Ian" "Feb" "Mar" "Apr" "Mai" "Iun" "Iul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("duminică" "luni" "marţi" "miercuri" "joi" "vineri" "sîmbătă")
+                       :SHORT-WEEKDAYS '("D" "L" "Ma" "Mi" "J" "V" "S")
+                       :ERAS '("d.C." "î.d.C."))))
+
+(setf (gethash "en_NZ" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "NZD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "no_NO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "NOK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "mars" "april" "mai" "juni" "juli" "august" "september" "oktober" "november" "desember")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "mai" "jun" "jul" "aug" "sep" "okt" "nov" "des")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("søndag" "mandag" "tirsdag" "onsdag" "torsdag" "fredag" "lørdag")
+                       :SHORT-WEEKDAYS '("sø" "ma" "ti" "on" "to" "fr" "lø")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "lt_LT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "LTL")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Sausio" "Vasario" "Kovo" "Balandžio" "Gegužės" "Birželio" "Liepos" "Rugpjūčio" "Rugsėjo" "Spalio" "Lapkričio" "Gruodžio")
+                       :SHORT-MONTHS '("Sau" "Vas" "Kov" "Bal" "Geg" "Bir" "Lie" "Rgp" "Rgs" "Spa" "Lap" "Grd")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sekmadienis" "Pirmadienis" "Antradienis" "Trečiadienis" "Ketvirtadienis" "Penktadienis" "Šeštadienis")
+                       :SHORT-WEEKDAYS '("Sk" "Pr" "An" "Tr" "Kt" "Pn" "Št")
+                       :ERAS '("pr.Kr." "po.Kr."))))
+
+(setf (gethash "es_NI" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "NIO")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "nl" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januari" "februari" "maart" "april" "mei" "juni" "juli" "augustus" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mrt" "apr" "mei" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("zondag" "maandag" "dinsdag" "woensdag" "donderdag" "vrijdag" "zaterdag")
+                       :SHORT-WEEKDAYS '("zo" "ma" "di" "wo" "do" "vr" "za")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ga_IE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("a.m." "p.m.")
+                       :MONTHS '("Eanáir" "Feabhra" "Márta" "Aibreán" "Bealtaine" "Meitheamh" "Iúil" "Lúnasa" "Meán Fómhair" "Deireadh Fómhair" "Samhain" "Nollaig")
+                       :SHORT-MONTHS '("Ean" "Feabh" "Márta" "Aib" "Beal" "Meith" "Iúil" "Lún" "MFómh" "DFómh" "Samh" "Noll")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Dé Domhnaigh" "Dé Luain" "Dé Máirt" "Dé Céadaoin" "Déardaoin" "Dé hAoine" "Dé Sathairn")
+                       :SHORT-WEEKDAYS '("Domh" "Luan" "Máirt" "Céad" "Déar" "Aoine" "Sath")
+                       :ERAS '("RC" "AD"))))
+
+(setf (gethash "fr_BE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "es_ES" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_LB" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "LBP")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نوار" "حزيران" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :SHORT-MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نوار" "حزيران" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "ko" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("오전" "오후")
+                       :MONTHS '("1월" "2월" "3월" "4월" "5월" "6월" "7월" "8월" "9월" "10월" "11월" "12월")
+                       :SHORT-MONTHS '("1월" "2월" "3월" "4월" "5월" "6월" "7월" "8월" "9월" "10월" "11월" "12월")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("일요일" "월요일" "화요일" "수요일" "목요일" "금요일" "토요일")
+                       :SHORT-WEEKDAYS '("일" "월" "화" "수" "목" "금" "토")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "fr_CA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "CAD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "et_EE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "EEK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Jaanuar" "Veebruar" "Märts" "Aprill" "Mai" "Juuni" "Juuli" "August" "September" "Oktoober" "November" "Detsember")
+                       :SHORT-MONTHS '("Jaan" "Veebr" "Märts" "Apr" "Mai" "Juuni" "Juuli" "Aug" "Sept" "Okt" "Nov" "Dets")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("pühapäev" "esmaspäev" "teisipäev" "kolmapäev" "neljapäev" "reede" "laupäev")
+                       :SHORT-WEEKDAYS '("P" "E" "T" "K" "N" "R" "L")
+                       :ERAS '("e.m.a." "m.a.j."))))
+
+(setf (gethash "ar_KW" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "KWD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "sr_RS" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "RSD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануар" "фебруар" "март" "април" "мај" "јун" "јул" "август" "септембар" "октобар" "новембар" "децембар")
+                       :SHORT-MONTHS '("јан" "феб" "мар" "апр" "мај" "јун" "јул" "авг" "сеп" "окт" "нов" "дец")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("недеља" "понедељак" "уторак" "среда" "четвртак" "петак" "субота")
+                       :SHORT-WEEKDAYS '("нед" "пон" "уто" "сре" "чет" "пет" "суб")
+                       :ERAS '("п. н. е." "н. е"))))
+
+(setf (gethash "es_US" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "USD")
+        :DATE-FORMAT (list
+                       :AMPM '("a.m." "p.m.")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("a.C." "d.C."))))
+
+(setf (gethash "es_MX" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "MXN")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_SD" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SDD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "in_ID" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "IDR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januari" "Februari" "Maret" "April" "Mei" "Juni" "Juli" "Agustus" "September" "Oktober" "November" "Desember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "Mei" "Jun" "Jul" "Agu" "Sep" "Okt" "Nov" "Des")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Minggu" "Senin" "Selasa" "Rabu" "Kamis" "Jumat" "Sabtu")
+                       :SHORT-WEEKDAYS '("Min" "Sen" "Sel" "Rab" "Kam" "Jum" "Sab")
+                       :ERAS '("BCE" "CE"))))
+
+(setf (gethash "ru" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Январь" "Февраль" "Март" "Апрель" "Май" "Июнь" "Июль" "Август" "Сентябрь" "Октябрь" "Ноябрь" "Декабрь")
+                       :SHORT-MONTHS '("янв" "фев" "мар" "апр" "май" "июн" "июл" "авг" "сен" "окт" "ноя" "дек")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("воскресенье" "понедельник" "вторник" "среда" "четверг" "пятница" "суббота")
+                       :SHORT-WEEKDAYS '("Вс" "Пн" "Вт" "Ср" "Чт" "Пт" "Сб")
+                       :ERAS '("до н.э." "н.э."))))
+
+(setf (gethash "lv" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvāris" "februāris" "marts" "aprīlis" "maijs" "jūnijs" "jūlijs" "augusts" "septembris" "oktobris" "novembris" "decembris")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "Maijs" "Jūn" "Jūl" "Aug" "Sep" "Okt" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("svētdiena" "pirmdiena" "otrdiena" "trešdiena" "ceturtdiena" "piektdiena" "sestdiena")
+                       :SHORT-WEEKDAYS '("Sv" "P" "O" "T" "C" "Pk" "S")
+                       :ERAS '("pmē" "mē"))))
+
+(setf (gethash "es_UY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "UYU")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "lv_LV" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "LVL")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvāris" "februāris" "marts" "aprīlis" "maijs" "jūnijs" "jūlijs" "augusts" "septembris" "oktobris" "novembris" "decembris")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "Maijs" "Jūn" "Jūl" "Aug" "Sep" "Okt" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("svētdiena" "pirmdiena" "otrdiena" "trešdiena" "ceturtdiena" "piektdiena" "sestdiena")
+                       :SHORT-WEEKDAYS '("Sv" "P" "O" "T" "C" "Pk" "S")
+                       :ERAS '("pmē" "mē"))))
+
+(setf (gethash "iw" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("ינואר" "פברואר" "מרץ" "אפריל" "מאי" "יוני" "יולי" "אוגוסט" "ספטמבר" "אוקטובר" "נובמבר" "דצמבר")
+                       :SHORT-MONTHS '("ינו" "פבר" "מרץ" "אפר" "מאי" "יונ" "יול" "אוג" "ספט" "אוק" "נוב" "דצמ")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("יום ראשון" "יום שני" "יום שלישי" "יום רביעי" "יום חמישי" "יום שישי" "שבת")
+                       :SHORT-WEEKDAYS '("א" "ב" "ג" "ד" "ה" "ו" "ש")
+                       :ERAS '("לסה"נ" "לפסה"נ"))))
+
+(setf (gethash "pt_BR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "BRL")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Janeiro" "Fevereiro" "Março" "Abril" "Maio" "Junho" "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro")
+                       :SHORT-MONTHS '("Jan" "Fev" "Mar" "Abr" "Mai" "Jun" "Jul" "Ago" "Set" "Out" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Domingo" "Segunda-feira" "Terça-feira" "Quarta-feira" "Quinta-feira" "Sexta-feira" "Sábado")
+                       :SHORT-WEEKDAYS '("Dom" "Seg" "Ter" "Qua" "Qui" "Sex" "Sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_SY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SYP")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نواران" "حزير" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :SHORT-MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نوار" "حزيران" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "hr" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("siječanj" "veljača" "ožujak" "travanj" "svibanj" "lipanj" "srpanj" "kolovoz" "rujan" "listopad" "studeni" "prosinac")
+                       :SHORT-MONTHS '("sij" "vel" "ožu" "tra" "svi" "lip" "srp" "kol" "ruj" "lis" "stu" "pro")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("nedjelja" "ponedjeljak" "utorak" "srijeda" "četvrtak" "petak" "subota")
+                       :SHORT-WEEKDAYS '("ned" "pon" "uto" "sri" "čet" "pet" "sub")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "et" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Jaanuar" "Veebruar" "Märts" "Aprill" "Mai" "Juuni" "Juuli" "August" "September" "Oktoober" "November" "Detsember")
+                       :SHORT-MONTHS '("Jaan" "Veebr" "Märts" "Apr" "Mai" "Juuni" "Juuli" "Aug" "Sept" "Okt" "Nov" "Dets")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("pühapäev" "esmaspäev" "teisipäev" "kolmapäev" "neljapäev" "reede" "laupäev")
+                       :SHORT-WEEKDAYS '("P" "E" "T" "K" "N" "R" "L")
+                       :ERAS '("e.m.a." "m.a.j."))))
+
+(setf (gethash "es_DO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "DOP")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "fr_CH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\' :DECIMAL-SEPARATOR #\. "CHF")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "hi_IN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "INR")
+        :DATE-FORMAT (list
+                       :AMPM '("पूर्वाह्न" "अपराह्न")
+                       :MONTHS '("जनवरी" "फ़रवरी" "मार्च" "अप्रैल" "मई" "जून" "जुलाई" "अगस्त" "सितंबर" "अक्तूबर" "नवंबर" "दिसंबर")
+                       :SHORT-MONTHS '("जनवरी" "फ़रवरी" "मार्च" "अप्रैल" "मई" "जून" "जुलाई" "अगस्त" "सितंबर" "अक्तूबर" "नवंबर" "दिसंबर")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("रविवार" "सोमवार" "मंगलवार" "बुधवार" "गुरुवार" "शुक्रवार" "शनिवार")
+                       :SHORT-WEEKDAYS '("रवि" "सोम" "मंगल" "बुध" "गुरु" "शुक्र" "शनि")
+                       :ERAS '("ईसापूर्व" "सन"))))
+
+(setf (gethash "es_VE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "VEB")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_BH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "BHD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "en_PH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "PHP")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_TN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "TND")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "fi" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("tammikuu" "helmikuu" "maaliskuu" "huhtikuu" "toukokuu" "kesäkuu" "heinäkuu" "elokuu" "syyskuu" "lokakuu" "marraskuu" "joulukuu")
+                       :SHORT-MONTHS '("tammi" "helmi" "maalis" "huhti" "touko" "kesä" "heinä" "elo" "syys" "loka" "marras" "joulu")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("sunnuntai" "maanantai" "tiistai" "keskiviikko" "torstai" "perjantai" "lauantai")
+                       :SHORT-WEEKDAYS '("su" "ma" "ti" "ke" "to" "pe" "la")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "de_AT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Jänner" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember")
+                       :SHORT-MONTHS '("Jän" "Feb" "Mär" "Apr" "Mai" "Jun" "Jul" "Aug" "Sep" "Okt" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
+                       :SHORT-WEEKDAYS '("So" "Mo" "Di" "Mi" "Do" "Fr" "Sa")
+                       :ERAS '("v. Chr." "n. Chr."))))
+
+(setf (gethash "es" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "nl_NL" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januari" "februari" "maart" "april" "mei" "juni" "juli" "augustus" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mrt" "apr" "mei" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("zondag" "maandag" "dinsdag" "woensdag" "donderdag" "vrijdag" "zaterdag")
+                       :SHORT-WEEKDAYS '("zo" "ma" "di" "wo" "do" "vr" "za")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "es_EC" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "USD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "zh_TW" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "TWD")
+        :DATE-FORMAT (list
+                       :AMPM '("上午" "下午")
+                       :MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :SHORT-MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :SHORT-WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :ERAS '("西元前" "西元"))))
+
+(setf (gethash "ar_JO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "JOD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نوار" "حزيران" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :SHORT-MONTHS '("كانون الثاني" "شباط" "آذار" "نيسان" "نوار" "حزيران" "تموز" "آب" "أيلول" "تشرين الأول" "تشرين الثاني" "كانون الأول")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "be" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("студзеня" "лютага" "сакавіка" "красавіка" "мая" "чрвеня" "ліпеня" "жніўня" "верасня" "кастрычніка" "листапада" "снежня")
+                       :SHORT-MONTHS '("стд" "лют" "скв" "крс" "май" "чрв" "лпн" "жнв" "врс" "кст" "лст" "снж")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("нядзеля" "панядзелак" "аўторак" "серада" "чацвер" "пятніца" "субота")
+                       :SHORT-WEEKDAYS '("нд" "пн" "ат" "ср" "чц" "пт" "сб")
+                       :ERAS '("да н.е." "н.е."))))
+
+(setf (gethash "is_IS" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "ISK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janúar" "febrúar" "mars" "apríl" "maí" "júní" "júlí" "ágúst" "september" "október" "nóvember" "desember")
+                       :SHORT-MONTHS '("jan." "feb." "mar." "apr." "maí" "jún." "júl." "ágú." "sep." "okt." "nóv." "des.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("sunnudagur" "mánudagur" "þriðjudagur" "miðvikudagur" "fimmtudagur" "föstudagur" "laugardagur")
+                       :SHORT-WEEKDAYS '("sun." "mán." "þri." "mið." "fim." "fös." "lau.")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "es_CO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "COP")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "es_CR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "CRC")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "es_CL" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "CLP")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_EG" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "EGP")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "en_ZA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "ZAR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "th_TH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "THB")
+        :DATE-FORMAT (list
+                       :AMPM '("ก่อนเที่ยง" "หลังเที่ยง")
+                       :MONTHS '("มกราคม" "กุมภาพันธ์" "มีนาคม" "เมษายน" "พฤษภาคม" "มิถุนายน" "กรกฎาคม" "สิงหาคม" "กันยายน" "ตุลาคม" "พฤศจิกายน" "ธันวาคม")
+                       :SHORT-MONTHS '("ม.ค." "ก.พ." "มี.ค." "เม.ย." "พ.ค." "มิ.ย." "ก.ค." "ส.ค." "ก.ย." "ต.ค." "พ.ย." "ธ.ค.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("วันอาทิตย์" "วันจันทร์" "วันอังคาร" "วันพุธ" "วันพฤหัสบดี" "วันศุกร์" "วันเสาร์")
+                       :SHORT-WEEKDAYS '("อา." "จ." "อ." "พ." "พฤ." "ศ." "ส.")
+                       :ERAS '("ปีก่อนคริสต์กาลที่" "ค.ศ."))))
+
+(setf (gethash "el_GR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("πμ" "μμ")
+                       :MONTHS '("Ιανουάριος" "Φεβρουάριος" "Μάρτιος" "Απρίλιος" "Μάϊος" "Ιούνιος" "Ιούλιος" "Αύγουστος" "Σεπτέμβριος" "Οκτώβριος" "Νοέμβριος" "Δεκέμβριος")
+                       :SHORT-MONTHS '("Ιαν" "Φεβ" "Μαρ" "Απρ" "Μαϊ" "Ιουν" "Ιουλ" "Αυγ" "Σεπ" "Οκτ" "Νοε" "Δεκ")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Κυριακή" "Δευτέρα" "Τρίτη" "Τετάρτη" "Πέμπτη" "Παρασκευή" "Σάββατο")
+                       :SHORT-WEEKDAYS '("Κυρ" "Δευ" "Τρι" "Τετ" "Πεμ" "Παρ" "Σαβ")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "it_IT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("gennaio" "febbraio" "marzo" "aprile" "maggio" "giugno" "luglio" "agosto" "settembre" "ottobre" "novembre" "dicembre")
+                       :SHORT-MONTHS '("gen" "feb" "mar" "apr" "mag" "giu" "lug" "ago" "set" "ott" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domenica" "lunedì" "martedì" "mercoledì" "giovedì" "venerdì" "sabato")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mer" "gio" "ven" "sab")
+                       :ERAS '("BC" "dopo Cristo"))))
+
+(setf (gethash "ca" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("gener" "febrer" "març" "abril" "maig" "juny" "juliol" "agost" "setembre" "octubre" "novembre" "desembre")
+                       :SHORT-MONTHS '("gen." "feb." "març" "abr." "maig" "juny" "jul." "ag." "set." "oct." "nov." "des.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("diumenge" "dilluns" "dimarts" "dimecres" "dijous" "divendres" "dissabte")
+                       :SHORT-WEEKDAYS '("dg." "dl." "dt." "dc." "dj." "dv." "ds.")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "hu_HU" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "HUF")
+        :DATE-FORMAT (list
+                       :AMPM '("DE" "DU")
+                       :MONTHS '("január" "február" "március" "április" "május" "június" "július" "augusztus" "szeptember" "október" "november" "december")
+                       :SHORT-MONTHS '("jan." "febr." "márc." "ápr." "máj." "jún." "júl." "aug." "szept." "okt." "nov." "dec.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("vasárnap" "hétfő" "kedd" "szerda" "csütörtök" "péntek" "szombat")
+                       :SHORT-WEEKDAYS '("V" "H" "K" "Sze" "Cs" "P" "Szo")
+                       :ERAS '("i.e." "i.u."))))
+
+(setf (gethash "fr" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "en_IE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "uk_UA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "UAH")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("січня" "лютого" "березня" "квітня" "травня" "червня" "липня" "серпня" "вересня" "жовтня" "листопада" "грудня")
+                       :SHORT-MONTHS '("січ" "лют" "бер" "квіт" "трав" "черв" "лип" "серп" "вер" "жовт" "лист" "груд")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("неділя" "понеділок" "вівторок" "середа" "четвер" "п'ятниця" "субота")
+                       :SHORT-WEEKDAYS '("нд" "пн" "вт" "ср" "чт" "пт" "сб")
+                       :ERAS '("до н.е." "після н.е."))))
+
+(setf (gethash "pl_PL" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "PLN")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("styczeń" "luty" "marzec" "kwiecień" "maj" "czerwiec" "lipiec" "sierpień" "wrzesień" "październik" "listopad" "grudzień")
+                       :SHORT-MONTHS '("sty" "lut" "mar" "kwi" "maj" "cze" "lip" "sie" "wrz" "paź" "lis" "gru")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("niedziela" "poniedziałek" "wtorek" "środa" "czwartek" "piątek" "sobota")
+                       :SHORT-WEEKDAYS '("N" "Pn" "Wt" "Śr" "Cz" "Pt" "So")
+                       :ERAS '("p.n.e." "n.e."))))
+
+(setf (gethash "fr_LU" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "nl_BE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januari" "februari" "maart" "april" "mei" "juni" "juli" "augustus" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mrt" "apr" "mei" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("zondag" "maandag" "dinsdag" "woensdag" "donderdag" "vrijdag" "zaterdag")
+                       :SHORT-WEEKDAYS '("zo" "ma" "di" "wo" "do" "vr" "za")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en_IN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "INR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ca_ES" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("gener" "febrer" "març" "abril" "maig" "juny" "juliol" "agost" "setembre" "octubre" "novembre" "desembre")
+                       :SHORT-MONTHS '("gen." "feb." "març" "abr." "maig" "juny" "jul." "ag." "set." "oct." "nov." "des.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("diumenge" "dilluns" "dimarts" "dimecres" "dijous" "divendres" "dissabte")
+                       :SHORT-WEEKDAYS '("dg." "dl." "dt." "dc." "dj." "dv." "ds.")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ar_MA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "MAD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "es_BO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "BOB")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en_AU" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "AUD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sr" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануар" "фебруар" "март" "април" "мај" "јун" "јул" "август" "септембар" "октобар" "новембар" "децембар")
+                       :SHORT-MONTHS '("јан" "феб" "мар" "апр" "мај" "јун" "јул" "авг" "сеп" "окт" "нов" "дец")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("недеља" "понедељак" "уторак" "среда" "четвртак" "петак" "субота")
+                       :SHORT-WEEKDAYS '("нед" "пон" "уто" "сре" "чет" "пет" "суб")
+                       :ERAS '("п. н. е." "н. е"))))
+
+(setf (gethash "zh_SG" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SGD")
+        :DATE-FORMAT (list
+                       :AMPM '("上午" "下午")
+                       :MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :SHORT-MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :SHORT-WEEKDAYS '("周日" "周一" "周二" "周三" "周四" "周五" "周六")
+                       :ERAS '("公元前" "公元"))))
+
+(setf (gethash "pt" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Janeiro" "Fevereiro" "Março" "Abril" "Maio" "Junho" "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro")
+                       :SHORT-MONTHS '("Jan" "Fev" "Mar" "Abr" "Mai" "Jun" "Jul" "Ago" "Set" "Out" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Domingo" "Segunda-feira" "Terça-feira" "Quarta-feira" "Quinta-feira" "Sexta-feira" "Sábado")
+                       :SHORT-WEEKDAYS '("Dom" "Seg" "Ter" "Qua" "Qui" "Sex" "Sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "uk" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("січня" "лютого" "березня" "квітня" "травня" "червня" "липня" "серпня" "вересня" "жовтня" "листопада" "грудня")
+                       :SHORT-MONTHS '("січ" "лют" "бер" "квіт" "трав" "черв" "лип" "серп" "вер" "жовт" "лист" "груд")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("неділя" "понеділок" "вівторок" "середа" "четвер" "п'ятниця" "субота")
+                       :SHORT-WEEKDAYS '("нд" "пн" "вт" "ср" "чт" "пт" "сб")
+                       :ERAS '("до н.е." "після н.е."))))
+
+(setf (gethash "es_SV" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SVC")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ru_RU" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "RUB")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Январь" "Февраль" "Март" "Апрель" "Май" "Июнь" "Июль" "Август" "Сентябрь" "Октябрь" "Ноябрь" "Декабрь")
+                       :SHORT-MONTHS '("янв" "фев" "мар" "апр" "май" "июн" "июл" "авг" "сен" "окт" "ноя" "дек")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("воскресенье" "понедельник" "вторник" "среда" "четверг" "пятница" "суббота")
+                       :SHORT-WEEKDAYS '("Вс" "Пн" "Вт" "Ср" "Чт" "Пт" "Сб")
+                       :ERAS '("до н.э." "н.э."))))
+
+(setf (gethash "ko_KR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "KRW")
+        :DATE-FORMAT (list
+                       :AMPM '("오전" "오후")
+                       :MONTHS '("1월" "2월" "3월" "4월" "5월" "6월" "7월" "8월" "9월" "10월" "11월" "12월")
+                       :SHORT-MONTHS '("1월" "2월" "3월" "4월" "5월" "6월" "7월" "8월" "9월" "10월" "11월" "12월")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("일요일" "월요일" "화요일" "수요일" "목요일" "금요일" "토요일")
+                       :SHORT-WEEKDAYS '("일" "월" "화" "수" "목" "금" "토")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "vi" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("SA" "CH")
+                       :MONTHS '("tháng một" "tháng hai" "tháng ba" "tháng tư" "tháng năm" "tháng sáu" "tháng bảy" "tháng tám" "tháng chín" "tháng mười" "tháng mười một" "tháng mười hai")
+                       :SHORT-MONTHS '("thg 1" "thg 2" "thg 3" "thg 4" "thg 5" "thg 6" "thg 7" "thg 8" "thg 9" "thg 10" "thg 11" "thg 12")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Chủ nhật" "Thứ hai" "Thứ ba" "Thứ tư" "Thứ năm" "Thứ sáu" "Thứ bảy")
+                       :SHORT-WEEKDAYS '("CN" "Th 2" "Th 3" "Th 4" "Th 5" "Th 6" "Th 7")
+                       :ERAS '("tr. CN" "sau CN"))))
+
+(setf (gethash "ar_DZ" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "DZD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "vi_VN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "VND")
+        :DATE-FORMAT (list
+                       :AMPM '("SA" "CH")
+                       :MONTHS '("tháng một" "tháng hai" "tháng ba" "tháng tư" "tháng năm" "tháng sáu" "tháng bảy" "tháng tám" "tháng chín" "tháng mười" "tháng mười một" "tháng mười hai")
+                       :SHORT-MONTHS '("thg 1" "thg 2" "thg 3" "thg 4" "thg 5" "thg 6" "thg 7" "thg 8" "thg 9" "thg 10" "thg 11" "thg 12")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Chủ nhật" "Thứ hai" "Thứ ba" "Thứ tư" "Thứ năm" "Thứ sáu" "Thứ bảy")
+                       :SHORT-WEEKDAYS '("CN" "Th 2" "Th 3" "Th 4" "Th 5" "Th 6" "Th 7")
+                       :ERAS '("tr. CN" "sau CN"))))
+
+(setf (gethash "sr_ME" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("јануар" "фебруар" "март" "април" "мај" "јун" "јул" "август" "септембар" "октобар" "новембар" "децембар")
+                       :SHORT-MONTHS '("јан" "феб" "мар" "апр" "мај" "јун" "јул" "авг" "сеп" "окт" "нов" "дец")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("недеља" "понедељак" "уторак" "среда" "четвртак" "петак" "субота")
+                       :SHORT-WEEKDAYS '("нед" "пон" "уто" "сре" "чет" "пет" "суб")
+                       :ERAS '("п. н. е." "н. е"))))
+
+(setf (gethash "sq" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("PD" "MD")
+                       :MONTHS '("janar" "shkurt" "mars" "prill" "maj" "qershor" "korrik" "gusht" "shtator" "tetor" "nëntor" "dhjetor")
+                       :SHORT-MONTHS '("Jan" "Shk" "Mar" "Pri" "Maj" "Qer" "Kor" "Gsh" "Sht" "Tet" "Nën" "Dhj")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("e diel" "e hënë" "e martë" "e mërkurë" "e enjte" "e premte" "e shtunë")
+                       :SHORT-WEEKDAYS '("Die" "Hën" "Mar" "Mër" "Enj" "Pre" "Sht")
+                       :ERAS '("p.e.r." "n.e.r."))))
+
+(setf (gethash "ar_LY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "LYD")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "ar" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "zh_CN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "CNY")
+        :DATE-FORMAT (list
+                       :AMPM '("上午" "下午")
+                       :MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :SHORT-MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :SHORT-WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :ERAS '("公元前" "公元"))))
+
+(setf (gethash "be_BY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "BYR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("студзеня" "лютага" "сакавіка" "красавіка" "мая" "чрвеня" "ліпеня" "жніўня" "верасня" "кастрычніка" "листапада" "снежня")
+                       :SHORT-MONTHS '("стд" "лют" "скв" "крс" "май" "чрв" "лпн" "жнв" "врс" "кст" "лст" "снж")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("нядзеля" "панядзелак" "аўторак" "серада" "чацвер" "пятніца" "субота")
+                       :SHORT-WEEKDAYS '("нд" "пн" "ат" "ср" "чц" "пт" "сб")
+                       :ERAS '("да н.е." "н.е."))))
+
+(setf (gethash "zh_HK" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "HKD")
+        :DATE-FORMAT (list
+                       :AMPM '("上午" "下午")
+                       :MONTHS '("一月" "二月" "三月" "四月" "五月" "六月" "七月" "八月" "九月" "十月" "十一月" "十二月")
+                       :SHORT-MONTHS '("1月" "2月" "3月" "4月" "5月" "6月" "7月" "8月" "9月" "10月" "11月" "12月")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("星期日" "星期一" "星期二" "星期三" "星期四" "星期五" "星期六")
+                       :SHORT-WEEKDAYS '("日" "一" "二" "三" "四" "五" "六")
+                       :ERAS '("西元前" "西元"))))
+
+(setf (gethash "ja" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("午前" "午後")
+                       :MONTHS '("1月" "2月" "3月" "4月" "5月" "6月" "7月" "8月" "9月" "10月" "11月" "12月")
+                       :SHORT-MONTHS '("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("日曜日" "月曜日" "火曜日" "水曜日" "木曜日" "金曜日" "土曜日")
+                       :SHORT-WEEKDAYS '("日" "月" "火" "水" "木" "金" "土")
+                       :ERAS '("紀元前" "西暦"))))
+
+(setf (gethash "iw_IL" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "ILS")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("ינואר" "פברואר" "מרץ" "אפריל" "מאי" "יוני" "יולי" "אוגוסט" "ספטמבר" "אוקטובר" "נובמבר" "דצמבר")
+                       :SHORT-MONTHS '("ינו" "פבר" "מרץ" "אפר" "מאי" "יונ" "יול" "אוג" "ספט" "אוק" "נוב" "דצמ")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("יום ראשון" "יום שני" "יום שלישי" "יום רביעי" "יום חמישי" "יום שישי" "שבת")
+                       :SHORT-WEEKDAYS '("א" "ב" "ג" "ד" "ה" "ו" "ש")
+                       :ERAS '("לסה"נ" "לפסה"נ"))))
+
+(setf (gethash "bg_BG" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "BGN")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Януари" "Февруари" "Март" "Април" "Май" "Юни" "Юли" "Август" "Септември" "Октомври" "Ноември" "Декември")
+                       :SHORT-MONTHS '("I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" "XI" "XII")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Неделя" "Понеделник" "Вторник" "Сряда" "Четвъртък" "Петък" "Събота")
+                       :SHORT-WEEKDAYS '("Нд" "Пн" "Вт" "Ср" "Чт" "Пт" "Сб")
+                       :ERAS '("пр.н.е." "н.е."))))
+
+(setf (gethash "in" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januari" "Februari" "Maret" "April" "Mei" "Juni" "Juli" "Agustus" "September" "Oktober" "November" "Desember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "Mei" "Jun" "Jul" "Agu" "Sep" "Okt" "Nov" "Des")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Minggu" "Senin" "Selasa" "Rabu" "Kamis" "Jumat" "Sabtu")
+                       :SHORT-WEEKDAYS '("Min" "Sen" "Sel" "Rab" "Kam" "Jum" "Sab")
+                       :ERAS '("BCE" "CE"))))
+
+(setf (gethash "mt_MT" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "MTL")
+        :DATE-FORMAT (list
+                       :AMPM '("QN" "WN")
+                       :MONTHS '("Jannar" "Frar" "Marzu" "April" "Mejju" "Ġunju" "Lulju" "Awissu" "Settembru" "Ottubru" "Novembru" "Diċembru")
+                       :SHORT-MONTHS '("Jan" "Fra" "Mar" "Apr" "Mej" "Ġun" "Lul" "Awi" "Set" "Ott" "Nov" "Diċ")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Il-Ħadd" "It-Tnejn" "It-Tlieta" "L-Erbgħa" "Il-Ħamis" "Il-Ġimgħa" "Is-Sibt")
+                       :SHORT-WEEKDAYS '("Ħad" "Tne" "Tli" "Erb" "Ħam" "Ġim" "Sib")
+                       :ERAS '("QK" "WK"))))
+
+(setf (gethash "es_PY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "PYG")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sl" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "marec" "april" "maj" "junij" "julij" "avgust" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "avg" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Nedelja" "Ponedeljek" "Torek" "Sreda" "Četrtek" "Petek" "Sobota")
+                       :SHORT-WEEKDAYS '("Ned" "Pon" "Tor" "Sre" "Čet" "Pet" "Sob")
+                       :ERAS '("pr.n.š." "po Kr."))))
+
+(setf (gethash "fr_FR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("janvier" "février" "mars" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")
+                       :SHORT-MONTHS '("janv." "févr." "mars" "avr." "mai" "juin" "juil." "août" "sept." "oct." "nov." "déc.")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("dimanche" "lundi" "mardi" "mercredi" "jeudi" "vendredi" "samedi")
+                       :SHORT-WEEKDAYS '("dim." "lun." "mar." "mer." "jeu." "ven." "sam.")
+                       :ERAS '("BC" "ap. J.-C."))))
+
+(setf (gethash "cs_CZ" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "CZK")
+        :DATE-FORMAT (list
+                       :AMPM '("dop." "odp.")
+                       :MONTHS '("leden" "únor" "březen" "duben" "květen" "červen" "červenec" "srpen" "září" "říjen" "listopad" "prosinec")
+                       :SHORT-MONTHS '("I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" "XI" "XII")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Neděle" "Pondělí" "Úterý" "Středa" "Čtvrtek" "Pátek" "Sobota")
+                       :SHORT-WEEKDAYS '("Ne" "Po" "Út" "St" "Čt" "Pá" "So")
+                       :ERAS '("př.Kr." "po Kr."))))
+
+(setf (gethash "it_CH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\' :DECIMAL-SEPARATOR #\. "CHF")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("gennaio" "febbraio" "marzo" "aprile" "maggio" "giugno" "luglio" "agosto" "settembre" "ottobre" "novembre" "dicembre")
+                       :SHORT-MONTHS '("gen" "feb" "mar" "apr" "mag" "giu" "lug" "ago" "set" "ott" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domenica" "lunedì" "martedì" "mercoledì" "giovedì" "venerdì" "sabato")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mer" "gio" "ven" "sab")
+                       :ERAS '("BC" "dopo Cristo"))))
+
+(setf (gethash "ro_RO" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "RON")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("ianuarie" "februarie" "martie" "aprilie" "mai" "iunie" "iulie" "august" "septembrie" "octombrie" "noiembrie" "decembrie")
+                       :SHORT-MONTHS '("Ian" "Feb" "Mar" "Apr" "Mai" "Iun" "Iul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("duminică" "luni" "marţi" "miercuri" "joi" "vineri" "sîmbătă")
+                       :SHORT-WEEKDAYS '("D" "L" "Ma" "Mi" "J" "V" "S")
+                       :ERAS '("d.C." "î.d.C."))))
+
+(setf (gethash "es_PR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "USD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en_CA" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "CAD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "de_DE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mrz" "Apr" "Mai" "Jun" "Jul" "Aug" "Sep" "Okt" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
+                       :SHORT-WEEKDAYS '("So" "Mo" "Di" "Mi" "Do" "Fr" "Sa")
+                       :ERAS '("v. Chr." "n. Chr."))))
+
+(setf (gethash "ga" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("a.m." "p.m.")
+                       :MONTHS '("Eanáir" "Feabhra" "Márta" "Aibreán" "Bealtaine" "Meitheamh" "Iúil" "Lúnasa" "Meán Fómhair" "Deireadh Fómhair" "Samhain" "Nollaig")
+                       :SHORT-MONTHS '("Ean" "Feabh" "Márta" "Aib" "Beal" "Meith" "Iúil" "Lún" "MFómh" "DFómh" "Samh" "Noll")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Dé Domhnaigh" "Dé Luain" "Dé Máirt" "Dé Céadaoin" "Déardaoin" "Dé hAoine" "Dé Sathairn")
+                       :SHORT-WEEKDAYS '("Domh" "Luan" "Máirt" "Céad" "Déar" "Aoine" "Sath")
+                       :ERAS '("RC" "AD"))))
+
+(setf (gethash "de_LU" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "EUR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mrz" "Apr" "Mai" "Jun" "Jul" "Aug" "Sep" "Okt" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
+                       :SHORT-WEEKDAYS '("So" "Mo" "Di" "Mi" "Do" "Fr" "Sa")
+                       :ERAS '("v. Chr." "n. Chr."))))
+
+(setf (gethash "de" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mrz" "Apr" "Mai" "Jun" "Jul" "Aug" "Sep" "Okt" "Nov" "Dez")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
+                       :SHORT-WEEKDAYS '("So" "Mo" "Di" "Mi" "Do" "Fr" "Sa")
+                       :ERAS '("v. Chr." "n. Chr."))))
+
+(setf (gethash "es_AR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "ARS")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "sk" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("január" "február" "marec" "apríl" "máj" "jún" "júl" "august" "september" "október" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "máj" "jún" "júl" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Nedeľa" "Pondelok" "Utorok" "Streda" "Štvrtok" "Piatok" "Sobota")
+                       :SHORT-WEEKDAYS '("Ne" "Po" "Ut" "St" "Št" "Pi" "So")
+                       :ERAS '("pred n.l." "n.l."))))
+
+(setf (gethash "ms_MY" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "MYR")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januari" "Februari" "Mac" "April" "Mei" "Jun" "Julai" "Ogos" "September" "Oktober" "November" "Disember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mac" "Apr" "Mei" "Jun" "Jul" "Ogos" "Sep" "Okt" "Nov" "Dis")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Ahad" "Isnin" "Selasa" "Rabu" "Khamis" "Jumaat" "Sabtu")
+                       :SHORT-WEEKDAYS '("Ahd" "Isn" "Sel" "Rab" "Kha" "Jum" "Sab")
+                       :ERAS '("BCE" "CE"))))
+
+(setf (gethash "hr_HR" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "HRK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("siječanj" "veljača" "ožujak" "travanj" "svibanj" "lipanj" "srpanj" "kolovoz" "rujan" "listopad" "studeni" "prosinac")
+                       :SHORT-MONTHS '("sij" "vel" "ožu" "tra" "svi" "lip" "srp" "kol" "ruj" "lis" "stu" "pro")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("nedjelja" "ponedjeljak" "utorak" "srijeda" "četvrtak" "petak" "subota")
+                       :SHORT-WEEKDAYS '("ned" "pon" "uto" "sri" "čet" "pet" "sub")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "en_SG" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "SGD")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday")
+                       :SHORT-WEEKDAYS '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "da" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "marts" "april" "maj" "juni" "juli" "august" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("søndag" "mandag" "tirsdag" "onsdag" "torsdag" "fredag" "lørdag")
+                       :SHORT-WEEKDAYS '("sø" "ma" "ti" "on" "to" "fr" "lø")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "mt" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("QN" "WN")
+                       :MONTHS '("Jannar" "Frar" "Marzu" "April" "Mejju" "Ġunju" "Lulju" "Awissu" "Settembru" "Ottubru" "Novembru" "Diċembru")
+                       :SHORT-MONTHS '("Jan" "Fra" "Mar" "Apr" "Mej" "Ġun" "Lul" "Awi" "Set" "Ott" "Nov" "Diċ")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Il-Ħadd" "It-Tnejn" "It-Tlieta" "L-Erbgħa" "Il-Ħamis" "Il-Ġimgħa" "Is-Sibt")
+                       :SHORT-WEEKDAYS '("Ħad" "Tne" "Tli" "Erb" "Ħam" "Ġim" "Sib")
+                       :ERAS '("QK" "WK"))))
+
+(setf (gethash "pl" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("styczeń" "luty" "marzec" "kwiecień" "maj" "czerwiec" "lipiec" "sierpień" "wrzesień" "październik" "listopad" "grudzień")
+                       :SHORT-MONTHS '("sty" "lut" "mar" "kwi" "maj" "cze" "lip" "sie" "wrz" "paź" "lis" "gru")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("niedziela" "poniedziałek" "wtorek" "środa" "czwartek" "piątek" "sobota")
+                       :SHORT-WEEKDAYS '("N" "Pn" "Wt" "Śr" "Cz" "Pt" "So")
+                       :ERAS '("p.n.e." "n.e."))))
+
+(setf (gethash "ar_OM" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "OMR")
+        :DATE-FORMAT (list
+                       :AMPM '("ص" "م")
+                       :MONTHS '("يناير" "فبراير" "مارس" "أبريل" "مايو" "يونيو" "يوليو" "أغسطس" "سبتمبر" "أكتوبر" "نوفمبر" "ديسمبر")
+                       :SHORT-MONTHS '("ينا" "فبر" "مار" "أبر" "ماي" "يون" "يول" "أغس" "سبت" "أكت" "نوف" "ديس")
+                       :FIRST-DAY-OF-THE-WEEK 7
+                       :WEEKDAYS '("الأحد" "الاثنين" "الثلاثاء" "الأربعاء" "الخميس" "الجمعة" "السبت")
+                       :SHORT-WEEKDAYS '("ح" "ن" "ث" "ر" "خ" "ج" "س")
+                       :ERAS '("ق.م" "م"))))
+
+(setf (gethash "tr" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Ocak" "Şubat" "Mart" "Nisan" "Mayıs" "Haziran" "Temmuz" "Ağustos" "Eylül" "Ekim" "Kasım" "Aralık")
+                       :SHORT-MONTHS '("Oca" "Şub" "Mar" "Nis" "May" "Haz" "Tem" "Ağu" "Eyl" "Eki" "Kas" "Ara")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Pazar" "Pazartesi" "Salı" "Çarşamba" "Perşembe" "Cuma" "Cumartesi")
+                       :SHORT-WEEKDAYS '("Paz" "Pzt" "Sal" "Çar" "Per" "Cum" "Cmt")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "th_TH" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "THB")
+        :DATE-FORMAT (list
+                       :AMPM '("ก่อนเที่ยง" "หลังเที่ยง")
+                       :MONTHS '("มกราคม" "กุมภาพันธ์" "มีนาคม" "เมษายน" "พฤษภาคม" "มิถุนายน" "กรกฎาคม" "สิงหาคม" "กันยายน" "ตุลาคม" "พฤศจิกายน" "ธันวาคม")
+                       :SHORT-MONTHS '("ม.ค." "ก.พ." "มี.ค." "เม.ย." "พ.ค." "มิ.ย." "ก.ค." "ส.ค." "ก.ย." "ต.ค." "พ.ย." "ธ.ค.")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("วันอาทิตย์" "วันจันทร์" "วันอังคาร" "วันพุธ" "วันพฤหัสบดี" "วันศุกร์" "วันเสาร์")
+                       :SHORT-WEEKDAYS '("อา." "จ." "อ." "พ." "พฤ." "ศ." "ส.")
+                       :ERAS '("ปีก่อนคริสต์กาลที่" "ค.ศ."))))
+
+(setf (gethash "el" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("πμ" "μμ")
+                       :MONTHS '("Ιανουάριος" "Φεβρουάριος" "Μάρτιος" "Απρίλιος" "Μάϊος" "Ιούνιος" "Ιούλιος" "Αύγουστος" "Σεπτέμβριος" "Οκτώβριος" "Νοέμβριος" "Δεκέμβριος")
+                       :SHORT-MONTHS '("Ιαν" "Φεβ" "Μαρ" "Απρ" "Μαϊ" "Ιουν" "Ιουλ" "Αυγ" "Σεπ" "Οκτ" "Νοε" "Δεκ")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("Κυριακή" "Δευτέρα" "Τρίτη" "Τετάρτη" "Πέμπτη" "Παρασκευή" "Σάββατο")
+                       :SHORT-WEEKDAYS '("Κυρ" "Δευ" "Τρι" "Τετ" "Πεμ" "Παρ" "Σαβ")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "ms" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "XXX")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("Januari" "Februari" "Mac" "April" "Mei" "Jun" "Julai" "Ogos" "September" "Oktober" "November" "Disember")
+                       :SHORT-MONTHS '("Jan" "Feb" "Mac" "Apr" "Mei" "Jun" "Jul" "Ogos" "Sep" "Okt" "Nov" "Dis")
+                       :FIRST-DAY-OF-THE-WEEK 1
+                       :WEEKDAYS '("Ahad" "Isnin" "Selasa" "Rabu" "Khamis" "Jumaat" "Sabtu")
+                       :SHORT-WEEKDAYS '("Ahd" "Isn" "Sel" "Rab" "Kha" "Jum" "Sab")
+                       :ERAS '("BCE" "CE"))))
+
+(setf (gethash "sv_SE" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\  :DECIMAL-SEPARATOR #\, "SEK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januari" "februari" "mars" "april" "maj" "juni" "juli" "augusti" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("söndag" "måndag" "tisdag" "onsdag" "torsdag" "fredag" "lördag")
+                       :SHORT-WEEKDAYS '("sö" "må" "ti" "on" "to" "fr" "lö")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "da_DK" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\. :DECIMAL-SEPARATOR #\, "DKK")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("januar" "februar" "marts" "april" "maj" "juni" "juli" "august" "september" "oktober" "november" "december")
+                       :SHORT-MONTHS '("jan" "feb" "mar" "apr" "maj" "jun" "jul" "aug" "sep" "okt" "nov" "dec")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("søndag" "mandag" "tirsdag" "onsdag" "torsdag" "fredag" "lørdag")
+                       :SHORT-WEEKDAYS '("sø" "ma" "ti" "on" "to" "fr" "lø")
+                       :ERAS '("BC" "AD"))))
+
+(setf (gethash "es_HN" *locales*)
+      (list 
+        :NUMBER-FORMAT (list :GROUPING-SEPARATOR #\, :DECIMAL-SEPARATOR #\. "HNL")
+        :DATE-FORMAT (list
+                       :AMPM '("AM" "PM")
+                       :MONTHS '("enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre")
+                       :SHORT-MONTHS '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic")
+                       :FIRST-DAY-OF-THE-WEEK 2
+                       :WEEKDAYS '("domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado")
+                       :SHORT-WEEKDAYS '("dom" "lun" "mar" "mié" "jue" "vie" "sáb")
+                       :ERAS '("BC" "AD"))))
+
Modified: trunk/main/claw-core/src/packages.lisp
==============================================================================
--- trunk/main/claw-core/src/packages.lisp	(original)
+++ trunk/main/claw-core/src/packages.lisp	Tue Mar 25 05:54:19 2008
@@ -33,7 +33,7 @@
 (export 'HUNCHENTOOT::SESSION-REALM 'HUNCHENTOOT)
 
 (defpackage :claw
-  (:use :cl :hunchentoot :alexandria :cl-ppcre :cl-fad)
+  (:use :cl :hunchentoot :alexandria :cl-ppcre :cl-fad :local-time)
   (:shadow :flatten)
   (:export :*html-4.01-strict*
 	   :*html-4.01-transitional*
@@ -289,7 +289,7 @@
 	   :translator-encode
 	   :translator-decode
 	   :*simple-translator*
-	   ;;:with-validators disabled
+	   :*locales*
 	   :validate
 	   :validation-errors
 	   :component-validation-errors
Modified: trunk/main/claw-core/src/validators.lisp
==============================================================================
--- trunk/main/claw-core/src/validators.lisp	(original)
+++ trunk/main/claw-core/src/validators.lisp	Tue Mar 25 05:54:19 2008
@@ -65,7 +65,9 @@
   ((thousand-separator :initarg :thousand-separator
 	 :reader translator-thousand-separator)
    (always-show-signum :initarg :always-show-signum
-	 :reader translator-always-show-signum))
+	 :reader translator-always-show-signum)
+   (grouping-size :initarg :grouping-size
+	 :reader translator-grouping-size))
   (:default-initargs :thousand-separator nil
     :always-show-signum nil)
   (:documentation "a translator object encodes and decodes integer values passed to a html input component"))
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    17 Mar '08
                    
                        Author: achiumenti
Date: Mon Mar 17 14:57:50 2008
New Revision: 18
Modified:
   trunk/main/claw-core/src/packages.lisp
   trunk/main/claw-core/src/validators.lisp
   trunk/main/claw-core/tests/test1.lisp
Log:
added translator-number
Modified: trunk/main/claw-core/src/packages.lisp
==============================================================================
--- trunk/main/claw-core/src/packages.lisp	(original)
+++ trunk/main/claw-core/src/packages.lisp	Mon Mar 17 14:57:50 2008
@@ -285,6 +285,7 @@
 	   ;;validation
 	   :translator
 	   :translator-integer
+	   :translator-number
 	   :translator-encode
 	   :translator-decode
 	   :*simple-translator*
Modified: trunk/main/claw-core/src/validators.lisp
==============================================================================
--- trunk/main/claw-core/src/validators.lisp	(original)
+++ trunk/main/claw-core/src/validators.lisp	Mon Mar 17 14:57:50 2008
@@ -56,6 +56,7 @@
 (defmethod translator-decode ((translator translator) (wcomponent wcomponent))  
   (multiple-value-bind (client-id new-value)      
       (component-id-and-value wcomponent)
+    (declare (ignore client-id))
     new-value))
 
 (defvar *simple-translator* (make-instance 'translator))
@@ -99,12 +100,13 @@
   (let* ((thousand-separator (translator-thousand-separator translator)))
     (multiple-value-bind (client-id new-value)
 	(component-id-and-value wcomponent)
+      (declare (ignore client-id))
       (if thousand-separator
 	  (parse-integer (regex-replace-all (format nil "~a" thousand-separator) new-value ""))
 	  (parse-integer new-value)))))
 
 ;;=========================================
-#|
+
 (defclass translator-number (translator) 
   ((thousand-separator :initarg :thousand-separator
 	 :reader translator-thousand-separator)
@@ -113,13 +115,17 @@
    (decimal-digits :initarg :decimal-digits
 		   :reader translator-decimal-digits)
    (always-show-signum :initarg :always-show-signum		       
-	 :reader translator-always-show-signum))
+	 :reader translator-always-show-signum)
+   (coerce :initarg :coerce
+	   :accessor translator-coerce))
   (:default-initargs :thousand-separator nil :decimals-separator #\.
-		     :integer-digits nil
+		     ;:integer-digits nil
 		     :decimal-digits nil
-		     :always-show-signum nil)
+		     :always-show-signum nil
+		     :coerce 'ratio)
   (:documentation "a translator object encodes and decodes integer values passed to a html input component"))
 
+
 (defmethod translator-encode ((translator translator-number) (wcomponent wcomponent))
   (let* ((page (htcomponent-page wcomponent))
 	 (visit-object (wcomponent-parameter-value wcomponent :visit-object))
@@ -145,24 +151,40 @@
 	      (floor (cond
 		       ((and (null reader) accessor) (funcall (fdefinition accessor) visit-object))
 		       (t (funcall (fdefinition reader) visit-object))))
+	    (progn 	      
+	      (setf dec-value (coerce dec-value 'float))
 	    (format nil "~a~a" (if thousand-separator
-				 (string-trim " " (format nil control-string thousand-separator int-value))
-				 (format nil control-string int-value))
+				 (string-trim " " (format nil integer-control-string thousand-separator int-value))
+				 (format nil integer-control-string int-value))		    
 		    (cond 
 		      ((and (= 0.0 (coerce dec-value 'double-float)) decimal-digits)
-		       (format "~a~a" decimals-separator (make-string decimal-digits #\0)))
+		       (format nil "~a~a" decimals-separator (make-string decimal-digits :initial-element #\0)))
 		      (decimal-digits 
-		       (format "~a~a" decimals-separator (make-string decimal-digits #\0))
+		       (let ((frac-part (subseq (format nil "~f" dec-value) 2)))
+			 (if (> (length frac-part) decimal-digits)
+			     (setf frac-part (subseq frac-part 0 decimal-digits))
+			     (setf frac-part (concatenate 'string frac-part (make-string (- decimal-digits (length frac-part)) :initial-element #\0))))
+			 (format nil "~a~a" decimals-separator frac-part)))
+		      (t (format nil "~a~a" decimals-separator (subseq (format nil "~f" dec-value) 2)))))))))))
+
 
 (defmethod translator-decode ((translator translator-number) (wcomponent wcomponent))
-  (let* ((thousand-separator (translator-thousand-separator translator)))
-    (multiple-value-bind (client-id new-value)
+  (let* ((thousand-separator (translator-thousand-separator translator))
+	 (type (translator-coerce translator)) 
+	 (int-value)
+	 (dec-value))
+    (multiple-value-bind (client-id new-value)	
 	(component-id-and-value wcomponent)
-      (if thousand-separator
-	  (parse-integer (regex-replace-all (format nil "~a" thousand-separator) new-value ""))
-	  (parse-integer new-value)))))
+      (declare (ignore client-id))
+      (when thousand-separator
+	(setf new-value (regex-replace-all (format nil "~a" thousand-separator) new-value "")))
+      (let ((decomposed-string (all-matches-as-strings "[0-9]+" new-value)))
+	(setf int-value (parse-integer (concatenate 'string (first decomposed-string) (second decomposed-string))))
+	(setf dec-value (expt 10 (length (second decomposed-string))))
+	(coerce (/ int-value dec-value) type)))))
+
+
 
-|#
 ;;----------------------------------------------------------------------------------------
 (defun add-exception (id reason) 
   (let* ((validation-errors (aux-request-value :validation-errors))
@@ -218,11 +240,19 @@
     (or (when min
 	  (validate (>= value min)
 		    :component component		
-		    :message (format nil "Field ~a is not greater then or equal to ~d" (wcomponent-parameter-value component :label) min)))
+		    :message (format nil "Field ~a is not greater then or equal to ~d" 
+				     (wcomponent-parameter-value component :label) 
+				     (if (typep min 'ratio)
+					 (coerce min 'float)
+					 min))))
 	(when max
 	  (validate (<= value max)
 		    :component component		
-		    :message (format nil "Field ~a is not less then or equal to ~d" (wcomponent-parameter-value component :label) max))))))
+		    :message (format nil "Field ~a is not less then or equal to ~d" 
+				     (wcomponent-parameter-value component :label) 
+				     (if (typep max 'ratio)
+					 (coerce max 'float)
+					 max)))))))
 
 (defun validator-number (component value &key min max)
   (when value        
@@ -259,15 +289,3 @@
 	      collect (li> message)))))))
 
 ;;-------------------------------------------------------------------------------------------
-
-#|
-(defmacro with-validators (&rest rest)
-  (let* ((component (gensym))
-	 (value (gensym))	
-	 (validators (loop for validator in rest
-			     collect (list 'funcall validator component value))))
-    `#'(lambda (,value) 
-       (let ((,component (current-component)))	 
-	 (or ,@validators)))))
-|#
-
Modified: trunk/main/claw-core/tests/test1.lisp
==============================================================================
--- trunk/main/claw-core/tests/test1.lisp	(original)
+++ trunk/main/claw-core/tests/test1.lisp	Mon Mar 17 14:57:50 2008
@@ -299,8 +299,10 @@
    (gender :initarg :gender	   
 	   :accessor user-gender)
    (age :initarg :age
-	:accessor user-age))  
-  (:default-initargs :name "" :surname "" :gender "" :age ""))
+	:accessor user-age)
+   (capital :initarg :capital
+	:accessor user-capital))  
+  (:default-initargs :name "" :surname "" :gender "" :age "" :capital 0.0))
 
 (defgeneric form-page-update-user (form-page))
 
@@ -317,12 +319,15 @@
    (user :initarg :user
 	 :accessor form-page-user)
    (age :initarg :age
-	:accessor form-page-age))  
+	:accessor form-page-age)
+   (capital :initarg :capital
+	:accessor form-page-capital))  
   (:default-initargs :name "kiuma"
     :surname "surnk"
     :colors nil
     :gender '("M")
     :age 1800
+    :capital 500055/100
     :message-dispatcher *lisplet-messages*
     :user (make-instance 'user)))
 
@@ -388,6 +393,20 @@
 						       (validator-integer component value :min 1 :max 2000)))
 				      :accessor 'form-page-age)"*"))
 			   (tr>
+			    (td> "Capital")
+			    (td>
+			     (cinput> :id "capital"
+				      :type "text"
+				      :label "Capital"
+				      :translator (make-instance 'translator-number 
+								 :decimal-digits 4
+								 :thousand-separator #\')
+				      :validator #'(lambda (value) 
+						     (let ((component (page-current-component o)))
+						       (validator-required component value)
+						       (validator-number component value :min 1000.01 :max 500099/100)))
+				      :accessor 'form-page-capital)"*"))
+			   (tr>
 			    (td> "Colors")
 			    (td>
 			     (cselect> :id "colors"				
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    14 Mar '08
                    
                        Author: achiumenti
Date: Fri Mar 14 02:57:28 2008
New Revision: 17
Modified:
   trunk/main/claw-core/src/misc.lisp
   trunk/main/claw-core/src/packages.lisp
   trunk/main/claw-core/src/tags.lisp
   trunk/main/claw-core/tests/test1.lisp
Log:
beginning of translators and i18n support
Modified: trunk/main/claw-core/src/misc.lisp
==============================================================================
--- trunk/main/claw-core/src/misc.lisp	(original)
+++ trunk/main/claw-core/src/misc.lisp	Fri Mar 14 02:57:28 2008
@@ -144,7 +144,7 @@
 	    (t (push element result))))
     (nreverse result)))
 
-(defmacro with-message (key locale &optional (default ""))
+(defmacro with-message (key &optional (default "") locale)
   (let ((current-lisplet (gensym))
 	(current-page (gensym))
 	(current-component (gensym))
@@ -157,28 +157,43 @@
 	       (,current-page (current-page))
 	       (,current-component (current-component))
 	       (,locale-val ,locale)
-	       (,result))
-	   (log-message :info "LISPLET: ~a; PAGE: ~a; COMPONENT: ~a" 
-			,current-lisplet 
-			,current-page 
-			,current-component)
-	 (when ,current-lisplet
-	   (log-message :info "CALLING (message-dispatch ~a ~a ~a)" ,current-lisplet ,key-val ,locale-val)
-	   (setf ,result (message-dispatch ,current-lisplet ,key-val ,locale-val)))
-	 (when (and (null ,result) ,current-page)
-	   (setf ,result (message-dispatch ,current-page ,key-val ,locale-val)))
-	 (when (and (null ,result) ,current-component)
-	   (setf ,result (message-dispatch ,current-component ,key-val ,locale-val)))	 
-	 (when (null ,result)
-	   (setf ,locale-val "")
+	       (,result))	   
+	   (unless ,locale-val
+	     (setf ,locale-val (user-locale)))
 	   (when ,current-lisplet
 	     (setf ,result (message-dispatch ,current-lisplet ,key-val ,locale-val)))
 	   (when (and (null ,result) ,current-page)
 	     (setf ,result (message-dispatch ,current-page ,key-val ,locale-val)))
 	   (when (and (null ,result) ,current-component)
-	     (setf ,result (message-dispatch ,current-component ,key-val ,locale-val))))
-	 (if ,result
-	     ,result
-	     ,default-val)))))
+	     (setf ,result (message-dispatch ,current-component ,key-val ,locale-val)))	 
+	   (when (null ,result)
+	     (setf ,locale-val "")
+	     (when ,current-lisplet
+	       (setf ,result (message-dispatch ,current-lisplet ,key-val ,locale-val)))
+	     (when (and (null ,result) ,current-page)
+	       (setf ,result (message-dispatch ,current-page ,key-val ,locale-val)))
+	     (when (and (null ,result) ,current-component)
+	       (setf ,result (message-dispatch ,current-component ,key-val ,locale-val))))
+	   (if ,result
+	       ,result
+	       ,default-val)))))
 	   
-  
\ No newline at end of file
+  
+(defun user-locale (&optional (request *request*) (session *session*))
+  (let ((locale (when session
+		  (session-value 'locale session))))
+    (unless locale
+      (setf locale (first (loop for str in (all-matches-as-strings 
+					    "[A-Z|a-z|_]+" 
+					    (regex-replace-all "-" (regex-replace-all ";.*" (header-in "ACCEPT-LANGUAGE" request) "") "_"))
+			     collect (if (> (length str) 2)
+					 (string-upcase str :start 2)
+					 str)))))
+    locale))
+
+(defun (setf user-locale) (locale &optional (session *session*))
+  (unless session
+    (setf session (lisplet-start-session)))
+  (setf (session-value 'locale session) locale))
+      
+    
Modified: trunk/main/claw-core/src/packages.lisp
==============================================================================
--- trunk/main/claw-core/src/packages.lisp	(original)
+++ trunk/main/claw-core/src/packages.lisp	Fri Mar 14 02:57:28 2008
@@ -272,6 +272,7 @@
 	   :current-realm
 	   :current-page
 	   :current-component
+	   :user-locale
 	   :page-current-component
 	   :user-in-role-p
 	   :login
Modified: trunk/main/claw-core/src/tags.lisp
==============================================================================
--- trunk/main/claw-core/src/tags.lisp	(original)
+++ trunk/main/claw-core/src/tags.lisp	Fri Mar 14 02:57:28 2008
@@ -389,7 +389,7 @@
     :url nil)
   (:documentation "A page object holds claw components to be rendered") )
   
-(defclass htcomponent ()
+(defclass htcomponent (i18n-aware)
   ((page :initarg :page
 	 :reader htcomponent-page :documentation "The owner page") 
    (body :initarg :body
@@ -431,6 +431,8 @@
   (:default-initargs :raw nil)
   (:documentation "Component needed to render strings"))
 
+
+
 (defmethod initialize-instance :after ((inst tag) &rest keys)
   (let ((emptyp (getf keys :empty))
 	(body (getf keys :body)))
@@ -943,7 +945,7 @@
     js))
 
 ;;;========= WCOMPONENT ===================================
-(defclass wcomponent (htcomponent i18n-aware)
+(defclass wcomponent (htcomponent)
   ((parameters :initarg :parameters
 	       :accessor wcomponent-parameters
 	       :type cons
@@ -1142,8 +1144,8 @@
     (when dispatcher
       (progn 
 	(setf result (message-dispatch dispatcher key locale))
-	(when (and (null result) (> (length key) 2))
-	  (setf result (message-dispatch dispatcher (subseq key 0 2) locale)))))
+	(when (and (null result) (> (length locale) 2))
+	  (setf result (message-dispatch dispatcher key (subseq locale 0 2))))))
     result))
 
 (defmethod simple-message-dispatcher-add-message ((simple-message-dispatcher simple-message-dispatcher) locale key value)
Modified: trunk/main/claw-core/tests/test1.lisp
==============================================================================
--- trunk/main/claw-core/tests/test1.lisp	(original)
+++ trunk/main/claw-core/tests/test1.lisp	Fri Mar 14 02:57:28 2008
@@ -354,7 +354,7 @@
 						     (validator-required (page-current-component o) value))
 				      :accessor 'form-page-name)"*"))
 			   (tr> :id "messaged"
-			    (td> (with-message "SURNAME" "it"))
+			    (td> (with-message "SURNAME" "SURNAME"))
 			    (td>
 			     (cinput> :id "surname"
 				      :type "text"
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    12 Mar '08
                    
                        Author: achiumenti
Date: Wed Mar 12 15:20:24 2008
New Revision: 16
Modified:
   trunk/main/claw-core/src/misc.lisp
   trunk/main/claw-core/src/packages.lisp
   trunk/main/claw-core/src/tags.lisp
   trunk/main/claw-core/tests/test1.lisp
Log:
beginning of translators and i18n support
Modified: trunk/main/claw-core/src/misc.lisp
==============================================================================
--- trunk/main/claw-core/src/misc.lisp	(original)
+++ trunk/main/claw-core/src/misc.lisp	Wed Mar 12 15:20:24 2008
@@ -144,33 +144,31 @@
 	    (t (push element result))))
     (nreverse result)))
 
-(defmacro message (key locale &optional (default ""))
+(defmacro with-message (key locale &optional (default ""))
   (let ((current-lisplet (gensym))
 	(current-page (gensym))
 	(current-component (gensym))
 	(result (gensym))
 	(key-val key)
-	(locale-val locale)
+	(locale-val (gensym))
 	(default-val default))
     `#'(lambda () 
 	 (let ((,current-lisplet (current-lisplet))
-	     (,current-page (current-page))
-	     (,current-component (current-component))
-	     (,result))
+	       (,current-page (current-page))
+	       (,current-component (current-component))
+	       (,locale-val ,locale)
+	       (,result))
+	   (log-message :info "LISPLET: ~a; PAGE: ~a; COMPONENT: ~a" 
+			,current-lisplet 
+			,current-page 
+			,current-component)
 	 (when ,current-lisplet
+	   (log-message :info "CALLING (message-dispatch ~a ~a ~a)" ,current-lisplet ,key-val ,locale-val)
 	   (setf ,result (message-dispatch ,current-lisplet ,key-val ,locale-val)))
 	 (when (and (null ,result) ,current-page)
 	   (setf ,result (message-dispatch ,current-page ,key-val ,locale-val)))
 	 (when (and (null ,result) ,current-component)
-	   (setf ,result (message-dispatch ,current-component ,key-val ,locale-val)))
-	 (when (and (null ,result) (> (length ,locale-val) 2))
-	   (setf ,locale-val (subseq ,locale-val 0 2))
-	   (when ,current-lisplet
-	     (setf ,result (message-dispatch ,current-lisplet ,key-val ,locale-val)))
-	   (when (and (null ,result) ,current-page)
-	     (setf ,result (message-dispatch ,current-page ,key-val ,locale-val)))
-	   (when (and (null ,result) ,current-component)
-	     (setf ,result (message-dispatch ,current-component ,key-val ,locale-val))))
+	   (setf ,result (message-dispatch ,current-component ,key-val ,locale-val)))	 
 	 (when (null ,result)
 	   (setf ,locale-val "")
 	   (when ,current-lisplet
Modified: trunk/main/claw-core/src/packages.lisp
==============================================================================
--- trunk/main/claw-core/src/packages.lisp	(original)
+++ trunk/main/claw-core/src/packages.lisp	Wed Mar 12 15:20:24 2008
@@ -275,7 +275,12 @@
 	   :page-current-component
 	   :user-in-role-p
 	   :login
-	   :message
+	   ;;i18n
+	   :message-dispatcher
+	   :message-dispatch
+	   :simple-message-dispatcher
+	   :simple-message-dispatcher-add-message	   
+	   :with-message
 	   ;;validation
 	   :translator
 	   :translator-integer
Modified: trunk/main/claw-core/src/tags.lisp
==============================================================================
--- trunk/main/claw-core/src/tags.lisp	(original)
+++ trunk/main/claw-core/src/tags.lisp	Wed Mar 12 15:20:24 2008
@@ -214,6 +214,9 @@
  - WCOMPONENT is the tag instance
  - PAGE the page instance"))
 
+(defgeneric simple-message-dispatcher-add-message (simple-message-dispatcher locale key value)
+  (:documentation "Adds a key value pair to a given locale for message translation"))
+
 (defvar *html-4.01-strict* "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" 
   "Page doctype as HTML 4.01 STRICT")
 
@@ -326,6 +329,10 @@
 (defclass message-dispatcher () 
   ())
 
+(defclass simple-message-dispatcher (message-dispatcher) 
+  ((locales :initform (make-hash-table :test #'equal)
+	    :accessor simple-message-dispatcher-locales)))
+
 (defclass i18n-aware (message-dispatcher) 
   ((message-dispatcher :initarg :message-dispatcher
 		       :accessor message-dispatcher
@@ -577,9 +584,9 @@
   (let ((body (page-content page))
 	(jsonp (page-json-id-list page)))
     (if (null body)
-	;(format nil "null body for page ~a~%" (type-of page))
-	(setf (current-page) page)
+	(format nil "null body for page ~a~%" (type-of page))	
 	(progn
+	  (setf (current-page) page)
 	  (page-init page)
 	  (when (page-req-parameter page *rewind-parameter*)
 	    (htcomponent-rewind body page))
@@ -728,7 +735,7 @@
       (when child-tag
 	(cond 
 	  ((stringp child-tag) (htcomponent-render ($> child-tag) page))
-	  ((functionp child-tag) (funcall child-tag))
+	  ((functionp child-tag) (htcomponent-render ($> (funcall child-tag)) page))
 	  (t (htcomponent-render child-tag page)))))
     (when (null previous-print-status)
       (setf (page-can-print page) nil)
@@ -793,11 +800,13 @@
       (htcomponent-json-print-start-component tag))
     (when (or (page-can-print page) previous-print-status)
       (tag-render-starttag tag page))
+    (when (string-equal "messaged" (htcomponent-client-id tag))
+	  (log-message :info "RENDEING ~a: body ~a" (htcomponent-client-id tag) body-list))
     (dolist (child-tag body-list)
-      (when child-tag 
-	(cond 
+      (when child-tag 	
+	(cond 	  
 	  ((stringp child-tag) (htcomponent-render ($> child-tag) page))
-	  ((functionp child-tag) (funcall child-tag))
+	  ((functionp child-tag) (htcomponent-render ($> (funcall child-tag)) page))
 	  (t (htcomponent-render child-tag page)))))
     (when (or (page-can-print page) previous-print-status)
       (tag-render-endtag tag page))
@@ -815,7 +824,7 @@
 	(when child-tag
 	  (cond 
 	  ((stringp child-tag) (htcomponent-render ($> child-tag) page))
-	  ((functionp child-tag) (funcall child-tag))
+	  ((functionp child-tag) (htcomponent-render ($> (funcall child-tag)) page))
 	  (t (htcomponent-render child-tag page)))))
       (dolist (injection injections)
 	(when injection
@@ -876,7 +885,7 @@
 	  (when element
 	    (cond 
 	      ((stringp element) (htcomponent-render ($> element) page))
-	      ((functionp element) (funcall element))
+	      ((functionp element) (htcomponent-render ($> (funcall element)) page))
 	      (t (htcomponent-render element page)))))
 	(if (null xml-p)
 	    (page-format page "~%//-->")
@@ -918,7 +927,7 @@
       (when child-tag
 	(cond 
 	  ((stringp child-tag) (htcomponent-render ($> child-tag) page))
-	  ((functionp child-tag) (funcall child-tag))
+	  ((functionp child-tag) (htcomponent-render ($> (funcall child-tag)) page))
 	  (t (htcomponent-render child-tag page)))))
     (when (page-can-print page)
       (htcomponent-render (htbody-init-scripts-tag page) page)
@@ -1095,7 +1104,7 @@
       (when child-tag
 	(cond 
 	  ((stringp child-tag) (htcomponent-render ($> child-tag) page))
-	  ((functionp child-tag) (funcall child-tag))
+	  ((functionp child-tag) (htcomponent-render ($> (funcall child-tag)) page))
 	  (t (htcomponent-render child-tag page)))))
     (wcomponent-after-render wcomponent page)
     (when (null previous-print-status)
@@ -1137,6 +1146,13 @@
 	  (setf result (message-dispatch dispatcher (subseq key 0 2) locale)))))
     result))
 
-
-
+(defmethod simple-message-dispatcher-add-message ((simple-message-dispatcher simple-message-dispatcher) locale key value)
+  (let ((current-locale (gethash locale (simple-message-dispatcher-locales simple-message-dispatcher) (make-hash-table :test #'equal))))
+    (setf (gethash key current-locale) value)
+    (setf (gethash locale (simple-message-dispatcher-locales simple-message-dispatcher)) current-locale)))
+
+(defmethod message-dispatch ((simple-message-dispatcher simple-message-dispatcher) key locale) 
+  (let ((current-locale (gethash locale (simple-message-dispatcher-locales simple-message-dispatcher))))
+    (when current-locale
+      (gethash key current-locale))))
 
Modified: trunk/main/claw-core/tests/test1.lisp
==============================================================================
--- trunk/main/claw-core/tests/test1.lisp	(original)
+++ trunk/main/claw-core/tests/test1.lisp	Wed Mar 12 15:20:24 2008
@@ -35,11 +35,22 @@
 
 (setf *clawserver-base-path* "/claw")
 
+(defvar *lisplet-messages*
+  (make-instance 'simple-message-dispatcher))
+
+(simple-message-dispatcher-add-message *lisplet-messages* "en" "NAME" "Name")
+(simple-message-dispatcher-add-message *lisplet-messages* "en" "SURNAME" "Surname")
+
+(simple-message-dispatcher-add-message *lisplet-messages* "it" "NAME" "Nome")
+(simple-message-dispatcher-add-message *lisplet-messages* "it" "SURNAME" "Cognome")
+
 (defvar *test-lisplet*)
-(setf *test-lisplet* (make-instance 'lisplet :realm "test1" :base-path "/test"))
+(setf *test-lisplet* (make-instance 'lisplet :realm "test1" :base-path "/test" 
+				    ));:message-dispatcher *lisplet-messages*))
 
 (defvar *test-lisplet2*)
-(setf *test-lisplet2* (make-instance 'lisplet :realm "test2" :base-path "/test2"))
+(setf *test-lisplet2* (make-instance 'lisplet :realm "test2" :base-path "/test2" 
+				     ));:message-dispatcher *lisplet-messages*))
 
 ;;(defparameter *clawserver* (make-instance 'clawserver :port 4242))
 
@@ -312,6 +323,7 @@
     :colors nil
     :gender '("M")
     :age 1800
+    :message-dispatcher *lisplet-messages*
     :user (make-instance 'user)))
 
 (defmethod form-page-update-user ((form-page form-page))
@@ -341,8 +353,8 @@
 				      :validator #'(lambda (value) 
 						     (validator-required (page-current-component o) value))
 				      :accessor 'form-page-name)"*"))
-			   (tr>
-			    (td> "Surname")
+			   (tr> :id "messaged"
+			    (td> (with-message "SURNAME" "it"))
 			    (td>
 			     (cinput> :id "surname"
 				      :type "text"
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Author: achiumenti
Date: Wed Mar 12 07:49:10 2008
New Revision: 15
Modified:
   trunk/main/claw-core/src/tags.lisp
Log:
implemented message-dispatch for I18N-AWARE class
Modified: trunk/main/claw-core/src/tags.lisp
==============================================================================
--- trunk/main/claw-core/src/tags.lisp	(original)
+++ trunk/main/claw-core/src/tags.lisp	Wed Mar 12 07:49:10 2008
@@ -1133,7 +1133,9 @@
     (when dispatcher
       (progn 
 	(setf result (message-dispatch dispatcher key locale))
-	(when (null result))))
+	(when (and (null result) (> (length key) 2))
+	  (setf result (message-dispatch dispatcher (subseq key 0 2) locale)))))
+    result))
 
 
 
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0