diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/EntityMetadataConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/EntityMetadataConfigurationUnitBuilder.java index 9f9d6673..647c16af 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/EntityMetadataConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/EntityMetadataConfigurationUnitBuilder.java @@ -31,6 +31,8 @@ public interface EntityMetadataConfigurationUnitBuilder extends ConfigurationUni EntityMetadataConfigurationUnitBuilder pluralName(String pluralName); + EntityMetadataConfigurationUnitBuilder i18n(boolean i18n); + EntityMetadataConfigurationUnitBuilder field(String fieldName); EntityMetadataConfigurationUnitBuilder enumeration(EnumElement... elements); diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/FieldSetConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/FieldSetConfigurationUnitBuilder.java index 717aca95..4eed7f75 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/FieldSetConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/FieldSetConfigurationUnitBuilder.java @@ -26,6 +26,8 @@ public interface FieldSetConfigurationUnitBuilder extends ConfigurationUnitBuild FieldSetConfigurationUnitBuilder caption(String caption); + FieldSetConfigurationUnitBuilder captionKey(String caption); + FieldSetConfigurationUnitBuilder dynamic(String expression); FieldSetConfigurationUnitBuilder renderable(FieldValueRenderer renderer); diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/PersistentFieldSetConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/PersistentFieldSetConfigurationUnitBuilder.java index 88d316e7..afa2f97f 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/PersistentFieldSetConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/PersistentFieldSetConfigurationUnitBuilder.java @@ -26,6 +26,8 @@ public interface PersistentFieldSetConfigurationUnitBuilder extends Configuratio PersistentFieldSetConfigurationUnitBuilder caption(String caption); + PersistentFieldSetConfigurationUnitBuilder captionKey(String captionKey); + @Deprecated PersistentFieldSetConfigurationUnitBuilder enumeration(String... values); diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/ScreenContextConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/ScreenContextConfigurationUnitBuilder.java index 5488d601..f76385a5 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/ScreenContextConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/builder/ScreenContextConfigurationUnitBuilder.java @@ -22,4 +22,6 @@ public interface ScreenContextConfigurationUnitBuilder extends ConfigurationUnit ScreenContextConfigurationUnitBuilder screenName(String screenName); + ScreenContextConfigurationUnitBuilder i18n(boolean i18n); + } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/EntityMetadataConfigurationUnit.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/EntityMetadataConfigurationUnit.java index 53a7538f..3a6d67c6 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/EntityMetadataConfigurationUnit.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/EntityMetadataConfigurationUnit.java @@ -28,4 +28,6 @@ public interface EntityMetadataConfigurationUnit extends ConfigurationUnit { String getSingularName(); String getPluralName(); + + boolean i18n(); } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/ScreenContextConfigurationUnit.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/ScreenContextConfigurationUnit.java index a2acd098..af0742c4 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/ScreenContextConfigurationUnit.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/unit/ScreenContextConfigurationUnit.java @@ -20,4 +20,6 @@ public interface ScreenContextConfigurationUnit extends ConfigurationUnit { String getScreenName(); + + boolean i18n(); } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/EnumElement.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/EnumElement.java index 935f2560..75cb5c99 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/EnumElement.java +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/EnumElement.java @@ -23,10 +23,16 @@ public class EnumElement implements Serializable { private final Object value; private final String label; + private final boolean i18n; private EnumElement(Object value, String label) { + this(value,label, false); + } + + private EnumElement(Object value, String label, boolean i18n) { this.value = value; this.label = label; + this.i18n = i18n; } public Object getValue() { @@ -37,6 +43,10 @@ public String getLabel() { return label; } + public boolean isI18n() { + return i18n; + } + public static EnumElement element(int value, String label) { return new EnumElement(value, label); } @@ -49,4 +59,15 @@ public static EnumElement element(String value, String label) { return new EnumElement(value, label); } + public static EnumElement element(int value, String label, boolean i18n) { + return new EnumElement(value, label, i18n); + } + + public static EnumElement element(long value, String label, boolean i18n) { + return new EnumElement(value, label, i18n); + } + + public static EnumElement element(String value, String label, boolean i18n) { + return new EnumElement(value, label, i18n); + } } diff --git a/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/MessageSourceUtil.java b/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/MessageSourceUtil.java new file mode 100644 index 00000000..9a8525a2 --- /dev/null +++ b/lightadmin-core/src/main/java/org/lightadmin/api/config/utils/MessageSourceUtil.java @@ -0,0 +1,24 @@ +package org.lightadmin.api.config.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.stereotype.Component; + +@Component +public class MessageSourceUtil { + private static MessageSourceAccessor messages; + + @Autowired + private void setMessageSource(MessageSource messageSource) { + MessageSourceUtil.messages = new MessageSourceAccessor(messageSource); + } + + public static MessageSourceAccessor messages() { + return messages; + } + + public static String getMessage(String code) { + return messages.getMessage(code); + } +} diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/LightAdminConfiguration.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/LightAdminConfiguration.java index 3f7e6d28..c2f6f12d 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/LightAdminConfiguration.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/LightAdminConfiguration.java @@ -17,6 +17,7 @@ import java.io.File; import java.net.URI; +import java.util.List; public interface LightAdminConfiguration { @@ -42,4 +43,8 @@ public interface LightAdminConfiguration { boolean isFileStreamingEnabled(); + boolean isI18n(); + + String[] getLanguages(); + } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/StandardLightAdminConfiguration.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/StandardLightAdminConfiguration.java index f00624a3..7dfb7a84 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/StandardLightAdminConfiguration.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/StandardLightAdminConfiguration.java @@ -39,6 +39,8 @@ public class StandardLightAdminConfiguration implements LightAdminConfiguration private final boolean fileStreaming; private final String basePackage; private final boolean demoMode; + private boolean i18n; + private String[] languages; public StandardLightAdminConfiguration(ServletContext servletContext) { this.basePackage = servletContext.getInitParameter(LIGHT_ADMINISTRATION_BASE_PACKAGE); @@ -59,6 +61,12 @@ public StandardLightAdminConfiguration(ServletContext servletContext) { } else { this.securityLogoutUrl = servletContext.getContextPath() + defaultIfBlank(servletContext.getInitParameter(LIGHT_ADMINISTRATION_SECURITY_LOGOUT_URL), "#"); } + + this.i18n = BooleanUtils.toBoolean(servletContext.getInitParameter(LIGHT_ADMINISTRATION_I18N)); + + if(i18n) { + this.languages = servletContext.getInitParameter(LIGHT_ADMINISTRATION_LANGUAGES).split(","); + } } @Override @@ -81,6 +89,16 @@ public boolean isFileStreamingEnabled() { return fileStreaming; } + @Override + public boolean isI18n() { + return this.i18n; + } + + @Override + public String[] getLanguages() { + return this.languages; + } + @Override public String getBackToSiteUrl() { return backToSiteUrl; diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminContextConfiguration.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminContextConfiguration.java index 95dc1b5a..37d9388d 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminContextConfiguration.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminContextConfiguration.java @@ -26,6 +26,8 @@ import org.lightadmin.core.web.support.FileResourceLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; +import org.springframework.context.MessageSourceResolvable; +import org.springframework.context.NoSuchMessageException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -38,10 +40,9 @@ import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.CookieLocaleResolver; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; import org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory; import org.springframework.web.servlet.view.tiles3.TilesConfigurer; @@ -50,6 +51,7 @@ import javax.servlet.ServletContext; import java.util.Arrays; import java.util.List; +import java.util.Locale; import static org.lightadmin.core.util.LightAdminConfigurationUtils.LIGHT_ADMIN_CUSTOM_RESOURCE_CLASSPATH_LOCATION; import static org.springframework.web.servlet.DispatcherServlet.VIEW_RESOLVER_BEAN_NAME; @@ -60,7 +62,8 @@ LightAdminDomainConfiguration.class, LightAdminRemoteConfiguration.class, LightAdminRepositoryRestMvcConfiguration.class, - LightAdminViewConfiguration.class + LightAdminViewConfiguration.class, + LightAdminUtilsConfiguration.class }) @EnableWebMvc public class LightAdminContextConfiguration extends WebMvcConfigurerAdapter { @@ -128,10 +131,30 @@ public LocalValidatorFactoryBean validator() { return validator; } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("language"); + return localeChangeInterceptor; + } + + @Bean(name = "localeResolver") + public CookieLocaleResolver localeResolver() { + CookieLocaleResolver localeResolver = new CookieLocaleResolver(); + localeResolver.setDefaultLocale(Locale.ENGLISH); + localeResolver.setCookieName("adminLocale"); + return localeResolver; + } + @Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.setBasename("classpath:messages"); + messageSource.setBasenames("classpath:messages","classpath:i18n/messages"); messageSource.setDefaultEncoding("UTF-8"); messageSource.setCacheSeconds(0); messageSource.setFallbackToSystemLocale(false); diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminUtilsConfiguration.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminUtilsConfiguration.java new file mode 100644 index 00000000..a1523dd6 --- /dev/null +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/context/LightAdminUtilsConfiguration.java @@ -0,0 +1,7 @@ +package org.lightadmin.core.config.context; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan(basePackages = {"org.lightadmin.api.config.utils"}) +public class LightAdminUtilsConfiguration { +} diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/AbstractFieldSetConfigurationBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/AbstractFieldSetConfigurationBuilder.java index 2cec196c..8c7c7841 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/AbstractFieldSetConfigurationBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/AbstractFieldSetConfigurationBuilder.java @@ -56,6 +56,17 @@ public B caption(final String caption) { assertFieldMetadataIsNotNull(); currentFieldMetadata.setName(caption); + currentFieldMetadata.setI18n(false); + + return (B) this; + } + + @SuppressWarnings("unchecked") + public B captionKey(final String caption) { + assertFieldMetadataIsNotNull(); + + currentFieldMetadata.setName(caption); + currentFieldMetadata.setI18n(true); return (B) this; } diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/PersistentFieldSetConfigurationUnitBuilderAdapter.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/PersistentFieldSetConfigurationUnitBuilderAdapter.java index f816f5b8..a67224b9 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/PersistentFieldSetConfigurationUnitBuilderAdapter.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/common/PersistentFieldSetConfigurationUnitBuilderAdapter.java @@ -44,6 +44,12 @@ public PersistentFieldSetConfigurationUnitBuilder caption(final String caption) return this; } + @Override + public PersistentFieldSetConfigurationUnitBuilder captionKey(final String captionKey) { + fieldSetConfigurationUnitBuilder.captionKey(captionKey); + return this; + } + @Deprecated @Override public PersistentFieldSetConfigurationUnitBuilder enumeration(String... values) { diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnit.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnit.java index 91515644..90890b57 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnit.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnit.java @@ -28,6 +28,7 @@ public class DefaultEntityMetadataConfigurationUnit extends DefaultFieldSetConfi private String singularName; private String pluralName; + private boolean i18n; DefaultEntityMetadataConfigurationUnit(Class domainType) { super(domainType, DomainConfigurationUnitType.CONFIGURATION); @@ -74,4 +75,12 @@ public DomainConfigurationUnitType getParentUnitType() { return null; } + @Override + public boolean i18n() { + return i18n; + } + + public void setI18n(boolean i18n) { + this.i18n = i18n; + } } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnitBuilder.java index a68ea654..66d386f6 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/configuration/DefaultEntityMetadataConfigurationUnitBuilder.java @@ -58,6 +58,12 @@ public EntityMetadataConfigurationUnitBuilder pluralName(final String pluralName return this; } + @Override + public EntityMetadataConfigurationUnitBuilder i18n(boolean i18n) { + configurationUnit.setI18n(i18n); + return this; + } + @Override public EntityMetadataConfigurationUnitBuilder repositoryEventListener(Class listenerClass) { configurationUnit.setRepositoryEventListener(listenerClass); diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnit.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnit.java index e101ca40..816de524 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnit.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnit.java @@ -22,11 +22,17 @@ public class DefaultScreenContextConfigurationUnit extends DomainTypeConfigurationUnit implements ScreenContextConfigurationUnit { private final String screenName; + private final boolean i18n; DefaultScreenContextConfigurationUnit(Class domainType, final String screenName) { + this(domainType, screenName, false); + } + + DefaultScreenContextConfigurationUnit(Class domainType, final String screenName, final boolean i18n) { super(domainType); this.screenName = screenName; + this.i18n = i18n; } @Override @@ -34,6 +40,11 @@ public String getScreenName() { return screenName; } + @Override + public boolean i18n() { + return i18n; + } + @Override public DomainConfigurationUnitType getDomainConfigurationUnitType() { return DomainConfigurationUnitType.SCREEN_CONTEXT; diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnitBuilder.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnitBuilder.java index b6ba112e..bb107b65 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnitBuilder.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/context/DefaultScreenContextConfigurationUnitBuilder.java @@ -22,11 +22,13 @@ public class DefaultScreenContextConfigurationUnitBuilder extends DomainTypeConfigurationUnitBuilder implements ScreenContextConfigurationUnitBuilder { private String screenName; + private boolean i18n; public DefaultScreenContextConfigurationUnitBuilder(final Class domainType) { super(domainType); this.screenName = domainType.getSimpleName(); + this.i18n = false; } @Override @@ -35,8 +37,14 @@ public ScreenContextConfigurationUnitBuilder screenName(final String screenName) return this; } + @Override + public ScreenContextConfigurationUnitBuilder i18n(boolean i18n) { + this.i18n = i18n; + return this; + } + @Override public ScreenContextConfigurationUnit build() { - return new DefaultScreenContextConfigurationUnit(getDomainType(), screenName); + return new DefaultScreenContextConfigurationUnit(getDomainType(), screenName, i18n); } } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/AbstractFieldMetadata.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/AbstractFieldMetadata.java index 0f50ff91..760f3656 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/AbstractFieldMetadata.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/AbstractFieldMetadata.java @@ -27,6 +27,8 @@ public abstract class AbstractFieldMetadata implements FieldMetadata, Serializab private String name; + private boolean i18n; + private int order; private final UUID uuid; @@ -43,6 +45,7 @@ protected AbstractFieldMetadata(final String name, int order) { this.name = name; this.order = order; this.uuid = UUID.randomUUID(); + this.i18n = false; } @Override @@ -131,4 +134,12 @@ public String toString() { .add("uuid", uuid) .toString(); } + + public boolean isI18n() { + return i18n; + } + + public void setI18n(boolean i18n) { + this.i18n = i18n; + } } diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/FieldMetadata.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/FieldMetadata.java index 1ee64471..193ec4ec 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/FieldMetadata.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/FieldMetadata.java @@ -15,7 +15,7 @@ */ package org.lightadmin.core.config.domain.field; -public interface FieldMetadata extends Identifiable, Nameable { +public interface FieldMetadata extends Identifiable, Nameable, Internationalizable { boolean isSortable(); diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/Internationalizable.java b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/Internationalizable.java new file mode 100644 index 00000000..95fe2575 --- /dev/null +++ b/lightadmin-core/src/main/java/org/lightadmin/core/config/domain/field/Internationalizable.java @@ -0,0 +1,23 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.lightadmin.core.config.domain.field; + +public interface Internationalizable { + boolean isI18n(); + + void setI18n(boolean i18n); + +} diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/util/LightAdminConfigurationUtils.java b/lightadmin-core/src/main/java/org/lightadmin/core/util/LightAdminConfigurationUtils.java index 1751891c..5cf9d52f 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/util/LightAdminConfigurationUtils.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/util/LightAdminConfigurationUtils.java @@ -54,4 +54,7 @@ public class LightAdminConfigurationUtils { public static final String LIGHT_ADMINISTRATION_HELP_DEFAULT_URL = "http://lightadmin.org/getting-started/"; public static final String LIGHT_ADMINISTRATION_DEMO_MODE = "light:administration:demo-mode"; + + public static final String LIGHT_ADMINISTRATION_I18N = "light:administration:i18n"; + public static final String LIGHT_ADMINISTRATION_LANGUAGES = "light:administration:languages"; } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ConfigurationAwareViewPreparer.java b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ConfigurationAwareViewPreparer.java index 1f40ae9a..4aa550b5 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ConfigurationAwareViewPreparer.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ConfigurationAwareViewPreparer.java @@ -25,6 +25,8 @@ import org.lightadmin.core.config.domain.GlobalAdministrationConfiguration; import org.lightadmin.core.web.ApplicationController; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.support.MessageSourceAccessor; import javax.servlet.http.HttpServletRequest; @@ -38,6 +40,9 @@ public abstract class ConfigurationAwareViewPreparer implements ViewPreparer { @Autowired protected GlobalAdministrationConfiguration globalAdministrationConfiguration; + private MessageSource messageSource; + protected MessageSourceAccessor messages; + @Override public final void execute(Request request, AttributeContext attributeContext) { execute(request, attributeContext, globalAdministrationConfiguration); @@ -55,8 +60,13 @@ protected void execute(Request request, AttributeContext attributeContext, Domai addAttribute(attributeContext, ApplicationController.DOMAIN_TYPE_ADMINISTRATION_CONFIGURATION_KEY, configuration, true); addAttribute(attributeContext, "persistentEntity", configuration.getPersistentEntity(), true); - addAttribute(attributeContext, "entityPluralName", configuration.getEntityConfiguration().getPluralName(), true); - addAttribute(attributeContext, "entitySingularName", entitySingularName(request, configuration), true); + if(configuration.getEntityConfiguration().i18n()) { + addAttribute(attributeContext, "entityPluralName", messages.getMessage(configuration.getEntityConfiguration().getPluralName()), true); + addAttribute(attributeContext, "entitySingularName", messages.getMessage(configuration.getEntityConfiguration().getSingularName()), true); + } else { + addAttribute(attributeContext, "entityPluralName", configuration.getEntityConfiguration().getPluralName(), true); + addAttribute(attributeContext, "entitySingularName", entitySingularName(request, configuration), true); + } addAttribute(attributeContext, "entity", entityFromRequest(request), true); addAttribute(attributeContext, "entityId", entityId(configuration, entityFromRequest(request)), true); @@ -92,4 +102,10 @@ private String entitySingularName(final Request request, final DomainTypeAdminis private Object entityFromRequest(Request request) { return attributeFromRequest(request, "entity"); } + + @Autowired + public void getMessageSource(MessageSource messageSource) { + this.messageSource = messageSource; + this.messages = new MessageSourceAccessor(messageSource); + } } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/DashboardViewPreparer.java b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/DashboardViewPreparer.java index e16a2c08..1a2e6096 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/DashboardViewPreparer.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/DashboardViewPreparer.java @@ -32,6 +32,7 @@ import static com.google.common.collect.Lists.newLinkedList; import static java.util.Collections.sort; +import static org.springframework.util.StringUtils.uncapitalize; public class DashboardViewPreparer extends ConfigurationAwareViewPreparer { @@ -49,6 +50,9 @@ private Collection> dashboardDomainTypes(Collection> domainTypeItems = newLinkedList(); for (DomainTypeAdministrationConfiguration configuration : configurations) { domainTypeItems.add(Pair.create(menuItem(configuration), configuration.getRepository().count())); + if(configuration.getEntityConfiguration().i18n()) { + domainTypeItems.get(domainTypeItems.size()-1).first.setValue(messages.getMessage(uncapitalize(domainTypeItems.get(domainTypeItems.size()-1).first.getValue()))); + } } sort(domainTypeItems, new Comparator>() { diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/LeftSectionViewPreparer.java b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/LeftSectionViewPreparer.java index 892f588a..03810307 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/LeftSectionViewPreparer.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/LeftSectionViewPreparer.java @@ -32,6 +32,7 @@ import static com.google.common.collect.Collections2.transform; import static com.google.common.collect.Lists.newArrayList; import static java.util.Collections.sort; +import static org.springframework.util.StringUtils.uncapitalize; public class LeftSectionViewPreparer extends ConfigurationAwareViewPreparer { @@ -46,7 +47,12 @@ protected void execute(final Request request, final AttributeContext attributeCo @Override protected void execute(final Request request, final AttributeContext attributeContext, final DomainTypeAdministrationConfiguration configuration) { final SidebarsConfigurationUnit sidebarsConfigurationUnit = configuration.getSidebars(); - final String selectedMenuItemName = configuration.getEntityConfiguration().getPluralName(); + final String selectedMenuItemName; + if(configuration.getEntityConfiguration().i18n()) { + selectedMenuItemName = messages.getMessage(configuration.getEntityConfiguration().getPluralName()); + } else { + selectedMenuItemName = configuration.getEntityConfiguration().getPluralName(); + } addAttribute(attributeContext, "selectedMenuItemName", selectedMenuItemName); @@ -55,7 +61,13 @@ protected void execute(final Request request, final AttributeContext attributeCo private Collection menuItems(Collection configurations) { final List menuItems = newArrayList(transform(configurations, new DomainConfigToMenuItemTransformer(domainEntityLinks))); - + int i = 0; + for(DomainTypeAdministrationConfiguration domain : configurations) { + if(domain.getEntityConfiguration().i18n()) { + menuItems.get(i).setValue(messages.getMessage(uncapitalize(menuItems.get(i).getValue()))); + } + i++; + } sort(menuItems, MenuItemComparator.INSTANCE); return menuItems; diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ScreenViewPreparer.java b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ScreenViewPreparer.java index 4a810740..32216c8e 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ScreenViewPreparer.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/view/preparer/ScreenViewPreparer.java @@ -21,6 +21,8 @@ import org.lightadmin.core.config.domain.DomainTypeAdministrationConfiguration; import org.lightadmin.core.config.domain.GlobalAdministrationConfiguration; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; public class ScreenViewPreparer extends ConfigurationAwareViewPreparer { @@ -32,12 +34,16 @@ protected void execute(Request request, AttributeContext attributeContext, Globa super.execute(request, attributeContext, configuration); addAttribute(attributeContext, "lightAdminConfiguration", lightAdminConfiguration, true); + addAttribute(attributeContext, "currentLanguage", LocaleContextHolder.getLocale().getLanguage(), true); } @Override protected void execute(final Request request, final AttributeContext attributeContext, final DomainTypeAdministrationConfiguration configuration) { super.execute(request, attributeContext, configuration); - - addAttribute(attributeContext, "screenContext", configuration.getScreenContext(), true); + if(configuration.getScreenContext().i18n()) { + addAttribute(attributeContext, "screenName", messages.getMessage(configuration.getScreenContext().getScreenName()), true); + } else { + addAttribute(attributeContext, "screenName", configuration.getScreenContext(), true); + } } } \ No newline at end of file diff --git a/lightadmin-core/src/main/java/org/lightadmin/core/web/ApplicationController.java b/lightadmin-core/src/main/java/org/lightadmin/core/web/ApplicationController.java index 16f7d66f..1764f3d0 100644 --- a/lightadmin-core/src/main/java/org/lightadmin/core/web/ApplicationController.java +++ b/lightadmin-core/src/main/java/org/lightadmin/core/web/ApplicationController.java @@ -33,6 +33,7 @@ import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; import java.io.Serializable; +import java.util.Locale; import static org.springframework.http.HttpStatus.FORBIDDEN; import static org.springframework.web.servlet.support.ServletUriComponentsBuilder.fromCurrentContextPath; @@ -66,43 +67,42 @@ public ModelAndView handleException(Exception ex) { @ExceptionHandler(NoSuchRequestHandlingMethodException.class) @RequestMapping(value = "/page-not-found", method = RequestMethod.GET) - public String handlePageNotFound() { + public String handlePageNotFound(Locale locale) { return "page-not-found"; } @ResponseStatus(FORBIDDEN) @RequestMapping(value = "/access-denied", method = RequestMethod.GET) - public String handleAccessDenied() { + public String handleAccessDenied(Locale locale) { return "access-denied"; } @RequestMapping(value = "/login", method = RequestMethod.GET) - public String login() { + public String login(Locale locale) { return "login"; } @RequestMapping(value = "/", method = RequestMethod.GET) - public String root() { + public String root(Locale locale) { return redirectTo("/dashboard"); } @RequestMapping(value = "/dashboard", method = RequestMethod.GET) - public String dashboard() { + public String dashboard(Locale locale) { return "dashboard-view"; } @RequestMapping(value = "/domain/{domainType}", method = RequestMethod.GET) - public String list(@PathVariable String domainType, Model model) { - addDomainTypeConfigurationToModel(domainType, model); - + public String list(@PathVariable String domainType, Model model, Locale locale) { + addDomainTypeConfigurationToModel(domainType, model, locale); return "list-view"; } @RequestMapping(value = "/domain/{domainTypeName}/{entityId}", method = RequestMethod.GET) - public String show(@PathVariable String domainTypeName, @PathVariable String entityId, Model model) { - addDomainTypeConfigurationToModel(domainTypeName, model); + public String show(@PathVariable String domainTypeName, @PathVariable String entityId, Model model, Locale locale) { + addDomainTypeConfigurationToModel(domainTypeName, model, locale); - final Object entity = findEntityOfDomain(entityId, domainTypeName); + final Object entity = findEntityOfDomain(entityId, domainTypeName, locale); if (entity == null) { return pageNotFound(); } @@ -112,10 +112,10 @@ public String show(@PathVariable String domainTypeName, @PathVariable String ent } @RequestMapping(value = "/domain/{domainTypeName}/{entityId}/edit", method = RequestMethod.GET) - public String edit(@PathVariable String domainTypeName, @PathVariable String entityId, Model model) { - addDomainTypeConfigurationToModel(domainTypeName, model); + public String edit(@PathVariable String domainTypeName, @PathVariable String entityId, Model model, Locale locale) { + addDomainTypeConfigurationToModel(domainTypeName, model, locale); - final Object entity = findEntityOfDomain(entityId, domainTypeName); + final Object entity = findEntityOfDomain(entityId, domainTypeName, locale); if (entity == null) { return pageNotFound(); } @@ -125,22 +125,22 @@ public String edit(@PathVariable String domainTypeName, @PathVariable String ent } @RequestMapping(value = "/domain/{domainTypeName}/{entityId}/edit-dialog", method = RequestMethod.GET) - public String editDialog(@PathVariable String domainTypeName, @PathVariable String entityId, Model model) { - edit(domainTypeName, entityId, model); + public String editDialog(@PathVariable String domainTypeName, @PathVariable String entityId, Model model, Locale locale) { + edit(domainTypeName, entityId, model, locale); return "edit-dialog-view"; } @RequestMapping(value = "/domain/{domainTypeName}/create", method = RequestMethod.GET) - public String create(@PathVariable String domainTypeName, Model model) { - addDomainTypeConfigurationToModel(domainTypeName, model); + public String create(@PathVariable String domainTypeName, Model model, Locale locale) { + addDomainTypeConfigurationToModel(domainTypeName, model, locale); return "create-view"; } @RequestMapping(value = "/domain/{domainTypeName}/create-dialog", method = RequestMethod.GET) - public String createDialog(@PathVariable String domainTypeName, Model model) { - create(domainTypeName, model); + public String createDialog(@PathVariable String domainTypeName, Model model, Locale locale) { + create(domainTypeName, model, locale); return "create-dialog-view"; } @@ -149,7 +149,7 @@ private String pageNotFound() { return redirectTo("/page-not-found"); } - private Object findEntityOfDomain(String entityId, String domainTypeName) { + private Object findEntityOfDomain(String entityId, String domainTypeName, Locale locale) { DomainTypeAdministrationConfiguration domainTypeConfiguration = configuration.forEntityName(domainTypeName); DynamicJpaRepository repository = domainTypeConfiguration.getRepository(); @@ -159,7 +159,7 @@ private Object findEntityOfDomain(String entityId, String domainTypeName) { return repository.findOne(id); } - private void addDomainTypeConfigurationToModel(String domainTypeName, Model model) { + private void addDomainTypeConfigurationToModel(String domainTypeName, Model model, Locale locale) { model.addAttribute(DOMAIN_TYPE_ADMINISTRATION_CONFIGURATION_KEY, configuration.forEntityName(domainTypeName)); model.addAttribute(BEAN_FACTORY_KEY, appContext.getAutowireCapableBeanFactory()); } diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/editors/enum-field-edit-control.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/editors/enum-field-edit-control.jsp index 5a5141f8..11ccd3c6 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/editors/enum-field-edit-control.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/editors/enum-field-edit-control.jsp @@ -1,5 +1,6 @@ <%@ page import="org.lightadmin.core.persistence.metamodel.PersistentPropertyType" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> @@ -7,6 +8,11 @@ \ No newline at end of file diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/layout/external-layout.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/layout/external-layout.jsp index 99a90e5e..ea74e118 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/layout/external-layout.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/layout/external-layout.jsp @@ -7,6 +7,7 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> +<%@ taglib prefix="bean" uri="http://java.sun.com/jsp/jstl/fmt" %> @@ -18,7 +19,7 @@ - LightAdmin - Web administration framework. + <bean:message key="lightadmin.application.external.name"/> "> "> diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/layout/internal-layout.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/layout/internal-layout.jsp index 9c8bb00e..c9e4c47e 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/layout/internal-layout.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/layout/internal-layout.jsp @@ -8,7 +8,7 @@ <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> - + @@ -20,8 +20,8 @@ - <spring:message code="application.name"/> - <c:out value="${ not empty(screenContext) ? screenContext.screenName : ''}"/> + <spring:message code="lightadmin.application.name"/> + <c:out value="${ not empty(screenName) ? screenName : ''}"/> "> "> diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/create.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/create.jsp index 2bc8ac63..0506cced 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/create.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/create.jsp @@ -24,10 +24,11 @@ +
-
+
@@ -46,8 +47,15 @@
diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/dashboard.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/dashboard.jsp index ac2f62d7..238f2e29 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/dashboard.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/dashboard.jsp @@ -9,7 +9,7 @@
-
+
diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/edit.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/edit.jsp index 9edc53cb..1ef3cfe6 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/edit.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/edit.jsp @@ -26,10 +26,11 @@ +
-
+
@@ -51,8 +52,15 @@
diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/error-page.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/error-page.jsp index 9af109d5..b89bec68 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/error-page.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/error-page.jsp @@ -3,18 +3,19 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="light" uri="http://www.lightadmin.org/tags" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="bean" uri="http://java.sun.com/jsp/jstl/fmt" %>
-

Something went wrong here

+

400

-

Oops! Sorry, an error has occured.

+


diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/login.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/login.jsp index 527df4e9..e2d38af7 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/login.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/login.jsp @@ -6,6 +6,7 @@ +
@@ -48,7 +49,7 @@
+ for="_spring_security_remember_me">${remember_me}
diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/page-not-found.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/page-not-found.jsp index 2ccf306b..cf152cf7 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/page-not-found.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/page-not-found.jsp @@ -3,17 +3,18 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="light" uri="http://www.lightadmin.org/tags" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="bean" uri="http://java.sun.com/jsp/jstl/fmt" %>
-

Something went wrong here

+

404

-

Oops! Sorry, an error has occured.
Requested page not found!

+


diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/show.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/show.jsp index c4019c38..5b81d413 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/pages/show.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/pages/show.jsp @@ -22,9 +22,11 @@ + +
-
+
@@ -38,14 +40,23 @@
${edit} - ${remove} + ${remove}
- + diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/sections/footer-section.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/sections/footer-section.jsp index 1079086e..f4888416 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/sections/footer-section.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/sections/footer-section.jsp @@ -7,6 +7,6 @@ \ No newline at end of file diff --git a/lightadmin-core/src/main/resources/META-INF/resources/views/sections/header-section.jsp b/lightadmin-core/src/main/resources/META-INF/resources/views/sections/header-section.jsp index 6c393d4f..1828e3d8 100644 --- a/lightadmin-core/src/main/resources/META-INF/resources/views/sections/header-section.jsp +++ b/lightadmin-core/src/main/resources/META-INF/resources/views/sections/header-section.jsp @@ -7,6 +7,9 @@ + + +
: + + + + + + + + : +