Improve localization framework.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 7 Feb 2021 09:14:41 +0000 (10:14 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 7 Feb 2021 09:14:41 +0000 (10:14 +0100)
org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/auth/CmsLogin.java
org.argeo.cms/src/org/argeo/cms/LocaleUtils.java
org.argeo.cms/src/org/argeo/cms/Localized.java

index c6a31900b061c333d0741a0f7f7f45056b593970..48ac9a0c9557da63d39f578f62a2ff7b144ce639 100644 (file)
@@ -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 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())
                        // button.addListener(SWT.Selection, listener);
                        button.addSelectionListener(selectionListener);
                        if (i == localeChoice.getSelectedIndex())
index 5ddb1dab1c01e0657e90eea1e211d2ad22bae517..8101563d95e9fee6bbe3c4c6d51510206e5c0cc1 100644 (file)
@@ -14,6 +14,8 @@ import org.argeo.cms.auth.CurrentUser;
 
 /** Utilities simplifying the development of localization enums. */
 public class LocaleUtils {
 
 /** 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<>();
        private final static Log log = LogFactory.getLog(LocaleUtils.class);
 
        private final static ThreadLocal<Locale> threadLocale = new ThreadLocal<>();
@@ -22,36 +24,54 @@ public class LocaleUtils {
                threadLocale.set(locale);
        }
 
                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) {
        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) {
        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());
        }
 
        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) {
        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) {
        }
 
        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);
        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) {
        }
 
        public static boolean isLocaleKey(String str) {
@@ -61,16 +81,24 @@ public class LocaleUtils {
                        return false;
        }
 
                        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);
        }
 
                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) {
        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() {
        }
 
        static Locale getCurrentLocale() {
index d4558cac6092c3e4c9e07bc4442165e272cc0024..0a3bd18a862fd73a048a0993242b5d0c00c2d805 100644 (file)
@@ -4,17 +4,23 @@ import java.text.MessageFormat;
 import java.util.Locale;
 
 /** Localized object. */
 import java.util.Locale;
 
 /** Localized object. */
+@FunctionalInterface
 public interface Localized {
 public interface Localized {
+       String name();
 
        /** Default assumes that this is an {@link Enum} */
 
        /** 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 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 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) {
        }
 
        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;
 
        static class Untranslated implements Localized {
                private String msg;
 
@@ -34,9 +40,14 @@ public interface Localized {
                }
 
                @Override
                }
 
                @Override
-               public Object local(Locale locale) {
+               public String local(Locale locale) {
                        return msg;
                }
 
                        return msg;
                }
 
+               @Override
+               public String name() {
+                       return null;
+               }
+
        }
 }
        }
 }