首页 > 其他分享 >Struts1.x系列教程(13):国际化

Struts1.x系列教程(13):国际化

时间:2023-06-15 12:33:46浏览次数:30  
标签:文件 13 语言 application 教程 Struts1 编码 properties 属性

   对于一个面向全球的Web应用程序,按着不同国家的要求显示相关信息(称为国际化)显得尤为重要。国际化的工作非常复杂和繁琐。因为要翻译很多Web界面,信息格式等。然而,Struts为我们提供了完成国际化工作的更容易的方式。在本文将介绍如何使用Struts来简化国际化的工作。


一、处理客户端界面的编码问题


   由于Web浏览器可以使用不同的编码格式来解析客户端代码,这主要取决于用户的默认设置或偏好。由于存在这种情况,因此,在服务端向客户端发送数据时,就必须使用和客户端一致的编码格式。    

   通常的做法是使用Internet上比较常用的UTF-8编码,这主要是因为UTF-8编码格式所描述的字符包括了世界上所有以知国家和地区的语言编码。 这样服务端就不用根据客户端的编码格式不断地调整服务端响应信息的编码格式了。对于JSP页面来说,可以使用page指定来设置响应信息的编码格式,如下 面代码所示:    

<% @ page contentType = " text/html; charset=UTF-8 "   %>

   当然,如果我们在Web程序中使用了Struts框架,还可以在struts-config.xml文件中使用如下的代码来设置编码格式:

< controller  contentType ="text/html; charset=UTF-8"   />

   如果使用上面的设置,所有通过.do或<forward>元素访问的页面都会继承这一编码设置。但是如果单独访问JSP页面,就会绕过Struts的这个设置。    

   对于静态页面(如HTML)来说,需要使用<meta>元素来设置编码格式,如下面代码所示:    


< head > 
    < meta  http-equiv ="content-type"  content ="text/html; charset=UTF-8" > 
</ head >

   除了使用通用的UTF-8编码格式外,也可以从HTTP请求头字段Accept- Charset中获得客户端的编码格式。然后根据这个编码格式来设置响应信息的编码格式。然而,虽然根据HTML4.0规范,Web浏览器可以设置 Accept-Charset字段,但是有很多浏览器可以会忽略这一字段,因此,只使用这个字段来确定Web浏览器所使用的编码格式是不可靠的。所以最好 的国际化编码格式解决方案仍然是UTF-8。


二、本地化属性文件


   本地化最重要的部分就是根据用户所处的语言环境来显示响应语言的界面,如用户在英文操作系统下,就会显示英文界面,如果在中文操作系统下,就会显示中文界面。最理想的情况是这种显示效果的切换是完全透明的。


   在Struts中提供了这种技术,使我们可以更容易地实现透明地界面切换。在Struts Bean标签库中有一个<bean:message>标签,它可以根据客户端浏览器所处的语言环境自动选择相应的属性文件来读取界面显示信息。为了演示如何使用<bean:message>以及不同的属性文件来实现国际化的程序。让我们先来看一个例子。


   在本例中,选用了三个国家的语言环境(中文、英文和法文)来演示国际化的实现。由于读者可能不便于输入法文,因此,法文信息仍然用中文代替,只是后面多了个“(法文)”作为标识。我们需要如下四步来完成这个例子:    


【第1步】建立一个默认的属性文件


  在<samples工程目录>\src\struts目录中建立一个application.properties文件,内容如下:

title  =  这是一个国际化的web程序(默认值)
name  =  姓名(默认值)
submit  =  提交(默认值)

   application.properties文件是默认的属性文件,如果客户端浏览器所处的语言环境在服务端未找到相应的属性文件,<bean:message>标签就会从application.properties文件中读取字符串信息。    

   在Eclipse中编辑非ISO 8859-1编码格式的字符时,应使用在《属性(资源)文件乱码问题的解决之道》介绍的两个Eclipse插件,或使用native2ascii.exe命令进行转换。否则在显示属性文件中的信息时会出现乱码。


【第2步】在struts-config.xml文件中配置属性文件


