Quando pensamos em internacionalizar nossas APIs parece que será uma tarefa extremamente árdua, quando na verdade é relativamente simples. Nesse post iremos ver como aplicar a internacionalização à sua API!
Para nossa implementação iremos utilizar apenas as dependências WEB e DevTools do Spring. Utilizando o inicializador do Spring, crie um projeto com as dependências citadas acima.
Como estamos criando uma implementação bem simples, criarei apenas um pacote de controllers e dentro será adicionada uma classe chamada MessageController. Esse controller irá receber chamadas no endpoint "/message" e "/messages" e conterá apenas um método mapeado com o método HTTP GET, onde é obrigatório que o header "name" seja informado e o header "accept-language" é opcional (mas extremamente necessário para a internacionalização funcionar).
package io.github.felipepedrosa.springapiinternationalization.controllers;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = {"/messages", "/message"})
public class MessageController {
private final MessageSource messageSource;
public MessageController(MessageSource messageSource) {
this.messageSource = messageSource;
}
@GetMapping
public ResponseEntity<String> getGreetingMessage(@RequestHeader String name) {
String message = messageSource.getMessage(
"greeting.withName",
new Object[]{name},
LocaleContextHolder.getLocale()
);
return ResponseEntity.ok(message);
}
}
Para obtenção das mensagens iremos injetar o MessageSource
desta forma será possível recuperar as mensagens criadas no diretório de recursos, nesse diretório serão adicionados três arquivos .properties
:
- messages.properties com o conteúdo
greeting.withName=Hi {0}, are you fine?
- messages_pt.properties com o conteúdo
greeting.withName=Oi {0}, como vai?
- messages_fr.properties com o conteúdo
greeting.withName=Salut {0}, ça va?
Mas você deve estar se perguntando onde está sendo feita a definição de qual mensagem será selecionada, ao executar o método messageResouce.getMessage()
foi passado como parâmetro o LocaleContextHolder.getLocale()
é ele quem faz toda a mágica e é responsável por obter o Locale informado na requisição, caso não exista irá utilizar a mensagem padrão (que vem do messages.properties - arquivo que está em inglês).
Pronto, dessa maneira sua API está internacionalizada! Vale lembrar que a estrutura que fiz aqui não é obrigatória, então o MessageSource pode ser utilizado na camada de serviços ou em qualquer outra que faça sentido para você.
Abaixo resultado das requisições, caso queira mais informações acesse o repositório da implementação (lá existem testes unitários para a mesma :D).
Top comments (0)