Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Spring Boot] Aiuto su internazionalizzazione

    ciao!

    in pratica sto testando l'internazionalizzazione in spring boot.
    la lingua la vorrei passare tramite path, ed in base a quello prendere i testi corretti.

    ho già creato i file di properties con i testi.

    nel main per ora ho fatto così (poi magari separo meglio le varie parti di codice se c'è bisogno):
    codice:
    package com.example.test_springboot_java;
    
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.support.ResourceBundleMessageSource;
    import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
    
    
    import java.util.Locale;
    
    
    @SpringBootApplication
    public class TestSpringbootJavaApplication {
    
    
      public static void main(String[] args) {
        SpringApplication.run(TestSpringbootJavaApplication.class, args);
      }
    
    
      @Bean
      public MessageSource messageSource() {
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setBasenames("lingue/testi");
        source.setDefaultEncoding("UTF-8");
        return source;
      }
    
    
      @Bean
      public AcceptHeaderLocaleResolver localeResolver() {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(Locale.ITALIAN);
        return localeResolver;
      }
    
    
    }
    poi nel controller:
    codice:
    package com.example.test_springboot_java.controllers;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.MessageSource;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.*;
    
    
    import java.util.Locale;
    
    
    @RestController
    @RequestMapping(path = "/test")
    public class TestController {
    
    
      @Autowired
      MessageSource messageSource;
    
    
      @GetMapping(path = "/{lingua}", produces = MediaType.APPLICATION_JSON_VALUE)
      @ResponseStatus(HttpStatus.OK)
      public String index(@PathVariable String lingua) {
        System.out.println(lingua);
        return messageSource.getMessage("saluti", null, Locale.ITALIAN);
      }
    
    
    }
    come faccio in base alla lingua passata dirgli quale file di testo prendere?
    ovviamente si potrebbe fare con un banale switch, ma non penso sia la soluzione migliore.
    solo che non ho capito come agganciare la lingua passata ad un resolver.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da fermat Visualizza il messaggio
    come faccio in base alla lingua passata dirgli quale file di testo prendere?
    ovviamente si potrebbe fare con un banale switch, ma non penso sia la soluzione migliore.
    solo che non ho capito come agganciare la lingua passata ad un resolver.
    Innanzitutto in Spring Boot non è per forza obbligatorio creare esplicitamente il bean del MessageSource. C'è una auto-configuration che si può sfruttare, ed è documentata qui: https://docs.spring.io/spring-boot/r...alization.html

    Ovvero, se si mettono dei file alla "radice" in classpath (src/main/resources/) con nome messages.properties e le varianti delle lingue (es. messages_en.properties, messages_it.properties ecc...), Spring Boot è in grado di autoconfigurare il MessageSource da solo.

    Se fai qualunque altra cosa di diverso, ovviamente è tutto a tuo carico, come appunto hai fatto.

    Riguardo il passaggio della lingua nel controller, la possibilità più semplice è quella di mappare direttamente il java.util.Locale nel path param, che è proprio ciò che poi serve ai getMessage del MessageSource.
    Ovvero:
    codice:
      @GetMapping(path = "/{lingua}", produces = MediaType.APPLICATION_JSON_VALUE)
      @ResponseStatus(HttpStatus.OK)
      public String index(@PathVariable("lingua") Locale lingua) {

    Spring Boot è in grado di mappare es. /en_US nel java.util.Locale corrispondente. Nota che è bene mettere sempre il value alla annotation, @PathVariable("lingua") in quanto la esposizione dei nomi dei parametri è possibile ma solo sotto certe condizioni.

    Se invece volessi mappare tu dei nomi "parlanti", es. /inglese, ovviamente la transcodifica è tutta a tuo carico.
    Ultima modifica di andbin; 08-04-2025 a 18:25
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    eccomi qua!

    allora, ho modificato il main levando i bean:
    codice:
    package com.example.test_springboot_java;
    
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    
    @SpringBootApplication
    public class TestSpringbootJavaApplication {
    
    
      public static void main(String[] args) {
        SpringApplication.run(TestSpringbootJavaApplication.class, args);
      }
    
    
    }
    a questo punto ho creato un file messages.properties e un messages_en.properties sotto resources.
    e nell'application.properties:
    codice:
    spring.messages.basename=messages, config.i18n.messages
    spring.messages.common-messages=classpath:my-common-messages.properties
    spring.messages.fallback-to-system-locale=false
    nel controller poi ho fatto così:
    codice:
    package com.example.test_springboot_java.controllers;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.MessageSource;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.*;
    
    
    import java.util.Locale;
    
    
    @RestController
    @RequestMapping(path = "/test")
    public class TestController {
    
    
      @Autowired
      MessageSource messageSource;
    
    
      @GetMapping(path = "/{lingua}", produces = MediaType.APPLICATION_JSON_VALUE)
      @ResponseStatus(HttpStatus.OK)
      public String index(@PathVariable Locale lingua) {
        System.out.println(lingua);
        return messageSource.getMessage("saluti", null, lingua);
      }
    
    
    }
    sembra funzionare tutto, grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.