DEV Community

Cover image for Como internacionalizar as mensagens de suas APIs criadas com Spring ?
Felipe Pedrosa
Felipe Pedrosa

Posted on

Como internacionalizar as mensagens de suas APIs criadas com Spring ?

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

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);
    }
}

Enter fullscreen mode Exit fullscreen mode

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?
Enter fullscreen mode Exit fullscreen mode
  • messages_pt.properties com o conteúdo
greeting.withName=Oi {0}, como vai?
Enter fullscreen mode Exit fullscreen mode
  • messages_fr.properties com o conteúdo
greeting.withName=Salut {0}, ça va?
Enter fullscreen mode Exit fullscreen mode

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

Mensagem em Inglês
Mensagem em Português
Mensagem em francês

Top comments (0)