介绍了应用国际化需要考虑的问题,本篇介绍后端如何实现提示语的国际化。
先说说系统框架,本项目采用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 com.rongdu.framework.core.common.cookie.langcookiefilter langcookiefilter *.htm org.springframework.web.context.request.requestcontextlistener
后来看了requestcontextlistener代码,感觉langcookiefilter的做法有些多余,后续再研究。
3、springmvc配置文件中添加i18n支持
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"; } }
相关推荐
国际化版本应用,国际化语言切换及系统配置应用。springmvc国际化代码应用。
java web应用国际化与分页 java web应用国际化与分页 java web应用国际化与分页
【eoeandroid特刊】第五期:资源与应用国际化布 (其余《eoeandroid特刊》请查阅我的资源列表) 1.源和资产(resources and assets) 2.android 中可用的资源类型 3.resources and internationalization(资源和国际化)...
struts 2 国际化应用
文档中介绍了struts2中国际化的实现原理和使用方法,同时介绍了应用程序的国际化的实现思路和方法以及示例!
对于某些应用系统而言,它需要发布到不同的国家地区,因此需要特殊的做法来支持,也即是国际化。通过国际化的方式,实现界面信息,各种提示信息等内容根据不同国家地区灵活展示的效果。比如在中国,系统以简体中文...
qt应用程序国际化示例代码,包含静态加载和动态切换语言两种方式。
ios应用程序国际化,能实现语言切换,非常好用。
ios国际化 应用内切换语言更新版
国际化与本地化的概念,web应用的中文本地化,struts框架对国际化的支持
设计java ee应用程序-- j2ee应用程序国际化和本地化.doc
论人脸识别技术的国际化区域诉讼证据应用.pdf
go 需要支持 i18n (国际化) 工具,但是现有的 go 程序的国际化支持都比较冗长繁杂。i18n4go提供一个应用工作流进程 —— 从 go 应用中提取字符串,合并他们到单个包(消除冗余),准备翻译,使底层代码容易接收他们...
android应用内和系统设置,两种设置多语言国际化。代码完整,包括切换简体,繁体中文和英文
qt应用程序国际化工程示例
# 国际化(应用名称 文字 图片的国际化适应)附带参考链接在readme.md中
本地化与国际化.zipios应用例子源码下载本地化与国际化.zipios应用例子源码下载 1.适合学生学习研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
ios应用程序国际化 博客文章:http://blog.csdn.net/z251257144/article/details/8288028
这样估计以后会有中文版的flex2 了...),使用flex2的本地化特性我们可以很容易创建多语言本地化的flex应用,为我们的flex应用打入国际市场添威助力,不过不像java的 本地化资源动态获取的方式,目前flex2的本地化...
能够支持多个国家或者地区的本地化应用,国际化的应用