孤灯野火
畅想的天空
posts - 2,comments - 4,trackbacks - 0

1.       根据浏览器语言配置国际化

1.1 例如国际化配置文件internationalization.xml,放置在spring/appServlet/文件夹下,可根据需要具体放置


 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

    
<!-- Internationalization start -->

    
<bean id="messageSource" class="com.util.ResourceBundleMessageSourceExtend">

        
<property name="basename">

            
<value>config/account/messages-account  </value>

        
</property>

        
<property name="useCodeAsDefaultMessage" value="true" />




</beans>




<!-- Internationalization end -->


</bean>

 

 

 

注:此配置文件加载国家化语言配置文件,value中值表示在当前src下的config/core文件件下的语言配置文件,例如:
可根据模块配置多个不同的配置文件以逗号放置在value中,例如:

  1.2 加载internationalization.xml

                web,xml需要配置,加载国际化配置文件

例如: 

 

<context-param>   
<param-name>contextConfigLocation</param-name>

<param-value>

 classpath:spring/appServlet/internationalization.xml

</param-value>

</context-param>

 

  1.3 国际化页面的展现

          引入spring或者jstl的标签库,例如

<%@ taglib uri="/spring"
prefix="spring"%>
,也可手动引入spring.tld,那么在uri中写入spring.tld所在位置,例如:/WEB-INF/tag/spring.tld

   在需要国际化的jsp中引入标签:

         <spring:message code="CM01S01_Label_Password " /> 
code
中可根据需要写入国际化语言配置的key

  1.4 启动加载国际化语言的类以及后台国际化

         1.4.1 ResourceBundleMessageSourceExtend.java
   

package com.core.util;

import org.springframework.context.support.ResourceBundleMessageSource;

/**
 * ResourceBundleMessageSourceExtend
 * 
 * 
@author liu_dawei
 * 
 
*/

public class ResourceBundleMessageSourceExtend extends ResourceBundleMessageSource {

    
private String[] extendBaseNames;

    
/**
     * 
     * <p>
     * setBasenames
     * </p>
     * 
     * 
@param basenames
     * 
@see org.springframework.context.support.ResourceBundleMessageSource#setBasenames(java.lang.String[])
     
*/

    @Override
    
public void setBasenames(String[] basenames) {
        
// TODO Auto-generated method stub
        String tempBaseName = basenames[0].toString();
        
int length = tempBaseName.split(",").length;
        extendBaseNames 
= new String[length];

        
for (int i = 0; i < length; i++{
            extendBaseNames[i] 
= tempBaseName.split(",")[i];
        }


        
super.setBasenames(extendBaseNames);
    }


}

 

    1.4.2 MessageManager类

/**
 * MessageManager.java
 * 
 * @screen core
 * 
@author liu_dawei
 
*/

package com.core.util;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils;

/**
 * The internationalization message manager class
 * 
 * 
@author liu_dawei
 * 
 
*/

public class MessageManager {

    
/** the single instance */
    
private static MessageManager instance;

    
/**
     * <p>
     * The Constructors Method.
     * </p>
     * 
     
*/

    
private MessageManager() {}

    
/**
     * <p>
     * get the single instance of MessageManager.
     * </p>
     * 
     * 
@return the single instance
     
*/

    
public static MessageManager getInstance() {

        
if (null == instance) {
            instance 
= new MessageManager();
        }


        
return instance;
    }


    
/**
     * get Message
     * 
     * 
@param key properties key
     * 
@return the message
     
*/

    
public String getMessage(String key) {
        
return this.getMessage(key, null);
    }


    
/**
     * get Message
     * 
     * 
@param key properties key
     * 
@param obj the parameters
     * 
@return the message
     
*/

    
public String getMessage(String key, Object[] obj) {
        
// TODO
        ApplicationContext actx = null;
        actx 
= WebApplicationContextUtils.getWebApplicationContext(getHttpServletRequest().getSession()
                .getServletContext());

        String value 
= "";
        value 
= actx.getMessage(key, obj, getLocale());

        
if (StringUtil.isEmpty(value)) {
            value 
= key;
        }

        
return value;
    }


    
/**
     * get Message
     * 
     * 
@param key properties key
     * 
@param obj the parameters
     * 
@return the message
     
*/

    
public String getMessage(String key, Object[] obj, Locale locale) {
        
// TODO
        ApplicationContext actx = ApplicationContextManager.getInstance().getApplicationContext();

        String value 
= actx.getMessage(key, obj, locale);

        
if (StringUtil.isEmpty(value)) {
            value 
= key;
        }

        
return value;
    }


    
/**
     * get the Locale info
     * 
     * 
@return the Locale info
     
*/

    
public Locale getLocale() {

        HttpServletRequest request 
= getHttpServletRequest();

        LocaleResolver localeResolver 
= RequestContextUtils.getLocaleResolver(request);

        
return localeResolver.resolveLocale(request);

    }


    
/**
     * 
     * <p>
     * getIELanguage
     * </p>
     * 
     * 
@return
     
*/

    
public String getIELanguage() {

        
return getHttpServletRequest().getLocale().getLanguage();
    }


    
/**
     * <p>
     * get the request.
     * </p>
     * 
     * 
@return the request
     
*/

    
public HttpServletRequest getHttpServletRequest() {
        ServletRequestAttributes servletRequestAttributes 
= (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        
if (servletRequestAttributes != null{
            
return servletRequestAttributes.getRequest();
        }
 else {
            
return null;
        }

    }


}

注:getMessage(String key, Object[] obj) obj的参数传的国际化语言中附带的参数,例如:

Common_E0014=Input value of {0} is too short. Minimum {1} character

Obj[0]=”a”,obj[1]=”b”,如果调用getMessage(“Common_E0014”,obj),那么形成的值为:Input value of a is too short. Minimum b character

   getLocale()方法用于spring Session国际化的,只要session中有Locale,就会使用session中的locale,以下会详解

2.       Spring Session国际化

1.1  与浏览器国际化相比需要在internationalization.xml中加入以下配置

 

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


    
<bean id="controllerClassNameHandler"
        class
="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
        
<property name="interceptors">
            
<list>
                
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
            
</list>

        
</property>
    
</bean>



1.2   调用jsp中改变语言的按钮时,需要把变化的语言传到后台,并放置在session中,例如:

  // language 页面传入的语言
        String newLanguage = language;
        
if (!StringUtil.isEmpty(newLanguage)) {
            
// get the locale resolver
            LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
            
if ("zh".equals(newLanguage)) {
                localeResolver.setLocale(request, response, Locale.CHINA);
            }
 else if ("en".equals(newLanguage)) {
                localeResolver.setLocale(request, response, Locale.ENGLISH);
            }
 else if ("jp".equals(newLanguage)) {
                localeResolver.setLocale(request, response, Locale.JAPAN);
            }
 else {
                localeResolver.setLocale(request, response, Locale.ENGLISH);
            }

        }
 else {
            
////此处使用的外界传入locale,如果默认进入主页面想使用浏览器的,可调用request.getLocale().getLanguage();
            newLanguage = locale.getLanguage();
        }

 

其他使用方法类似------------------------------end



posted on 2012-11-01 11:00 孤飞燕 阅读(2614) 评论(0)  编辑  收藏 所属分类: Spring

只有注册用户登录后才能发表评论。


网站导航: