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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.20  
changed lines
  Added in v.185

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26