我使用 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;
}
...
...
}
仅供以后参考。
如果使用Spring Boot,您还可以在application.properties文件中设置其自定义位置:
spring.messages.basename=i18n/messages
Javadoc:
以逗号分隔的基本名称列表,每个都位于 ResourceBundle 后面 习俗。本质上是一个完全限定的类路径位置。如果它 不包含包限定符(例如“org.mypackage”),它将 从类路径根解析。
messages.properties 文件需要与模板同名的想法并不常见。但是,您可以通过侦听配置中的所有文件来解决此问题。
messageSource.setBasenames("classpath:i18n/template1","classpath:i18n/template2"...);
如果将它们放入类路径中或将
classpath:i18n
替换为 WEB-INF/languages
。
也许您可以通过程序逻辑创建基本名称列表。
请记住,即使使用这种方法,消息键也只能在应用程序中定义一次。
我遇到了同样的问题,我的工作如下。
@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 中使用了系统属性作为消息文件路径。我的消息文件采用以下格式:语言文件夹下的 messages_en.properties。
<systemProperties>
<web.server.message>${basedir}/src/main/resources/conf/languages/messages</web.server.message>
</systemProperties>
在您的 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;
}
我知道这是一个老问题,但在 Google 中得到了很好的引用。
我终于在Github中找到了这个问题的解决方案https://github.com/thymeleaf/thymeleaf-spring/issues/9
你必须使用
setTemplateEngineMessageSource(MessageSource)
我做了什么
@Service
public class TemplateEngineService {
private Logger log = LoggerFactory.getLogger(getClass());
private final SpringTemplateEngine thymeleafTemplateEngine;
public TemplateEngineService(SpringTemplateEngine thymeleafTemplateEngine) {
this.thymeleafTemplateEngine = thymeleafTemplateEngine;
}
public String processTemplate(String templatePath, String messagePath, String locale, Map<String, Object> variables) {
thymeleafTemplateEngine.setTemplateEngineMessageSource(getMessageSource(messagePath));
// ...
}
public MessageSource getMessageSource(String messagePath) {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename( messagePath);
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}