====== Gestionar soporte para Internacionalización en mi API REST ====== En esta Wiki se va a tratar el uso de las **cabeceras HTTP** para __negociar de forma automática el idioma__ en el que nuestra //API REST// devolverá los datos. \\ En este contexto, solo tiene sentido gestionar el idioma si **ya disponemos de todos los literales traducidos** con anterioridad y almacenados en **ficheros de propiedades** o en **base de datos**: * [[fdw2.0:fundeweb2.0:gt:gestionar_soporte_para_internacionalizacion_en_mi_proyecto|Gestionar soporte para internacionalización en mi proyecto]] * [[https://thoughts-on-java.org/localized-data-hibernate/|Internacionalización en la BBDD con Hibernate]] * [[http://elblogdepicodev.blogspot.com/2011/11/internacionalizacion-i18n-de-campos-con.html|Internacionalización (i18n) de campos con Hibernate]] ===== Cabeceras HTTP ===== Para negociar el idioma en nuestro servicio REST hay que hacer uso de las siguientes cabeceras HTTP definidas en el [[https://tools.ietf.org/html/rfc2616#section-14|RFC 2616 - Hypertext Transfer Protocol HTTP/1.1]]: * **Accept-Language** * **Content-Language** \\ === Accept-Language === [[https://tools.ietf.org/html/rfc2616#section-14.4|Cabecera HTTP]] **establecida por el cliente** en la petición para indicar la preferencia en el idioma de la información a devolver. \\ Puede añadirse varios idiomas separados por comas donde el orden significa la prioridad en el idioma. Accept-Language: es, en-gb, en Esta cabecera indica que se prefiere el idoma Español (es), pero que también se aceptan el inglés británico o cualquier otro tipo de inglés. \\ === Content-Language === [[https://tools.ietf.org/html/rfc2616#section-14.12|Cabecera HTTP]] **establecida por el servicio** en la respuesta para indicar los idiomas soportados. Content-Language: en, es Esta cabecera indica que el servicio soporta los idiomas inglés y español. Por lo tanto, en el ejemplo de la petición anterior, el servicio devolverá la información en español. Mediante el uso de estas cabeceras, **el cliente puede interrogar al servicio y proporcionarle al usuario la posibilidad de escoger un idioma entre los soportados.** \\ ===== Ejemplo ===== A continuación se muestra un ejemplo de servicio REST con Jersey donde se establece automáticamente el idioma de la respuesta a partir de la cabecera de la petición. \\ Para este ejemplo se usarán los ficheros de mensajes de FundeWeb. === Servicio === ... //@Context //HttpServletRequest request; ... @GET @Path( "/bienvenida" ) @Produces(MediaType.TEXT_PLAIN) public Response testLanguage( @QueryParam( "nombre" ) String nombre ) { //Locale requestLocale = request.getLocale(); String cadena = Messages.instance().get("org.jboss.seam.loginSuccessful" ); String mensaje = MessageFormat.format( cadena, nombre ); return Response.ok( mensaje ).header( "Content-Language", "es, en" ).build(); } ... \\ En este ejemplo no sería necesario incluir el objeto //request// para obtener el //locale//. Con ficheros de propiedades la selección del idioma se realiza automáticamente una vez se ha establecido la cabecera en la petición.\\ Se mantiene el código comentado para indicar cómo obtener el locale en el caso de querer usarlo como parámetro en consultas de base de datos. \\ La variable **request** puede declararse a nivel de clase o de método. === Petición 1 - ESPAÑOL === GET /proyectoPrueba/rest/public/v2/bienvenida?nombre=RAMÓN HTTP/1.1 Host: ramongg.atica.um.es:8002 Accept-Language: es === Respuesta 1 - ESPAÑOL === Bienvenido, RAMÓN Date: Mon, 15 Jun 2020 10:54:45 GMT Transfer-Encoding: chunked Content-Type: text/plain Content-Language: es, en \\ === Petición 2 - INGLÉS === GET /proyectoPrueba/rest/public/v2/bienvenida?nombre=RAY HTTP/1.1 Host: ramongg.atica.um.es:8002 Accept-Language: en === Respuesta 2 - INGLÉS === Welcome, RAY! Date: Mon, 15 Jun 2020 10:55:22 GMT Transfer-Encoding: chunked Content-Type: text/plain Content-Language: es, en \\ ===== Referencias y Bibliografía ===== * [[https://tools.ietf.org/html/rfc2616#section-14 |RFC HTTP - Cabeceras]] * [[http://apiux.com/2013/04/25/how-to-localize-your-api/|How to localize your API]] ===== FAQs ===== ===== Solicitud/Registro de FAQ ===== Pon aquí tus propuestas de FAQs, indicando qué problema tienes, y buscaremos la solución lo antes posible. Si además lo has resuelto, puedes indicar cómo lo has hecho. Formato de petición de FAQ: **Título** //Descripción del problema// //Tecnología afectada (Fundeweb 1/2)// //Cómo reproducir el error// **Solución** //Descripción de la solución// Tus datos de contacto --- //[[correo@umOticarum.es|Tu Nombre]] dd/mm/yyyy // ---- --- //[[ramon.ginel@ticarum.es|RAMON GINEL GEA]] 15/06/2020 13:16//