一、Spring Boot国际化配置
Spring Boot使用MessageSource类实现国际化,我们可以在application.properties或application.yml文件中配置如下信息:
spring.messages.basename=i18n/message spring.messages.fallback-to-system-locale=true spring.messages.cache-duration=-1 #i18n/message.properties设置英文语言 #i18n/message_zh.properties设置中文语言
其中spring.messages.basename指定基础消息文件的路径,我们需要在i18n目录下创建message.properties和message_zh.properties。fallback-to-system-locale设置当没有匹配到语言时是否使用系统语言,默认为true。cache-duration设置消息缓存的时间,默认为-1,即永久缓存。
二、Spring Boot国际化默认为英文
在国际化配置中,如果不设置fallbackLocale,则默认使用英文作为基础语言,当没有匹配到其他语言时就使用英文。我们可以创建一个i18n/message.properties文件,并添加如下信息:
name=Tom age=21 gender=Male
当我们访问http://localhost:8080/hello时,可以看到页面打印出了以上信息。
三、Spring Boot国际化默认语言
我们可以通过设置Locale.getDefault()方法的返回值来设置默认语言。在Spring Boot中,我们可以通过配置文件进行设置,如下:
spring.mvc.locale=zh_CN
此时访问http://localhost:8080/hello,页面打印出的信息就会变成中文。
四、Spring Boot国际化乱码
在配置文件中指定了中文编码为UTF-8,但在页面上显示的却是乱码,这是因为我们没有在message_zh.properties文件中指定编码格式,我们可以在该文件中添加如下信息:
name=\u59D3\u540D age=\u5E74\u9F84 gender=\u6027\u522B
其中,\u59D3\u540D是“姓名”的Unicode编码,\u5E74\u9F84是“年龄”的Unicode编码,\u6027\u522B是“性别”的Unicode编码。我们需要将所有的中文字符转换成Unicode编码,然后再放入配置文件中。
五、Spring Boot国际化原理
在Spring Boot中,国际化实现的主要原理是在MessageSource和LocaleResolver等类的帮助下,通过读取配置文件来获取相应语言环境的资源文件。
· MessageSource:提供了国际化资源文件的支持,可以通过getMessage()方法获取国际化资源。
· ResourceBundleMessageSource:默认的MessageSource实现,使用了Java标准库中的ResourceBundle类来读取资源文件。
· LocaleResolver:提供了根据请求头部信息来解析出语言环境的支持。
· AcceptHeaderLocaleResolver:默认的LocaleResolver实现,使用请求头部信息中的“Accept-Language”字段来判断客户端语言偏好。
六、Spring Boot国际化多个base
我们也可以配置多个基础消息文件的路径,以逗号分隔,如下:
spring.messages.basename=i18n/message,i18n/message_custom
此时,在i18n目录下需要新建message_custom.properties和message_custom_zh.properties文件,用于存放自定义消息信息。当匹配不到国际化信息时,会按照默认顺序依次查找message和message_custom文件。
七、Spring Boot国际化动态加载
在配置文件中,我们不仅可以指定国际化资源文件的路径,还可以指定国际化资源文件的实时修改。
在application.yml中,我们可以设置如下参数:
spring.messages.always-use-message-format=true spring.messages.basename=classpath*:i18n/message spring.messages.cache-duration=-1 spring.messages.encoding=UTF-8 spring.messages.fallback-to-system-locale=true spring.messages.use-code-as-default-message=true
always-use-message-format参数指定是否开启MessageFormat的解析。而basename目前指向类路径下的i18n/message文件。Spring Boot支持使用classpath*:前缀来扫描类路径下的多个资源文件,通配符*会匹配所有的文件名。
我们可以在代码中动态改变Locale信息,并通过MessageSource.getMessage()方法返回对应消息,代码如下:
@Autowired private MessageSource messageSource; public String getMessage(String code, Object[] args, Locale locale) { return messageSource.getMessage(code, args, locale); }
八、Spring Boot国际化json
在前后端分离的场景下,我们可以将国际化信息以json格式返回给前端,让前端自行解析国际化信息。我们可以使用下面的代码返回国际化信息的json格式:
@RequestMapping(value = "/getMessageByJson", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public String getMessageByJson(@RequestParam String code, @RequestParam(required = false) String locale) { Locale l = StringUtils.hasText(locale) ? LocaleUtils.toLocale(locale) : LocaleContextHolder.getLocale(); Mapmap = new HashMap<>(); map.put(code, messageSource.getMessage(code, null, l)); return JSONObject.toJSONString(map); }
九、Spring Boot国际化配置中英文切换
我们可以通过在配置文件中指定Profile的方式来切换国际化信息。
在application.properties文件中添加如下信息:
spring.profiles.active=zh_CN
当我们需要切换到英文,只需要将application.properties文件名修改为application_en.properties,并设置spring.profiles.active=dev。
十、Spring Boot国际化一开始就变中文
在国际化配置中,我们可以在启动类中强制设置默认语言环境为中文,这样应用启动时就直接使用中文语言了,代码如下:
@SpringBootApplication public class Application { public static void main(String[] args) { Locale.setDefault(Locale.CHINA); SpringApplication.run(Application.class, args); } }