[Opensource] i18n of DefaultAutoElement and date formatting

addison at inter-locale.com addison at inter-locale.com
Fri May 2 02:47:11 PDT 2003


I forgot to add that SimpleDateFormat has a toLocalizedPattern() method
that returns the specific string for the Locale and pattern specified.

Best Regards,

Addison

===============================================================
Addison P. Phillips                     Globalization Architect
webMethods, Inc                       http://www.webmethods.com
Sunnyvale, CA, USA              mailto:aphillips at webmethods.com

+1 408.210.3569 (mobile)                  +1 408.962.5487 (ofc)
===============================================================
"Internationalization is not a feature. It is an architecture."

On Fri, 2 May 2003 addison at inter-locale.com wrote:

> May I suggest that you use the java.text.DateFormatSymbols class to obtain
> these rather than having to localize the values yourself? Java already has
> appropriate letter values stored for each locale.
> 
> Best Regards,
> 
> Addison
> 
> ===============================================================
> Addison P. Phillips                     Globalization Architect
> webMethods, Inc                       http://www.webmethods.com
> Sunnyvale, CA, USA              mailto:aphillips at webmethods.com
> 
> +1 408.210.3569 (mobile)                  +1 408.962.5487 (ofc)
> ===============================================================
> "Internationalization is not a feature. It is an architecture."
> 
> On Wed, 30 Apr 2003, D Lloyd wrote:
> 
> > I would like all of the end-user GUI to be internationalized, including
> > the custom user registration.  
> > So I modified DefaultAutoElement to try and find a reasonable entry in the
> > message bundles.  
> > The prior implementation did not search the bundle for the schema where
> > the DBObject actually resided.  
> > I had to use setSchema in my DBObject, otherwise it works out-of-the-box. 
> > Without this, it works as previously.
> > I noticed the comment in the DefaultAutoElement where Mike R. would have
> > liked to show the Date format based on Locale.
> > There are times where I would also like my GUI to show the date entry
> > format, so I created the function getDateFormatString in DateTime.java
> > and modified DefaultAutoElement to use it when the field is not read-only.
> > 
> > I had a lot of problems locating how to localize the resulting pattern.  I
> > suppose that is where Mike R. got hung up.
> > So I resorted to using the message bundles to tell me what the
> > abbreviation should be for a language.  
> > The pattern for the US might be M/d/yy so the result is mm/dd/yyyy and for
> > German it could be dd-MM-yyyy = Tag-Monat-Jahr.
> > I have no idea what the internationalized strings for the date formats
> > are, so if someone could fill in the blanks I would appreciate it.
> > 
> > I tried to cache the DateFormatCacheItem entries using the CacheManager
> > and had no luck.  I gave up last night when it got too late.  
> > 
> > 
> > 
> > The new MessagesBundle.properties entries are:
> > 
> > datetime.format.MM = mm
> > datetime.format.dd = dd
> > datetime.format.yy = yyyy
> > datetime.format.hh = hh
> > datetime.format.HH = hh
> > datetime.format.kk = kk
> > datetime.format.KK = kk
> > datetime.format.mm = mm
> > datetime.format.ss = ss
> > 
> > 
> > 
> > 
> > The diffs are:
> > 
> > 
> > 
> > DateTime.java - just new functions with supporting imports and a map
> > 
> > 
> > import com.jcorporate.expresso.core.cache.Cache;
> > import com.jcorporate.expresso.core.cache.Cacheable;
> > import com.jcorporate.expresso.core.cache.CacheException;
> > import com.jcorporate.expresso.core.cache.CacheManager;
> > import com.jcorporate.expresso.core.i18n.Messages;
> > 
> > import java.text.DateFormat;
> > 
> >     /** map of locale to date format strings */
> >     transient private static Hashtable sDateFormatStrings = null;
> > 
> >        /**
> >         * Get the Date or DateTime format for a Locale.
> >         * @param  dateOnly True if this is to get a date only format
> > (m/d/yy) versus DateTime (m/d/yy h:m:s)
> >         * @param  locale   The locale to get the format for. This may not
> > be null
> >         *
> >         * @return String formatted for the date
> >         * @author David Lloyd
> >         */
> >        public static String getDateFormatString(boolean dateOnly, Locale
> > locale) {
> >                DateTime.DateFormatCacheItem item = null;
> >                String pattern = "";
> >                String datePattern = "";
> >                String dateTimePattern = "";
> > 
> >                if (sDateFormatStrings == null)
> >                        sDateFormatStrings = new Hashtable();
> >                item = (DateTime.DateFormatCacheItem)
> > sDateFormatStrings.get(DateFormatCacheItem.deriveKey(locale));
> > 
> >                if (item == null) {
> >                        DateFormat dateFormat;
> >                        DateFormat dateTimeFormat;
> >                        dateFormat =
> > DateFormat.getDateInstance(DateFormat.SHORT, locale);
> >                        dateTimeFormat =
> > DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT,
> > locale);
> > 
> >                        if (dateFormat instanceof SimpleDateFormat) {
> >                                SimpleDateFormat simpleDateFormat =
> > (SimpleDateFormat) dateFormat;
> >                                datePattern =
> > convertDateFormatStringToLocalized(locale, simpleDateFormat.toPattern());
> >                        }
> >                        if (dateTimeFormat instanceof SimpleDateFormat) {
> >                                SimpleDateFormat simpleDateFormat =
> > (SimpleDateFormat) dateTimeFormat;
> >                                dateTimePattern =
> > convertDateFormatStringToLocalized(locale, simpleDateFormat.toPattern());
> >                        }
> > 
> >                        item = new DateFormatCacheItem(locale, datePattern,
> > dateTimePattern);
> >                        sDateFormatStrings.put(item.key, item);
> >                } else {
> >                        datePattern = item.dateFormat;
> >                        dateTimePattern = item.dateTimeFormat;
> >                        //System.err.println("DateTime.getDateFormatString
> > cache hit");
> >                }
> >                if (dateOnly)
> >                        pattern = datePattern;
> >                else
> >                        pattern = dateTimePattern;
> > 
> >                return pattern;
> >        }
> > 
> >        static String convertDateFormatStringToLocalized(Locale locale,
> > String p) {
> >                try {
> >                        FastStringBuffer fsb = new FastStringBuffer(16);
> >                        int n = p.length();
> >                        for (int i=0; i < n; i++) {
> >                                char c = p.charAt(i);
> >                                switch (c) {
> >                                        case 'M':
> >                                        case 'd':
> >                                        case 'y':
> >                                        case 'h': case 'H': case 'k': case
> > 'K':
> >                                        case 'm':
> >                                        case 's':
> >                                        {
> >                                                String s;
> >                                                try {
> >                                                        s =
> > Messages.getString(locale, "datetime.format."+c+c);
> >                                                        fsb.append(s);
> >                                                } catch (Exception e) {
> >                                                       
> > fsb.append(c).append(c);
> >                                                }
> >                                                while (i < n-1 && c ==
> > p.charAt(i+1))
> >                                                        i++;
> >                                        }
> >                                        break;
> >                                        default:
> >                                                fsb.append(c);
> >                                                break;
> >                                }
> >                        }
> >                        return fsb.toString();
> >                } catch (Exception e) {
> >                        // FIXME: log this
> >                }
> >                return "";
> >        }
> > 
> >        static class DateFormatCacheItem implements Cacheable {
> >                public String key;
> >                public String dateFormat;
> >                public String dateTimeFormat;
> > 
> >                DateFormatCacheItem(Locale locale, String dateFormat,
> > String dateTimeFormat) {
> >                        key = deriveKey(locale);
> >                        this.dateFormat = dateFormat;
> >                        this.dateTimeFormat = dateTimeFormat;
> >                }
> >                public String getKey() {
> >                        return key;
> >                }
> >                static String deriveKey(Locale locale) {
> >                        return
> > locale.getCountry()+"-"+locale.getLanguage();
> >                }
> >        }
> > 
> > 
> > 
> > ===========================================
> > DefaultAutoElement.java
> > 
> > 
> > D:\Dev\expresso>diff
> > expresso\expresso-web\web-inf\src\com\jcorporate\expresso\services\controller\ui\DefaultAutoElement.java
> > DefaultAutoElement.java
> > 105a106
> > >       static final String expressoSchema =
> > com.jcorporate.expresso.core.ExpressoSchema.class.getName();
> > 328,341d328
> > <             //xun li add for time display
> > <             //oneField.setLabel(dbobj.getDescription(fieldName));
> > <             //xun li add for time display
> > < //
> > < //  I've commented this out because we now try to parse given the
> > current user's
> > < // Locale and I can't figure out how to get a descriptive format string
> > for
> > < // the locale (MR)
> > < //
> > < //            if (dbobj.getFieldMetaData(fieldName).isDateType()) {
> > < //                oneField.setLabel(dbobj.getDescription(fieldName) +
> > < //                                  " (YYYY-MM-DD)");
> > < //            } else {
> > <                 oneField.setLabel(dbobj.getDescription(fieldName));
> > < //            } /* xnu li*/
> > 342a330,332
> > >                       // Get the localized description, including date
> > pattern
> > >                       {
> > >                               String description;
> > 343a334,380
> > >                               // We could also convert request to
> > HttpServletRequest and get locale from user pref.
> > >                               // I do not think it would be a problem,
> > but I'm not sure this isnot used in a
> > >                               // non-web environment.
> > >                               Locale locale = response.getLocale();
> > >
> > >                               Object[] args = {};
> > >                               String stringCode =
> > dbobj.getDescription(fieldName);
> > >
> > >                               try {
> > >                                       description =
> > com.jcorporate.expresso.core.i18n.Messages.getString(
> > >                                                                      
> > dbobj.getSchema(),
> > >                                                                      
> > locale,
> > >                                                                      
> > stringCode,
> > >                                                                      
> > args);
> > >                               } catch (IllegalArgumentException iae) {
> > >                                       if (log.isDebugEnabled())
> > >                                              
> > log.debug("DefaultAutoElement: Key ["+stringCode+"] not found in
> > "+dbobj.getSchema());
> > >                                       description = null;
> > >
> > >                                       if ( !
> > dbobj.getSchema().equals(expressoSchema)) {
> > >                                               try {
> > >                                                       description =
> > com.jcorporate.expresso.core.i18n.Messages.getString(
> > >                                                                         
> >   expressoSchema,
> > >                                                                         
> >   locale,
> > >                                                                         
> >    stringCode,
> > >                                                                         
> >    args);
> > >                                               } catch
> > (IllegalArgumentException e) {
> > >                                                       description =
> > null;
> > >                                               }
> > >                                       }
> > >                               }
> > >
> > >                               if (description == null ||
> > description.length() == 0)
> > >                                       description = stringCode;
> > >
> > >                               if (metaData.isDateType() &&
> > !metaData.isReadOnly()) {
> > >                                       // try to show 'A Date
> > (MM/dd/yyyy)'
> > >                                       String pattern =
> > DateTime.getDateFormatString(metaData.isDateOnlyType(), locale);
> > >                                       if (pattern.length() > 0)
> > >                                               pattern = "
> > ("+pattern+")";
> > >                                       oneField.setLabel(description +
> > pattern);
> > >                               } else {
> > >                                       oneField.setLabel(description);
> > >                               }
> > >                       }
> > >
> > >
> > 
> > 
> > 
> > I have also attached the modified files.
> > 
> > Thanks,
> > 
> > David Lloyd
> > 
> > 
> > __________________________________
> > Do you Yahoo!?
> > The New Yahoo! Search - Faster. Easier. Bingo.
> > http://search.yahoo.com
> 
> 




More information about the Opensource mailing list