我的 spring boot应用程序中解析 i18n 时遇到问题。我有这个配置:
LocaleConfiguration.java 这里我将Locale.US设置为默认语言,将消息目录设置为“src / main / resources / messages”并使用locale param更改语言。
package com.myproject.web.config;
import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@Configuration
public class LocaleConfiguration extends WebMvcConfigurerAdapter {
/**
* Este bean se encargará de resolver que idioma (locale) esta siendo usado
* actualmente
*
* @return
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
/**
* Este bean se encargara de interceptar el locale que venga a través del
* parámetro locale de la url
*
* @return
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("locale");
return lci;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
/**
* Registramos los filtros
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
我的消息文件:
/src/main/resources/
----/messages/
-------->messages_es_ES.properties (Spanish message file)
-------->messages.properties (Default messages file. US)
乳清我进入我的家,我的应用程序显示:
??home.welcome_en_US??
看起来无法解析消息文件(甚至不是默认文件!)。我应该错过一些但我找不到的东西。对此有何帮助?
解决方案
这里的问题是我使用的Basename路径,我必须在类路径中定义完整路径而没有locale后缀和文件扩展名(For my use,this):
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages/messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
这将搜索 / src / main / resources / - >类路径 消息/消息 - >基本名 然后添加所需的后缀(“es_ES”,“en_US”..) 和文件扩展名“.properties”
答案 0 :(得分:1)
对于任何类似的问题,这是解决方案
这里的问题是我使用的Basename路径,我必须在类路径中定义完整路径而没有locale后缀和文件扩展名(For my use,this):
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages/messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
这将搜索
/ src / main / resources / - >类路径
消息/消息 - >基名
然后添加所需的后缀(" es_ES"," en_US" ..)
和文件扩展名" .properties"
答案 1 :(得分:0)
使其灵活工作的另一种方法是使用属性初始化文件:application.properties,其中包含以下条目:
spring.messages.basename=messages/messages
第一个消息是src \ resources中文件夹的名称。为了最终澄清,另一个示例是src \ resources内一个名为 bundles 的目录,如下所示:
spring.messages.basename=bundles/messages
使用该配置,在Springboot主类中不需要下面的硬编码配置:
...
messageSource.setBasename("classpath:messages/messages");
...