whitespace fixups
[jSite2.git] / src / net / pterodactylus / jsite / i18n / I18n.java
index 0acdced..4647ddc 100644 (file)
@@ -31,19 +31,27 @@ import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.Properties;
 import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.swing.KeyStroke;
 
 import net.pterodactylus.util.io.Closer;
+import net.pterodactylus.util.logging.Logging;
 
 /**
  * Class that handles i18n.
- * 
+ *
  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
- * @version $Id$
  */
 public class I18n {
 
+       /** Logger. */
+       private static final Logger logger = Logging.getLogger(I18n.class.getName());
+
+       /** List of I18nables that are notified when the language changes. */
+       private static final List<I18nable> i18nables = new ArrayList<I18nable>();
+
        /** The current locale. */
        private static Locale currentLocale;
 
@@ -64,16 +72,13 @@ public class I18n {
                } catch (IOException e) {
                        /* something is fucked. */
                }
-               setLocale(Locale.getDefault());
+               setLocale(Locale.getDefault(), false);
        }
 
-       /** List of I18nables that are notified when the language changes. */
-       private static final List<I18nable> i18nables = new ArrayList<I18nable>();
-
        /**
         * Returns the translated value for a key. The translated values may contain
         * placeholders that are replaced with the given parameters.
-        * 
+        *
         * @see MessageFormat
         * @param key
         *            The key to get
@@ -87,7 +92,9 @@ public class I18n {
                String value = null;
                value = currentLanguage.getProperty(key);
                if (value == null) {
-                       return key;
+                       logger.log(Level.WARNING, "please fix “" + key + "”!", new Throwable());
+                       /* TODO - replace with value when done! */
+                       return null;
                }
                if ((parameters != null) && (parameters.length > 0)) {
                        return MessageFormat.format(value, parameters);
@@ -99,14 +106,14 @@ public class I18n {
         * Returns the keycode from the value of the given key. You can specify the
         * constants in {@link KeyEvent} in the properties file, e.g. VK_S for the
         * keycode ‘s’ when used for mnemonics.
-        * 
+        *
         * @param key
         *            The key under which the keycode is stored
         * @return The keycode
         */
        public static int getKey(String key) {
-               String value = get(key);
-               if (value.startsWith("VK_")) {
+               String value = currentLanguage.getProperty(key);
+               if ((value != null) && value.startsWith("VK_")) {
                        try {
                                Field field = KeyEvent.class.getField(value);
                                return field.getInt(null);
@@ -120,19 +127,20 @@ public class I18n {
                                /* ignore. */
                        }
                }
-               return value.toUpperCase().charAt(0);
+               System.err.println("please fix “" + key + "”!");
+               return KeyEvent.VK_UNDEFINED;
        }
 
        /**
         * Returns a key stroke for use with swing accelerators.
-        * 
+        *
         * @param key
         *            The key of the key stroke
         * @return The key stroke, or <code>null</code> if no key stroke could be
         *         created from the translated value
         */
        public static KeyStroke getKeyStroke(String key) {
-               String value = get(key);
+               String value = currentLanguage.getProperty(key);
                if (value == null) {
                        return null;
                }
@@ -148,6 +156,9 @@ public class I18n {
                                modifierMask |= InputEvent.SHIFT_DOWN_MASK;
                        } else {
                                if (keyToken.startsWith("VK_")) {
+                                       if (keyToken.equals("VK_UNDEFINED")) {
+                                               return null;
+                                       }
                                        try {
                                                Field field = KeyEvent.class.getField(keyToken);
                                                return KeyStroke.getKeyStroke(field.getInt(null), modifierMask);
@@ -169,19 +180,40 @@ public class I18n {
 
        /**
         * Sets the current locale.
-        * 
+        *
         * @param newLocale
         *            The new locale to use
         */
        public static void setLocale(Locale newLocale) {
+               setLocale(newLocale, true);
+       }
+
+       /**
+        * Sets the current locale.
+        *
+        * @param newLocale
+        *            The new locale to use
+        * @param notify
+        *            <code>true</code> to notify registered {@link I18nable}s
+        *            after the language was changed
+        */
+       private static void setLocale(Locale newLocale, boolean notify) {
                currentLocale = newLocale;
                InputStream inputStream = null;
                try {
                        currentLanguage = new Properties(defaultLanguage);
-                       inputStream = I18n.class.getResourceAsStream("jSite_" + currentLocale.toString() + ".properties");
+                       if (newLocale == Locale.ENGLISH) {
+                               if (notify) {
+                                       notifyI18nables();
+                               }
+                               return;
+                       }
+                       inputStream = I18n.class.getResourceAsStream("jSite_" + newLocale.getLanguage() + ".properties");
                        if (inputStream != null) {
                                currentLanguage.load(inputStream);
-                               notifyI18nables();
+                               if (notify) {
+                                       notifyI18nables();
+                               }
                        }
                } catch (MissingResourceException mre1) {
                        currentLocale = Locale.ENGLISH;
@@ -193,8 +225,29 @@ public class I18n {
        }
 
        /**
+        * Returns the current locale.
+        *
+        * @return The current locale
+        */
+       public static Locale getLocale() {
+               return currentLocale;
+       }
+
+       /**
+        * Finds all available locales.
+        *
+        * @return All available locales
+        */
+       public static List<Locale> findAvailableLanguages() {
+               List<Locale> availableLanguages = new ArrayList<Locale>();
+               availableLanguages.add(Locale.ENGLISH);
+               availableLanguages.add(Locale.GERMAN);
+               return availableLanguages;
+       }
+
+       /**
         * Registers the given I18nable to be updated when the language is changed.
-        * 
+        *
         * @param i18nable
         *            The i18nable to register
         */
@@ -205,7 +258,7 @@ public class I18n {
        /**
         * Deregisters the given I18nable to be updated when the language is
         * changed.
-        * 
+        *
         * @param i18nable
         *            The i18nable to register
         */
@@ -221,7 +274,7 @@ public class I18n {
         * Notifies all registered {@link I18nable}s that the language was changed.
         */
        private static void notifyI18nables() {
-               for (I18nable i18nable: i18nables) {
+               for (I18nable i18nable : i18nables) {
                        i18nable.updateI18n();
                }
        }