...
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 | ||||
|---|---|---|---|---|
| ||||
...
//@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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
Welcome, RAY! Date: Mon, 15 Jun 2020 10:55:22 GMT Transfer-Encoding: chunked Content-Type: text/plain Content-Language: es, en |