I'm working on redesigning a large consumer facing retail website. Think something like gap.com
The technology stack is Apache tiles, Apache velocity, Spring MVC.
Question: To implement I18N right, should I just create multiple velocity templates per locale or externalize strings into properties files? With the latter approach, there'll be much clutter in the velocity templates of the sort - resourcebundle.getMessage("website.title", "en_US") whereas in the earlier case, I'll probably have duplicated logic sitting in multiple templates.
You shouldn't do multiple templates (one per language). That would be counterproductive.
Also, you need to define some kind of wrapper for translating text. You don't want to use Locale or Locale Identifiers directly ("en_US"), instead you need to set Locale for the session and use this object (possibly implicitly, so you won't need to pass it every time you call
getMessage()
, thus wrapper).Be aware that if you call
ResourceBundle
class' methods directly, some of may throwMissingResourceException
(which is runtime exception to make matter worse). You must be sure to check for it.BTW. Velocity defines some tool for the localization purposes. Funny thing is, I never seen anybody actually using it (but to be honest my experience with Velocity is quite limited).