/[schmitzm]/branches/1.0-gt2-2.6/src/skrueger/i8n/Translation.java
ViewVC logotype

Contents of /branches/1.0-gt2-2.6/src/skrueger/i8n/Translation.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 244 - (show annotations)
Wed Jul 29 09:33:33 2009 UTC (15 years, 7 months ago) by alfonx
Original Path: trunk/src/skrueger/i8n/Translation.java
File size: 9572 byte(s)
* Updated all .java and .properties headers with a recent LGPL 3.0 and a link to the project webpage.
1 /*******************************************************************************
2 * Copyright (c) 2009 Martin O. J. Schmitz.
3 *
4 * This file is part of the SCHMITZM library - a collection of utility
5 * classes based on Java 1.6, focussing (not only) on Java Swing
6 * and the Geotools library.
7 *
8 * The SCHMITZM project is hosted at:
9 * http://wald.intevation.org/projects/schmitzm/
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 3
14 * of the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public License (license.txt)
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * or try this link: http://www.gnu.org/licenses/lgpl.html
25 *
26 * Contributors:
27 * Martin O. J. Schmitz - initial API and implementation
28 * Stefan A. Krüger - additional utility classes
29 ******************************************************************************/
30 package skrueger.i8n;
31
32 import java.beans.PropertyChangeEvent;
33 import java.beans.PropertyChangeListener;
34 import java.util.ArrayList;
35 import java.util.HashMap;
36 import java.util.List;
37 import java.util.Locale;
38
39 import javax.swing.JComponent;
40 import javax.swing.JTable;
41
42 import org.apache.log4j.Logger;
43
44 /**
45 * Represents a {@link HashMap} of translations. toString() returns the
46 * appropriate translation
47 *
48 * @author @author <a href="mailto:[email protected]">Stefan Alfons
49 * Kr&uuml;ger</a>
50 */
51
52 public class Translation extends HashMap<String, String> {
53 public static final String LOCALECHANGE_PROPERTY = "localechange";
54 public static final String NO_TRANSLATION = "NO TRANSLATION";
55 public static final String DEFAULT_KEY = "default";
56 static final Logger log = Logger.getLogger(Translation.class);
57 static String activeLang = "fr";
58
59 static protected List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
60
61 static {
62
63 // TODO default aus Locale auslesen und mit möglichen vergleichen...
64 // mmm.. vor laden von atlasml immer DEFAULT_KEY, also hier nicht
65
66 // Get default locale
67 Locale locale = Locale.getDefault();
68 setActiveLang(locale.getLanguage());
69 }
70
71 @Override
72 /*
73 * @comment To make a copy of a translation see methods toOneLine() and
74 * fromOneLine()
75 */
76 public Translation clone() {
77 return (Translation) super.clone();
78 }
79
80 /**
81 * Get the two-letter language sting that is active
82 */
83 public static String getActiveLang() {
84 return activeLang;
85 }
86
87 /**
88 * Set up the {@link Translation}-system to use language. If a change is
89 * performed, events are fired to listeners. Nothing is done if the new
90 * language equals the old language. The system's default locale is changed.
91 *
92 * @param newLang
93 * The ISO Code of the new active language
94 */
95 public static void setActiveLang(String newLang) {
96 setActiveLang(newLang, true);
97 }
98
99 /**
100 * Set up the {@link Translation}-system to use language. If a change is
101 * performed, events are fired to listeners. Nothing is done if the new
102 * language equals the old language.
103 *
104 * @param newLang
105 * The ISO Code of the new active language
106 *
107 * @param setDefaultLocale
108 * Shall the system's default locale be changed?
109 */
110 public static void setActiveLang(String newLang, boolean setDefaultLocale) {
111 if (getActiveLang().equals(newLang)) {
112 return;
113 }
114
115 if (!I8NUtil.isValidISOLangCode(newLang)) {
116 throw new IllegalArgumentException("'" + newLang
117 + "' is not a valid ISO language code.");
118 }
119
120 Locale newLocale = new Locale(newLang);
121 if (setDefaultLocale)
122 Locale.setDefault(newLocale);
123
124 /**
125 * Setting default locale for Swing JComponents to work around bug
126 * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4884480
127 */
128 JComponent.setDefaultLocale(newLocale);
129
130 Translation.activeLang = newLang;
131
132 fireLocaleChangeEvents();
133
134 log.info("skrueger.i8n.Translation switched ActiveLang to " + newLang);
135 }
136
137 /**
138 * Initializes a new {@link Translation} with a default translation if a
139 * simple text is passed. If a "oneLine" text is parsed, it is interpreted.
140 * Other translations may be added later - this is a HashMap<br/>
141 *
142 * @param defaultTranslation
143 *
144 * @see public Translation(List<String> languages, String
145 * defaultTranslation) {
146 *
147 */
148 public Translation(String defaultTranslation) {
149
150 fromOneLine(defaultTranslation);
151
152 }
153
154 /**
155 * Initializes a new {@link Translation}, an uses the given String to
156 * initialize the {@link Translation} for all languages codes passed.
157 *
158 * The translations can be changed later
159 */
160 public Translation(List<String> languages, String defaultTranslation) {
161 // put(DEFAULT_KEY, defaultTranslation);
162 if (languages == null) {
163 put(DEFAULT_KEY, defaultTranslation);
164 } else
165 for (String code : languages) {
166 if (code.equals(getActiveLang())) {
167 put(code, defaultTranslation);
168 }
169 }
170 }
171
172 /**
173 * Sometimes Translations are optional, like for keywords.
174 */
175 public Translation() {
176 }
177
178 /**
179 * Fills the {@link Translation} with the values coded into the String
180 * Format of {@link String} is: "de{Baum}en{tree}"
181 * <p>
182 * <ul>
183 * <li>If <code>oneLineCoded</code> is empty or null, NO TRANSLATION is set.
184 * <li>If format can't be recognized, the {@link String} is interpreted as
185 * the translation in the <code>{@value #DEFAULT_KEY}</code> language
186 *
187 * @author Stefan Alfons Krüger
188 */
189 public void fromOneLine(final String oneLineCoded) {
190 clear();
191 if ((oneLineCoded == null) || (oneLineCoded.equals(""))) {
192 put(DEFAULT_KEY, "");
193 return;
194 }
195
196 if (oneLineCoded.indexOf("}") == -1) {
197 // log.warn("The String '"+oneLineCoded+"' is not in oneLine coded => put(DEFAULT_KEY,oneLineCoded);");
198 put(DEFAULT_KEY, oneLineCoded);
199 }
200
201 String eatUp = oneLineCoded;
202 while (eatUp.indexOf("}") != -1) {
203 String substring = eatUp.substring(0, eatUp.indexOf("}"));
204
205 // log.debug("substring = "+substring);
206 String key = substring.substring(0, substring.indexOf("{"));
207 String value = substring.substring(substring.indexOf("{") + 1,
208 substring.length());
209 // log.debug("key="+key);
210 // log.debug("value="+value);
211 put(key, value);
212 eatUp = eatUp.substring(eatUp.indexOf("}") + 1);
213 }
214 }
215
216 /**
217 * Exports the Translations to a String of the Format: "de{Baum}en{tree}"
218 *
219 * @author Stefan Alfons Krüger
220 */
221 public String toOneLine() {
222 return I8NUtil.toOneLine(this);
223 }
224
225 /**
226 * Returns the right translation by using the {@link #activeLang} field. If
227 * no translation is set, an ugly String {@link #NO_TRANSLATION} will re
228 * returned. This might be changed for the final release. If the correct
229 * language was not found, any entry in the {@link Translation}
230 * {@link HashMap} will be returned, that contains more than an empty
231 * string.
232 */
233 @Override
234 public String toString() {
235 if (get(activeLang) != null) {
236 return get(activeLang);
237 }
238 // ****************************************************************************
239 // MS: The ISDSS needs the concept of the default lang!! So I took the
240 // following in again!!
241 // ****************************************************************************
242 // else return "";
243 // //****************************************************************************
244 // // The following is commented out.. the concept of the default lang
245 // seems to be bad....
246 // //****************************************************************************
247 // MS:
248 else {
249 if (get(DEFAULT_KEY) != null) {
250 // log.debug("default lang returned, cuz the translation to "+activeLang+" was not found. Schmeiss raus martin, wenn du das mit der default trans geklärt hast.");
251 return get(DEFAULT_KEY);
252 }
253
254 // log.debug("return first best <> '' ");
255 if (size() > 0)
256 for (String s : values()) {
257 if ((s != null) && (s.trim().length() > 0))
258 return s;
259 }
260 }
261 // log.warn("No translation found!");
262 return NO_TRANSLATION;
263 }
264
265 /**
266 * Copy this {@link Translation} to another {@link Translation} e.g. for
267 * editing
268 *
269 * @return the destination {@link Translation}
270 */
271 public Translation copy(Translation backup) {
272 if (backup == null)
273 throw new IllegalArgumentException(
274 "Target translation may not be null.");
275 for (String s : keySet()) {
276 backup.put(s, get(s));
277 }
278 return backup;
279 }
280
281 /**
282 * {@link PropertyChangeListener} can be registered to be informed when the
283 * {@link Locale} changed.
284 *
285 * @param propertyChangeListener
286 */
287 public static void addLocaleChangeListener(
288 PropertyChangeListener propertyChangeListener) {
289 listeners.add(propertyChangeListener);
290 }
291
292 /**
293 * Informs all registered {@link PropertyChangeListener}s about a change of
294 * the the {@link Locale}.
295 */
296 public static void fireLocaleChangeEvents() {
297 PropertyChangeEvent pce = new PropertyChangeEvent(new Translation(
298 new ArrayList<String>(), "fakeSource"), LOCALECHANGE_PROPERTY,
299 null, getActiveLang());
300 for (PropertyChangeListener pcl : listeners) {
301 if (pcl != null)
302 pcl.propertyChange(pce);
303 }
304 }
305
306 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26