Hey, Preetam, Sorry I couldn't help much on Locale based templating, as I am not familiar with that myself. But it seems to me that your home-made version of the Locale usage is ok.
Good luck! Jian On Mon, Mar 16, 2009 at 1:42 AM, Preetam Palwe <[email protected]> wrote: > Thanks Jian for the code snippet! > > Well I have written the similar code and its working! > > But the question is still open :-) > > I guess I should rephrase what I exactly want to achive. > > I have written a Java code to send email using Java Mail APIs. I have a > email template (body.vm) which I use to frame the HTML body of my mails. > I pass context and Locale to one of my methods which returns be email body > using Velocity template. > Here is the code for the same > > private String getEmailBody(String templateFile, Map context, Locale > locale) > { > Template velocityTemplate = > Velocity.getTemplate(templateFile,"UTF-8"); > StringWriter writer = new StringWriter(); > VelocityContext ctx = new VelocityContext(context); > velocityTemplate.merge(ctx, writer); > return writer.toString(); > } > > Now in above code Locale object is not getting used. The purpose of Locale > object is: Depending upon the locale generate the email body. > E.g. email text in English would be different than that of in German! > > Currently I have used a workaround for this as below > > > private String getEmailBody(String templateFile, Map context, Locale > locale) > { > if (locale == null) > { > locale = Locale.getDefault(); > } > > // get the templateFile as per the locale > // e.g. body.vm.en_us or body.vm.de etc > > templateFile = templateFile + "." + > locale.toString().toLowerCase(); > > Template velocityTemplate = > Velocity.getTemplate(templateFile,"UTF-8"); > StringWriter writer = new StringWriter(); > VelocityContext ctx = new VelocityContext(context); > velocityTemplate.merge(ctx, writer); > return writer.toString(); > } > > I have defined locale specific vm files and loaded a appropriate vm file at > runtime using Locale! > > But > I found this solution "unnecessary" as there are VelocityTools like > ResourceTool / MultiviewsTool which could be used for the same purpose. > But I am unaware of how to use these tools in offline mode i.e. in java > environment without servlets/jsps/struts etc > > Any help in this regards would be really appreciated > > Thanks > ~PP > > > > > > > -----Original Message----- > From: jian chen [mailto:[email protected]] > Sent: Monday, March 16, 2009 12:34 PM > To: Velocity Users List > Subject: Re: Does velocity engine supports I18N ? > > Hi, Preetam, > > Here is my sample code to use Velocity offline: > > import java.io.File; > import java.io.OutputStreamWriter; > import java.io.StringWriter; > > import javax.servlet.http.HttpServletRequest; > import javax.servlet.http.HttpServletResponse; > > import org.apache.velocity.app.VelocityEngine; > import org.apache.velocity.context.Context; > import org.apache.velocity.runtime.RuntimeConstants; > > import util.Util; > > public class VelocityParser > { > private static VelocityEngine ve; > > static > { > try > { > File templateDir = new File("mytempdir"); > > ve = new VelocityEngine(); > > // setting up file resource loader > ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, > templateDir.getCanonicalPath()); > > // Jian: this is very important, otherwise, there will be out of > memory error when a template > // with #foreach loop is called and the #foreach loop iterates > through million of times > ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, > "true"); > // > ve.setProperty("file.resource.loader.modificationCheckInterval", "5"); > > // velocimacro configuration > ve.setProperty(RuntimeConstants.VM_LIBRARY, "macro/spring.vm"); > > // this setting is such that changing inline velocity macro will > take effect > // WITHOUT restarting the web server! > > ve.setProperty(RuntimeConstants.VM_PERM_ALLOW_INLINE_REPLACE_GLOBAL, > "true"); > > ve.setProperty(RuntimeConstants.VM_LIBRARY_AUTORELOAD, "true"); > > ve.setProperty(RuntimeConstants.COUNTER_INITIAL_VALUE, "0"); > ve.setProperty(RuntimeConstants.PARSER_POOL_SIZE, "1"); > > // comment this out if we want to enable logging > ve.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, > "org.apache.velocity.runtime.log.NullLogSystem"); > > ve.setProperty(RuntimeConstants.RUNTIME_LOG_ERROR_STACKTRACE, > "false"); > ve.setProperty(RuntimeConstants.RUNTIME_LOG_INFO_STACKTRACE, > "false"); > ve.setProperty(RuntimeConstants.RUNTIME_LOG_WARN_STACKTRACE, > "false"); > > ve.setProperty(RuntimeConstants.RUNTIME_LOG_REFERENCE_LOG_INVALID, "true"); > > ve.setProperty(RuntimeConstants.PARSE_DIRECTIVE_MAXDEPTH, "10"); > > // Jian: this is very important, otherwise, there will be out of > memory error when a template > // with #foreach loop is called and the #foreach loop iterates > through million of times > ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, > "true"); > > ve.init(); > } > catch (Exception e) > { > throw new RuntimeException(e); > } > } > > public static String evaluate(File templateFile, Context ctx) throws > Exception > { > return evaluate(Util.readFileAsString(templateFile, "UTF-8"), ctx); > } > > public static String evaluate(String inputStr, Context ctx) throws > Exception > { > StringWriter sw = new StringWriter(); > ve.evaluate(ctx, sw, "velolog", inputStr); > return sw.toString(); > } > } > > It is part of my code as I have something more relating to servlet too. So, > you might want to modify and adapt to your purpose. > > Cheers, > > Jian > http://www.JiansNet.com > > > > On Sun, Mar 15, 2009 at 6:42 PM, Preetam Palwe <[email protected]> wrote: > > > Thanks Byron > > > > Yes I have all UTF-8 encodded templates! > > My problem is I am to passing java.util.Locale with me using this I want > to > > load proper velocity template. > > One simple way is as I mentioned earlier: > > > > if (locale == null) > > { > > locale = Locale.getDefault(); > > } > > > > String templateFile = "xyz.vm"+ "." + locale.toString().toLowerCase(); > > > > // Use templateFile e.g. xyz.vm.en_us or xyz.vm.de > > > > > > Now I was thinking whether I can use Velocity tools for the same. (Please > > note: I am in offline mode: no servlets, struts etc) > > > > > > > > Thanks > > > > > > > > > > -----Original Message----- > > From: Byron Foster [mailto:[email protected]] > > Sent: Saturday, March 14, 2009 6:39 PM > > To: Velocity Users List > > Subject: Re: Does velocity engine supports I18N ? > > > > Couldn't you always maintain your template files in UTF-8, then always > > merge in UTF-8 and send out the email in UTF-8. Unless I'm not > > understanding the problem. I'm not sure what a I18N tool would do for > > you, unless this is more of an issue of date and number formatting. > > > > > > On Mar 14, 2009, at 0:35 , Preetam Palwe wrote: > > > > > Precisely I am trying to use Velocity engine as a offline tool to send > > > emails. > > > I have an option or workaround to keep Locale specific velocity > > > templates > > > like "body.vm.de" , "body.vm.en_us" etc. > > > But I was wondering whether there is an inbuilt support in velocity > > > for > > > I18N? > > > > > > Jian, If you could please share the your parser code which enables > > > Velocity > > > I18N in offline mode to the mailing list, it would be great! > > > I had read about "Multiviews" in velocity tools but looks like I > > > can't use > > > it in offline mode. > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
