From: Mathieu Baudier Date: Sun, 7 Feb 2021 09:14:41 +0000 (+0100) Subject: Improve localization framework. X-Git-Tag: argeo-commons-2.1.101~4^2 X-Git-Url: http://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=11c9710b1d2456c8304a5841d775af008a794431 Improve localization framework. --- diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/auth/CmsLogin.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/auth/CmsLogin.java index c6a31900b..48ac9a0c9 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/auth/CmsLogin.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/auth/CmsLogin.java @@ -251,7 +251,7 @@ public class CmsLogin implements CmsStyles, CallbackHandler { Button button = new Button(c, SWT.RADIO); CmsUiUtils.style(button, CMS_USER_MENU_ITEM); button.setData(i); - button.setText(LocaleUtils.lead(locale.getDisplayName(locale), locale) + " (" + locale + ")"); + button.setText(LocaleUtils.toLead(locale.getDisplayName(locale), locale) + " (" + locale + ")"); // button.addListener(SWT.Selection, listener); button.addSelectionListener(selectionListener); if (i == localeChoice.getSelectedIndex()) diff --git a/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java b/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java index 5ddb1dab1..8101563d9 100644 --- a/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java @@ -14,6 +14,8 @@ import org.argeo.cms.auth.CurrentUser; /** 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 threadLocale = new ThreadLocal<>(); @@ -22,36 +24,54 @@ public class LocaleUtils { 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) { @@ -61,16 +81,24 @@ public class LocaleUtils { 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() { diff --git a/org.argeo.cms/src/org/argeo/cms/Localized.java b/org.argeo.cms/src/org/argeo/cms/Localized.java index d4558cac6..0a3bd18a8 100644 --- a/org.argeo.cms/src/org/argeo/cms/Localized.java +++ b/org.argeo.cms/src/org/argeo/cms/Localized.java @@ -4,17 +4,23 @@ import java.text.MessageFormat; 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); @@ -22,9 +28,9 @@ public interface Localized { } 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; @@ -34,9 +40,14 @@ public interface Localized { } @Override - public Object local(Locale locale) { + public String local(Locale locale) { return msg; } + @Override + public String name() { + return null; + } + } }