Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Suporte a internacionalização?

Pra mim ficou bem claro como utilizar o ValidationMessages.properties, mas a dúvida é se eu consigo unir esse document com o Accept-Language para poder retornar as mensagens de acordo com o idioma do cliente. Teria como?

4 respostas

Olá Lia!

Sim, é possível unir o ValidationMessages.properties com o Accept-Language para retornar mensagens de acordo com o idioma do cliente. Para isso, você pode configurar a internacionalização (i18n) no seu projeto Spring Boot. Vou te mostrar um exemplo de como fazer isso.

  1. Crie arquivos de propriedades para cada idioma:

    • ValidationMessages.properties (para o idioma padrão, por exemplo, português)
    • ValidationMessages_en.properties (para o inglês)

    Exemplo de ValidationMessages.properties:

    nome.obrigatorio=Nome é obrigatório
    email.obrigatorio=Email é obrigatório
    email.invalido=Formato do email é inválido
    telefone.obrigatorio=Telefone é obrigatório
    crm.obrigatorio=CRM é obrigatório
    crm.invalido=Formato do CRM é inválido
    especialidade.obrigatoria=Especialidade é obrigatória
    endereco.obrigatorio=Dados do endereço são obrigatórios
    

    Exemplo de ValidationMessages_en.properties:

    nome.obrigatorio=Name is required
    email.obrigatorio=Email is required
    email.invalido=Invalid email format
    telefone.obrigatorio=Phone number is required
    crm.obrigatorio=CRM is required
    crm.invalido=Invalid CRM format
    especialidade.obrigatoria=Specialty is required
    endereco.obrigatorio=Address details are required
    
  2. Configure o MessageSource no Spring Boot: Adicione a configuração do MessageSource no seu arquivo de configuração (por exemplo, ApplicationConfig.java):

    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
    
    import java.util.Locale;
    
    @Configuration
    public class ApplicationConfig {
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:ValidationMessages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        @Bean
        public LocaleResolver localeResolver() {
            AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
            localeResolver.setDefaultLocale(Locale.forLanguageTag("pt-BR"));
            return localeResolver;
        }
    }
    
  3. Utilize o Accept-Language no cliente: Quando o cliente fizer uma requisição, ele pode especificar o cabeçalho Accept-Language. Por exemplo:

    GET /api/endpoint HTTP/1.1
    Host: example.com
    Accept-Language: en
    

Com essa configuração, o Spring Boot automaticamente selecionará o arquivo de mensagens apropriado com base no cabeçalho Accept-Language da requisição.

Espero ter ajudado e bons estudos!

Muito obrigada! Ficou bem claro como funciona, vou testar e pesquisar um pouco mais.

Me parece que esse MessageSource e Resolver são mais genéricos, não apenas para validações. A internacionalização de outros retornos, como uma mensagem para 404, seguiria um princípio bem parecido, correto?l

solução!

Isso. O MessageSource e o LocaleResolver não se limitam apenas às mensagens de validação do Bean Validation. Eles são mecanismos para internacionalizar qualquer tipo de mensagem na aplicação, incluindo mensagens de erro HTTP, mensagens informativas, textos de interface, etc.

Você pode injetar o MessageSource em qualquer componente Spring e usar o método getMessage() para recuperar mensagens:

@RestController
public class MeuController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/ola")
    public String olaMundo(@RequestHeader(value = "Accept-Language", defaultValue = "en") String locale) {
        Locale currentLocale = Locale.forLanguageTag(locale);
        return messageSource.getMessage("mensagem.boasvindas", null, currentLocale);
    }
}

Sendo necessário criar um arquivo messages.properties (e seus equivalentes traduzidos):

# messages.properties
mensagem.boasvindas=Olá, mundo!

# messages_es.properties
mensagem.boasvindas=¡Hola, mundo!

Bons estudos!

Perfeito! Era tudo o que eu procurava por agora. Obrigada pela ajuda. Uma boa semana pra você.