【发布时间】:2018-01-05 08:51:15
【问题描述】:
我的 spring boot 应用程序中的 i18n 分辨率有问题。我有这个配置:
LocaleConfiguration.java 这里我将Locale.US设置为默认语言,将消息目录设置为“src/main/resources/messages”并使用locale参数更改语言。
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 路径,我必须在没有语言环境后缀和文件扩展名的类路径中定义完整路径(供我使用,这个):
@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”
【问题讨论】:
-
请阅读有关
baseName含义的文档。这并不意味着你认为它意味着什么。 -
看起来消息定义了属性文件的名称,而不是路径:) 感谢您指出正确的方向
标签: spring spring-boot internationalization