25 |
* |
* |
26 |
* Contributors: |
* Contributors: |
27 |
* Martin O. J. Schmitz - initial API and implementation |
* Martin O. J. Schmitz - initial API and implementation |
28 |
* Stefan A. Krüger - additional utility classes |
* Stefan A. Tzeggai - additional utility classes |
29 |
******************************************************************************/ |
******************************************************************************/ |
30 |
package skrueger.i8n; |
package skrueger.i8n; |
31 |
|
|
33 |
import java.awt.event.ActionListener; |
import java.awt.event.ActionListener; |
34 |
import java.beans.PropertyChangeEvent; |
import java.beans.PropertyChangeEvent; |
35 |
import java.beans.PropertyChangeListener; |
import java.beans.PropertyChangeListener; |
36 |
|
import java.io.Serializable; |
37 |
import java.util.ArrayList; |
import java.util.ArrayList; |
38 |
import java.util.HashMap; |
import java.util.HashMap; |
39 |
import java.util.Iterator; |
import java.util.Iterator; |
40 |
import java.util.List; |
import java.util.List; |
41 |
import java.util.Locale; |
import java.util.Locale; |
42 |
import java.util.Random; |
import java.util.Random; |
43 |
|
import java.util.Set; |
44 |
|
import java.util.WeakHashMap; |
45 |
|
|
46 |
import javax.swing.JComponent; |
import javax.swing.JComponent; |
47 |
|
|
49 |
import org.geotools.util.WeakHashSet; |
import org.geotools.util.WeakHashSet; |
50 |
import org.opengis.util.InternationalString; |
import org.opengis.util.InternationalString; |
51 |
|
|
52 |
|
import schmitzm.lang.ResourceProvider; |
53 |
|
import schmitzm.lang.SortableVector; |
54 |
import skrueger.geotools.Copyable; |
import skrueger.geotools.Copyable; |
55 |
|
|
56 |
/** |
/** |
58 |
* appropriate translation |
* appropriate translation |
59 |
* |
* |
60 |
* @author @author <a href="mailto:[email protected]">Stefan Alfons |
* @author @author <a href="mailto:[email protected]">Stefan Alfons |
61 |
* Krüger</a> |
* Tzeggai</a> |
62 |
*/ |
*/ |
63 |
|
|
64 |
public class Translation extends HashMap<String, String> implements |
public class Translation extends HashMap<String, String> implements |
65 |
Copyable<Translation> { |
Copyable<Translation>, Serializable { |
66 |
|
|
67 |
|
private static final long serialVersionUID = -347702744122305245L; |
68 |
|
|
69 |
public static final String LOCALECHANGE_PROPERTY = "localechange"; |
public static final String LOCALECHANGE_PROPERTY = "localechange"; |
70 |
public static final String NO_TRANSLATION = "NO TRANSLATION"; |
public static final String NO_TRANSLATION = "NO TRANSLATION"; |
71 |
public static final String DEFAULT_KEY = "default"; |
public static final String DEFAULT_KEY = "default"; |
72 |
static final Logger LOGGER = Logger.getLogger(Translation.class); |
static final Logger LOGGER = Logger.getLogger(Translation.class); |
73 |
static String activeLang = Locale.getDefault().getLanguage(); |
static String activeLang = Locale.getDefault().getLanguage(); |
74 |
|
|
75 |
static protected List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>(); |
static protected WeakHashSet<PropertyChangeListener> listeners = new WeakHashSet<PropertyChangeListener>( |
76 |
|
PropertyChangeListener.class); |
77 |
|
|
78 |
static { |
static { |
79 |
|
|
108 |
/** |
/** |
109 |
* Set up the {@link Translation}-system to use language. If a change is |
* Set up the {@link Translation}-system to use language. If a change is |
110 |
* performed, events are fired to listeners. Nothing is done if the new |
* performed, events are fired to listeners. Nothing is done if the new |
111 |
* language equals the old language. The system's default locale is changed. |
* language equals the old language. The system's default {@link Locale} is changed. |
112 |
* |
* |
113 |
* @param newLang |
* @param newLang |
114 |
* The ISO Code of the new active language |
* The ISO Code of the new active language |
152 |
|
|
153 |
fireLocaleChangeEvents(); |
fireLocaleChangeEvents(); |
154 |
|
|
155 |
LOGGER.info("skrueger.i8n.Translation switched ActiveLang to " + newLang); |
LOGGER.info("skrueger.i8n.Translation switched ActiveLang to " |
156 |
|
+ newLang); |
157 |
} |
} |
158 |
|
|
159 |
/** |
/** |
185 |
put(DEFAULT_KEY, defaultTranslation); |
put(DEFAULT_KEY, defaultTranslation); |
186 |
} else |
} else |
187 |
for (String code : languages) { |
for (String code : languages) { |
188 |
if (code.equals(getActiveLang())) { |
// if (code.equals(getActiveLang())) { |
189 |
put(code, defaultTranslation); |
put(code, defaultTranslation); |
190 |
} |
// } |
191 |
} |
} |
192 |
} |
} |
193 |
|
|
206 |
* <li>If format can't be recognized, the {@link String} is interpreted as |
* <li>If format can't be recognized, the {@link String} is interpreted as |
207 |
* the translation in the <code>{@value #DEFAULT_KEY}</code> language |
* the translation in the <code>{@value #DEFAULT_KEY}</code> language |
208 |
* |
* |
209 |
* @author Stefan Alfons Krüger |
* @author Stefan Alfons Tzeggai |
210 |
*/ |
*/ |
211 |
public void fromOneLine(final String oneLineCoded) { |
public void fromOneLine(final String oneLineCoded) { |
212 |
|
|
247 |
/** |
/** |
248 |
* Exports the Translations to a String of the Format: "de{Baum}en{tree}" |
* Exports the Translations to a String of the Format: "de{Baum}en{tree}" |
249 |
* |
* |
250 |
* @author Stefan Alfons Krüger |
* @author Stefan Alfons Tzeggai |
251 |
*/ |
*/ |
252 |
public String toOneLine() { |
public String toOneLine() { |
253 |
return I8NUtil.toOneLine(this); |
return I8NUtil.toOneLine(this); |
294 |
|
|
295 |
/** |
/** |
296 |
* {@link PropertyChangeListener} can be registered to be informed when the |
* {@link PropertyChangeListener} can be registered to be informed when the |
297 |
* {@link Locale} changed. |
* {@link Locale} changed.<br> |
298 |
|
* The listeners are kept in a {@link WeakHashMap}, so you have to keep a |
299 |
|
* reference to the listener or it will be removed! |
300 |
* |
* |
301 |
* @param propertyChangeListener |
* @param propertyChangeListener |
302 |
|
* A {@link PropertyChangeListener} that will be called when |
303 |
|
* {@link #setActiveLang(String)} changes the language. |
304 |
*/ |
*/ |
305 |
public static void addLocaleChangeListener( |
public static void addLocaleChangeListener( |
306 |
PropertyChangeListener propertyChangeListener) { |
PropertyChangeListener propertyChangeListener) { |
308 |
} |
} |
309 |
|
|
310 |
/** |
/** |
311 |
|
* {@link PropertyChangeListener} can be registered to be informed when the |
312 |
|
* {@link Locale} changed.<br> |
313 |
|
* The listeners are kept in a {@link WeakHashMap}, so you have to keep a |
314 |
|
* reference to the listener or it will be removed! |
315 |
|
* |
316 |
|
* @param propertyChangeListener |
317 |
|
* A {@link PropertyChangeListener} that will be called when |
318 |
|
* {@link #setActiveLang(String)} changes the language. |
319 |
|
*/ |
320 |
|
public static boolean removeLocaleChangeListener( |
321 |
|
PropertyChangeListener propertyChangeListener) { |
322 |
|
return listeners.remove(propertyChangeListener); |
323 |
|
} |
324 |
|
|
325 |
|
/** |
326 |
* Informs all registered {@link PropertyChangeListener}s about a change of |
* Informs all registered {@link PropertyChangeListener}s about a change of |
327 |
* the the {@link Locale}. |
* the the {@link Locale}. |
328 |
*/ |
*/ |
342 |
*/ |
*/ |
343 |
public void addTranslationChangeListener(ActionListener actionListener) { |
public void addTranslationChangeListener(ActionListener actionListener) { |
344 |
if (actionListeners.add(actionListener)) { |
if (actionListeners.add(actionListener)) { |
345 |
LOGGER.debug("registering a new translationChangeActionListener in the WeakHashSet"); |
// LOGGER |
346 |
|
// .debug("registering a new translationChangeActionListener in the WeakHashSet"); |
347 |
} |
} |
348 |
} |
} |
349 |
|
|
423 |
return true; |
return true; |
424 |
} |
} |
425 |
|
|
426 |
|
/** |
427 |
|
* Goes through the available languages of the FIRST registered {@link ResourceProvider} and set the active locale to the fist match. |
428 |
|
* |
429 |
|
* @param fireChangeEvent if <code>true</code>, a Translation.fireLocaleChangeEvents() is issued. |
430 |
|
|
431 |
|
* @return |
432 |
|
*/ |
433 |
|
public static boolean setFirstmatchingLanguage(List<String> languages, |
434 |
|
boolean fireChangeEvent) { |
435 |
|
|
436 |
|
SortableVector<ResourceProvider> registeredResourceProvider = ResourceProvider |
437 |
|
.getRegisteredResourceProvider(); |
438 |
|
Set<Locale> available = ResourceProvider.getAvailableLocales( |
439 |
|
registeredResourceProvider.get(0), true); |
440 |
|
|
441 |
|
for (String l : languages) { |
442 |
|
for (Locale loc : available) { |
443 |
|
if (loc.getLanguage().equals(l)) { |
444 |
|
Translation.setActiveLang(l); |
445 |
|
if (fireChangeEvent) |
446 |
|
Translation.fireLocaleChangeEvents(); |
447 |
|
return true; |
448 |
|
} |
449 |
|
} |
450 |
|
} |
451 |
|
|
452 |
|
return false; |
453 |
|
|
454 |
|
} |
455 |
} |
} |