<!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>