2016-04-23 17 views
1

で動作しますので、この質問Thymeleaf + Spring (not Boot) - how to show messages from messageSourceはなぜThymeleafインターナショナルは唯一ResourceBundleMessageSource

に答えるうえで私はあなたがReloadableResourceBundleMessageSourceを使用している場合、それは働いていないだろうことがわかったん。 Thymeleafは?? app.name_pt_BRを表示しますか?期待される結果の代わりに。

@Bean(name = "messageSource") 
public MessageSource messageSource() { 

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("/i18n/messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 

    return messageSource; 
} 

次のように切り替えると、期待通りに機能しました。

@Bean(name = "messageSource") 
public MessageSource messageSource() { 

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
    messageSource.setBasename("/i18n/messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 

    return messageSource; 
} 

なぜReloadableResourceBundleMessageSourceを使用できないのですか?

この質問のためのコードを追加:GitHub

+0

XMLベースの構成での問題を再現することができないのパスをincludeingします。サンプルアプリケーションは[Github](https://github.com/manish-in-java/stackoverflow-questions/tree/master/36816274)で入手できます。 Javaベースの設定では何かが外れているようです。 [その他の例](https://samerabdelkafi.wordpress。'ReloadableResourceBundleMessageSource'を使用しているJava設定を使用して正常に動作します(com/2014/08/03/spring-mvc-full-java-based-config /)。 – manish

+0

興味深い...私はあなたがティメレフを使っている場所を見ていますが、あなたがリンクしている例はそうではありません。しかし、どちらもSpring Bootを使用していません。それが問題のどこにあるのかがわかりました。 – ndrone

+0

Spring Githubレポの問題を提起する価値があるかもしれません。 – manish

答えて

1

が答えを見つけました!春のApplicationContextのリソースの読み込みに参加し、指定したベース名を使用して、リソースバンドルにアクセスReloadableResouceBundleMessageSource

春特有のMessageSourceの実装のためのjavadocパー

。 JDKベースのResourceBundleMessageSourceとは対照的に、このクラスはPropertiesインスタンスをメッセージのカスタムデータ構造として使用し、Spring ResourceハンドルからPropertiesPersisterストラテジを使用してロードします。この戦略では、タイムスタンプ変更に基づいてファイルをリロードできるだけでなく、プロパティファイルを特定の文字エンコーディングで読み込むこともできます。 XMLプロパティファイルも検出します。

"basenames"プロパティとして設定されたbasenameは、ResourceBundleMessageSourceの "basenames"プロパティとは少し異なります。これは、ファイル拡張子や言語コードを指定しない基本的なResourceBundleルールに従いますが、(クラスパスリソースに制限されるのではなく)任意のSpringリソースロケーションを参照できます。 "classpath:"接頭辞を使用すると、クラスパスからリソースをロードすることはできますが、 "-1"以外の "cacheSeconds"値(永久にキャッシュする)はこの場合確実に機能しない可能性があります。

典型的なWebアプリケーションの場合、メッセージファイルはWEB-INFに置くことができます。 "WEB-INF/messages"ベース名は、 "WEB-INF/messages.properties"、 "WEB-INF/messages_en.properties"などの配置や、 "WEB-INF/messages.xml"、 "WEB-INF /messages_ja.xml "などです。前回のリソースバンドルのメッセージ定義は、後続バンドルのメッセージ定義を上書きします。

このMessageSourceは、ApplicationContextの外部で簡単に使用できます。デフォルトではDefaultResourceLoaderが使用され、コンテキストで実行されている場合はApplicationContextのリソースローダーでオーバーライドされます。その他の特定の依存関係はありません。

ですので、修正はパスを提供することです。

@Bean 
public MessageSource messageSource() 
{ 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 
    return messageSource; 
} 

から

setBasename()

@Bean 
public MessageSource messageSource() 
{ 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("classpath:messages"); 
    messageSource.setFallbackToSystemLocale(false); 
    messageSource.setCacheSeconds(0); 
    messageSource.setDefaultEncoding("UTF-8"); 
    return messageSource; 
} 
+0

しかし、それは私が試したことはありません。完全な例があれば私たちと一緒にください。 – Muhammad

+0

Thymeleafと春のブートのどのバージョンですか?これはThymeleaf 2.1.xと春のブート1.3.xで動作しました – ndrone

+0

私はThymleaf 3.0.0とspring-web 4.3.4を使用しています – Muhammad

関連する問題