2016-04-15 33 views
6

Uygulama için Spring Boot kullanıyoruz. ApplicationConfig.java ben aşağıda koduSpring Boot Yerelleştirme sorunu - Accept-Language başlığı

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

ve SmartLocaleResolver.java

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

altındadır ve ben başlığında Accept-Language değeri karşılaştırmak için aşağıdaki benim sabitler sınıfta var.

public static final List LOCALE = Koleksiyonlar .unmodifiableList (Arrays.asList ("en", "es"));

Gerçek senaryoda bildiğim başlık Kabul-Dili: fr, es; q = 0.8, en-us; q = 0.6 ama test amaçlı olarak aşağıdaki gibi geçiyorum.

Accept-language: fr, es,

tr kod henüz tamamlanmadı, ancak ben sadece kod yerel ayarı olarak "es" alır olmadığını görmek için postacı gelen test ve bana lokalize verir ediyorum sonuç.

Ben message_fr.properties dosyası yok ama message_es.properties var, bu yüzden eğer uygulama aşağıdaki kodu kullanarak yerel ayarı ayarlıyorsa, Locale'i 'es' olarak seçip İspanyolca'da istediğim değerleri vermekteyim. Kodun çalışması için burada ne gibi değişiklikler yapmalıyım?

+0

Neden değil c tüm 'request.getLocale()' doğrudan? –

+0

Sadece request.getLocale() yöntemini çağırırsam projemde 'fr' desteklemediğimizi nasıl doğrular? Projemde message_fr.properies yok. Bu yüzden fr'yi görmezden gelmemiz gerekiyor ve Locale'i 'es' olarak ayarlamanız gerekecek çünkü 'es'i destekliyoruz ve messages_es.properties var. Bunun için herhangi bir mantık yazmadan bunu otomatik olarak yapabilir mi? – Arun

cevap

6

çözümdür: Ben

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

ve benim sabitleri sınıfta

: public class SmartLocaleResolver SmartLocaleResolver Aşağıda

güncellenmiş kodudur SessionLocaleResolver uzanır AcceptHeaderLocaleResolver yerine kamu sınıfını genişleten

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

Yararlı !!!!! :) – ChaitanyaAtkuri