<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
Después, proporcionar un componente/bean "LocaleResolver" encargado de resolver la localización de la petición del cliente. Hay varios tipos, pero de los que yo he visto el más adecuado es CookieLocaleResolver, dado que guarda el idioma en una cookie, recordando la última elección.
@SpringBootApplication public class Application implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public ViewResolver getViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/"); resolver.setSuffix(".jsp"); return resolver; } @Bean public LocaleResolver localeResolver() { return new CookieLocaleResolver(); } @Override public void addInterceptors(InterceptorRegistry registry) { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("l"); registry.addInterceptor(localeChangeInterceptor); } }
La parte del "addInterceptors" proviene de la interfaz WebMvcConfigurer (menos mal que con Java 8 las interfaces pueden tener implementaciones por defecto, sino hay que extender WebMvcConfigurerAdapter, supongo). Esta interfaz permite configurar el MVC de Spring vía Java en varios aspectos, como añadir "Interceptores" (método addInterceptors), que permite interceptar la petición antes de ser pasada al controller, o después. En este caso se usa para cargar un "Locale" en base a la información de la cookie, es decir, la localización.
Ahora se podría cambiar el idioma agregando el parámetro "l" a la URI: "/?l=en" (siempre que messages_en.properties esté creado).
Podemos definir varios archivos "messages_XX.properties", uno por idioma (dejando messages.properties para el idioma usado cuando no es especifique nada). Un ejemplo de "messages_es.properties":
home.welcome = Bienvenidos
home.listOfNumbers = Lista de números elegidos al azar
home.range= {0} números elegidos al azar entre {1} y {2}
Después se usarían en el JSP así (en este caso con JSTL + EL):
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix = "fmt" uri = "http://java.sun.com/jstl/fmt"%> <html> <head> <link rel="stylesheet" type="text/css" href="main.css"> </head> <body> <H1><fmt:message key="home.listOfNumbers"/></H1> <fmt:message key="home.range"> <fmt:param>${combinacion.getN()}</fmt:param> <fmt:param>${combinacion.getMin()}</fmt:param> <fmt:param>${combinacion.getMax()}</fmt:param> </fmt:message> <ul> <c:forEach items="${combinacion.getNumbers()}" var="numero"> <li> ${numero} </li> </c:forEach> </ul> </body> </html>
El controlador podría ser algo así:
@Controller public class BasicController { public static class Combinacion { private Set<Integer> numbers; private int min; private int max; private int n; Combinacion (int n, int a, int b) { Random r=new Random(); numbers=new TreeSet<>(); min=Math.min(a,b); max=Math.max(a,b); this.n=n; if (max-min<n) max=min+n-1; while (numbers.size()<n) { int number=r.nextInt(max-min+1)+min; if (!numbers.contains(number)) numbers.add(number); } } public Set<Integer>getNumbers() { return numbers; } public int getMin() { return min; } public int getMax() { return max; } public int getN() { return n; } } @RequestMapping("/") public String index(Model model, @RequestParam(defaultValue="6") int n, @RequestParam(defaultValue="1") int min, @RequestParam(defaultValue="49") int max) { model.addAttribute("combinacion", new Combinacion(n, min, max)); return "home"; } }
En fin... esto es todo.
No hay comentarios :
Publicar un comentario