From 73d30af8f72acd35da538765db4dc2d84cd70841 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 17 Apr 2018 13:05:37 +0200 Subject: [PATCH] Improve localisation --- .../argeo/cms/e4/handlers/LocaleAddon.java | 2 ++ org.argeo.cms/src/org/argeo/cms/CmsMsg.java | 13 -------- .../src/org/argeo/cms/auth/CurrentUser.java | 33 ++++++++++++++----- .../cms/i18n/DefaultsResourceBundle.java | 1 + .../src/org/argeo/cms/i18n/LocaleUtils.java | 5 ++- .../src/org/argeo/cms/i18n/Localized.java | 14 +++++++- 6 files changed, 44 insertions(+), 24 deletions(-) diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/LocaleAddon.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/LocaleAddon.java index 265b21309..e1a2581dc 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/LocaleAddon.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/LocaleAddon.java @@ -6,6 +6,7 @@ import java.util.Locale; import javax.annotation.PostConstruct; import javax.security.auth.Subject; +import org.argeo.eclipse.ui.specific.UiContext; import org.eclipse.e4.core.services.nls.ILocaleChangeService; public class LocaleAddon { @@ -14,5 +15,6 @@ public class LocaleAddon { Subject subject = Subject.getSubject(AccessController.getContext()); Locale locale = subject.getPublicCredentials(Locale.class).iterator().next(); localeChangeService.changeApplicationLocale(locale); + UiContext.setLocale(locale); } } diff --git a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java index 89f1921c4..521ceedef 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java @@ -1,22 +1,9 @@ package org.argeo.cms; -import java.util.Locale; - -import org.argeo.cms.i18n.LocaleUtils; import org.argeo.cms.i18n.Localized; public enum CmsMsg implements Localized { username, password, login, logout, register, changePassword, currentPassword, newPassword, repeatNewPassword, passwordChanged; - 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/auth/CurrentUser.java b/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java index ef56adc33..34f4457ed 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java @@ -22,6 +22,7 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.acl.Group; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; @@ -30,6 +31,7 @@ import javax.security.auth.x500.X500Principal; import org.argeo.cms.CmsException; import org.argeo.cms.internal.auth.CmsSessionImpl; +import org.argeo.cms.internal.kernel.Activator; import org.argeo.node.NodeConstants; import org.osgi.service.useradmin.Authorization; @@ -38,7 +40,7 @@ import org.osgi.service.useradmin.Authorization; * context. */ public final class CurrentUser { -// private final static Log log = LogFactory.getLog(CurrentUser.class); + // private final static Log log = LogFactory.getLog(CurrentUser.class); // private final static BundleContext bc = // FrameworkUtil.getBundle(CurrentUser.class).getBundleContext(); /* @@ -48,16 +50,15 @@ public final class CurrentUser { /** * Technical username of the currently authenticated user. * - * @return the authenticated username or null if not authenticated / - * anonymous + * @return the authenticated username or null if not authenticated / anonymous */ public static String getUsername() { return getUsername(currentSubject()); } /** - * Human readable name of the currently authenticated user (typically first - * name and last name). + * Human readable name of the currently authenticated user (typically first name + * and last name). */ public static String getDisplayName() { return getDisplayName(currentSubject()); @@ -68,6 +69,11 @@ public final class CurrentUser { return isAnonymous(currentSubject()); } + /** Locale of the current user */ + public final static Locale locale() { + return locale(currentSubject()); + } + /** Roles of the currently logged-in user */ public final static Set roles() { return roles(currentSubject()); @@ -115,6 +121,15 @@ public final class CurrentUser { return roles; } + public final static Locale locale(Subject subject) { + Set locales = subject.getPublicCredentials(Locale.class); + if (locales.isEmpty()) { + Locale defaultLocale = Activator.getNodeState().getDefaultLocale(); + return defaultLocale; + } else + return locales.iterator().next(); + } + /** Whether this user is currently authenticated. */ public static boolean isAnonymous(Subject subject) { if (subject == null) @@ -152,8 +167,8 @@ public final class CurrentUser { /** * The node authenticated component (typically a CMS view) related to this - * display, or null if none is available from this call. Not API: Only - * for low-level access. + * display, or null if none is available from this call. Not API: Only for + * low-level access. */ // private static CmsAuthenticated getNodeAuthenticated() { // return UiContext.getData(CmsAuthenticated.KEY); @@ -171,8 +186,8 @@ public final class CurrentUser { return false; CmsSessionImpl cmsSession = CmsSessionImpl.getByUuid(nodeSessionId.toString()); cmsSession.close(); -// if (log.isDebugEnabled()) -// log.debug("Logged out CMS session " + cmsSession.getUuid()); + // if (log.isDebugEnabled()) + // log.debug("Logged out CMS session " + cmsSession.getUuid()); return true; } 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 1c9aff0ca..78d717a20 100644 --- a/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java +++ b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java @@ -9,6 +9,7 @@ import java.util.Vector; import org.argeo.cms.CmsException; /** Expose the default values as a {@link ResourceBundle} */ +@Deprecated public class DefaultsResourceBundle extends ResourceBundle { @Override diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java b/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java index 700e73105..e0a77bcf3 100644 --- a/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Locale; import java.util.ResourceBundle; +import org.argeo.cms.auth.CurrentUser; + /** Utilities simplifying the development of localization enums. */ public class LocaleUtils { public static Object local(Enum en) { @@ -37,9 +39,10 @@ public class LocaleUtils { } static Locale getCurrentLocale() { + return CurrentUser.locale(); // return UiContext.getLocale(); // FIXME look into Subject or settings - return Locale.getDefault(); + // return Locale.getDefault(); } /** Returns null if argument is null. */ diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java b/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java index b34cc6ca8..9378d476d 100644 --- a/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java +++ b/org.argeo.cms/src/org/argeo/cms/i18n/Localized.java @@ -4,5 +4,17 @@ import java.util.Locale; /** Localized object. */ public interface Localized { - public Object local(Locale locale); + /** Default assumes that this is an {@link Enum} */ + default Object local(Locale locale) { + return LocaleUtils.local((Enum) this, locale); + } + + default String lead() { + return LocaleUtils.lead(this); + } + + default String lead(Locale locale) { + return LocaleUtils.lead(local(locale).toString(), locale); + } + } -- 2.30.2