make the GUI update its texts when a new language is chosen
[jSite2.git] / src / net / pterodactylus / jsite / i18n / I18n.java
index db97d0b..0acdced 100644 (file)
@@ -25,6 +25,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.Properties;
@@ -65,6 +67,9 @@ public class I18n {
                setLocale(Locale.getDefault());
        }
 
+       /** 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.
@@ -176,6 +181,7 @@ public class I18n {
                        inputStream = I18n.class.getResourceAsStream("jSite_" + currentLocale.toString() + ".properties");
                        if (inputStream != null) {
                                currentLanguage.load(inputStream);
+                               notifyI18nables();
                        }
                } catch (MissingResourceException mre1) {
                        currentLocale = Locale.ENGLISH;
@@ -185,4 +191,39 @@ public class I18n {
                        Closer.close(inputStream);
                }
        }
+
+       /**
+        * Registers the given I18nable to be updated when the language is changed.
+        * 
+        * @param i18nable
+        *            The i18nable to register
+        */
+       public static void registerI18nable(I18nable i18nable) {
+               i18nables.add(i18nable);
+       }
+
+       /**
+        * Deregisters the given I18nable to be updated when the language is
+        * changed.
+        * 
+        * @param i18nable
+        *            The i18nable to register
+        */
+       public static void deregisterI18nable(I18nable i18nable) {
+               i18nables.remove(i18nable);
+       }
+
+       //
+       // PRIVATE METHODS
+       //
+
+       /**
+        * Notifies all registered {@link I18nable}s that the language was changed.
+        */
+       private static void notifyI18nables() {
+               for (I18nable i18nable: i18nables) {
+                       i18nable.updateI18n();
+               }
+       }
+
 }