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

Legend:
Removed from v.38  
changed lines
  Added in v.39

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26