微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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信息决定启用哪个国际化文件

在这里插入图片描述

那如果不想使用这种通过设置请求头信息的方法,而希望能够使用请求参数的方式是否可以呢?
答案是肯定的,可以通过 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配置文件拦截器相关配置,然后对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测试发送请求:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