在Struts中所有的属性文件都必须在struts-config.xml文件中配置。否则<bean:message>标签就会由于无法找到相应的属性文件而抛出异常。

   为了配置application.properties,需要在struts-config.xml文件中的<struts-config>标签中加入如下的代码:


< message-resources  parameter ="struts.application"  key  = "global" />

   由于在struts-config.xml文件中已经有一个ErrorDescription.properties作为默认的属性文件,因此,application.properties文件要使用一个key加以标识。在使用<bean:message>标签时必须要使用bundle属性指定这个key才能找到application.properties文件。


【第3步】加入不同语言的属性文件


   在这一步我们来加入中文、英文、法文的属性文件。这三个属性文件的文件名如下:


中文:application_zh.properties

英文:application_en.properties

法文:application_fr.properties

   将这三个文件放到<samples工程目录>\src\struts目录中。它们的内容如下:

application_zh.properties
title  =  这是一个国际化的web程序
name  =  姓名
submit  =  提交

application_en.properties
title  =  This is an internationalization web program.
name  =  name
submit  =  submit

application_fr.properties
title  =  这是一个国际化的web程序(法语)
name  =  姓名(法语)
submit  =  提交(法语)

这三个属性文件是不需要在struts-config.xml中配置的。Struts会自动根据客户端浏览器所处的语言环境来寻找这三个文件。




【第4步】编写JSP页面


   在这个JSP页面中使用了<bean:message>来根据客户端浏览器所处的语言环境来读取相应的属性文件中的内容。在web根目录中建立一个global.jsp文件,代码如下:


<% @ page pageEncoding = " UTF-8 "   %> 
   <% @ taglib uri = " http://struts.apache.org/tags-bean "  prefix = " bean " %> 
   < html > 
     < head > 
       < title > 国际化 </ title > 
     </ head > 
     < body > 
       < bean:message  key ="title"  bundle ="global"   />< p /> 
       < form  action ="" > 
         < bean:message  key ="name"  bundle ="global"   /> :
         < input  type ="text"  name ="name"   />< p /> 
         < input  type ="submit"   value =<bean:message  key ="submit"  bundle ="global" />  />
       </ form > 
     </ body > 
   </ html >

    由于安装不同语言的操作系统很不方便,在这里我们采用另一种方法来模拟不同的语言环境测试这个程序。首先在IE中使用【工具】>【Internet 选项】> 【常规】>【语言】来打开“语言首选项”对话框,使用“添加”按钮添加“中文 [zh]”、“英文 [en]”和“法语(法国) [fr]”,再添加一种其他语言,如“梵文 [sa]”。添加后的界面如下图所示。


Struts1.x系列教程(13):国际化_struts


然后分别将这四种语言上移到列表顶端。然后点击“确定”按钮保存设置。在启动Tomcat后,在IE中输入如下的URL:

http://localhost:8080/samples/global.jsp

根据语言设置的不同,在IE中会显示不同语言的界面,如中文和英文的页面分别如下面两个图所示。



Struts1.x系列教程(13):国际化_编码格式_02






Struts1.x系列教程(13):国际化_属性文件_03


如果在刷新时页面语言未更新,可能是因为IE的Cache的原因,读者可以启一个新的IE窗口,再进行测试。
    读者在使用属性文件进行国际化时应注意如下三点:   
    1. 由于语言还可以继续细分,如中文可以分为简体和繁体,英文也可以分为不同国家或地区的英文,如爱尔兰、澳大利亚等。因此,对于更细化的语言,可以在属性文 件后面再加一个代表国家或地区的后缀,如application_zh_TW.properties代表中国台湾所使用的繁体中 文,application_en_AU.properties代表澳大利亚英文。Struts在寻找属性文件时,会首先查找带有国家或地区后缀的属性文 件,如果这类文件不存在,会继续查找只有语言后缀的属性文件,如果还不存在,最后会读取默认属性文件,也就是 application.properties的内容。假设我们在“语言首选项”中选择了“中文(台湾)  [zh-tw]”,那么读取文件的顺序(从最左边开始,如果文件不存在,依次读取右边的文件)如下:

application_zh_TW.properties  >  application_zh.properties  >  application.properties

