/[schmitzm]/branches/2.0-RC1/src/skrueger/i8n/Translation.java
ViewVC logotype

Annotation of /branches/2.0-RC1/src/skrueger/i8n/Translation.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 185 - (hide annotations)
Fri Jul 3 14:36:08 2009 UTC (15 years, 8 months ago) by alfonx
Original Path: trunk/src/skrueger/i8n/Translation.java
File size: 7856 byte(s)
* Un-deprecated the constructor Translation(String);

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26