001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/i18n/Messages.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.i18n;
037
038 import java.io.IOException;
039 import java.io.InputStream;
040 import java.text.MessageFormat;
041 import java.util.HashMap;
042 import java.util.Iterator;
043 import java.util.Locale;
044 import java.util.Map;
045 import java.util.Properties;
046
047 import org.deegree.framework.log.ILogger;
048 import org.deegree.framework.log.LoggerFactory;
049 import org.deegree.framework.util.BootLogger;
050
051 /**
052 * Responsible for the access to messages that are visible to the user.
053 * <p>
054 * Messages are read from the properties file <code>messages_LANG.properties</code> (LANG is
055 * always a lowercased ISO 639 code), so internationalization is supported. If a certain property
056 * (or the property file) for the specific default language of the system is not found, the message
057 * is taken from <code>messages_en.properties</code>.
058 *
059 * @see Locale#getLanguage()
060 *
061 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
062 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a>
063 * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
064 * @author last edited by: $Author: mschneider $
065 *
066 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
067 */
068 public class Messages {
069
070 private static final ILogger LOG = LoggerFactory.getLogger( Messages.class );
071
072 /* This definition allows Eclipse to display the content of referenced message keys. */
073 @SuppressWarnings("unused")
074 private static final String BUNDLE_NAME = "org.deegree.i18n.messages_en";
075
076 private static Properties defaultProps = new Properties();
077
078 private static Map<Locale, Properties> props = new HashMap<Locale, Properties>();
079
080 private static String lang;
081
082 /**
083 * Initialization done at class loading time.
084 */
085 static {
086 try {
087 // load all messages from default file ("org/deegree/i18n/message_en.properties")
088 String fileName = "messages_en.properties";
089 InputStream is = Messages.class.getResourceAsStream( fileName );
090 if ( is == null ) {
091 BootLogger.log( "Error while initializing " + Messages.class.getName() + " : "
092 + " default message file: '" + fileName + " not found." );
093 }
094 is = Messages.class.getResourceAsStream( fileName );
095 defaultProps.load( is );
096 is.close();
097
098 // override messages using file "/message_en.properties"
099 fileName = "/messages_en.properties";
100 overrideMessages( fileName, defaultProps );
101
102 lang = Locale.getDefault().getLanguage();
103 if ( !"".equals( lang ) && !"en".equals( lang ) ) {
104 // override messages using file "org/deegree/i18n/message_LANG.properties"
105 fileName = "messages_" + lang + ".properties";
106 overrideMessages( fileName, defaultProps );
107 // override messages using file "/message_LANG.properties"
108 fileName = "/messages_" + lang + ".properties";
109 overrideMessages( fileName, defaultProps );
110 }
111 } catch ( IOException e ) {
112 BootLogger.logError( "Error while initializing " + Messages.class.getName() + " : " + e.getMessage(), e );
113 }
114 }
115
116 private static void overrideMessages( String propertiesFile, Properties props )
117 throws IOException {
118 InputStream is = Messages.class.getResourceAsStream( propertiesFile );
119 if ( is != null ) {
120 // override default messages
121 Properties overrideProps = new Properties();
122 overrideProps.load( is );
123 is.close();
124 Iterator<?> iter = overrideProps.keySet().iterator();
125 while ( iter.hasNext() ) {
126 String key = (String) iter.next();
127 props.put( key, overrideProps.get( key ) );
128 }
129 }
130 }
131
132 private static String get( Properties props, String key, Object... args ) {
133 String s = (String) props.get( key );
134 if ( s != null ) {
135 return MessageFormat.format( s, args );
136 }
137
138 return "$Message with key: " + key + " not found$";
139 }
140
141 /**
142 * @param loc
143 * the locale to be used
144 * @param key
145 * to get
146 * @param arguments
147 * to fill in the message
148 * @return the localized message
149 */
150 public static synchronized String get( Locale loc, String key, Object... arguments ) {
151 if ( loc.getLanguage().equals( lang ) ) {
152 return get( key, arguments );
153 }
154
155 if ( !props.containsKey( loc ) ) {
156 Properties p = new Properties();
157
158 String l = loc.getLanguage();
159
160 if ( !"".equals( l ) ) {
161 try {
162 // override messages in this order:
163 // messages_en.properties
164 // /messages_en.properties
165 // messages_lang.properties
166 // /messages_lang.properties
167 String fileName = "messages_en.properties";
168 overrideMessages( fileName, p );
169 fileName = "/messages_en.properties";
170 overrideMessages( fileName, p );
171 fileName = "messages_" + l + ".properties";
172 overrideMessages( fileName, p );
173 fileName = "/messages_" + l + ".properties";
174 overrideMessages( fileName, p );
175 } catch ( IOException e ) {
176 LOG.logError( "Error loading language file for language '" + l + "': ", e );
177 }
178 }
179
180 props.put( loc, p );
181 }
182
183 String s = get( props.get( loc ), key, arguments );
184 return s;
185 }
186
187 /**
188 * Alias for #getMessage.
189 *
190 * @param key
191 * @param arguments
192 * @return the message
193 */
194 public static String get( String key, Object... arguments ) {
195 return getMessage( key, arguments );
196 }
197
198 /**
199 * Returns the message assigned to the passed key. If no message is assigned, an error message
200 * will be returned that indicates the missing key.
201 *
202 * @see MessageFormat for conventions on string formatting and escape characters.
203 *
204 * @param key
205 * @param arguments
206 * @return the message assigned to the passed key
207 */
208 public static String getMessage( String key, Object... arguments ) {
209 return get( defaultProps, key, arguments );
210 }
211 }