您的位置:

Spring Boot国际化详解

一、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();
        Map map = 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);
        }
    }