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