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

java struts2国际化

阅读更多

国际化的英文是Internationalization,简称I18N(18表示单词长度)。

1,JAVA国际化知识介绍:

1,JAVA程序的国际化主要是通过如下3个类完成:

1,java.util.ResourceBundle:用于加载一个资源包

2,java.util.Locale:对应一个特定的国家/区域,语言环境

3,java.text.MessageFormat:用于将消息格式化

为了实现程序的格式化,必须提供资源文件,资源文件的内容以key-value对来提供信息。资源文件的命名有如下3种形式:

1,baseName_language_country.properties

2,baseName_language.properties

3,baseName.properties

baseName用户可以自定义,但是language和country必须是JAVA所支持的语言和国家/区域。

2,以下代码获取所有JAVA支持的语言和国家/区域

import java.util.Locale;

public class LocaleList {
public static void main(String[] args) {
   Locale[] localeList = Locale.getAvailableLocales();
   for(int i=0;i<localeList.length;i++){
    System.out.println(localeList[i].getDisplayLanguage()+"="+localeList[i].getLanguage()+";"+localeList[i].getDisplayCountry()+"="+localeList[i].getCountry());
   }
}
}

比较常用的有以下几种:日文=ja;日本=JP;英文=en;美国=US;中文=zh;中国=CN;中文=zh;台湾地区=TW;

对于包含非西欧字符的资源文件,JAVA提供了native2ascii工具来进行转换(将各个语言的原始编码转成JAVA支持的unicode编码),用法如下,在命令行下进入资源文件所在的目录,执行以下命令:

native2ascii 源资源文件名 目的资源文件名

3,我们在JAVA源文件中调用资源文件中的信息方式如下

public static void main(String[] args) {
   //获取系统默认的国家/语言环境
   Locale myLocale = Locale.getDefault();
   //根据指定的国家/语言环境加载资源文件
   ResourceBundle bundle = ResourceBundle.getBundle("messageResource",myLocale);
   //获取资源文件中的key为hello的value值
   System.out.println(bundle.getString("hello"));

}

4,带占位符的消息

有时候我们需要要输出的消息中带动态生成的内容,这个时候就需要用动态生成的消息取代资源文件中的部分内容。

1,资源文件内容如下:msg=Hello,{0}!Today is {1}.

0和1就是我们将要取代的地方。

2,JAVA类代码如下:

public static void main(String[] args)
{
        Locale currentLocale = null;
        if (args.length == 2)
        {
            currentLocale = new Locale(args[0] , args[1]);
        }
        else
        {
            currentLocale = Locale.getDefault();
        }
   ResourceBundle bundle = ResourceBundle.getBundle("com/test/MyResource" , currentLocale);
   String msg = bundle.getString("msg");  
  System.out.println(MessageFormat.format(msg , "annlee" , new Date()));
}

红色部分为资源文件存放的包。我的电脑使用的是中文操作系统,因此输入的内容如下:你好,annlee!今天是08-7-31 下午5:09。

5,使用类.class文件来代替资源文件存放信息

在JAVA中还可以使用类.class文件来存放信息,虽然这种方式根本上不会有人使用。类的源文件如下:

import java.util.ListResourceBundle;
import java.util.Locale;
//给zh_CN定义的资源包
public class MyResource_zh_CN extends ListResourceBundle
{
//定义资源
private final Object myData[][]=
{
   {"msg","{0},您好 Class!今天是{1}"}
};
//实现抽象方法getContents()
public Object[][] getContents()
{
   return myData;
}

}

类资源文件的命名规范同资源文件是一致的。JAVA客户端调用方式如下:

public static void main(String[] args)
{
        Locale currentLocale = null;
        if (args.length == 2)
        {
            currentLocale = new Locale(args[0] , args[1]);
        }
        else
        {
            currentLocale = Locale.getDefault();
        }
   ResourceBundle bundle = ResourceBundle.getBundle("MyResource" , currentLocale);
   String msg = (String)bundle.getObject("msg");
   MessageFormat mf = new MessageFormat("");

   mf.setLocale(currentLocale);
   mf.applyPattern(msg);  
   Date now = new Date();
   Object[] msgParams = {"annlee",now};
  
   System.out.println(mf.format(msgParams));

}

2,Struts2中的国际化

1,Struts2中通过在struts.properties配置文件或者struts.xml配置文件中的struts.custom.i18n.resources元素来指定配置文件的baseName名称。如下例:

struts.custom.i18n.resources=resource.messageResource

指定资源文件为resource目录下的messageResource.properties。

2,在页面获取资源文件中的内容的方式为:

<s:text name="login.jsp.title">//获取资源文件中key为login.jsp.title的value值,并显示在页面上

<s:textfield name="username" key="login.jsp.username" ></s:textfield>//key为login.jsp.username信息

3,在Action获取资源文件中的内容,可以继承ActionSupport类,再用此类的getText()方法获取资源文件中的信息,例:getText("login.jsp.user.validate");就可以获取login.jsp.user.validate信息。

