2016-04-15 31 views
6

Stiamo utilizzando Spring Boot per l'applicazione. In ApplicationConfig.java ho il codice qui sottoProblema di localizzazione di avvio a molla - Intestazione Accept-Language

@Bean 
    public LocaleResolver localeResolver() { 
     return new SmartLocaleResolver(); 
    } 

e SmartLocaleResolver.java è inferiore

public class SmartLocaleResolver extends SessionLocaleResolver { 

    @Override 
    public Locale resolveLocale(HttpServletRequest request) { 
     final String acceptLanguage = request.getHeader("Accept-Language"); 
     if (acceptLanguage.contains(",")) { 
      String[] aheader = acceptLanguage.split(",[ ]*");  
      for (String locale : aheader) {  
       if (ApplicationConstants.LOCALE.contains(locale)) { 
        locale.trim(); 
        return Locale.forLanguageTag(locale); 
       } 
      } 
     } else if (!acceptLanguage.contains(",") && !acceptLanguage.isEmpty()) { 
      if (ApplicationConstants.LOCALE.contains(acceptLanguage)) { 
       return Locale.forLanguageTag(acceptLanguage); 
      } 
     } 
     return request.getLocale(); 
    } 
} 

e ho nella mia classe costanti il ​​seguito per confrontare il valore di intestazione Accept-Language.

elenco statico finale pubblico LOCALE = Collezioni .unmodifiableList (Arrays.asList ("en", "es"));

So che nell'attuale scenario l'intestazione sarà come Accept-Language: fr, es; q = 0.8, en-us; q = 0.6 ma a scopo di test lo sto passando come di seguito.

Accept-Language: FR, ES, IT

Il codice non è ancora completo, ma io sono solo test da postino per vedere se il codice prende "es", come il locale e mi dà l'localizzato risultato.

Non ho il file messages_fr.properties ma ho messages_es.properties quindi mi aspetto che se l'applicazione imposta il locale dal codice sottostante, selezionerà Locale come 'es' e fornirà i valori che voglio in spagnolo. Quali modifiche devo apportare qui affinché il codice funzioni?

+0

Perché non c tutto 'request.getLocale()' direttamente? –

+0

Se chiamo direttamente request.getLocale() come verifica che non supportiamo 'fr' nel mio progetto? Non ho messaggi_fr.properies nel mio progetto. Quindi ha bisogno di ignorare fr e dovrebbe impostare Locale come 'es' perché supportiamo 'es' e abbiamo messages_es.properties. Può farlo automaticamente senza scrivere alcuna logica per quello? – Arun

risposta

6

La soluzione è: public class SmartLocaleResolver estende AcceptHeaderLocaleResolver invece di public class SmartLocaleResolver estende SessionLocaleResolver

Di seguito si riporta il codice aggiornato:

public class SmartLocaleResolver extends AcceptHeaderLocaleResolver { 

     @Override 
      public Locale resolveLocale(HttpServletRequest request) { 
        if (StringUtils.isBlank(request.getHeader("Accept-Language"))) { 
        return Locale.getDefault(); 
        } 
        List<Locale.LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language")); 
        Locale locale = Locale.lookup(list, ApplicationConstants.LOCALES); 
        return locale ; 
      } 
    } 

e nella mia classe costanti ho:

List<Locale> LOCALES = Arrays.asList(new Locale("en"), 
             new Locale("es"), 
             new Locale("fr"), 
             new Locale("es", "MX"), 
             new Locale("zh"), 
             new Locale("ja")); 
+0

Utile !!!!! :) – ChaitanyaAtkuri