Home | History | Annotate | Download | only in pages
      1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      3 
      4 <html xmlns="http://www.w3.org/1999/xhtml">
      5   <head>
      6     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
      7     <title>Localization</title>
      8     <link rel="stylesheet" type="text/css" media="screen" href="css/site.css" />
      9     <link rel="stylesheet" type="text/css" href="css/prettify.css" />
     10   </head>
     11   <body onload="prettyPrint()">
     12     
     13     <script type="text/javascript">prefix='';</script>
     14 
     15     <script type="text/javascript" src="js/prettify.js"></script>
     16     <script src="templates/header.js" type="text/javascript"></script>
     17     <div id="left">
     18       <noscript>Please turn on Javascript to view this menu</noscript>
     19       <script src="templates/left.js" type="text/javascript"></script>
     20     </div>
     21 
     22     <div id="content">
     23   
     24 
     25     <h1>Localization support</h1>
     26     
     27     <p>A <a
     28     href="http://markmail.org/thread/drcabfc6z42sijdo">discussion</a>
     29     on the slf4j-dev mailing list spawned an open-source project
     30     called <a href="http://cal10n.qos.ch"><b>CAL10N or Compiler
     31     Assisted Localization</b></a>. As its name indicates, CAL10N
     32     focuses on the issue of localization/internationalization in Java
     33     applications.
     34     </p>
     35 
     36     <p>The <code>org.slf4j.cal10n</code> package which ships with
     37     <em>slf4j-ext-${project.version}.jar</em> adds an extremely thin
     38     layer on top of CALI0N to offer localized logging.</p>
     39     
     40     
     41     <p>Once you have a handle on an <a
     42     href="http://cal10n.qos.ch/apidocs/ch/qos/cal10n/IMessageConveyor.html">IMessageConveyor</a>
     43     instance, you can create a <a
     44     href="xref/org/slf4j/cal10n/LocLoggerFactory.html">LocLoggerFactory</a>,
     45     which in turn can create <a
     46     href="xref/org/slf4j/cal10n/LocLogger.html">LocLogger</a>
     47     instances capable of doing localized logging.
     48     </p>
     49 
     50 
     51     <p>Let us assume that you have defined localized message in your
     52     application. In accordance with the CAL10N's philosophy, you have
     53     the declared the keys for those messages in the enum type
     54     <code>Production</code>.</p>
     55 
     56 
     57    <pre class="prettyprint source">import ch.qos.cal10n.LocaleData;
     58 import ch.qos.cal10n.Locale;
     59 import ch.qos.cal10n.BaseName;
     60 
     61 @BaseName("production")
     62 @LocaleData( { @Locale("en_UK"), @Locale("ja_JP") })
     63 public enum Production  {
     64   APPLICATION_STARTED,
     65   APPLICATION_STOPPED,
     66   ...
     67   DB_CONNECTION,
     68   DB_CONNECTION_FAILURE;
     69 }</pre>
     70 
     71     <p>It is assumed that you have created appropriate bundle file for
     72     the various locales "en_UK" and "ja_JP" as appropriate. Here is a
     73     sample bundle for the "en_UK" locale.
     74     </p>
     75 
     76 
     77     <pre class="source">APPLICATION_STARTED=Application <b>{0}</b> has started.
     78 APPLICATION_STOPPED=Application <b>{0}</b> has stopped.
     79 ... </pre>
     80 
     81     <p>Then, you
     82     can instantiate a <code>IMessageConveyor</code>, inject it into a
     83     <code>LogLoggerFactory</code>, retrieve multiple
     84     <code>LogLogger</code> instances by name and log away, as the next
     85     sample code illustrates.
     86     </p>
     87     
     88 
     89     <pre class="prettyprint source">import java.util.Locale;
     90 
     91 import org.slf4j.cal10n.LocLogger;
     92 import org.slf4j.cal10n.LocLoggerFactory;
     93 
     94 import ch.qos.cal10n.IMessageConveyor;
     95 import ch.qos.cal10n.MessageConveyor;
     96 
     97 public class MyApplication {
     98 
     99   // create a message conveyor for a given locale 
    100   IMessageConveyor  messageConveyor = new MessageConveyor(Locale.UK);
    101   
    102   // create the LogLoggerFactory
    103   LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor);
    104   
    105   // create a locLogger
    106   LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass());
    107   
    108 
    109   public void applicationStart() {
    110     locLogger.info(Production.APPLICATION_STARTED, "fooApp");
    111     // ..
    112   }
    113   
    114   public void applicationStop() {
    115     locLogger.info(Production.APPLICATION_STOPPED, "fooApp");
    116     // ...
    117   }
    118 }</pre>
    119 
    120     <p>Assuming the resource bundle
    121     <em>production_en_UK.properties</em> exists, and the underlying
    122     logging framework is enabled for the info level, log messages will
    123     be output in UK English.
    124     </p>
    125 
    126     <p>Note that a <code>LogLogger</code> is a regular SLF4J logger
    127     with additional methods supporting localization. For those
    128     additional methods which take an enum as first parameter,
    129     <code>LogLogger</code> follows the standard Java convention for
    130     parameter substitution as defined by the <a
    131     href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html">java.text.MessageFormat</a>
    132     class. For non-localized logs, which take a String as first
    133     parameter, <code>LogLogger</code> follows the {} convention, as
    134     customary for all <code>org.slf4j.Logger</code> implementations.
    135     </p>
    136 
    137     <p>Here is an example illustrating the difference.</p>
    138     
    139     <pre  class="prettyprint source">import ...;
    140 public class MyApplication {
    141 
    142   IMessageConveyor  messageConveyor = new MessageConveyor(Locale.UK);
    143   LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor);
    144   LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass());
    145 
    146   public void someMethod() {
    147     // follows the MessageFormat convention
    148     locLogger.info(Production.APPLICATION_STARTED, "fooApp");
    149 
    150    // follows the {} convention
    151    logLogger.info("Hello {}", name);
    152    ...  
    153   }  
    154 }</pre>
    155     <script src="templates/footer.js" type="text/javascript"></script>
    156     </div>
    157   </body>
    158 </html>
    159