在Java项目中,资源文件一般都为 *.properties 文件(只能存储key-value格式的数据),SpringMVC中提供有MessageSource接口进行资源文件的读取,在SpringBoot中也支持同样的操作。
读取资源文件在resources目录下新建i18n文件夹,在文件夹中新建message.properties文件:
title=SpringBoot开发框架 desc=官方网址: https://spring.io/projects/spring-boot
修改application.yml文件,指定资源文件的basename。
server:
port: 8080
spring:
messages:
basename: i18n/message
在java对象中注入MessageSource,根据key来读取value值。
@RestController
@RequestMapping("/message/*")
public class MessageAction {
private final MessageSource messageSource; // 资源文件处理类
public MessageAction(MessageSource messageSource) {
this.messageSource = messageSource;
}
@RequestMapping("/get")
public Map getMessage() {
String title = messageSource.getMessage("title", null, Locale.getDefault());
String desc = messageSource.getMessage("desc", null, Locale.getDefault());
Map map = new linkedHashMap<>();
map.put("title", title);
map.put("desc", desc);
return map;
}
}
访问http://localhost:8080/message/get
在i18n文件夹再定义两个文件,message_zh_CN.properties和message_en_US.properties:
# message_zh_CN.properties title=SpringBoot开发框架 desc=官方网址: https://spring.io/projects/spring-boot
# message_en_US.properties title=SpringBoot Development framework desc=Official website: https://spring.io/projects/spring-boot
如果想要设置国际化,那么就不能使用默认的Locale,可以实现一个Locale解析器,通过传入字符串的方式指定Locale。
定义一个DefaultLocaleResolver,并在Spring容器中提供实例对象。
@Configuration
public class DefaultLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String loc = request.getParameter("loc"); // 取得请求参数
if (!StringUtils.hasLength(loc)) {
return Locale.getDefault(); // 设置默认Locale
}
String[] localeArray = loc.split("_");
return new Locale(localeArray[0], localeArray[1]); // 采用传入的locale
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {}
@Bean(name="localeResolver") // 指定LocaleResolver名称,否则可能不生效
public LocaleResolver getLocaleResolver() {
return new DefaultLocaleResolver();
}
}
修改控制器,在方法参数里面接收Locale对象,该Locale对象正是采用DefaultLocaleResolver生成的。
@RequestMapping("/get")
public Map getMessage(Locale locale) {
String title = messageSource.getMessage("title", null, locale);
String desc = messageSource.getMessage("desc", null, locale);
Map map = new linkedHashMap<>();
map.put("title", title);
map.put("desc", desc);
return map;
}
此时输入http://localhost:8080/message/get?loc=zh_CN可以得到中文版本:
输入http://localhost:8080/message/get?loc=en_US则可以得到英文版本:



