一、 环境搭建

1.1 依赖包版本

jdk版本 1.8

spring版本 4.1.6.RELEASE

javax.servlet版本 3.0.1

1.2 Maven配置

<properties>
       <org.springframework.version>4.1.6.RELEASE</org.springframework.version>
</properties>

    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <!-- j2ee -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

二、国际化配置步骤

在环境搭建完成后,我们开始配置国际化。基本的实现思路就是根据每个请求的请求头中的地区信息,也就是Accept-Language来识别地区,如下所示。识别请求所属的地区后,利用Spring的ResourceBundleMessageSource来获取对应语言版本资源文件中的信息即可。

Accept-Language:zh-CN,zh;q=0.8

2.1 新建国际化资源文件resource bundle

我们在项目文件resource文件夹下创建一个locale文件夹,用于存放不同语言版本的资源文件,资源文件的名称格式为:
文件名_对应语言英文简称.properties,如message_zh.properties和message_en.properties

创建完成后,在资源文件内加入需要替换的字段信息,以键值对形式排列:
在message_zh.properties中添加:
message.hi=你好
在message_en.properties中添加:
message.hi=hi

2.2 在spring配置文件中添加messageSource:

在Spring配置文件中增加id为messageSource的bean,将资源文件读取到messageSource中。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <!-- 这里设置资源文件地址,这里只要填文件名就可以了,不需要填语言类型的后缀 -->
                <value>locale.message</value>
            </list>
        </property>
        <!-- 设置字符编码utf8 -->
        <property name="defaultEncoding" value="UTF-8"/>
</bean>

2.3 创建LocaleType类:

创建一个用于记录和转换语言版本的LocaleType类,将上面创建的messageSource注入,用于获取资源文件中对应的文本信息。将该类注册到spring容器,在需要使用的地方直接注入即可。

@Component
public class LocaleType {
    @Autowired
    private MessageSource messageSource;

    private static ThreadLocal<Locale> threadLocal = new NamedThreadLocal<Locale>("language_threadLocal");

    public static void setLocale(Locale locale) {
        threadLocal.set(locale);
    }

    public String getMessage(String key) {
        return messageSource.getMessage(key,null,threadLocal.get());
    }
}

2.4 创建LocaleInterceptor类

创建一个LocaleInterceptor,用于拦截请求,获取请求头中的地区信息并利用已创建的LocalType类保存,如下所示:

@Component("localeInterceptor")
public class LocaleInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        Locale locale = request.getLocale();
        if (locale != null) {
            LocaleType.setLocale(locale);
        } else {
            //请求头中不包含地区信息则设置为中国
            LocaleType.setLocale(Locale.CHINA);
        }

        return true;
    }

    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

2.5 在SpringMVC配置文件中添加拦截器:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <ref bean="localeInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

2.6 在需要使用语言版本转换的地方注入LocaleType类:

@RestController
public class TestController {

    @Autowired
    private LocaleType localeType;

    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String getMessage() {
        String message = localeType.getMessage("message.hi");
        System.out.println("get message: " + message);
        return message;
    }
}

三、测试运行

我们使用postman发送请求进行测试,分别在请求头中选择zh和en两种语言版本发送:

Java spring国际化 spring国际化配置_Source

控制台打印信息:get message: hi


Java spring国际化 spring国际化配置_国际化_02

控制台打印信息:get message: 你好

四、项目github地址:

本项目github地址:git@github.com:cokiMing/i18demo.git