<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <title>Localization</title> <link rel="stylesheet" type="text/css" media="screen" href="css/site.css" /> <link rel="stylesheet" type="text/css" href="css/prettify.css" /> </head> <body onload="prettyPrint()"> <script type="text/javascript">prefix='';</script> <script type="text/javascript" src="js/prettify.js"></script> <script src="templates/header.js" type="text/javascript"></script> <div id="left"> <noscript>Please turn on Javascript to view this menu</noscript> <script src="templates/left.js" type="text/javascript"></script> </div> <div id="content"> <h1>Localization support</h1> <p>A <a href="http://markmail.org/thread/drcabfc6z42sijdo">discussion</a> on the slf4j-dev mailing list spawned an open-source project called <a href="http://cal10n.qos.ch"><b>CAL10N or Compiler Assisted Localization</b></a>. As its name indicates, CAL10N focuses on the issue of localization/internationalization in Java applications. </p> <p>The <code>org.slf4j.cal10n</code> package which ships with <em>slf4j-ext-${project.version}.jar</em> adds an extremely thin layer on top of CALI0N to offer localized logging.</p> <p>Once you have a handle on an <a href="http://cal10n.qos.ch/apidocs/ch/qos/cal10n/IMessageConveyor.html">IMessageConveyor</a> instance, you can create a <a href="xref/org/slf4j/cal10n/LocLoggerFactory.html">LocLoggerFactory</a>, which in turn can create <a href="xref/org/slf4j/cal10n/LocLogger.html">LocLogger</a> instances capable of doing localized logging. </p> <p>Let us assume that you have defined localized message in your application. In accordance with the CAL10N's philosophy, you have the declared the keys for those messages in the enum type <code>Production</code>.</p> <pre class="prettyprint source">import ch.qos.cal10n.LocaleData; import ch.qos.cal10n.Locale; import ch.qos.cal10n.BaseName; @BaseName("production") @LocaleData( { @Locale("en_UK"), @Locale("ja_JP") }) public enum Production { APPLICATION_STARTED, APPLICATION_STOPPED, ... DB_CONNECTION, DB_CONNECTION_FAILURE; }</pre> <p>It is assumed that you have created appropriate bundle file for the various locales "en_UK" and "ja_JP" as appropriate. Here is a sample bundle for the "en_UK" locale. </p> <pre class="source">APPLICATION_STARTED=Application <b>{0}</b> has started. APPLICATION_STOPPED=Application <b>{0}</b> has stopped. ... </pre> <p>Then, you can instantiate a <code>IMessageConveyor</code>, inject it into a <code>LogLoggerFactory</code>, retrieve multiple <code>LogLogger</code> instances by name and log away, as the next sample code illustrates. </p> <pre class="prettyprint source">import java.util.Locale; import org.slf4j.cal10n.LocLogger; import org.slf4j.cal10n.LocLoggerFactory; import ch.qos.cal10n.IMessageConveyor; import ch.qos.cal10n.MessageConveyor; public class MyApplication { // create a message conveyor for a given locale IMessageConveyor messageConveyor = new MessageConveyor(Locale.UK); // create the LogLoggerFactory LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); // create a locLogger LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); public void applicationStart() { locLogger.info(Production.APPLICATION_STARTED, "fooApp"); // .. } public void applicationStop() { locLogger.info(Production.APPLICATION_STOPPED, "fooApp"); // ... } }</pre> <p>Assuming the resource bundle <em>production_en_UK.properties</em> exists, and the underlying logging framework is enabled for the info level, log messages will be output in UK English. </p> <p>Note that a <code>LogLogger</code> is a regular SLF4J logger with additional methods supporting localization. For those additional methods which take an enum as first parameter, <code>LogLogger</code> follows the standard Java convention for parameter substitution as defined by the <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html">java.text.MessageFormat</a> class. For non-localized logs, which take a String as first parameter, <code>LogLogger</code> follows the {} convention, as customary for all <code>org.slf4j.Logger</code> implementations. </p> <p>Here is an example illustrating the difference.</p> <pre class="prettyprint source">import ...; public class MyApplication { IMessageConveyor messageConveyor = new MessageConveyor(Locale.UK); LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); public void someMethod() { // follows the MessageFormat convention locLogger.info(Production.APPLICATION_STARTED, "fooApp"); // follows the {} convention logLogger.info("Hello {}", name); ... } }</pre> <script src="templates/footer.js" type="text/javascript"></script> </div> </body> </html>