4,输出带占位符的国际化信息

如果要在JSP页面输出带占位符的国际化信息,可以通过<param>标签来指定占位符的内容,如下例:

    <body>
   <!-- 输出request范围内的tip属性 -->
   ${requestScope.tip}<br/>
   <!-- 使用useBean指定创建一个Date实例 -->
   <jsp:useBean id="d" class="java.util.Date" scope="page"/>
   <s:text name="welcomeMsg">
    <!-- 使用s:param标签为国际化消息的占位符传入参数值 -->
    <s:param><s:property value="username"/></s:param>
    <s:param>${d}</s:param>

   </s:text>
    </body>

如果要在Action代码里填充国际化消息里的占位符,可以通过调用getText()方法时填充值,如下例:

getText("failTip" , new String[]{username,password})//username和password为action中的属性,此时

                          //返回的字符串中就已经设置了参数的值

3,Struts2中加载资源文件的方式

对于一个大型的应用而言,可能资源文件非常庞大,因此有必要将它分成多个较小的文件,Struts2可以指定包范围资源文件,类范围资源文件,以及临时指定资源文件。

1,包范围资源文件

Struts2指定包范围资源文件的方法是:在包的根目录下建立多个名为package_<language>_<country>.properties文件,这个文件的命名同普通资源文件的命名方式一样。建立了此文件之后,该包下的所有Action都可以访问资源文件。例:我们在lee这个包下建立多个资源文件,文件名分别为:package.properties,package_en_US.properties,package_zh_CN.properties;那么在此包中所有的Action都可以获取资源文件,获取的方式同普通的一样,如下:getText("succTip")。如果存在包资源文件,则包资源文件中的内容将优先于普通的资源文件。

2,Action范围资源文件

Struts2还允许为Action单独指定一份国际化资源文件。它的方式为:在Action类文件所在的路径下建立多个文件名为<ActionName>_<language>_<country>.properties文件。例:在LoginAction的同目录下建立多个资源文件:LoginAction.properties,LoginAction_en_US.properties,LoginAction_zh_CN.properties;那么这个资源文件仅对此Action开放。获取资源文件中内容的方式不变。如果存在Action范围资源文件,则此文件中的内容将优先于所有的资源文件。

3,临时指定资源文件

Struts的页面有一个标签<s:i18n>,可以通过它来指定资源文件的位置。这个标签一般可做为其它标签的父标签,这样其它标签所读取的内容就是<s:i18n>标签所指定的资源文件中的内容。用法如下:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>
<s:i18n name="tmp">
<s:text name="loginPage"/>       //读取WEB\INF\classes\tmp.properties资源文件中的loginPage的内容
</s:i18n>

</title>
</head>
<body>
<s:i18n name="tmp">
<s:form action="Login">
<s:textfield name="username" key="user"/>
<s:textfield name="password" key="pass"/>
<s:submit key="login"/>
</s:form>
</s:i18n>

</body>
</html>

通常若查找不到所需要的资源文件中的内容,都是直接输出KEY的字符串值。

4,让用户自行选择语言

在很多应用中,我们需要提供允许用户自行选择语言的功能。Struts2中可以通过ActionContext.getContext().setLocale(Locale locale)设置用户的默认语言。Struts2还提供了一个名为i18n的拦截器(已经包含在默认拦截器栈中),i18n拦截器首先在请求中查找名为request_locale,如果存在,就将其转换成Locale对象,并设置成用户默认的Locale,此外i18n还会将其保存在Session的WW_TRANS_I18N_LOCALE属性中,如果存在此属性,则指定为用户浏览器的默认Locale。

我们在应用中,可以将我们系统所支持的语言放在一个下拉列表中,用户选择下拉列表中的某项时,将其值作为request_locale参数提交给Struts2就可以了。实现代码如下:

1,searchlanguage.jsp页面代码:此页面就是用户选择语言的页面,它也以嵌在任何页面下

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<script type="text/javascript">
function langSelecter_onChanged()
{
document.getElementByIdx("langForm").submit();
}
</script>
<!-- 将session里的WW_TRANS_I18N_LOCALE属性的值取出来,赋值给此页面的属性SESSION_LOCALE -->
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<!-- 在此页面注册一个lee.Locales类型的Bean -->
<s:bean id="locales" name="lee.Locales">
<!-- 给lee.Locales的参数current注入值SESSION_LOCALE -->
<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>
<!-- 提交给当前目录名.action处理,这样做是为了在任何都可以嵌入此selectlanguage.jsp页面,如果用户不需要此功能,这里也可以指定action -->
<form action="<s:url/>" id="langForm"
    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
<!-- 从资源文件中读出key为languag的信息 -->
    <s:text name="languag"/>
<!-- 读出刚才注册的locales类实例的locales属性 -->
<s:select label="Language" list="#locales.locales" listKey="value" listValue="key"
        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
        name="request_locale" id="langSelecter"
        onchange="langSelecter_onChanged()" theme="simple"/>
</form>

2,Locales类的代码如下:此类仅作数据装载,不做其它用途。

