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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26