Como internacionalizar as mensagens de suas APIs criadas com Spring ?
Tags: java, api, springboot, developer
Published: 2021-12-13 19:43:59

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.

![Spring initializer, using Web and DevTools extensions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59to89uv1tjnlh3smgbk.png)

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).

```java
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 
```properties
greeting.withName=Hi {0}, are you fine?
```
 - messages_pt.properties com o conteúdo 
```properties
greeting.withName=Oi {0}, como vai?
```
 - messages_fr.properties com o conteúdo 
```properties
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](https://github.com/felipepedrosa/spring-api-internationalization) (**lá existem testes unitários para a mesma :D**).

![Mensagem em Inglês](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/weyvqzcnz6wmiypo7x6f.png)
![Mensagem em Português](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oeti9y7he3mge5daljut.png)
![Mensagem em francês](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xcutbmdzv2jfjbalmgs5.png)