第十章 国际化_概述

国际化_页面中获取国际化资源信息

  • 在页面上能够根据浏 览器语言设置的情况对文本, 时间, 数值进行本地化处理
  • 可以在 bean 中获取国际化资源文件 Locale 对应的消息
  • 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况
  • 解决:
    • 使用 JSTL 的 fmt 标签
    • 在 bean 中注入 ResourceBundleMessageSource 的实例, 使用其对应的
      getMessage 方法即可
    • 配置 LocalResolver 和 LocaleChangeInterceptor

springMvc中国际化的区域信息是由区域信息解析器得到的;

private LocaleResolver localeResolver
默认初始化
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
对应的方法如下

图片说明
图片说明
现象:是按照浏览器带来语言信息决定

获取到浏览器的区域信息
Locale locale = request.getLocale()

实验代码

定义国际化资源文件

login_zh_CN.properties    
welcomeinfo=WELECOME TO HERE
username=USERNAME
password=PASSWORD
loginBtn=LOGIN
login_en_US.properties

注册springmvc组件

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="LoginProperties/login"></property>
    </bean>

获取jsp页面

<fmt:message key="welcomeinfo"></fmt:message>
<form action="">
  <fmt:message key="username"/>:<input />
  <fmt:message key="password"/>:<input />
  <input type="submit" value='<fmt:message key="loginBtn"/>'/>
</form>

程序中获取国际化信息

jsr303 这么获取信息 原生表单就可以用了

@Controller
public class MyController {
    @Autowired
    private MessageSource messageSource;

    @RequestMapping("/hello")
    public String getIndex(Locale locale,Model model ) {
        System.out.println(locale);
        String welcomeinfo = messageSource.getMessage("welcomeinfo", null, locale);
        System.out.println(welcomeinfo);
        model.addAttribute("msg", welcomeinfo);//可以绑定错误信息
        return "hello";
    }
}

点击链接切换国际化

效果一
图片说明
效果二
图片说明
控制层

@Controller
public class MyController {
    @Autowired
    private MessageSource messageSource;
    @RequestMapping("/hello")
    public String getIndex() {
        return "hello";
    }
}

自定义的国际化处理类

public class myLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        Locale locale = null;
        String localeStr = request.getParameter("locale");
        if(localeStr!=null&&!"".equals(localeStr)) {
            locale = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]);
        }else {
            locale = request.getLocale(); //请求头
        }
        return locale;
    }

    @Override//去别的继承子类 chao
    public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {
        throw new UnsupportedOperationException(
                "Cannot change HTTP accept header - use a different locale resolution strategy");
    }
}

springmvc的配置信息

<bean id="localeResolver" class="com.project.service.myLocaleResolver"></bean>

页面代码

《a href="hello?locale=en_US">English《/a>
《a href="hello?locale=zh_CN">中文《/a>

①国际化概述

  • 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。
  • 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver),找到后使用它获取请求所对应的本地化类型信息。
  • SpringMVC 还允许装配一个动态更改本地化类型的***,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
  • SessionLocaleResolver & LocaleChangeInterceptor 工作原理
    图片说明

②本地化解析器和本地化***

  • AcceptHeaderLocaleResolver:根据 HTTP 请求头的 Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器。
  • CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型
  • SessionLocaleResolver:根据 Session 中特定的属性确定本地化类型
    LocaleChangeInterceptor:从请求参数中获取本次请求对应的本地化类型

sessionLocaleResolver

因为国际化通过配置后会去session中找对应locale中
图片说明
配置文件的代码

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

控制层的代码

@Controller
public class MyController {
    @RequestMapping("/hello")
    public String getIndex(@RequestParam(value="locale",defaultValue = "zh_CN")String localeStr, Locale locale ,HttpSession session) {
        locale = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]);
        session.setAttribute(SessionLocaleResolver.class.getName() + ".LOCALE", locale);
        return "hello";
    }
}

效果
图片说明

通过***来修改国际化 【SessionLocaleResolver+LocaleChangeInterceptor】

是特定专门解决该问题
配置文件信息

<mvc:interceptors>
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

控制器

@Controller
public class MyController {
    @RequestMapping("/hello")
    public String getIndex() {
        return "hello";
    }
}
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务