java国际化实现思路
Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。 Java程序的国际化主要通过如下3个类完成Java.util.ResourceBundle:用于加载资源包 Java.util.Locale:对应一个特定的国家/地区、语言环境 Java.text.MessageFormat:用于将消息格式化
资源文件 为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多的 key-value对,其中key是程序使用的部分,而value是程序的显示部分。 资源文件的命名可以是如下3种形式: baseName_language_country.properties baseName_language.properties baseName.properties 其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家如:中文: zh_CN 、英文:en_US。
实例:
1、搭建struts2环境。
2、在struts.xml文件中添加国际化的相关配置:
<constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="ApplicationResources" />
3、根据struts2的配置,插件一个名字为ApplicationResources_en_US.properties和ApplicationResources_zh_CN.properties的配置文件(如果还需要支持其他国家的语言只需要添加相应的配置文件并对其配置即可):
4、在ApplicationResources_en_US.properties和ApplicationResources_zh_CN.properties分别写入key-value对应关系。
5、编写语言切换方法。
/** * 实现手动中英文切换的方法 * @author ldy * @return */ public String changLanguage(){ String flag=ServletActionContext.getRequest().getParameter("lau_flag"); Locale l=null; HttpSession session = super.getSession(); if(flag==null){ l = Locale.CHINA; session.setAttribute("WW_TRANS_I18N_LOCALE", Locale.CHINA); }else if (flag.equals("2")) { l = Locale.CHINA; session.setAttribute("WW_TRANS_I18N_LOCALE", Locale.CHINA); } else if (flag.equals("1")) { l = Locale.US; ServletActionContext.getRequest().getSession().setAttribute("WW_TRANS_I18N_LOCALE", Locale.US); } ActionContext.getContext().setLocale(l); //解决把语言放入session后需要点击2次才切换语言的问题。 return SUCCESS; }
6、在struts配置文件中配置action:
<action name="changLanguage" class="LoginAction" method="changLanguage"> <result name="success">/pages/layout/top.jsp</result> </action>
7、在jsp界面中手动切换语言代码:
<%if(session.getAttribute("WW_TRANS_I18N_LOCALE") != null && ("en_US").equalsIgnoreCase(session.getAttribute("WW_TRANS_I18N_LOCALE").toString()) ){ %> <button οnclick="changeLanguage(2)">CHINESE</button> <%}else{ %> <button οnclick="changeLanguage(1)">ENGLISH</button> <%} %>
相对应的js代码:
function changeLanguage(flag) { this.location.href = "${ctx}/login/changLanguage.action?lau_flag="+flag; }
这样子可以实现action跳转的指定页面实现中英文切换,虽然我们把切换语言赋值给session的WW_TRANS_I18N_LOCAL属性,但是项目始终是只会读取浏览器发送过来的区域Locale对象信息。
解决这个问题我们可以自定义一个拦截器。
8、过滤器实现:
public class ChangeLanguageFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest r = (HttpServletRequest) req; MyRequestLanguage request = new MyRequestLanguage(r); filterChain.doFilter(request, resp); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
9、在web.xml文件中配置过滤器
<filter> <filter-name>changeLanguage</filter-name> <filter-class>com.jddba.webapp.filter.ChangeLanguageFilter</filter-class> </filter> <filter-mapping> <filter-name>changeLanguage</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
10、MyRequestLanguage实现语言的转换:
public class MyRequestLanguage extends HttpServletRequestWrapper{ private Locale locale = null; public MyRequestLanguage(HttpServletRequest request) { super(request); HttpSession session = request.getSession(); locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE"); } @Override public Locale getLocale() { if (locale != null) { return locale; } return super.getLocale(); } }
到此可以实现java web 项目的中英文手动切换。这种实现方式只有通过struts的acton跳转的界面可以实现手动进行中英文切换,直接以链接方式的跳转到jsp面不能使用此方式手动切换语言。
