`
wutheringsea
  • 浏览: 263324 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于Struts2的国际化问题

阅读更多

在做项目时,遇到了点击首页两个链接实现系统全部国际化的问题。以下两篇文章帮助很大,故摘录下来:

 

第一篇文章: 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国际化的概述 Struts2作为一个流行的Web应用框架,为了满足全球用户的使用需求,提供了一系列国际化(Internationalization, 简称I18N)的支持。这包括了如何在配置文件...

    struts2国际化例子源码

    在Struts2中实现国际化,可以帮助开发者创建对多语言环境友好的应用。 本示例主要围绕Struts2框架如何实现国际化进行深入探讨。源码中包含两个关键部分:WebRoot目录和src目录。 1. **WebRoot** 目录: - `WEB-...

    Struts2国际化的实现原理

    Struts2国际化的实现原理;简单的struts2国际化实现过程的讲解

    struts2国际化 标签 页面 处理类

    Struts2是一个流行的Java web框架,它提供了强大的国际化支持,帮助开发者创建多语言的应用程序。在Struts2中实现国际化,主要包括配置、JSP页面、表单和Action类的处理。 首先,在`struts.xml`配置文件中,我们...

    Struts2国际化Demo

    在“Struts2国际化Demo”中,我们主要探讨的是如何利用Struts2框架实现应用的多语言支持,即国际化(i18n)功能。国际化是一种设计方法,使得软件能够根据不同地区的语言和文化习惯进行调整,使得全球用户都能无障碍...

    struts2国际化MyEclipse开发

    struts2国际化MyEclipse开发struts2国际化MyEclipse开发童叟无欺

    struts2国际化源码以及eclipse国际化插件

    在Struts2中实现国际化(i18n)是一项重要功能,它允许应用程序支持多种语言,以满足全球用户的需求。国际化不仅仅是翻译文本,而是设计应用程序以适应不同地区的文化习惯和语言需求。 首先,让我们来探讨一下...

    struts1.2 国际化

    ### Struts 1.2 国际化详解 #### 一、引言 在软件开发过程中,为了满足不同地域和语言环境下的用户需求,软件国际化(Internationalization, 简称 I18N)和本地化(Localization, 简称 L10N)成为了一项重要的技术...

    struts2国际化测试

    在“struts2国际化测试”这个主题中,我们将探讨如何在Struts2框架下实现应用程序的国际化功能。 首先,国际化(i18n,i代表第9个字母n,18是n到i的字母数,表示国际化)是使软件能够适应不同语言和文化背景的重要...

    struts2国际化处理全解

    在国际化处理方面,Struts2提供了全面的支持,使得开发者能够轻松地为多语言环境的应用程序创建接口。 首先,我们需要了解什么是国际化(Internationalization)和本地化(Localization)。国际化是指设计和开发...

    Struts1 和 Struts 2 国际化全局资源

    Struts1 和 Struts 2 是两种非常流行的Java Web开发框架,它们都提供了对国际化(i18n)的支持,使得应用能够根据用户的语言和地区显示相应的本地化内容。国际化是软件设计的一个重要方面,它允许应用程序在全球范围...

    struts2标签库及国际化的使用例子

    Struts2 框架提供了强大的标签库和国际化功能,本实验旨在掌握 Struts 2 标签库和国际化功能的使用,并实现用户注册页面的国际化显示。 一、Struts2 标签库 Struts2 框架提供了一个强大的标签库,用于简化 JSP ...

    Struts2国际化支持引导(初)

    这篇指南将深入探讨Struts2如何实现国际化支持,并提供一个初步的引导。 首先,理解国际化的基本概念是至关重要的。国际化不仅仅是翻译文本,它还涉及到日期、时间、货币等格式的本地化。在Java中,这一过程通常...

    struts2国际化+简单的标签+用户注册和登录

    总的来说,这个项目提供了一个基础的Struts2应用实例,展示了如何实现国际化、使用Struts2标签库,以及创建简单的用户注册和登录功能,尽管它并不涉及实际的数据存储。对于学习和理解Struts2框架的运作机制,这是一...

    struts2国际化demo

    "Struts2国际化demo"是一个示例,展示了如何在Struts2框架下实现这一功能,使得网站可以根据用户的浏览器设置显示不同的语言。 首先,要实现国际化,我们需要创建资源文件。在Java中,这些通常是`.properties`文件...

    struts中文问题,struts国际化问题——终极解决方案

    ### Struts中文问题与国际化问题——终极解决方案深度解析 #### 引言 在Web应用开发中,特别是使用Struts框架时,中文显示和国际化(Internationalization,简称i18n)问题是开发者常遇的挑战。本文将深入探讨解决...

    Struts2 使用 Struts2 实现国际化

    总结,实现Struts2的国际化涉及资源文件的创建、配置Struts2的`struts.xml`、设置locale以及在JSP页面中使用国际化标签库。理解和掌握这些步骤对于开发全球化应用程序至关重要。通过阅读源码和利用相关工具,开发者...

    struts2框架国际化

    国际化(i18n)是Struts2的一个重要特性,使得应用能够支持多种语言环境,以满足全球用户的语言需求。以下是对Struts2框架国际化实现的详细讲解。 1. **国际化的基本概念** 国际化(Internationalization,简称i18...

    struts2 国际化使用

    在Struts2中实现国际化,可以帮助你的应用触达全球用户。 Struts2的国际化主要依赖于Java的ResourceBundle类,该类用于管理应用程序中的多语言资源。以下是如何在Struts2中进行国际化设置的详细步骤: 1. **创建...

Global site tag (gtag.js) - Google Analytics