/** Utilities simplifying the development of localization enums. */
public class LocaleUtils {
+ final static String DEFAULT_OSGI_l10N_BUNDLE = "/OSGI-INF/l10n/bundle";
+
private final static Log log = LogFactory.getLog(LocaleUtils.class);
private final static ThreadLocal<Locale> threadLocale = new ThreadLocal<>();
threadLocale.set(locale);
}
+ public static String local(Localized localized) {
+ return local(localized.name(), localized.getClass().getClassLoader());
+ }
+
+ public static String local(Localized localized, Locale locale) {
+ if (localized.name() == null) // untranslated
+ return localized.local(locale);
+ return local(localized.name(), locale, localized.getClass().getClassLoader());
+ }
+
+ @Deprecated
public static String local(Enum<?> en) {
- return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
+ return local(en, getCurrentLocale(), DEFAULT_OSGI_l10N_BUNDLE);
}
+ @Deprecated
public static String local(Enum<?> en, Locale locale) {
- return local(en, locale, "/OSGI-INF/l10n/bundle");
+ return local(en, locale, DEFAULT_OSGI_l10N_BUNDLE);
}
+ @Deprecated
public static String local(Enum<?> en, Locale locale, String resource) {
return local(en, locale, resource, en.getClass().getClassLoader());
}
+ @Deprecated
public static String local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
return local(en.name(), locale, resource, classLoader);
}
public static String local(String key, ClassLoader classLoader) {
- return local(key, getCurrentLocale(), "/OSGI-INF/l10n/bundle", classLoader);
+ return local(key, getCurrentLocale(), DEFAULT_OSGI_l10N_BUNDLE, classLoader);
}
public static String local(String key, Locale locale, ClassLoader classLoader) {
- return local(key, locale, "/OSGI-INF/l10n/bundle", classLoader);
+ return local(key, locale, DEFAULT_OSGI_l10N_BUNDLE, classLoader);
}
+ /** Where the search for a message is actually performed. */
public static String local(String key, Locale locale, String resource, ClassLoader classLoader) {
ResourceBundle rb = ResourceBundle.getBundle(resource, locale, classLoader);
assert key.length() > 2;
if (isLocaleKey(key))
key = key.substring(1);
- return rb.getString(key);
+ if (rb.containsKey(key))
+ return rb.getString(key);
+ else // for simple cases, the key will actually be the English word
+ return key;
}
public static boolean isLocaleKey(String str) {
return false;
}
- public static String lead(String raw, Locale locale) {
+ /** Lead transformation on the translated string. */
+ public static String toLead(String raw, Locale locale) {
return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
}
+ public static String lead(Localized localized, ClassLoader classLoader) {
+ Locale locale = getCurrentLocale();
+ if (localized.name() == null)// untranslated
+ return toLead(localized.local(locale), locale);
+ return toLead(local(localized.name(), getCurrentLocale(), DEFAULT_OSGI_l10N_BUNDLE, classLoader), locale);
+ }
+
public static String lead(Localized localized) {
return lead(localized, getCurrentLocale());
}
public static String lead(Localized localized, Locale locale) {
- return lead(localized.local(locale).toString(), locale);
+ return toLead(local(localized, locale), locale);
}
static Locale getCurrentLocale() {
import java.util.Locale;
/** Localized object. */
+@FunctionalInterface
public interface Localized {
+ String name();
/** Default assumes that this is an {@link Enum} */
- default Object local(Locale locale) {
- return LocaleUtils.local((Enum<?>) this, locale);
+ default String local(Locale locale) {
+ return LocaleUtils.local(this, locale);
}
default String lead() {
return LocaleUtils.lead(this);
}
+ default String local() {
+ return LocaleUtils.local(this);
+ }
+
default String format(Object[] args) {
Locale locale = LocaleUtils.getCurrentLocale();
MessageFormat format = new MessageFormat(local(locale).toString(), locale);
}
default String lead(Locale locale) {
- return LocaleUtils.lead(local(locale).toString(), locale);
+ return LocaleUtils.toLead(local(locale).toString(), locale);
}
-
+
static class Untranslated implements Localized {
private String msg;
}
@Override
- public Object local(Locale locale) {
+ public String local(Locale locale) {
return msg;
}
+ @Override
+ public String name() {
+ return null;
+ }
+
}
}