X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FTransBundle.java;h=7b2edb1ca919b4bc9f31e85d968ca8ee771d538f;hb=ae5672397c765fff97844f43d587faa7ccfef630;hp=a3804401034692909302f04c50c39cdcad828e6d;hpb=80383c142f85a7850d0fbea418689608fdccac05;p=fanfix.git
diff --git a/src/be/nikiroo/utils/resources/TransBundle.java b/src/be/nikiroo/utils/resources/TransBundle.java
index a380440..7b2edb1 100644
--- a/src/be/nikiroo/utils/resources/TransBundle.java
+++ b/src/be/nikiroo/utils/resources/TransBundle.java
@@ -8,8 +8,6 @@ import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
-import be.nikiroo.utils.resources.Bundles;
-
/**
* This class manages a translation-dedicated Bundle.
*
@@ -19,6 +17,9 @@ import be.nikiroo.utils.resources.Bundles;
*
DUMMY will return "[DUMMY]" (maybe with a suffix and/or "NOUTF")
*
*
+ * @param
+ * the enum to use to get values out of this class
+ *
* @author niki
*/
public class TransBundle> extends Bundle {
@@ -35,8 +36,7 @@ public class TransBundle> extends Bundle {
* the name of the {@link Bundles}
*/
public TransBundle(Class type, Enum> name) {
- super(type, name);
- setLanguage(null);
+ this(type, name, (Locale) null);
}
/**
@@ -48,11 +48,27 @@ public class TransBundle> extends Bundle {
* @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 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 type, Enum> name, Locale language) {
+ super(type, name, null);
+ setLocale(language);
}
/**
@@ -121,15 +137,19 @@ public class TransBundle> extends Bundle {
} 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;
}
/**
@@ -152,13 +172,36 @@ public class TransBundle> extends Bundle {
}
/**
- * 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 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;
}
/**
@@ -168,15 +211,31 @@ public class TransBundle> extends Bundle {
* 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);
+ 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() {
- setBundle(name, locale);
+ public void reload(boolean resetToDefault) {
+ setBundle(keyType, locale, resetToDefault);
}
@Override
@@ -199,16 +258,26 @@ public class TransBundle> extends Bundle {
@Override
public void updateFile(String path) throws IOException {
String prev = locale.getLanguage();
+ Object status = takeSnapshot();
- setLanguage(null); // default locale
+ // default locale
+ 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);
}
@Override
@@ -216,10 +285,10 @@ public class TransBundle> extends Bundle {
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;
@@ -259,8 +328,12 @@ public class TransBundle> extends Bundle {
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);
}
}
@@ -271,29 +344,28 @@ public class TransBundle> extends Bundle {
* 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;
}