如果选择的语言是“中文 [zh]”,那么就直接从application_zh.properties开始读取。

   2. 在建立属性文件时要注意,后缀的连接符为下划线( _ ),而不能用减号( - )。  

   3. 代表语言的后缀(如zh、fr、en等)必须小写,而代表国家或地区的后缀(如CN、TW、AU等)必须大写。如写成application_ZH_tw.properties是不正确的。

   在Struts HTML标签库中的标签中以key为后缀的属性值就是属性文件中的key,如下面的代码所示:    

< html:submit  value ="提交"  titleKey ="title"  bundle ="global" />

上面的代码将<html:submit>标签的title属性值设为属性文 件的title键的值。但是在<html:submit>标签中的value属性无法使用属性文件中的键值,解决的方法是使用< html:submit>标签的另一种写法,代码如下:

< html:submit > 
       < bean:message  key  = “title”  bundle  = “global”  /> 
   </ html:submit >

三、实现多种语言界面的Web程序

   在上面所讲的国际化只是根据客户端浏览器所处的语言环境来自动设置界面语言。而我们在Internet上会看到很多Web程序在主界面上都提供了对不同语言的选择。在本节我们就来讲一下如何通过编程的方式来干预服务端对属性文件的选择。    

   实现上,Java使用java.util.Locate类来描述语言,一个Locate类的对象实例就代表一种语言。并且从客户端获得的语言信息使用 “org.apache.struts.action.LOCALE”保存在了session中,因此,我们只要在调 用<bean:message>或其他使用属性文件的语句之前修改session中保存的Locale对象,就可以达到我们的目的。现在我们 来对global.jsp页面进行修改(新建一个文件newGlobal.jsp)。global.jsp中所有的代码都不用动,只需要在第一 个<bean:message>标签的前面加上如下的代码:

<% 
if ( " en " .equals(request.getParameter( " language " )))
session.setAttribute( " org.apache.struts.action.LOCALE " ,  new  java.util.Locale( " en " ));
else   if ( " zh " .equals(request.getParameter( " language " )))
session.setAttribute( " org.apache.struts.action.LOCALE " ,  new  java.util.Locale( " zh " ));
else   if ( " fr " .equals(request.getParameter( " language " )))
session.setAttribute( " org.apache.struts.action.LOCALE " ,  new  java.util.Locale( " fr " ));
    %> 
< bean:message key = " title "  bundle = " global "   /> 
 
    在Web根目录中建立一个mainGlobal.jsp文件,如下面的代码所示:

   <% @ page pageEncoding = " UTF-8 " %> 
   < html > 
     < head > 
       < title > 多语言支持 </ title > 
     </ head > 
     < body > 
     < a  href ="newGlobal.jsp?language=en"  target ="_blank" > 英文 </ a >< p /> 
     < a  href ="newGlobal.jsp?language=zh"  target ="_blank" > 中文 </ a >< p /> 
     < a  href ="newGlobal.jsp?language=fr"  target ="_blank" > 法文 </ a > 
     </ body > 
   </ html >

   启动Tomcat后,在IE中输入如下的URL:

http://localhost:8080/samples/mainGlobal.jsp

   点击mainGlobal.jsp页面上的三个链接,就会分别显示三种语言的页面。

   在Struts Action类中的也可以使用Action类提供的setLocale方法来设置语言。如在execute方法中设置语言的代码如下:    

setLocale(request,  new  java.util.Locale( " zh " ,  " TW " ));

   使用setLocale方法设置语言时应注意两点:

   1. java.util.Locale的构造方法的第一个参数表示语言,第二个参数表示国家或地区,这两个参数值和属性文件的后缀不同,它不区分大小写,因此,也可以写成如下的形式:

setLocale(request,  new  java.util.Locale( " ZH " ,  " tw " ));

   2. 所有经过<forward>元素或.do的程序都会继承setLocale方法设置后的语言,但<action>元素的forward和input属性所指的页面除外。



标签:文件,13,语言,application,教程,Struts1,编码,properties,属性
From: https://blog.51cto.com/u_16065168/6486223

