/[schmitzm]/trunk/src/skrueger/i8n/Translation.java
ViewVC logotype

Contents of /trunk/src/skrueger/i8n/Translation.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 409 - (show annotations)
Fri Sep 18 15:00:29 2009 UTC (15 years, 5 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/i8n/Translation.java
File size: 10589 byte(s)
* First start of rewriting of AtlasStyler GUI for GT2.6 and Miglayout.
* Fix for Schmitzm so that the FeatureMapLayerSelectionSynchronizer works correctly again.
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, focusing (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.awt.event.ActionEvent;
33 import java.awt.event.ActionListener;
34 import java.beans.PropertyChangeEvent;
35 import java.beans.PropertyChangeListener;
36 import java.util.ArrayList;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.Locale;
40 import java.util.Random;
41
42 import javax.swing.JComponent;
43
44 import org.apache.log4j.Logger;
45 import org.opengis.util.InternationalString;
46
47 /**
48 * Represents a {@link HashMap} of translations. toString() returns the
49 * appropriate translation
50 *
51 * @author @author <a href="mailto:[email protected]">Stefan Alfons
52 * Kr&uuml;ger</a>
53 */
54
55 public class Translation extends HashMap<String, String> {
56 public static final String LOCALECHANGE_PROPERTY = "localechange";
57 public static final String NO_TRANSLATION = "NO TRANSLATION";
58 public static final String DEFAULT_KEY = "default";
59 static final Logger log = Logger.getLogger(Translation.class);
60 static String activeLang = Locale.getDefault().getLanguage();
61
62 static protected List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
63
64 static {
65
66 // TODO default aus Locale auslesen und mit möglichen vergleichen...
67 // mmm.. vor laden von atlasml immer DEFAULT_KEY, also hier nicht
68
69 // Get default locale
70 Locale locale = Locale.getDefault();
71 setActiveLang(locale.getLanguage());
72 }
73
74 private List<ActionListener> actionListeners = new ArrayList<ActionListener>();
75
76 @Override
77 /*
78 * @comment To make a copy of a translation see methods toOneLine() and
79 * fromOneLine()
80 */
81 public Translation clone() {
82 return (Translation) super.clone();
83 }
84
85 /**
86 * Get the two-letter language sting that is active
87 */
88 public static String getActiveLang() {
89 return activeLang;
90 }
91
92 /**
93 * Set up the {@link Translation}-system to use language. If a change is
94 * performed, events are fired to listeners. Nothing is done if the new
95 * language equals the old language. The system's default locale is changed.
96 *
97 * @param newLang
98 * The ISO Code of the new active language
99 */
100 public static void setActiveLang(String newLang) {
101 setActiveLang(newLang, true);
102 }
103
104 /**
105 * Set up the {@link Translation}-system to use language. If a change is
106 * performed, events are fired to listeners. Nothing is done if the new
107 * language equals the old language.
108 *
109 * @param newLang
110 * The ISO Code of the new active language
111 *
112 * @param setDefaultLocale
113 * Shall the system's default locale be changed?
114 */
115 public static void setActiveLang(String newLang, boolean setDefaultLocale) {
116 if (getActiveLang().equals(newLang)) {
117 return;
118 }
119
120 if (!I8NUtil.isValidISOLangCode(newLang)) {
121 throw new IllegalArgumentException("'" + newLang
122 + "' is not a valid ISO language code.");
123 }
124
125 Locale newLocale = new Locale(newLang);
126 if (setDefaultLocale)
127 Locale.setDefault(newLocale);
128
129 /**
130 * Setting default locale for Swing JComponents to work around bug
131 * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4884480
132 */
133 JComponent.setDefaultLocale(newLocale);
134
135 Translation.activeLang = newLang;
136
137 fireLocaleChangeEvents();
138
139 log.info("skrueger.i8n.Translation switched ActiveLang to " + newLang);
140 }
141
142 /**
143 * Initializes a new {@link Translation} with a default translation if a
144 * simple text is passed. If a "oneLine" text is parsed, it is interpreted.
145 * Other translations may be added later - this is a HashMap<br/>
146 *
147 * @param defaultTranslation
148 *
149 * @see public Translation(List<String> languages, String
150 * defaultTranslation) {
151 *
152 */
153 public Translation(String defaultTranslation) {
154
155 fromOneLine(defaultTranslation);
156
157 }
158
159 /**
160 * Initializes a new {@link Translation}, an uses the given String to
161 * initialize the {@link Translation} for all languages codes passed.
162 *
163 * The translations can be changed later
164 */
165 public Translation(List<String> languages, String defaultTranslation) {
166 // put(DEFAULT_KEY, defaultTranslation);
167 if (languages == null) {
168 put(DEFAULT_KEY, defaultTranslation);
169 } else
170 for (String code : languages) {
171 if (code.equals(getActiveLang())) {
172 put(code, defaultTranslation);
173 }
174 }
175 }
176
177 /**
178 * Sometimes Translations are optional, like for keywords.
179 */
180 public Translation() {
181 }
182
183 /**
184 * Fills the {@link Translation} with the values coded into the String
185 * Format of {@link String} is: "de{Baum}en{tree}"
186 * <p>
187 * <ul>
188 * <li>If <code>oneLineCoded</code> is empty or null, NO TRANSLATION is set.
189 * <li>If format can't be recognized, the {@link String} is interpreted as
190 * the translation in the <code>{@value #DEFAULT_KEY}</code> language
191 *
192 * @author Stefan Alfons Krüger
193 */
194 public void fromOneLine(final String oneLineCoded) {
195 clear();
196
197 if ((oneLineCoded == null) || (oneLineCoded.equals(""))) {
198 put(DEFAULT_KEY, "");
199 return;
200 }
201
202 if (oneLineCoded.indexOf("}") == -1) {
203 // log.warn("The String '"+oneLineCoded+"' is not in oneLine coded => put(DEFAULT_KEY,oneLineCoded);");
204 put(DEFAULT_KEY, oneLineCoded);
205 }
206
207 String eatUp = oneLineCoded;
208 while (eatUp.indexOf("}") != -1) {
209 String substring = eatUp.substring(0, eatUp.indexOf("}"));
210
211 // log.debug("substring = "+substring);
212 String key = substring.substring(0, substring.indexOf("{"));
213 String value = substring.substring(substring.indexOf("{") + 1,
214 substring.length());
215 // log.debug("key="+key);
216 // log.debug("value="+value);
217 put(key, value);
218 eatUp = eatUp.substring(eatUp.indexOf("}") + 1);
219 }
220 }
221
222 /**
223 * Exports the Translations to a String of the Format: "de{Baum}en{tree}"
224 *
225 * @author Stefan Alfons Krüger
226 */
227 public String toOneLine() {
228 return I8NUtil.toOneLine(this);
229 }
230
231 /**
232 * Returns the right translation by using the {@link #activeLang} field. If
233 * no translation is set, an ugly String {@link #NO_TRANSLATION} will re
234 * returned. This might be changed for the final release. If the correct
235 * language was not found, any entry in the {@link Translation}
236 * {@link HashMap} will be returned, that contains more than an empty
237 * string.
238 */
239 @Override
240 public String toString() {
241 if (get(activeLang) != null) {
242 return get(activeLang);
243 }
244 // ****************************************************************************
245 // MS: The ISDSS needs the concept of the default lang!! So I took the
246 // following in again!!
247 // ****************************************************************************
248 // else return "";
249 // //****************************************************************************
250 // // The following is commented out.. the concept of the default lang
251 // seems to be bad....
252 // //****************************************************************************
253 // MS:
254 else {
255 if (get(DEFAULT_KEY) != null) {
256 // 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.");
257 return get(DEFAULT_KEY);
258 }
259
260 // log.debug("return first best <> '' ");
261 if (size() > 0)
262 for (String s : values()) {
263 if ((s != null) && (s.trim().length() > 0))
264 return s;
265 }
266 }
267 // log.warn("No translation found!");
268 return NO_TRANSLATION;
269 }
270
271 /**
272 * Copy this {@link Translation} to another {@link Translation} e.g. for
273 * editing
274 *
275 * @return the destination {@link Translation}
276 */
277 public Translation copy(Translation backup) {
278 if (backup == null)
279 throw new IllegalArgumentException(
280 "Target translation may not be null.");
281 for (String s : keySet()) {
282 backup.put(s, get(s));
283 }
284 return backup;
285 }
286
287 /**
288 * {@link PropertyChangeListener} can be registered to be informed when the
289 * {@link Locale} changed.
290 *
291 * @param propertyChangeListener
292 */
293 public static void addLocaleChangeListener(
294 PropertyChangeListener propertyChangeListener) {
295 listeners.add(propertyChangeListener);
296 }
297
298 /**
299 * Informs all registered {@link PropertyChangeListener}s about a change of
300 * the the {@link Locale}.
301 */
302 public static void fireLocaleChangeEvents() {
303 PropertyChangeEvent pce = new PropertyChangeEvent(new Translation(
304 new ArrayList<String>(), "fakeSource"), LOCALECHANGE_PROPERTY,
305 null, getActiveLang());
306 for (PropertyChangeListener pcl : listeners) {
307 if (pcl != null)
308 pcl.propertyChange(pce);
309 }
310 }
311
312 public void addTranslationChangeListener(ActionListener actionListener) {
313 actionListeners.add(actionListener);
314 }
315
316 public boolean removeTranslationChangeListener(ActionListener actionListener) {
317 return actionListeners.remove(actionListener);
318 }
319
320 public void fireTranslationChangedEvents(String lang) {
321 ActionEvent ae = new ActionEvent(this, new Random().nextInt(), lang);
322
323 for (ActionListener al : actionListeners) {
324 al.actionPerformed( ae);
325 }
326 }
327
328 @Override
329 public String put(String lang, String value) {
330 String result = super.put(lang, value);
331 fireTranslationChangedEvents(lang);
332 return result;
333 }
334
335 public void fromOneLine(InternationalString iString) {
336 if (iString != null)
337 fromOneLine(iString.toString());
338 else
339 fromOneLine((String)null);
340 }
341
342
343 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26