Tips, Soluciones y Novedades en Tecnología

06/03/2020

Multi-idioma en Spring Boot





La internalización es un factor que se debe considerar en las aplicaciones, sobre todo si las aplicaciones que desarrollamos van a escalar fuera de nuestras frontereas, quizá puede ingresar a otros lugares donde el idioma no es el mismo que en lugar donde se desarrolla el software.











Para ello disponemos de herramientas que nos fascilitan la configuración y poder hacer mas facil esta tarea.



Como primer paso vamos a utilizar Spring Boot para nuestro proyecto, la única dependencia requerida es Spring Web, lo pueden hacer directamente desde https://start.spring.io/





Ahora tenemos que crear minimo 3 archivos:




  • messages.properties

  • messages-es.properties

  • messages-en.properties




Estos archivos contienen lo siguiente:











El archivo messages.properties, es por defecto que nuestra aplicación inicializa, por eso se recomienda que alli se copie el contenido a bien de messages-es.properties o messages-en.properties.



Como siguiente paso tenemos que crear un archivo llamado Translator.java, con el siguiente contenido.








package com.dev.app.apptranslation.config;

import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Component;

@Component
public class Translator {

private static ResourceBundleMessageSource messageSource;

@Autowired
Translator(ResourceBundleMessageSource messageSource) {
Translator.messageSource = messageSource;
}

public static String toLocale(String msgCode) {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(msgCode, null, locale);
}
}




Adicionalmente tenemos que crear un archivo configuración en este caso InternationalizationConfig.java con contenido:








package com.dev.app.apptranslation.config;

import java.util.Locale;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Configuration
public class InternationalizationConfig implements WebMvcConfigurer {

@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}




 Si analizamos el metodo localeChangeInterceptor , podemos ver se setea un parametro "language", este es el que utilizaremos pasando como parametro el idioma respectivo.





Para probar creamos un controllador y realizamos el llamado a nuestro Translator, utilizando el metodo "Translator.toLocale("message.stock")".








package com.dev.app.apptranslation.controller;

import com.dev.app.apptranslation.config.Translator;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ItemController {

@RequestMapping(method = RequestMethod.GET, path = "/stock")
public String welcome() {
return Translator.toLocale("message.stock");
}
}






Vamos a ver el resultado de nuestro controller.

















La internalización se puede configurar de múltiples manera, en esta demo se ha realizado de la manera mas sensilla para comprender como hacer una integración con Spring Boot.





El codigo fuente lo pueden obtener desde GitHub.





Saludos.









1 comentario:

  1. Thank you for your articles that you have shared with us. Hopefully you can give the article a good benefit to us. Microsoft Teams TIC (¿?)

    ResponderEliminar