Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

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 tal y como se especifica en la guía DokuWiki-Gestionar soporte para internacionalización en mi proyecto.

Cabeceras HTTP

Para negociar el idioma en nuestro servicio REST hay que hacer uso de las siguientes cabeceras HTTP definidas en el RFC 2616 - Hypertext Transfer Protocol HTTP/1.1:

  • Accept-Language

  • Content-Language

Accept-Language

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.

...

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

Cabecera HTTP establecida por el servicio en la respuesta para indicar los idiomas soportados.

...

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

Bloque de código
languagejava
themeEclipse
  ...
  	//@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();
	}
  ...

...

Info

La variable request puede declararse a nivel de clase o de método.

Petición 1 - ESPAÑOL

Bloque de código
themeEclipse
 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

Bloque de código
themeEclipse
 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

Bloque de código
themeEclipse
 GET /proyectoPrueba/rest/public/v2/bienvenida?nombre=RAY HTTP/1.1
 Host: ramongg.atica.um.es:8002
 Accept-Language: en

Respuesta 2 - INGLÉS

Bloque de código
themeEclipse
  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