`
hbxflihua
  • 浏览: 683349 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

应用国际化(2)

阅读更多

上一篇介绍了应用国际化需要考虑的问题,本篇介绍后端如何实现提示语的国际化。

 

先说说系统框架,本项目采用React + Spring + MyBatis + RabbitMQ + Redis等主流框架组合搭建而成,前后端分离。不得不说,在Spring Framework的加持下,做什么事情都方便的多。

 

1、添加LangCookieFilter,拦截参数中带有lang的请求,并将语言标识存入cookie。

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;

public class LangCookieFilter implements Filter {
    // 默认参数名称
    public static final String DEFAULT_PARAM_NAME = "lang";
    
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
			throws IOException, ServletException {
		
		HttpServletRequest request = (HttpServletRequest)arg0;
		HttpServletResponse response = (HttpServletResponse)arg1;
		
		String lang = request.getParameter(DEFAULT_PARAM_NAME);
		if(StringUtils.isNotEmpty(lang)){
			Cookie[] cookies = request.getCookies();
			boolean flag = false;
			if(cookies != null){
				for (Cookie cookie : cookies) {
					if(cookie.getName().equals(DEFAULT_PARAM_NAME)){
						cookie.setValue(lang);
						flag = true;
					}				
				}				
			}
			if(!flag){
				Cookie cookie = new Cookie(DEFAULT_PARAM_NAME, lang);
				cookie.setHttpOnly(true);
				response.addCookie(cookie);
			}			
		}
		chain.doFilter(arg0, arg1); 
	}

	@Override
	public void destroy() {}

}

 

2、配置web.xml  将LangCookieFilter添加到web.xml中。另外还需配置RequestContextListener监听,方便在MessageSourceUtils中使用

	<!-- langCookieFilter -->
	<filter>
		<filter-name>langCookieFilter</filter-name>
		<filter-class>com.rongdu.framework.core.common.cookie.LangCookieFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>langCookieFilter</filter-name>
		<url-pattern>*.htm</url-pattern>
	</filter-mapping>
	
<listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  
</listener>

   后来看了RequestContextListener代码,感觉LangCookieFilter的做法有些多余,后续再研究。

 

3、springmvc配置文件中添加i18n支持

	  
	<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
		<property name="defaultLocale" value="zh_CN"/>
	</bean>  
	
	<!-- 国际化的消息资源文件(本系统中主要用于显示/错误消息定制) -->  
	<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
	    <property name="basenames">  
	        <list>  
	            <!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找  -->  
	            <value>classpath:i18n/message</value>  
	            <value>classpath:org/hibernate/validator/ValidationMessages</value>  
	        </list>  
	    </property>  
	    <property name="useCodeAsDefaultMessage" value="false"/>  
	    <property name="defaultEncoding" value="UTF-8"/>  
	    <property name="cacheSeconds" value="60"/>  
	</bean>

 

4、添加MessageSourceUtils工具类,获取国际化文件中国际化字段信息

import java.util.Locale;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.rongdu.framework.core.common.context.Constant;
import com.rongdu.framework.core.common.cookie.LangCookieFilter;
/**
 * 国际化语言工具类
 * @author lh@erongdu.com
 * @version 2.0
 * @since 2018-12-26
 *
 */
public class LangUtil {
	
	public static String get(){
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null){    		
	    	for (Cookie cookie : cookies) {
				if(cookie.getName().equals(LangCookieFilter.DEFAULT_PARAM_NAME)){
					return cookie.getValue();
				}
	    	}
		}
    	return Constant.DEFAULT_LANG;		
	}

	public static Locale getLocale(){
    	return new Locale(get());
    }
}

 

import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;

/**
 * 资源国际化工具类
 * @author lh@erongdu.com
 * @version 2.0
 * @since 2018-12-24
 */
@Component
public class MessageSourceUtils {

    // 日志
    private static final Logger LOGGER = LoggerFactory.getLogger(MessageSourceUtils.class);
    
    private static MessageSource messageSource;
    
    @Autowired
    public void setMessageSource(MessageSource messageSource) {
		MessageSourceUtils.messageSource = messageSource;
	}


    /**
     * 获取国际化文件中国际化字段信息
     * @param key	国际化参数
     * @param args	动态参数
     * @return
     */
    public static String getMessage(String key, Object[] args) {
    	try {
    		return messageSource.getMessage(key, args, key, LangUtil.getLocale());
    	} catch (Exception e) {
    		LOGGER.error(e.getMessage());
    	}
    	return key;
    }
    
    /**
     * 可供后台使用
     * 获取国际化文件中中文字段信息
     * @param key	国际化参数
     * @param args	动态参数
     * @return
     */
    public static String getChineseMessage(String key, Object[] args) {
    	try {
    		return messageSource.getMessage(key, args, key, Locale.CHINESE);
    	} catch (Exception e) {
    		LOGGER.error(e.getMessage());
    	}
    	return key;
    }
    
//	/**
//     * 获取国际化文件中国际化字段信息
//     * @param key	国际化key
//     * @param args	动态参数
//     * @return
//     */
//    public static String getMessage(String key, Object[] args) {
//        try {
//            Locale locale = LocaleContextHolder.getLocale();
//            return messageSource.getMessage(key, args, key, locale);
//        } catch (Exception e) {
//        	LOGGER.error(e.getMessage());
//        }
//        return key;
//    }

}

 

5、在Controller、Service等层使用MessageSourceUtils工具类

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.rongdu.framework.core.common.util.MessageSourceUtils;

@Controller
public class IndexController{

	/**
	 * 首页
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/home.htm")
	public String home(Model model){
		model.addAttribute("title", MessageSourceUtils.getMessage("title", null));
		return "home";
	}
	
}

 

分享到:
评论

相关推荐

    国际化语言版本应用

    国际化语言版本应用是一种让软件或网站能够适应不同国家和地区用户需求的技术。在现代软件开发中,随着全球化进程的加速,应用程序需要支持多种语言,以便更好地服务全球用户。Spring MVC 是一个广泛使用的Java Web...

    应用程序国际化

    应用程序国际化,特别是针对iOS平台的国际化,是一项至关重要的任务,它允许开发者构建的应用程序能够适应全球用户的不同语言和文化需求。iOS国际化不仅涉及到文本翻译,还包括日期、时间、数字、货币格式以及图像和...

    java web应用国际化与分页

    Java Web应用的国际化(i18n)和分页是开发多语言支持和高效展示大量数据的关键技术。在Java Web环境中,Struts框架提供了一种优雅的方式来处理这两种需求。 国际化是使应用程序能够根据用户的地区和语言偏好显示不同...

    Struts 2 国际化应用

    Struts 2 国际化应用

    Struts2/应用程序 国际化

    文档中介绍了Struts2中国际化的实现原理和使用方法,同时介绍了应用程序的国际化的实现思路和方法以及示例!

    Qt应用程序国际化步骤

    在开发跨地域的应用程序时,实现国际化(Internationalization,简称i18n)是一项重要的任务。Qt库提供了强大的支持,使得Qt应用程序能够轻松地适应多种语言环境。本篇将详细介绍Qt应用程序国际化的步骤,以及如何...

    spring 国际化 spring mvc

    国际化可以让我们的应用程序适应不同语言和地区,提高应用程序的可读性和可用性。本文将详细介绍如何使用 Spring MVC 实现国际化。 国际化的重要性 在全球化的今天,国际化变得越来越重要。随着应用程序的全球化,...

    论人脸识别技术的国际化区域诉讼证据应用.pdf

    "论人脸识别技术的国际化区域诉讼证据应用" 人脸识别技术的国际化区域诉讼证据应用是当前学术领域和司法实务界关注的焦点之一。随着现代科技的高速发展,人脸识别技术已经广泛应用于各领域,主要应用在侦查破案、...

    android国际化中英文切换demo

    在Android应用开发中,实现国际化是一项重要的任务,它能让应用支持多种语言,为全球用户提供更好的体验。本示例“android国际化中英文切换demo”提供了一个实际操作的案例,帮助开发者理解并实现Android应用的多...

    Nacos实现SpringBoot国际化的增强

    对于某些应用系统而言,它需要发布到不同的国家地区,因此需要特殊的做法来支持,也即是国际化。通过国际化的方式,实现界面信息,各种提示信息等内容根据不同国家地区灵活展示的效果。比如在中国,系统以简体中文...

    C# winform 国际化

    在C# WinForm应用开发中,国际化(Internationalization)是一个重要的功能,允许应用程序适应不同语言和文化环境。本文将深入探讨如何实现C# WinForm应用的国际化,包括菜单国际化和资源国际化。 首先,我们需要...

    Android 一键国际化

    在Android应用开发中,为了使应用能够适应全球市场,国际化的支持是必不可少的。"Android 一键国际化"是一个针对Android Studio的高效插件,旨在帮助开发者便捷地为应用添加多语言支持,尤其对于那些需要快速扩展到...

    c# 多国语言国际化

    C# 多国语言国际化(Internationalization)是开发支持多种语言的应用程序的关键技术。在WinForms应用程序中,C#提供了一套完整的框架来实现这一功能,使得开发者可以轻松地为不同地区和语言的用户提供定制化的界面...

    Kiwi国际化全流程解决方案

    Kiwi项目是一个专门针对JavaScript应用的国际化框架,它提供了一套完整的工具集,旨在简化多语言版本的创建和维护。Kiwi的核心目标是使开发者能够轻松地将应用内容与特定语言分离,以实现高效且灵活的国际化支持。 ...

    设计Java EE应用程序-- J2EE应用程序国际化和本地化.doc

    Java EE应用程序的国际化和本地化是开发面向全球市场的软件的关键组成部分。这涉及到设计能够适应不同语言、文化习惯、货币和日期格式的应用程序。在Java平台上,实现这一目标主要依靠Java的国际化API,如`java.util...

    Android应用源码之(本地化与国际化).zip

    在Android应用开发中,本地化和国际化是两个关键的概念,它们允许开发者构建能够适应不同语言和地区设置的应用。本文将深入探讨这两个概念,并结合提供的源码进行解析和学习。 首先,让我们理解什么是本地化...

    android应用内和系统设置两种设置多语言国际化

    在Android开发中,实现应用支持多语言国际化是一个重要的功能,可以让应用吸引全球用户。本教程将详细介绍如何在Android应用内以及通过系统设置实现多语言国际化,涵盖了简体中文、繁体中文和英文的切换。 首先,...

    国际化标签库

    国际化标签库是一种软件开发工具,主要用于支持多语言环境下的应用程序。在现代软件开发中,特别是在全球范围内使用的产品或服务中,支持多种语言是至关重要的。国际化标签库提供了一种标准化的方式来管理和显示各种...

    Android应用源码之(本地化与国际化)-IT计算机-毕业设计.zip

    2. **国际化(Internationalization)**: 国际化则是指设计和构建应用程序时,考虑到其可能被世界各地的不同语言和文化所使用。在Android中,这通常意味着代码中不包含硬编码的文本,而是使用字符串资源,以便于在...

Global site tag (gtag.js) - Google Analytics