相关文章

  • 服务器该如何处理大数据 45.113.203.x
    当大量设备连接服务器,大量数据上传到服务器,服务器要如何提高处理能力,来处理这些数据,数据源为设备数据。服务器如何处理数据可以由以下几个点考虑:1、排队列处理机制数据涌入服务器,但还是能够区分先后顺序,按照数据传输时序将数据摘要排入队列,然后服务器按队列依次进行处理。2、数据分......
  • Axure RP 9 基础教程 元件基础2
    第一章:AxureRP9的元件(2)6、改变元件的位置要改变元件的位置,只需要拖动对应的元件即可。另外也可以在顶部快捷样式菜单中设置坐标值,然后按回车键,让元件移动到指定位置。 X轴是横轴,改变可以调整左右的位置。 Y轴是纵轴,调整上下的位置。在样式选修卡中也可以设置坐标位置。同......
  • Axure RP 9 基础教程 元件基础1
    第一章:AxureRP9的元件(1)1、元件的概念首先我们来认识一下AxureRP9元件,元件是组成我们原型的零件,也有人翻译成组件。AxureRP9默认给我们提供了三套元件库,默认元件库、流程图元件库、图标元件库。可以根据自己的需要选择。也可以自己导入第三方的元件库使用。初学者我们使用......
  • Axure RP 9 基础教程 元件基础3
    11、组合元件Axure中可以将多个元件组合起来,组合可以被命名,也可以被当成一个元件来进行交互,调整位置和大小等。选中多个元件,在顶部菜单中点击组合图标即可。选中一个组合,点击取消组合,可以就地解散。组合还可以被当成一个元件,再组合。就是说组合中包含组合也可以。单击组合里的任......
  • 【Axure 教程】中继器(基础篇)
    一、初识中继器中继器是Axure中一个比较高阶的应用,它可以让我们在纯静态网页中模拟出类似带有后台数据交互的增删改查的效果,虽然它没有真正意义上帮我们存储任何的数据,但是当我们在一次项目体验过程中,它却可以给我们带来更加真实的交互效果,我们可以把中继器理解为是一个临时的......
  • 【Axure 教程】中继器(进阶篇)
    一、修改、删除指定行首先我们还是在Axure页面中拖入一个【中继器】,并双击打开,在默认的【矩形】后面加上【修改】和【删除】按钮:然后我们给修改按钮添加【中继器事件】,选择【更新行】:可以看到,由于我们是在中继器内部添加事件,在编辑的时候,【行】的板块多了一个【当前】的选......
  • Struts1.x系列教程(14):动态Form
    上一篇:Struts1.x系列教程(13):国际化一、动态Form简介   虽然ActionForm功能强大,但有些时候使用起来有些麻烦。如每建立一个用户录入界面(JSP页面),就得建立一个ActionForm子类来和这个页面对应。当然,我们可以采用嵌套属性从一定程度上弥补这个问题。但是在建立新的用户录入界面时,......
  • javascript现代编程系列教程之七——字符集(七)
    Unicode:Unicode是一个字符集(Charset),包含了世界上所有的字符。每个字符在Unicode中都有其唯一对应的数字编号,这就是我们常说的Unicode码。UTF-8:UTF-8是Unicode的实现方式之一。UTF-8使用一至四个字节为每个字符编码,英文字符通常使用一个字节,西欧其他语言的部分字符使用......
  • TrueNAS CORE 13.0-U5.1 TrueNas存储平台 安装部署设置
    Truenas官网地址:https://www.truenas.com/下载TrueNASCORE13.0-U5.1服务器配置要求:CPU四核心内存8G硬盘按需求一、安装:与FREENAS一样(忽略)二、开始配置配置网卡信息说明开始配置网卡信息即可,因此我们选择第一项:三、浏览器访问TrueNas我们可以Https访问也可http访问......
  • Three.js教程:相机控件轨道控制器OrbitControls
    推荐:将NSDT场景编辑器加入你的3D工具链其他系列工具:NSDT简石数字孪生相机控件轨道控制器OrbitControls平时开发调试代码,或者展示模型的时候,可以通过相机控件OrbitControls实现旋转缩放预览效果。OrbitControls使用你可以打开课件案例源码测试下效果。旋转:拖动鼠标左键缩放......