zoukankan      html  css  js  c++  java
  • spring源码-国际化-3.5

      一、国际化在实际代码中是非常常见的一中方式。为了结合web做一下语言上面的切换,而达到展示的目的。

      二、这里呢,主要是介绍spring中对于国际化做了哪些处理。

      三、实现方式

      1)xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      
        <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basenames">
                <list>
                    <value>message.test</value>
                </list>
            </property>
        </bean>
    </beans>

      备注:<!--这里id必须是messageSource,后续会说为什么-->

      2)语言文件

       

      写法:

    testtest=u6d4bu8bd5{0}
    testtest=test{0}

      3)应用过程:

         ApplicationContext context = new ClassPathXmlApplicationContext("spring-message.xml");
            ResourceBundleMessageSource messageSource = context.getBean("messageSource", ResourceBundleMessageSource.class);
            String messageZh = messageSource.getMessage("testtest", new Object[]{"数据"}, Locale.CHINESE);
            String messageEn = messageSource.getMessage("testtest", new Object[]{"data"}, Locale.ENGLISH);
            System.out.println(messageZh);
            System.out.println(messageEn);

      4)效果

      

      四、当然这里只是后台的实现方式,因为是国际化吗。肯定是和web端密切相关的。传递方式

      1)request:设置消息头等。通过拦截请求设置获取当前语言。然后在后端处理国际化。

      2)cookie:这种方式通过请求的方式修改语言。

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
       <property name="cookieMaxAge" value="1800000"/>
       <property name="defaultLocale" value="zh_CN"/>
       <property name="cookieName" value="Language"/>
     </bean>

      3)session:这个方式的好处是在于会话处理。相对于cookie,会话可以根据session的时间而保持。

      <bean id="sessionLocaleResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
            <property name="defaultLocale" value="zh"/>
        </bean>

      五、spring部分

      1)refresh()方法中的this.initMessageSource();

      2)实现:

    protected voidinitMessageSource() {
            //获取beanfactory
            ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
            //判断是否包含messageSource的bean
            if (beanFactory.containsLocalBean("messageSource")) {
                this.messageSource = (MessageSource)beanFactory.getBean("messageSource", MessageSource.class);
                //如果父类存在,设置父类
                if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
                    HierarchicalMessageSource hms = (HierarchicalMessageSource)this.messageSource;
                    if (hms.getParentMessageSource() == null) {
                        hms.setParentMessageSource(this.getInternalParentMessageSource());
                    }
                }
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Using MessageSource [" + this.messageSource + "]");
                }
            } else {
                //spring默认的国际化使用方式
                DelegatingMessageSource dms = new DelegatingMessageSource();
                dms.setParentMessageSource(this.getInternalParentMessageSource());
                this.messageSource = dms;
                beanFactory.registerSingleton("messageSource", this.messageSource);
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Unable to locate MessageSource with name 'messageSource': using default [" + this.messageSource + "]");
                }
            }
        }

      3)从代码中可以看出:这里默认访问的是messageSource,如果配置成其他名称。在使用的时候会抛类型异常。

       六、简易版国际化实现过程

         ResourceBundle resourceBundle = ResourceBundle.getBundle("message.test", Locale.US);
            String testest = resourceBundle.getString("testtest");
            String format = MessageFormat.format(testest, new Object[]{"data"});
            System.out.println(format);

      

  • 相关阅读:
    再谈PHP、Python与Ruby
    php消息队列
    创业如同追女生:成功的创业者都是追女生好手
    Windows 下 Python easy_install 的安装
    常用Python第三方库 简介
    Highcharts使用手册
    sqoop java api
    redis 读写分离
    linux 安装redis
    hive 安装和部署
  • 原文地址:https://www.cnblogs.com/ll409546297/p/10028060.html
Copyright © 2011-2022 走看看