Merge commit '77d3a60869e7a780c6ae069e51530e1eacece5e2'
[fanfix.git] / src / be / nikiroo / utils / resources / TransBundle.java
index 51101b0441ed56ee7648a9f4543ebfc4b53d44d9..7b2edb1ca919b4bc9f31e85d968ca8ee771d538f 100644 (file)
@@ -17,6 +17,9 @@ import java.util.regex.Pattern;
  * <li>DUMMY will return "[DUMMY]" (maybe with a suffix and/or "NOUTF")</li>
  * </ul>
  * 
+ * @param <E>
+ *            the enum to use to get values out of this class
+ * 
  * @author niki
  */
 public class TransBundle<E extends Enum<E>> extends Bundle<E> {
@@ -33,8 +36,7 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
         *            the name of the {@link Bundles}
         */
        public TransBundle(Class<E> type, Enum<?> name) {
-               super(type, name);
-               setLanguage(null);
+               this(type, name, (Locale) null);
        }
 
        /**
@@ -46,11 +48,27 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
         * @param name
         *            the name of the {@link Bundles}
         * @param language
-        *            the language to use
+        *            the language to use, can be NULL for default
         */
        public TransBundle(Class<E> type, Enum<?> name, String language) {
-               super(type, name);
-               setLanguage(language);
+               super(type, name, null);
+               setLocale(language);
+       }
+
+       /**
+        * Create a translation service for the given language (will fall back to
+        * the default one i not found).
+        * 
+        * @param type
+        *            a runtime instance of the class of E
+        * @param name
+        *            the name of the {@link Bundles}
+        * @param language
+        *            the language to use, can be NULL for default
+        */
+       public TransBundle(Class<E> type, Enum<?> name, Locale language) {
+               super(type, name, null);
+               setLocale(language);
        }
 
        /**
@@ -119,15 +137,19 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
                } else if ("DUMMY".equals(id.name().toUpperCase())) {
                        result = "[" + key.toLowerCase() + "]";
                } else if (containsKey(key)) {
-                       result = getString(key);
+                       result = getString(key, null);
+                       if (result == null) {
+                               result = getMetaDef(id.name());
+                       }
                } else {
                        result = null;
                }
 
-               if (values != null && values.length > 0 && result != null)
+               if (values != null && values.length > 0 && result != null) {
                        return String.format(locale, result, values);
-               else
-                       return result;
+               }
+
+               return result;
        }
 
        /**
@@ -150,13 +172,36 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
        }
 
        /**
-        * Return all the languages known by the program.
-        * 
+        * Return all the languages known by the program for this bundle.
         * 
         * @return the known language codes
         */
        public List<String> getKnownLanguages() {
-               return getKnownLanguages(name);
+               return getKnownLanguages(keyType);
+       }
+
+       /**
+        * The current language (which can be the default one, but NOT NULL).
+        * 
+        * @return the language, not NULL
+        */
+       public Locale getLocale() {
+               return locale;
+       }
+
+       /**
+        * The current language (which can be the default one, but NOT NULL).
+        * 
+        * @return the language, not NULL, in a display format (fr-BE, en-GB, es,
+        *         de...)
+        */
+       public String getLocaleString() {
+               String lang = locale.getLanguage();
+               String country = locale.getCountry();
+               if (country != null && !country.isEmpty()) {
+                       return lang + "-" + country;
+               }
+               return lang;
        }
 
        /**
@@ -166,15 +211,31 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
         *            the language to initialise, in the form "en-GB" or "fr" for
         *            instance
         */
-       private void setLanguage(String language) {
-               defaultLocale = (language == null || language.length() == 0);
-               locale = getLocaleFor(language);
-               setBundle(name, locale, false);
+       private void setLocale(String language) {
+               setLocale(getLocaleFor(language));
+       }
+
+       /**
+        * Initialise the translation mappings for the given language.
+        * 
+        * @param language
+        *            the language to initialise, or NULL for default
+        */
+       private void setLocale(Locale language) {
+               if (language != null) {
+                       defaultLocale = false;
+                       locale = language;
+               } else {
+                       defaultLocale = true;
+                       locale = Locale.getDefault();
+               }
+
+               setBundle(keyType, locale, false);
        }
 
        @Override
        public void reload(boolean resetToDefault) {
-               setBundle(name, locale, resetToDefault);
+               setBundle(keyType, locale, resetToDefault);
        }
 
        @Override
@@ -200,22 +261,22 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
                Object status = takeSnapshot();
 
                // default locale
-               setLanguage(null);
-               if (prev.equals(getLocaleFor(null).getLanguage())) {
+               setLocale((Locale) null);
+               if (prev.equals(Locale.getDefault().getLanguage())) {
                        // restore snapshot if default locale = current locale
                        restoreSnapshot(status);
                }
                super.updateFile(path);
 
                for (String lang : getKnownLanguages()) {
-                       setLanguage(lang);
+                       setLocale(lang);
                        if (lang.equals(prev)) {
                                restoreSnapshot(status);
                        }
                        super.updateFile(path);
                }
 
-               setLanguage(prev);
+               setLocale(prev);
                restoreSnapshot(status);
        }
 
@@ -224,10 +285,10 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
                String code = locale.toString();
                File file = null;
                if (!defaultLocale && code.length() > 0) {
-                       file = new File(path, name.name() + "_" + code + ".properties");
+                       file = new File(path, keyType.name() + "_" + code + ".properties");
                } else {
                        // Default properties file:
-                       file = new File(path, name.name() + ".properties");
+                       file = new File(path, keyType.name() + ".properties");
                }
 
                return file;
@@ -267,8 +328,12 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
 
                String name = id.name() + "_NOUTF";
                if (containsKey(name)) {
-                       String value = getString(name);
-                       writeValue(writer, name, value);
+                       String value = getString(name, null);
+                       if (value == null) {
+                               value = getMetaDef(id.name());
+                       }
+                       boolean set = isSet(id, false);
+                       writeValue(writer, name, value, set);
                }
        }
 
@@ -279,29 +344,28 @@ public class TransBundle<E extends Enum<E>> extends Bundle<E> {
         *            the language to initialise, in the form "en-GB" or "fr" for
         *            instance
         * 
-        * @return the corresponding {@link Locale} or the default {@link Locale} if
-        *         it is not known
+        * @return the corresponding {@link Locale} or NULL if it is not known
         */
        static private Locale getLocaleFor(String language) {
                Locale locale;
 
-               if (language == null) {
-                       locale = Locale.getDefault();
-               } else {
-                       language = language.replaceAll("_", "-");
-                       String lang = language;
-                       String country = null;
-                       if (language.contains("-")) {
-                               lang = language.split("-")[0];
-                               country = language.split("-")[1];
-                       }
+               if (language == null || language.trim().isEmpty()) {
+                       return null;
+               }
 
-                       if (country != null)
-                               locale = new Locale(lang, country);
-                       else
-                               locale = new Locale(lang);
+               language = language.replaceAll("_", "-");
+               String lang = language;
+               String country = null;
+               if (language.contains("-")) {
+                       lang = language.split("-")[0];
+                       country = language.split("-")[1];
                }
 
+               if (country != null)
+                       locale = new Locale(lang, country);
+               else
+                       locale = new Locale(lang);
+
                return locale;
        }