2016-04-15 4 views
6

アプリケーション用にSpringブートを使用しています。 ApplicationConfig.javaでは、私は以下のコードSpringブートローカリゼーションの問題 - Accept-Languageヘッダー

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

を持っていると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(); 
    } 
} 

を下回っていると私は言語をAcceptヘッダーの値を比較するには、以下の私の定数クラスを持っています。

public static final List LOCALE =コレクション .unmodifiableList(Arrays.asList( "en"、 "es"));

実際のシナリオでは、ヘッダは のようになります。Accept-Language:fr、es; q = 0.8、en-us; q = 0.6しかし、テスト目的のために、私は以下のように渡します。

は受け入れ言語を:FRは、ES、

エンコードはまだ完了していないですが、私はただのコードがロケールとして「ES」をピックアップし、私にローカライズさを与えるかどうかを確認するために郵便配達員からテストしています結果。

私はmessages_fr.propertiesファイルを持っていませんが、messages_es.propertiesを持っていますので、アプリケーションがロケールを下のコードから設定すると、ロケールが「es」として選択され、スペイン語で必要な値が与えられます。コードを動作させるためにここで何を変更する必要がありますか?

+0

なぜcすべての 'request.getLocale()'は直接ですか? –

+0

私は単にrequest.getLocale()を直接呼び出すと、プロジェクトで 'fr'をサポートしていないことをどのように確認するのですか?私は私のプロジェクトにmessages_fr.properiesを持っていません。したがって、frを無視する必要があり、 'es'をサポートし、messages_es.propertiesを持っているため、Localeを 'es'として設定する必要があります。私はそれを論理的に書かなければ自動的にそれを行うことができますか? – Arun

答えて

6

解決策は以下のとおりです。

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

と私は私の定数クラスで:

パブリッククラスSmartLocaleResolverではなく publicクラスSmartLocaleResolverの AcceptHeaderLocaleResolverがSessionLocaleResolver

以下

が更新されたコードで拡張する拡張します

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

役立つ!!!!! :) – ChaitanyaAtkuri