SpringMVC 使用MessageSource配置国际化

1,874 阅读2分钟

引言

如果我们的项目中使用到的message不想从java中直接定义,而是在properties资源文件中进行统一管理,或者需要对应多个语言,这个时候就需要国际化。


配置spring的context文件

在这里我的配置文件是servlet-context.xml。
添加的实现类是ReloadableResourceBundleMessageSource。
还有一个类是ResourceBundleMessageSource,区别是如果properties文件被更改了,不会自动重新加载。

<!-- messages -->
<beans:bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basenames">
        <beans:list>
            <beans:value>classpath:messages</beans:value>
        </beans:list>
    </beans:property>
    <beans:property name="defaultEncoding" value="utf-8"/>
    <beans:property name="useCodeAsDefaultMessage" value="true"/>
</beans:bean>。	

这里有两点需要注意的地方

  • id必须为messageSource,因为context加载时会自动读取名为messageSource的bean。
  • useCodeAsDefaultMessage设置为true,这样即使找不到相关的message也会使用id代替。否则则会抛出异常。
  • eclipse中设置的properties文件默认采用unicode编码,直接写中文会自动转变为字节码,非常不方便,就算手动改成utf-8编码也会乱码。所以把defaultEncoding设置为utf-8或者你想要的编码很有必要。

basenames设置为为classpath下的messages开头的资源文件。我生成了两个文件,分别为英文跟日文。命名规则为messages_语言_国家/地区.properties。


配置properties文件。

文件位置为classpath,src/main/resources/下。

  • messages_en_US.properties
msg1=TestMessage.My name is {0}.
msg2=TestMessage.My name is {0}, {1} years old.
  • messages_ja_JP.properties
msg1=TestMessage.My name is {0}.
msg2=TestMessage.My name is {0}, {1} years old.

在controller中测试

@RestController
public class TestMessageController {
	@Autowired
	private MessageSource msg;
	
	Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@RequestMapping("testMessage")
	public String show() {
		logger.warn(msg.getMessage("msg1",new String[] {"言語太郎"}, null));
		logger.warn(msg.getMessage("msg1",new String[] {"language boy"},new Locale("en","US")));
		logger.warn(msg.getMessage("msg2",new String[] {"言語太郎","20"}, null));
		logger.warn(msg.getMessage("msg2",new String[] {"language boy","20"},new Locale("en","US")));
		return "ok";
	}
}

日志输出结果