SpringMVC国际化

本文使用IDEA基于SpringMVC项目实现国际化功能。

创建国际化properties文件:

language_en_US.properties:

username=username
password=password

language_zh_CN.properties:

username=用户名
password=密码

SpringMVC配置文件:

<!--    MVC注解器,启用注释-->
<mvc:annotation-driven>
    <!-- 消息转换器(解决@ResponseBody返回中文乱码问题)-->
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!--    国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
	<!--    定义国际化文件前缀-->
    <property name="basename" value="language"></property>
    <!--    配置默认编码-->
    <property name="defaultEncoding" value="UTF-8"></property>
</bean>

Controller类:

使用SpringMVC配置文件配置的ResourceBundleMessageSource的bean对象获取对应的国际化文件中的值。

@Controller
public class InternationalController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/international")
    @ResponseBody
    public String international() {
        String username = messageSource.getMessage("username", null, LocaleContextHolder.getLocale());
        String password = messageSource.getMessage("password", null, LocaleContextHolder.getLocale());
        return username + ", " + password;
    }
}

使用PostMan模拟http请求访问Controller:

在以上的配置信息中,默认的国际化实现是:由请求头中Accept-Language信息决定启用哪个国际化文件。
SpringMVC国际化
那如果不想使用这种通过设置请求头信息的方法,而希望能够使用请求参数的方式是否可以呢?
答案是肯定的,可以通过 SessionLocaleResolver 或者 CookieLocaleResolver 都可以实现。

SpringMVC配置文件添加多一项bean配置,以及拦截器配置:

<!--    将解析出来的国际化配置信息保存在session中(注意id只能是localeResolver)-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<!--    将解析出来的国际化配置信息保存在cookie中-->
<!--    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>-->
    
<!--    国际化拦截器(支持url设置语言参数lang)-->
<mvc:interceptors>
    <mvc:interceptor>
    	<!--    拦截所有请求-->
        <mvc:mapping path="/**"/>
        <bean id="interceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        	<!--    通过url的lang参数决定国际化-->
            <property name="paramName" value="lang"></property>
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

再次使用PostMan发送请求测试:

这次是直接在url末尾拼接上参数lang,指定国际化信息。
SpringMVC国际化
那如果不依赖拦截器是否可以呢?
答案也是肯定的。

首先删除SpringMVC配置文件中拦截器相关配置,然后对Controller类进行如下改造:

@Controller
public class InternationalController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/international")
    @ResponseBody
    public String international(String lang, HttpSession session) {
        Locale locale = null;
        switch (lang) {
            case "zh-CN":
                locale = new Locale("zh", "CN");
                break;
            case "en-US":
                locale = new Locale("en", "US");
                break;
        }
        String username = messageSource.getMessage("username", null, locale);
        String password = messageSource.getMessage("password", null, locale);
        return username + ", " + password;
    }
}

还是同样使用PostMan测试发送请求:

SpringMVC国际化

上一篇:设计模式--备忘录模式


下一篇:SpringBoot+Thymeleaf国际化引用出错