在做项目时,遇到了点击首页两个链接实现系统全部国际化的问题。以下两篇文章帮助很大,故摘录下来:
第一篇文章: http://whp0731.iteye.com/blog/417222
Jsp代码
<body>
<s:a href="/Struts2/changeLang.action?lang=en">English</s:a>
<s:a href="/Struts2/changeLang.action?lang=zh">中文</s:a>
<center>
<s:text name="addUser"/>
</center>
</body>
Jsp代码
<body>
<s:a href="/Struts2/changeLang.action?lang=en">English</s:a>
<s:a href="/Struts2/changeLang.action?lang=zh">中文</s:a>
<center>
<s:text name="addUser"/>
</center>
</body>
struts.xml
Xml代码
<struts>
<!-- 设置全局配置文件 -->
<constant name="struts.custom.i18n.resources" value="message"/>
<!-- 解决中文乱码 -->
<constant name="struts.i18n.encoding" value="gbk"/>
<package name="Struts2" extends="struts-default">
<action name="changeLang" class="com.bjsxt.action.ChangeLangAction">
<result name="success">/register2/register.jsp</result>
</action>
</package>
</struts>
Xml代码
<struts>
<!-- 设置全局配置文件 -->
<constant name="struts.custom.i18n.resources" value="message"/>
<!-- 解决中文乱码 -->
<constant name="struts.i18n.encoding" value="gbk"/>
<package name="Struts2" extends="struts-default">
<action name="changeLang" class="com.bjsxt.action.ChangeLangAction">
<result name="success">/register2/register.jsp</result>
</action>
</package>
</struts>
message_en_US.properties
Properties代码
addUser=Add User
Properties代码
addUser=Add User
message_ zh _CN.properties
Properties代码
addUser=\u6DFB\u52A0\u7528\u6237
Properties代码
addUser=\u6DFB\u52A0\u7528\u6237
ChangeLangAction
Java代码
public class ChangeLangAction extends ActionSupport{
private String lang;
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
}
@Override
public String execute() throws Exception {
changeLang();
return SUCCESS;
}
/**
* 手动改变Locale
*/
private void changeLang() {
Locale currentLocale = Locale.getDefault();
//1、根据页面请求,创建下同的Locale对象
if("en".equals(getLang().trim())) {
currentLocale = new Locale("en","US");
}else if("zh".equals(getLang().trim())) {
currentLocale = new Locale("zh","CN");
}
/*
* 2、设置Action中的Locale
* 前台页面的Locale和后台session中的Locale范围是不一样的
* a)只改页面Locale当前页面信息会改变但提交后Locale又会改回到默认的
* b)改变了后台Locale,当前线程中的页面Locale并不会改变,但会随下一次提交
* Action一同改变,所以可能要刷新页面两次,第一次只变后台Locale,第二次
* 前台和后台同时改变
*
* 为避免上述情况,需要前台和后台的Locale一起改变
*/
ActionContext.getContext().setLocale(currentLocale);
ServletActionContext.getRequest().getSession().setAttribute(
"WW_TRANS_I18N_LOCALE", currentLocale);
}
}
Java代码
public class ChangeLangAction extends ActionSupport{
private String lang;
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
}
@Override
public String execute() throws Exception {
changeLang();
return SUCCESS;
}
/**
* 手动改变Locale
*/
private void changeLang() {
Locale currentLocale = Locale.getDefault();
//1、根据页面请求,创建下同的Locale对象
if("en".equals(getLang().trim())) {
currentLocale = new Locale("en","US");
}else if("zh".equals(getLang().trim())) {
currentLocale = new Locale("zh","CN");
}
/*
* 2、设置Action中的Locale
* 前台页面的Locale和后台session中的Locale范围是不一样的
* a)只改页面Locale当前页面信息会改变但提交后Locale又会改回到默认的
* b)改变了后台Locale,当前线程中的页面Locale并不会改变,但会随下一次提交
* Action一同改变,所以可能要刷新页面两次,第一次只变后台Locale,第二次
* 前台和后台同时改变
*
* 为避免上述情况,需要前台和后台的Locale一起改变
*/
ActionContext.getContext().setLocale(currentLocale);
ServletActionContext.getRequest().getSession().setAttribute(
"WW_TRANS_I18N_LOCALE", currentLocale);
}
}
看提供的例子很重要:
运行例子struts2-blank-2.0.9
http://localhost:8080/struts2-blank-2.0.9/example/HelloWorld.action?request_locale=en有效。
原来在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。
Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。
它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。
如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为
WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。
Struts1.X 与 Struts2.X 的区别 :
1、Struts1.X 通过在HttpSession中设置固定的变量实现
2、Struts2.X 比较方便,只需设置Action中的Locale
第二篇文章: http://blog.csdn.net/dahu1128/archive/2010/12/24/6096397.aspx
前台jsp:【1】
<head>
<title><s:text name="title"/></title>
<link href="css/index.css" type="text/css" rel="stylesheet" />
<link href="css/front.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="js/front.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<div style="float:left; margin-right:20px;"><a href="/cms/jingce/i18n/SelectLanguage.action?request_locale=zh_CN" ><s:text name="chinese"/></a></div>
<div style="float:left; margin-right:20px;"><a href="/cms/jingce/i18n/SelectLanguage.action?request_locale=en_US" ><s:text name="english"/></a></div>
struts.xml:【2】
<package name="article.front.inde2" namespace="/jingce/i18n" extends="struts-default">
<action name="SelectLanguage" method="selectLanguage" class="language.choose">
<result name="success" type="dispatcher">/jingce/index.jsp</result>
</action>
</package>
项目名:cms
目录结构:
按照如上的代码和配置将会产生的问题是:action能正常访问,也能正常跳转,也能正常国际化。但是跳转后页面将会变型,也就是说页面所引用的css与js以及页面内的图片地址将会找不到。
解决办法1:在jsp的head中添加如下js
<head>
<title><s:text name="title"/></title>
<link href="css/index.css" type="text/css" rel="stylesheet" />
<link href="css/front.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="js/front.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
function languageChoose(language){
var lan='/cms/jingce/i18n/SelectLanguage.action?request_locale='+language;
window.location.href=lan;
}
</script>
</head>
<div style="float:left; margin-right:20px;"><a href="#" onclick="languageChoose('zh_CN')"><s:text name="chinese"/></a></div>
<div style="float:left; margin-right:20px;"><a href="#" onclick="languageChoose('en_US')"><s:text name="english"/></a></div>
解决办法2:
在所有相对路径前加入:<%=bastPath%>jingce/
例如:<%=bastPath%>jingce/css/index.css
解决办法3:
<div style="float:left; margin-right:20px;"><a href="/cms/jingce/SelectLanguage.action?request_locale=zh_CN" ><s:text name="chinese"/></a></div>
<div style="float:left; margin-right:20px;"><a href="/cms/jingce/SelectLanguage.action?request_locale=en_US" ><s:text name="english"/></a></div>
<package name="article.front.inde2" namespace="/jingce" extends="struts-default">
<action name="SelectLanguage" method="selectLanguage" class="language.choose">
<result name="success" type="dispatcher">/jingce/index.jsp</result>
</action>
</package>
问题思考:
解决办法1相当于重新刷新页面,解决办法2很明显灵活性不强,如果目录改动岂不要修改所有地址,个人最喜欢解决办法3。
但是为什么会出现这种情况呢,对比跳转前与跳转后的图片地址。
跳转前:http://localhost:8080/cms/jingce/img/gywm.gif
跳转后:http://localhost:8080/cms/jingce/i18n/img/gywm.gif
action时Url地址:http://localhost:8080/cms/jingce/i18n/SelectLanguage.action?request_locale=en_US
之所以经过action后(我的action返回的是当前页面)图片和css的引用地址找不到,我推测是因为action跳转后容器将去掉action后剩下的地址作为当前的目录地址也就是:http://localhost:8080/cms/jingce/i18n/http://localhost:8080/cms/jingce/i18n/ 变成了当前目录,然项目中并无当前目录更不会在其中有img目录和该目录下的图片与其它资源文件了。
但是为什么还能跳转到正常页面呢?这是因为我强行指定了跳转后的页面地址:
<result name="success" type="dispatcher">/jingce/index.jsp</result>
如果我的推测是对的那么我将结果地址改成
<result name="success" type="dispatcher">index.jsp</result>
应该也能跳转到正常页面和正常显示样式,结果一试果然如此。
分享到:
相关推荐
### STRUTS2国际化的问题 #### 一、Struts2国际化的概述 Struts2作为一个流行的Web应用框架,为了满足全球用户的使用需求,提供了一系列国际化(Internationalization, 简称I18N)的支持。这包括了如何在配置文件...
在Struts2中实现国际化,可以帮助开发者创建对多语言环境友好的应用。 本示例主要围绕Struts2框架如何实现国际化进行深入探讨。源码中包含两个关键部分:WebRoot目录和src目录。 1. **WebRoot** 目录: - `WEB-...
Struts2国际化的实现原理;简单的struts2国际化实现过程的讲解
Struts2是一个流行的Java web框架,它提供了强大的国际化支持,帮助开发者创建多语言的应用程序。在Struts2中实现国际化,主要包括配置、JSP页面、表单和Action类的处理。 首先,在`struts.xml`配置文件中,我们...
在“Struts2国际化Demo”中,我们主要探讨的是如何利用Struts2框架实现应用的多语言支持,即国际化(i18n)功能。国际化是一种设计方法,使得软件能够根据不同地区的语言和文化习惯进行调整,使得全球用户都能无障碍...
struts2国际化MyEclipse开发struts2国际化MyEclipse开发童叟无欺
在Struts2中实现国际化(i18n)是一项重要功能,它允许应用程序支持多种语言,以满足全球用户的需求。国际化不仅仅是翻译文本,而是设计应用程序以适应不同地区的文化习惯和语言需求。 首先,让我们来探讨一下...
### Struts 1.2 国际化详解 #### 一、引言 在软件开发过程中,为了满足不同地域和语言环境下的用户需求,软件国际化(Internationalization, 简称 I18N)和本地化(Localization, 简称 L10N)成为了一项重要的技术...
在“struts2国际化测试”这个主题中,我们将探讨如何在Struts2框架下实现应用程序的国际化功能。 首先,国际化(i18n,i代表第9个字母n,18是n到i的字母数,表示国际化)是使软件能够适应不同语言和文化背景的重要...
在国际化处理方面,Struts2提供了全面的支持,使得开发者能够轻松地为多语言环境的应用程序创建接口。 首先,我们需要了解什么是国际化(Internationalization)和本地化(Localization)。国际化是指设计和开发...
Struts1 和 Struts 2 是两种非常流行的Java Web开发框架,它们都提供了对国际化(i18n)的支持,使得应用能够根据用户的语言和地区显示相应的本地化内容。国际化是软件设计的一个重要方面,它允许应用程序在全球范围...
Struts2 框架提供了强大的标签库和国际化功能,本实验旨在掌握 Struts 2 标签库和国际化功能的使用,并实现用户注册页面的国际化显示。 一、Struts2 标签库 Struts2 框架提供了一个强大的标签库,用于简化 JSP ...
这篇指南将深入探讨Struts2如何实现国际化支持,并提供一个初步的引导。 首先,理解国际化的基本概念是至关重要的。国际化不仅仅是翻译文本,它还涉及到日期、时间、货币等格式的本地化。在Java中,这一过程通常...
总的来说,这个项目提供了一个基础的Struts2应用实例,展示了如何实现国际化、使用Struts2标签库,以及创建简单的用户注册和登录功能,尽管它并不涉及实际的数据存储。对于学习和理解Struts2框架的运作机制,这是一...
"Struts2国际化demo"是一个示例,展示了如何在Struts2框架下实现这一功能,使得网站可以根据用户的浏览器设置显示不同的语言。 首先,要实现国际化,我们需要创建资源文件。在Java中,这些通常是`.properties`文件...
### Struts中文问题与国际化问题——终极解决方案深度解析 #### 引言 在Web应用开发中,特别是使用Struts框架时,中文显示和国际化(Internationalization,简称i18n)问题是开发者常遇的挑战。本文将深入探讨解决...
总结,实现Struts2的国际化涉及资源文件的创建、配置Struts2的`struts.xml`、设置locale以及在JSP页面中使用国际化标签库。理解和掌握这些步骤对于开发全球化应用程序至关重要。通过阅读源码和利用相关工具,开发者...
国际化(i18n)是Struts2的一个重要特性,使得应用能够支持多种语言环境,以满足全球用户的语言需求。以下是对Struts2框架国际化实现的详细讲解。 1. **国际化的基本概念** 国际化(Internationalization,简称i18...
在Struts2中实现国际化,可以帮助你的应用触达全球用户。 Struts2的国际化主要依赖于Java的ResourceBundle类,该类用于管理应用程序中的多语言资源。以下是如何在Struts2中进行国际化设置的详细步骤: 1. **创建...