Un software es uno de uso multipropósito. Al usar Message Source, puede ser aplicable a todos los idiomas. Ese concepto se llama i18n, es decir, según la localidad del usuario, las páginas web dinámicas se representan en la pantalla del usuario. Necesitamos mantener todas las constantes en un archivo de propiedades separado que coincida con todas y cada una de las localidades. En este artículo, veamos cómo se puede manejar en primavera a través de un proyecto maven.
Proyecto de ejemplo
Estructura del proyecto:
Veamos los archivos importantes uno por uno
pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gfg</groupId> <artifactId>springinternationlization</artifactId> <name>springinternationlization</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.6</java-version> <org.springframework-version>4.0.2.RELEASE</org.springframework-version> <org.aspectj-version>1.7.4</org.aspectj-version> <org.slf4j-version>1.7.5</org.slf4j-version> </properties> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!-- @Inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </build> </project>
Spring Resource Bundle se puede representar por medio de
mensajes_en.properties (Esta es la configuración predeterminada)
label.title=Initial Page label.emailId=Email label.password=Password label.submit=Welcome
message_fr.properties (para la configuración regional francesa)
label.title=Page initiale label.emailId=e-mail label.password=Mot de passe label.submit=Bienvenu
message_de.properties (para la configuración regional alemana)
label.title=Startseite label.emailId=E-Mail-ID label.password=Passwort label.submit=Herzlich willkommen
Veamos una clase de controlador simple que solo imprime la configuración regional que estamos usando. De forma predeterminada, la configuración regional se establece en en
Controlador de página de inicio.java
Java
import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class HomePageController { private static final Logger logger = LoggerFactory.getLogger(HomePageController.class); @RequestMapping(value = "/", method = RequestMethod.GET) // When no locale is passed in the parameter, we will // get en as answer public String home(Locale locale, Model model) { logger.info("You have come with the locale as {}.", locale); return "homepage"; } }
página de inicio.jsp
HTML
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@ page session="false"%> <html> <head> <title><spring:message code="label.title" /></title> <style> table { border-collapse: collapse; } th, td { border: 1px solid #ccc; padding: 10px; text-align: left; } tr:nth-child(even) { background-color: #eee; } tr:nth-child(odd) { background-color: #fff; } </style> </head> <body> <form method="post" action="login"> <table border = "1"> <tr> <td><label> <strong><spring:message code="label.emailId" /></strong> </label></td> <td><input name="emailId" /></td> </tr> <tr> <td><label> <strong><spring:message code="label.password" /></strong> </label></td> <td><input name="password" /></td> </tr> <tr> <spring:message code="label.submit" var="labelSubmit"></spring:message> <td colspan="2"><input type="submit" value="${labelSubmit}" /></td> </tr> </table> </form> </body> </html>
Veamos el archivo de configuración principal que indica cuál es el archivo de configuración regional predeterminado que se seleccionará
servlet-context.xml
XML
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <beans:property name="basename" value="classpath:messages" /> <beans:property name="defaultEncoding" value="UTF-8" /> </beans:bean> <beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- defaultLocale is set to en and hence when no param is passed, english will be the default locale --> <beans:property name="defaultLocale" value="en" /> <beans:property name="cookieName" value="myAppLocaleCookie"></beans:property> <beans:property name="cookieMaxAge" value="3600"></beans:property> </beans:bean> <interceptors> <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <beans:property name="paramName" value="locale" /> </beans:bean> </interceptors> <context:component-scan base-package="com.gfg.spring" /> </beans:beans>
Puntos importantes clave:
- Etiqueta dirigida por anotaciones: Habilita el modelo de programación del Controlador. A partir de esto, solo se identifican los controladores para manejar las requests de los clientes.
- context:component-scan: el lugar donde Spring debe buscar los componentes anotados y registrarlos automáticamente como Spring bean.
- bean messageSource: está configurado principalmente para habilitar i18n, es decir, soporte para todos los idiomas para nuestra aplicación. En esto, la propiedad basename se usa para proporcionar información sobre la ubicación de los paquetes de recursos. classpath:messages significa que los paquetes de recursos están ubicados en el classpath. message_{locale}.properties es el archivo de identificación para la configuración regional. Aquí, para la configuración regional, puede ser ‘en’, (inglés)/’fr’ (francés) /’de’ (alemán), etc., propiedad de codificación predeterminada : aquí generalmente necesitamos especificar como UTF-8 como se usa para definir la codificación utilizada para los mensajes.
- localeResolver : este es un punto de inicio muy importante para establecer una configuración regional predeterminada, el nombre de la cookie y la antigüedad de las cookies.
- org.springframework.web.servlet.i18n.LocaleChangeInterceptor: Con esto, podemos cambiar la nueva configuración regional que el usuario desea tener. Sin esto, Spring no puede configurar
web.xml (descriptor de implementación de la aplicación MVC)
Esto indicará en qué archivo se buscará la configuración de contexto y es configurable. Para nuestro ejemplo, a continuación se muestra el web.xml
XML
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Ejecutemos y veamos la salida de la consola, así como la página web de representación.
Ejecutemos la misma página pasando locale como fr
Ahora es para locale = de
Conclusión
Por lo tanto, un solo software en una aplicación Spring puede personalizarse al tener diferentes recursos de mensajes, cada uno para un idioma específico.
Publicación traducida automáticamente
Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA