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