Improve i18n
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Oct 2015 13:21:18 +0000 (13:21 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Oct 2015 13:21:18 +0000 (13:21 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8502 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

12 files changed:
org.argeo.cms/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
org.argeo.cms/OSGI-INF/l10n/bundle_fr.properties [new file with mode: 0644]
org.argeo.cms/OSGI-INF/l10n/bundle_ru.properties [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/CmsMsg.java
org.argeo.cms/src/org/argeo/cms/CmsMsg_fr.properties [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsMsg_ru.properties [deleted file]
org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java
org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/i18n/Localized.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/i18n/Msg.java [deleted file]
org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java
org.argeo.security.ui.rap/OSGI-INF/l10n/bundle_ru.properties

diff --git a/org.argeo.cms/OSGI-INF/l10n/bundle.properties b/org.argeo.cms/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..2817991
--- /dev/null
@@ -0,0 +1,5 @@
+username=username
+password=password
+logout=log out
+login=sign in
+register=register
diff --git a/org.argeo.cms/OSGI-INF/l10n/bundle_fr.properties b/org.argeo.cms/OSGI-INF/l10n/bundle_fr.properties
new file mode 100644 (file)
index 0000000..dc25d31
--- /dev/null
@@ -0,0 +1,11 @@
+username=identifiant
+password=mot de passe
+logout=déconnexion
+login=connexion
+register=créer un compte
+
+changePassword=changement de mot de passe
+currentPassword=mot de passe actuel
+newPassword=nouveau mot de passe
+repeatNewPassword=répéter le nouveau mot de passe
+passwordChanged=mot de passe changé
diff --git a/org.argeo.cms/OSGI-INF/l10n/bundle_ru.properties b/org.argeo.cms/OSGI-INF/l10n/bundle_ru.properties
new file mode 100644 (file)
index 0000000..5cacae4
--- /dev/null
@@ -0,0 +1,11 @@
+username=\u0438\u043C\u044F
+password=\u043F\u0430\u0440\u043E\u043B\u044C
+logout=\u0432\u044B\u0439\u0442\u0438
+login=\u0432\u043E\u0439\u0442\u0438
+register=créer un compte
+
+changePassword=\u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C
+currentPassword=mot de passe actuel
+newPassword=nouveau mot de passe
+repeatNewPassword=répéter le nouveau mot de passe
+passwordChanged=mot de passe changé
index 6d118db078d1ad7df2a87913fd71a1e29fa89aa6..89f1921c4d53dd3e160400cc61113ee8be31f9e8 100644 (file)
@@ -1,23 +1,22 @@
 package org.argeo.cms;
 
-import org.argeo.cms.i18n.DefaultsResourceBundle;
-import org.argeo.cms.i18n.Msg;
+import java.util.Locale;
 
-/** Standard CMS messages. */
-public class CmsMsg extends DefaultsResourceBundle {
-       public final static Msg username = new Msg("username");
-       public final static Msg password = new Msg("password");
-       public final static Msg logout = new Msg("log out");
-       public final static Msg login = new Msg("sign in");
-       public final static Msg register = new Msg("register");
+import org.argeo.cms.i18n.LocaleUtils;
+import org.argeo.cms.i18n.Localized;
 
-       public final static Msg changePassword = new Msg("change password");
-       public final static Msg currentPassword = new Msg("current password");
-       public final static Msg newPassword = new Msg("new password");
-       public final static Msg repeatNewPassword = new Msg("repeat new password");
-       public final static Msg passwordChanged = new Msg("password changed");
+public enum CmsMsg implements Localized {
+       username, password, login, logout, register, changePassword, currentPassword, newPassword, repeatNewPassword, passwordChanged;
 
-       static {
-               Msg.init(CmsMsg.class);
+       public Object local(Locale locale) {
+               return LocaleUtils.local(this, locale);
+       }
+
+       public String lead() {
+               return LocaleUtils.lead(this);
+       }
+
+       public String lead(Locale locale) {
+               return LocaleUtils.lead(local(locale).toString(), locale);
        }
 }
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsMsg_fr.properties b/org.argeo.cms/src/org/argeo/cms/CmsMsg_fr.properties
deleted file mode 100644 (file)
index dc25d31..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-username=identifiant
-password=mot de passe
-logout=déconnexion
-login=connexion
-register=créer un compte
-
-changePassword=changement de mot de passe
-currentPassword=mot de passe actuel
-newPassword=nouveau mot de passe
-repeatNewPassword=répéter le nouveau mot de passe
-passwordChanged=mot de passe changé
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsMsg_ru.properties b/org.argeo.cms/src/org/argeo/cms/CmsMsg_ru.properties
deleted file mode 100644 (file)
index 5cacae4..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-username=\u0438\u043C\u044F
-password=\u043F\u0430\u0440\u043E\u043B\u044C
-logout=\u0432\u044B\u0439\u0442\u0438
-login=\u0432\u043E\u0439\u0442\u0438
-register=créer un compte
-
-changePassword=\u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C
-currentPassword=mot de passe actuel
-newPassword=nouveau mot de passe
-repeatNewPassword=répéter le nouveau mot de passe
-passwordChanged=mot de passe changé
index 2fc9cbc5fa1d67b73bf79a78ae7f0e61cbf22d90..1c9aff0ca5e1d48245975e8c7556b6ccfa4830f4 100644 (file)
@@ -31,7 +31,7 @@ public class DefaultsResourceBundle extends ResourceBundle {
 
                for (Field field : fieldArray) {
                        if (Modifier.isStatic(field.getModifiers())
-                                       && field.getType().isAssignableFrom(Msg.class)) {
+                                       && field.getType().isAssignableFrom(LocaleUtils.class)) {
                                res.add(field.getName());
                        }
                }
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java b/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java
new file mode 100644 (file)
index 0000000..e422e21
--- /dev/null
@@ -0,0 +1,150 @@
+package org.argeo.cms.i18n;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import org.argeo.eclipse.ui.specific.UiContext;
+
+/** Utilities simplifying the development of localization enums. */
+public class LocaleUtils {
+       public static Object local(Enum<?> en) {
+               return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
+       }
+
+       public static Object local(Enum<?> en, Locale locale) {
+               return local(en, locale, "/OSGI-INF/l10n/bundle");
+       }
+
+       public static Object local(Enum<?> en, Locale locale, String resource) {
+               return local(en, locale, resource, en.getClass().getClassLoader());
+       }
+
+       public static Object local(Enum<?> en, Locale locale, String resource,
+                       ClassLoader classLoader) {
+               ResourceBundle rb = ResourceBundle.getBundle(resource, locale,
+                               classLoader);
+               return rb.getString(en.name());
+       }
+
+       public static String lead(String raw, Locale locale) {
+               return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
+       }
+
+       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);
+       }
+
+       static Locale getCurrentLocale() {
+               return UiContext.getLocale();
+       }
+       // private String id;
+       // private ClassLoader classLoader;
+       // private final Object defaultLocal;
+       //
+       // public Msg() {
+       // defaultLocal = null;
+       // }
+       //
+       // public Msg(Object defaultMessage) {
+       // this.defaultLocal = defaultMessage;
+       // }
+       //
+       // public String getId() {
+       // return id;
+       // }
+       //
+       // public void setId(String id) {
+       // this.id = id;
+       // }
+       //
+       // public ClassLoader getClassLoader() {
+       // return classLoader;
+       // }
+       //
+       // public void setClassLoader(ClassLoader classLoader) {
+       // this.classLoader = classLoader;
+       // }
+       //
+       // public Object getDefault() {
+       // return defaultLocal;
+       // }
+       //
+       // public String toString() {
+       // return local().toString();
+       // }
+       //
+       // /** When used as the first word of a sentence. */
+       // public String lead() {
+       // return lead(UiContext.getLocale());
+       // }
+       //
+       // public String lead(Locale locale) {
+       // return lead(this, locale);
+       // }
+
+       // private static String lead(Msg msg, Locale locale) {
+       // String raw = msg.local(locale).toString();
+       // return lead(raw, locale);
+       // }
+
+       // public Object local() {
+       // Object local = local(this);
+       // if (local == null)
+       // local = getDefault();
+       // if (local == null)
+       // throw new CmsException("No translation found for " + id);
+       // return local;
+       // }
+       //
+       // public Object local(Locale locale) {
+       // Object local = local(this, locale);
+       // if (local == null)
+       // local = getDefault();
+       // if (local == null)
+       // throw new CmsException("No translation found for " + id);
+       // return local;
+       // }
+       //
+       // private static Object local(Msg msg) {
+       // Locale locale = UiContext.getLocale();
+       // return local(msg, locale);
+       // }
+       //
+       // public static Object local(Msg msg, Locale locale) {
+       // String key = msg.getId();
+       // int lastDot = key.lastIndexOf('.');
+       // String className = key.substring(0, lastDot);
+       // String fieldName = key.substring(lastDot + 1);
+       // ResourceBundle rb = ResourceBundle.getBundle("/OSGI-INF/l10n/bundle",
+       // locale, msg.getClassLoader());
+       // // ResourceBundle rb = ResourceBundle.getBundle(className, locale,
+       // // msg.getClassLoader());
+       // return rb.getString(fieldName);
+       // }
+
+       // public static void init(Class<?> clss) {
+       // final Field[] fieldArray = clss.getDeclaredFields();
+       // ClassLoader loader = clss.getClassLoader();
+       //
+       // for (Field field : fieldArray) {
+       // if (Modifier.isStatic(field.getModifiers())
+       // && field.getType().isAssignableFrom(Msg.class)) {
+       // try {
+       // Object obj = field.get(null);
+       // String id = clss.getCanonicalName() + "." + field.getName();
+       // obj.getClass().getMethod("setId", String.class)
+       // .invoke(obj, id);
+       // obj.getClass()
+       // .getMethod("setClassLoader", ClassLoader.class)
+       // .invoke(obj, loader);
+       // } catch (Exception e) {
+       // throw new CmsException("Cannot prepare field " + field);
+       // }
+       // }
+       // }
+       // }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java b/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java
new file mode 100644 (file)
index 0000000..b34cc6c
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.cms.i18n;
+
+import java.util.Locale;
+
+/** Localized object. */
+public interface Localized {
+       public Object local(Locale locale);
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java
deleted file mode 100644 (file)
index bbbd590..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.argeo.cms.i18n;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.argeo.cms.CmsException;
-import org.argeo.eclipse.ui.specific.UiContext;
-
-/** A single message to be internationalised. */
-public class Msg {
-       private String id;
-       private ClassLoader classLoader;
-       private final Object defaultLocal;
-
-       public Msg() {
-               defaultLocal = null;
-       }
-
-       public Msg(Object defaultMessage) {
-               this.defaultLocal = defaultMessage;
-       }
-
-       public String getId() {
-               return id;
-       }
-
-       public void setId(String id) {
-               this.id = id;
-       }
-
-       public ClassLoader getClassLoader() {
-               return classLoader;
-       }
-
-       public void setClassLoader(ClassLoader classLoader) {
-               this.classLoader = classLoader;
-       }
-
-       public Object getDefault() {
-               return defaultLocal;
-       }
-
-       public String toString() {
-               return local().toString();
-       }
-
-       /** When used as the first word of a sentence. */
-       public String lead() {
-               return lead(UiContext.getLocale());
-       }
-
-       public String lead(Locale locale) {
-               return lead(this, locale);
-       }
-
-       private static String lead(Msg msg, Locale locale) {
-               String raw = msg.local(locale).toString();
-               return lead(raw, locale);
-       }
-
-       public static String lead(String raw, Locale locale) {
-               return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
-       }
-
-       public Object local() {
-               Object local = local(this);
-               if (local == null)
-                       local = getDefault();
-               if (local == null)
-                       throw new CmsException("No translation found for " + id);
-               return local;
-       }
-
-       public Object local(Locale locale) {
-               Object local = local(this, locale);
-               if (local == null)
-                       local = getDefault();
-               if (local == null)
-                       throw new CmsException("No translation found for " + id);
-               return local;
-       }
-
-       private static Object local(Msg msg) {
-               Locale locale = UiContext.getLocale();
-               return local(msg, locale);
-       }
-
-       private static Object local(Msg msg, Locale locale) {
-               String key = msg.getId();
-               int lastDot = key.lastIndexOf('.');
-               String className = key.substring(0, lastDot);
-               String fieldName = key.substring(lastDot + 1);
-               ResourceBundle rb = ResourceBundle.getBundle(className, locale,
-                               msg.getClassLoader());
-               return rb.getString(fieldName);
-       }
-
-       public static void init(Class<?> clss) {
-               final Field[] fieldArray = clss.getDeclaredFields();
-               ClassLoader loader = clss.getClassLoader();
-
-               for (Field field : fieldArray) {
-                       if (Modifier.isStatic(field.getModifiers())
-                                       && field.getType().isAssignableFrom(Msg.class)) {
-                               try {
-                                       Object obj = field.get(null);
-                                       String id = clss.getCanonicalName() + "." + field.getName();
-                                       obj.getClass().getMethod("setId", String.class)
-                                                       .invoke(obj, id);
-                                       obj.getClass()
-                                                       .getMethod("setClassLoader", ClassLoader.class)
-                                                       .invoke(obj, loader);
-                               } catch (Exception e) {
-                                       throw new CmsException("Cannot prepare field " + field);
-                               }
-                       }
-               }
-       }
-}
index 1220c12a28430d3a59562eb469f292c29e89725b..91c28078ee5fb33ba3523718dc09c39359230053 100644 (file)
@@ -26,7 +26,7 @@ import org.argeo.cms.CmsStyles;
 import org.argeo.cms.CmsView;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.HttpRequestCallback;
-import org.argeo.cms.i18n.Msg;
+import org.argeo.cms.i18n.LocaleUtils;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.util.LocaleChoice;
 import org.eclipse.rap.rwt.RWT;
@@ -113,6 +113,8 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
        }
 
        protected Composite userUi(Composite parent) {
+               Locale locale = localeChoice == null ? this.defaultLocale
+                               : localeChoice.getSelectedLocale();
                credentialsBlock = new Composite(parent, SWT.NONE);
                credentialsBlock.setLayout(new GridLayout());
                credentialsBlock.setLayoutData(CmsUtils.fillAll());
@@ -121,7 +123,7 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
 
                Label l = new Label(credentialsBlock, SWT.NONE);
                l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM);
-               l.setText(CmsMsg.logout.lead());
+               l.setText(CmsMsg.logout.lead(locale));
                GridData lData = CmsUtils.fillWidth();
                lData.widthHint = 120;
                l.setLayoutData(lData);
@@ -200,8 +202,10 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
        }
 
        protected void updateLocale(Locale selectedLocale) {
-               // usernameT.setMessage(username.lead(selectedLocale));
-               // passwordT.setMessage(password.lead(selectedLocale));
+               // save already entered values
+               String usernameStr = usernameT.getText();
+               char[] pwd = passwordT.getTextChars();
+               
                for (Control child : parent.getChildren())
                        child.dispose();
                createContents(parent);
@@ -209,6 +213,8 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
                        parent.getParent().layout();
                else
                        parent.layout();
+               usernameT.setText(usernameStr);
+               passwordT.setTextChars(pwd);
        }
 
        protected Composite createLocalesBlock(final Composite parent) {
@@ -234,8 +240,8 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
                        Locale locale = locales.get(i);
                        Button button = new Button(c, SWT.RADIO);
                        button.setData(i);
-                       button.setText(Msg.lead(locale.getDisplayName(locale), locale)
-                                       + " (" + locale + ")");
+                       button.setText(LocaleUtils.lead(locale.getDisplayName(locale),
+                                       locale) + " (" + locale + ")");
                        // button.addListener(SWT.Selection, listener);
                        button.addSelectionListener(selectionListener);
                        if (i == localeChoice.getSelectedIndex())
index a5c51e867c8e5538c3124c9c257cd153537e1d1f..11dd1007ccc7d966cca0f6a4ee607e1eb1c20af4 100644 (file)
@@ -1 +1 @@
-changePassword=\u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C
+changePassword=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C