我使用thymeleaf和spring,我的messages.properties文件需要与模板具有相同的名称才能使它们正常工作。我尝试使用webConfigurer.Java创建自定义路径,但它无法正常工作。
WebConfigurer.java来源:
...
...
@EnableWebMvc
@EnableTransactionManagement
@Configuration
@ComponentScan({"en.irp.project.*"})
@PropertySource("classpath:/application.properties")
@Import({SecurityConfigurer.class})
public class WebConfigurer extends WebMvcConfigurerAdapter {
...
...
...
@Bean(name="messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
resource.setBasename("WEB-INF/languages/messages");
resource.setDefaultEncoding("UTF-8");
return resource;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
@Bean(name = "localeResolver")
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(new Locale("en"));
return localeResolver;
}
...
...
}
答案 0 :(得分:4)
仅供将来参考。
如果使用 Spring Boot ,您还可以在 application.properties 文件中设置其自定义位置:
spring.messages.basename=i18n/messages
的Javadoc:
以逗号分隔的基本名称列表,每个基本名称都在ResourceBundle之后 惯例。基本上是一个完全限定的类路径位置。如果它 它不包含包限定符(例如“org.mypackage”) 从类路径根解析。
答案 1 :(得分:3)
messages.properties文件需要与模板具有相同名称的想法并不常见。但是,您可以通过侦听配置中的所有文件来解决此问题。
messageSource.setBasenames("classpath:i18n/template1","classpath:i18n/template2"...);
如果您将它们放入类路径或由classpath:i18n
替换WEB-INF/languages
。
也许您可以通过程序逻辑创建基本名称列表。
请记住,即使采用这种方法,消息密钥也只能在您的应用程序中定义一次。
答案 2 :(得分:1)
我遇到了同样的问题,我按照以下方式开展工作。
@Bean
public MessageSource messageSource()
{
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames( "file:" + System.getProperty( "web.server.message" ), "/WEB-INF/languages/messages" );
messageSource.setDefaultEncoding( CHARACTER_ENCODING );
return messageSource;
}
这里我想在DEV模式下使用不同的消息文件集,所以我在pom.xml中使用了一个系统属性来获取消息文件路径。我的消息文件采用以下格式:languages文件夹下的messages_en.properties。
<systemProperties>
<web.server.message>${basedir}/src/main/resources/conf/languages/messages</web.server.message>
</systemProperties>
答案 3 :(得分:0)
在application.properties文件中,只需提及spring.messages.baseDir的值。
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
List<String> baseNames = new ArrayList<>();
String baseName = applicationProperties.getString("spring.messages.basename", DEFAULT_MESSAGE_BASENAME);
String messageResourcePath = applicationProperties.getString("spring.messages.baseDir");
if(isNotEmpty(messageResourcePath)){
baseNames.add(String.format("file:%s", Paths.get(messageResourcePath, baseName)));
}
baseNames.add(String.format("classpath:%s", baseName));
resource.setBasenames(baseNames.toArray(new String[baseNames.size()]));
String encoding = applicationProperties.getString("spring.messages.encoding", CHARACTER_ENCODING);
LOGGER.debug("Encoding is set to :: {}", encoding);
resource.setDefaultEncoding(encoding);
resource.setUseCodeAsDefaultMessage(true);
return resource;
}