Springboot 基于MessageSource配置国际化

1. 国际化的基本配置
package com.collmall.config;

import org.springframework.boot.SpringApplication;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import java.util.Locale;

public class I18nConfig {
      @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 配置路径
        messageSource.setBasename("i18n.messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
   @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setDefaultLocale(Locale.CHINA);
        resolver.setCookieName("lang");
        return resolver;
    }
}


  

不想用以上代码中写死的配置,也可以通过配置文件进行配置: 如下

# 配置MessageSource
spring:
  messages:
#   文件类路径位置,文件名保留
    basename: messages/messages
#    编码语言
    encoding: UTF-8
#    在未查询到时是否使用默认设置的message
    use-code-as-default-message: true

2. 国际化的配置文件

Springboot 基于MessageSource配置国际化_第1张图片
以 中文和英文举例:

messages_en_US.properties

msg.activity= activity participation and statistics

messages_zh_CN.properties

msg.activity=中文活动参与和统计

在资源文件图片中Resource Bundle 'messages’文件夹是创建多个message_language_country.properties文件时IDEA自动创建的

3. 编写接口用于测试
package com.collmall.document.controller.i18n;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import java.util.Locale;

@RestController
public class I18nController {

    @Autowired
    private MessageSource messageSource;

    @Autowired
    private LocaleResolver localeResolver;


    @GetMapping("/getMessage")
    public String getMessage(HttpServletRequest request) {
        //国际化语言
        Locale locale = localeResolver.resolveLocale(request);
        return messageSource.getMessage("msg.activity", null, locale);
    }
}


4. 测试用例
 #验证中文请求
curl -H "Accept-Language: zh-CN" http://localhost:8080/getMessage

# 验证英文请求
curl -H "Accept-Language: en-US" http://localhost:8080/getMessage

已注释掉spring.mvc.locale=zh_CN配置
系统现在会根据请求自动选择语言环境
语言解析优先级:

URL参数?language=xx_XX(最高优先级)
Accept-Language请求头
JVM默认语言环境(最低优先级)

已添加的配置:

CookieLocaleResolver作为默认的LocaleResolver实现
设置默认语言环境为Locale.CHINA(zh_CN)
使用"lang"作为存储语言的cookie名称
语言解析流程:

优先从cookie获取语言设置
如果没有cookie,使用默认的Locale.CHINA
仍然支持通过Accept-Language头覆盖

# 测试默认中文
curl http://localhost:8080/getMessage

# 测试cookie语言设置
curl -H "Cookie: lang=en_US" http://localhost:8080/getMessage

扩展性: 如需改为Session存储,只需将CookieLocaleResolver替换为SessionLocaleResolver:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.CHINA);
    return resolver;
}

已添加CookieLocaleResolver作为默认实现

配置了合理的默认语言环境(zh_CN)

系统现在支持:

Cookie存储语言偏好
默认中文回退
仍然兼容Accept-Language头

# 验证默认中文
curl http://localhost:8080/getMessage

# 验证cookie设置英文
curl -H "Cookie: lang=en_US" http://localhost:8080/getMessage

你可能感兴趣的:(spring,boot,后端,java,国际化,I18N)