--- /dev/null
+package tim.prune;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.Properties;
+import java.util.ResourceBundle;
+
+/**
+ * Manager for all internationalization
+ * Responsible for loading property files
+ * and delivering language-specific texts
+ */
+public abstract class I18nManager
+{
+ /** Properties object into which all the texts are copied */
+ private static Properties LocalTexts = null;
+
+ /** External properties file for developer testing */
+ private static Properties ExternalPropsFile = null;
+
+
+ /**
+ * Initialize the library using the (optional) locale
+ * @param inLocale locale to use, or null for default
+ */
+ public static void init(Locale inLocale)
+ {
+ final String BUNDLE_NAME = "tim.prune.lang.prune-texts";
+ final Locale BACKUP_LOCALE = new Locale("en", "GB");
+
+ LocalTexts = new Properties();
+ // Load English texts first to use as defaults
+ loadFromBundle(ResourceBundle.getBundle(BUNDLE_NAME, BACKUP_LOCALE));
+
+ // Get bundle for selected locale, if any
+ try
+ {
+ if (inLocale != null)
+ {
+ loadFromBundle(ResourceBundle.getBundle(BUNDLE_NAME, inLocale));
+ }
+ else
+ {
+ // locale is null so just use the system default
+ loadFromBundle(ResourceBundle.getBundle(BUNDLE_NAME, Locale.getDefault()));
+ }
+ }
+ catch (MissingResourceException mre) { // ignore error, default to english
+ }
+ }
+
+ /**
+ * Copy all the translations from the given bundle and store in the Properties object
+ * overwriting the existing translations if necessary
+ * @param inBundle bundle object loaded from file
+ */
+ private static void loadFromBundle(ResourceBundle inBundle)
+ {
+ Enumeration<String> e = inBundle.getKeys();
+ while (e.hasMoreElements())
+ {
+ String key = e.nextElement();
+ LocalTexts.setProperty(key, inBundle.getString(key));
+ }
+ }
+
+ /**
+ * Add a language file
+ * @param inFilename filename of file
+ * @throws FileNotFoundException if load failed
+ */
+ public static void addLanguageFile(String inFilename) throws FileNotFoundException
+ {
+ FileInputStream fis = null;
+ boolean fileLoaded = false;
+ try
+ {
+ File file = new File(inFilename);
+ ExternalPropsFile = new Properties();
+ fis = new FileInputStream(file);
+ ExternalPropsFile.load(fis);
+ fileLoaded = true; // everything worked
+ }
+ catch (IOException ioe) {}
+ finally { try { fis.close();
+ } catch (Exception e) {}
+ }
+ // complain if file wasn't loaded, by throwing a filenotfound exception
+ if (!fileLoaded) throw new FileNotFoundException();
+ }
+
+
+ /**
+ * Lookup the given key and return the associated text
+ * @param inKey key to lookup
+ * @return associated text, or the key if not found
+ */
+ public static String getText(String inKey)
+ {
+ // look in external props file if available
+ if (ExternalPropsFile != null)
+ {
+ String extText = ExternalPropsFile.getProperty(inKey);
+ if (extText != null) return extText;
+ }
+ // look in texts if available
+ if (LocalTexts != null)
+ {
+ try
+ {
+ String localText = LocalTexts.getProperty(inKey);
+ if (localText != null) return localText;
+ }
+ catch (MissingResourceException mre) {}
+ }
+ // return the key itself
+ return inKey;
+ }
+
+ /**
+ * Lookup the given key and return the associated text, formatting with the number
+ * @param inKey key to lookup (text should contain a %d)
+ * @param inNumber number to substitute into the %d
+ * @return associated text, or the key if not found
+ */
+ public static String getTextWithNumber(String inKey, int inNumber)
+ {
+ String localText = getText(inKey);
+ try
+ {
+ localText = String.format(localText, inNumber);
+ }
+ catch (Exception e)
+ {} // printf formatting didn't work, maybe the placeholders are wrong?
+ return localText;
+ }
+}