2016-04-15 4 views
6

Wir verwenden Spring Boot für die Anwendung. Accept-Language In ApplicationConfig.java habe ich den Code untenSpring Boot-Lokalisierungsproblem - Accept-Language-Header

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

und die SmartLocaleResolver.java unter

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

und ich habe in meiner Konstanten Klasse des unter dem Wert von Header zu vergleichen.

öffentliche statische endgültige Liste LOCALE = Sammlungen .unmodiableList (Arrays.asList ("en", "es"));

Ich weiß im tatsächlichen Szenario der Header wird wie Accept-Language: fr, es; q = 0.8, en-us; q = 0.6 aber für Testzwecke bin ich es wie folgt übergeben.

Accept-language: fr, es, en

Der Code ist noch nicht abgeschlossen, aber ich bin Tests nur von Postbote, um zu sehen, ob der Code nimmt „es“ als Gebietsschema und gibt mir die lokalisierte Ergebnis.

Ich habe keine messages_fr.properties-Datei, aber ich habe messages_es.properties, also erwarte ich, wenn die Anwendung das Gebietsschema aus dem folgenden Code einstellt, würde es Locale als 'es' auswählen und die gewünschten Werte in Spanisch geben. Welche Änderungen muss ich hier vornehmen, damit der Code funktioniert?

+0

Warum nicht c alle 'request.getLocale()' direkt? –

+0

Wenn ich nur request.getLocale() direkt anrufe, wie stellt es sicher, dass wir 'fr' in meinem Projekt nicht unterstützen? Ich habe keine messages_fr.properies in meinem Projekt. Also muss es fr ignorieren und muss Locale als 'es' setzen, weil wir es unterstützen und messages_es.properties haben. Kann es das automatisch tun, ohne dass ich irgendeine Logik dafür schreibe? – Arun

Antwort

6

Die Lösung lautet: public class SmartLocaleResolver erstreckt AcceptHeaderLocaleResolver statt public class SmartLocaleResolver erstreckt SessionLocaleResolver

Unten ist der aktualisierte Code:

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

und in meine Konstanten Klasse I haben:

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

Hilfreich !!!!! :) – ChaitanyaAtkuri