X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FTransBundle.java;h=28fa2802e215eab074ff51405d7488b733f84459;hb=d46b7b96f94e88a776bcd2dfd756549ffb300cc9;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..28fa280 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,16 @@ 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); } 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 +169,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 +208,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 +255,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 +282,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 +325,9 @@ 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); + boolean set = isSet(id, false); + writeValue(writer, name, value, set); } } @@ -271,29 +338,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; }