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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26