package lee;

import java.util.*;


public class Locales
{
//current属性,由于此属性只做赋值操作,不做取值操作,因此没有get方法
private Locale current;
public void setCurrent(Locale cur)
{
   this.current = cur;
}

//locales属性,由于此属性只做取值操作,不做赋值操作,因此没有set方法
    public Map<String, Locale> getLocales()
{
        Map<String, Locale> locales = new Hashtable<String, Locale>();
   //这里是根据当前用户选择的语言类型,获取指定资源文件,这一步非常重要
   ResourceBundle bundle = ResourceBundle.getBundle("messageResource" , current);
   //设置工程支持的语言类型,key里的值对应资源文件里的key的值
        locales.put(bundle.getString("usen"), Locale.US);
        locales.put(bundle.getString("zhcn"), Locale.CHINA);
        return locales;
    }

}

3,资源文件messageResource.properties中的内容如下

languag=选择语言
usen=美式英语
zhcn=简体中文

4,struts.xml配置文件中的配置如下

   <action name="*">
    <result>/WEB-INF/jsp/{1}.jsp</result>
   </action>

这个action的配置意思就是返回你请求的那个JSP页面,因为所有的操作,在你选择语言的时候就已经完成了,所以无需其它的处理。

5,其它页面的调用方式:

其它JSP页面要调用此页面,只需要include就行了。如下例

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title><s:text name="loginPage"/></title>
</head>
<body>
<s:include value="selectlanguage.jsp"/>
<s:form action="Login">
<s:textfield name="username" key="user"/>
<s:textfield name="password" key="pass"/>
<s:submit key="login"/>
</s:form>
</body>
</html>

分享到:
评论

相关推荐

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_6_国际化 共34页.pptx

    ### Java Struts2 国际化教程概览 #### 一、课程背景及目标 本教程旨在通过一系列详细的章节,帮助读者深入理解Struts2框架中的国际化(Internationalization,简称I18N)功能,并掌握如何在实际项目中实现多语言...

    Struts2 国际化 I18N 和Java 国际化

    在Java和Struts2中实现国际化,可以为全球用户提供更友好的用户体验。 首先,我们需要理解Java的国际化机制。Java通过`java.util.ResourceBundle`类来处理国际化。资源库文件通常以`.properties`格式存储,每个文件...

    struts2国际化例子源码

    总结,这个Struts2国际化例子源码展示了如何在Java web应用中实现多语言支持,通过配置Struts2框架、编写Action类、创建资源文件以及在JSP页面中使用标签,实现了对不同语言环境的适应。这个例子对于理解和实践...

    struts2国际化 标签 页面 处理类

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

    Struts2国际化Demo

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

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

    总之,理解和掌握Struts2的国际化以及利用Eclipse的国际化插件进行资源文件管理是提高Java Web开发技能的重要一环。这不仅可以使你的应用程序更好地服务于全球用户,也有助于你了解Web框架的内部机制和开发工具的...

    struts1.2 国际化

    Struts 1.2 框架作为 Java Web 开发的经典框架之一,提供了强大的国际化支持。本文将详细介绍 Struts 1.2 如何实现国际化,以及如何利用该框架创建国际化应用。 #### 二、本地化与国际化基础 ##### 1. 本地化 ...

    struts2国际化demo

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

    struts2国际化测试

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

    Struts1 和 Struts 2 国际化全局资源

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

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

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

    struts2国际化处理全解

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

    Struts2国际化支持引导(初)

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

    struts2实现国际化

    2. **配置Struts2**:在Struts2的配置文件(struts.xml或struts-default.xml)中,我们需要添加一个Interceptor(拦截器)来处理国际化。`i18n interceptor`是专门用于这个目的的,它可以自动检测用户的浏览器设置并...

    struts2配置和Java国际化和JS国际化

    Java国际化的实现主要依赖于`ResourceBundle`类。我们可以通过创建不同语言版本的`.properties`文件来提供多语言支持。例如,对于英语(en_US)和简体中文(zh_CN): - `messages_en_US.properties` - `messages_...

    java struts国际化 struts 源码 演示

    通过这个Java Struts国际化演示项目,你可以深入理解Struts如何处理不同语言的用户请求,以及如何设计和组织资源包。实践操作将帮助你更好地掌握这一技能,从而在实际项目中为用户提供更好的多语言支持。

    Struts2国际化(可选择语言)

    在Struts2中实现国际化(I18n,Internationalization)是常见的需求,目的是使应用程序能够根据用户的语言和地区提供相应的本地化内容。本示例将详细介绍如何在Struts2框架下实现国际化,并通过myEclipse开发环境...

    struts2 国际化使用

    Struts2的国际化主要依赖于Java的ResourceBundle类,该类用于管理应用程序中的多语言资源。以下是如何在Struts2中进行国际化设置的详细步骤: 1. **创建资源文件**: 在项目的`src/main/resources`目录下,创建一...

    Struts2 使用 Struts2 实现国际化

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

Global site tag (gtag.js) - Google Analytics