From: Mathieu Baudier Date: Sat, 17 Oct 2015 13:21:18 +0000 (+0000) Subject: Improve i18n X-Git-Tag: argeo-commons-2.1.30~76 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=5146af93007c599cf9edb35d8b173753bc45a52f;p=lgpl%2Fargeo-commons.git Improve i18n git-svn-id: https://svn.argeo.org/commons/trunk@8502 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.cms/OSGI-INF/l10n/bundle.properties b/org.argeo.cms/OSGI-INF/l10n/bundle.properties new file mode 100644 index 000000000..281799155 --- /dev/null +++ b/org.argeo.cms/OSGI-INF/l10n/bundle.properties @@ -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 index 000000000..dc25d31a1 --- /dev/null +++ b/org.argeo.cms/OSGI-INF/l10n/bundle_fr.properties @@ -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 index 000000000..5cacae44c --- /dev/null +++ b/org.argeo.cms/OSGI-INF/l10n/bundle_ru.properties @@ -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é diff --git a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java index 6d118db07..89f1921c4 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java @@ -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 index dc25d31a1..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsMsg_fr.properties +++ /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 index 5cacae44c..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsMsg_ru.properties +++ /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é diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java index 2fc9cbc5f..1c9aff0ca 100644 --- a/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java +++ b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java @@ -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 index 000000000..e422e21fe --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java @@ -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 index 000000000..b34cc6ca8 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java @@ -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 index bbbd590cd..000000000 --- a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java +++ /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); - } - } - } - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java index 1220c12a2..91c28078e 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java @@ -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()) diff --git a/org.argeo.security.ui.rap/OSGI-INF/l10n/bundle_ru.properties b/org.argeo.security.ui.rap/OSGI-INF/l10n/bundle_ru.properties index a5c51e867..11dd1007c 100644 --- a/org.argeo.security.ui.rap/OSGI-INF/l10n/bundle_ru.properties +++ b/org.argeo.security.ui.rap/OSGI-INF/l10n/bundle_ru.properties @@ -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