引言
如果我们的项目中使用到的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";
}
}
日志输出结果