`

Struts 2 的国际化(一)

阅读更多

 

一、 程序国际化简介

 

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面

 

1.1 程序国际化的意义

 

      全球化软件,意味着同一种版本的产品能够容易地适用于不同地区的市场。软件全球化意味着国际化和本地化。

      国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。

      国际化的英文单词是 Internationalization ,简称 I18N ,I 是首字母,18 表示省略当中的字母个数,N 代表最有一个字母

      一个国际化支持很好的应用,会随着在不同区域使用时,呈现出本地语言提示。这个过程被成为 Localization,即本地化。简称 L10N

      java 内核基于 UNICODE 2.1 编码集,提供了对不同国家,不同语言的支持,它已经具有国际化和本地化的特征和 API,因此 java 程序的国际化相对比较简单。

 

1.2 Java 国际化的思路


    Java 程序国际化思路是 将程序中的标签、提示等信息放在资源文件中,程序需要支持的国家/语言环境,则必须提供对应的资源文件。资源文件是 key-value 对,每个资源文件中的 key 是不变的,但 value 则随不同国家/语言变化

 

   j ava 程序的国际化主要通过如下 3 个类完成

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

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

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

 

   为了实现国际化,必须先提供程序所需要的资源文件。资源文件内容是很多 key-value 对。

   资源文件的命名可以有如下 3 种形式

 baseName_language_country.properties

 baseName_language.properties

 baseName.properties

 

  其中 baseName 是资源文件的基本名,用户可以自由定义,而 languagecountry 都不可随意变化,必须是 java 所支持的语言和国家

 

 

1.3 Java 支持的语言和国家

 

  事实上,java 不可能支持所有国家和语言,如需要获取 java 所支持的语言和国家,可调用 Locale 类的 getAvailableLocale() 方法获取,该方法返回一个 Locale 数组,该数组包含 java 所支持的语言和国家

 

LocaleList.java

import java.util.*;

public class LocaleList
{
	public static void main(String[] args) 
	{
		//返回Java所支持的全部国家和语言的数组
		Locale[] localeList = Locale.getAvailableLocales();
		//遍历数组的每个元素,依次获取所支持的国家和语言
		for (int i = 0; i < localeList.length ; i++ )
		{
			//打印出所支持的国家和语言
			System.out.println(localeList[i].getDisplayCountry()
				+ "=" + localeList[i].getCountry()	+ " "
				+ localeList[i].getDisplayLanguage() + "="
				+ localeList[i].getLanguage());
		}
	}
}
 

通过该程序,就可以获得 java 程序所支持的国家/语言环境。

 

 

1.4 完成程序国际化

 

如有如下简单程序:

public class RawHello
{
	public static void main(String[] args)
	{
		System.out.println("Hello World");
	}
}
 

   为了让该程序支持国际化,则肯定不能让程序直接输出 "Hello World" ,为了让程序可以输出不同的字符串,此处绝对不能使用这种字符串常量。

   为了让上面输出的字符串常量可以改变,我们将需要输出的各种字符串 (不同国家/语言环境对应不同的字符串)定义在资源包中。

 

为上面程序提供如下 2 个文件

 mess_zh_CN.properties

#资源文件的内容是 key-value 对
hello=您好!

 mess_en_US.properties

hello=Hello World!
 

对于包含非西欧字符的资源文件,Java 提供了一个工具来处理该文件: native2ascii ,这个工具可以在 %JAVA_HOME%/bin 路径下找到。

使用 格式如下

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

 如果我们在命令窗口输入如下指令:

native2ascii mess_zh_CN.properties aa.properties

   上面命令将生成一个 aa.properties 文件,该文件才是我们需要的资源文件。该文件看上去包含很多乱码,其实是非西欧字符的 UNICODE 编码方式,这完全正常。将该文件重命名为 mess_zh_CN.properties 即可。

 

Hello.java

import java.util.*;

public class Hello {
    public static void main(String[] args) {
        // 取得系统默认的国家/语言环境
        Locale myLocale = Locale.getDefault();
        // 根据指定国家/语言环境加载资源文件
        ResourceBundle bundle = ResourceBundle.getBundle("mess", myLocale);
        // 打印从资源文件中取得的消息
        System.out.println(bundle.getString("hello"));
    }
}

 

Java 国际化的关键类是 ResourceBundle ,有如下方法:

 

● getBundle(String baseName, Locale locale);

    上面方法将根据 Locale 加载资源文件,Locale 代表一个国家/语言。

例如:

● ResourceBundle bundle = ResourceBundle.getBundle("mess", myLocale);

    上面代码会加载 baseName 为 mess 的系列资源文件的其中之一,到底加载哪个,取决于 myLocale,对于简体中文,则加载 mess_zh_CH.properties.

 

 

1.5 使用 MessageFormat 处理带占位符的消息

 

MyResource_en_US.properties

msg=Hello,{0}!Today is {1}.

 MyResource_zh_CN.properties

msg=你好,{0}!今天是{1}。

 

如上,我们需要使用参数为 {0} ,{1} 两个占位符赋值

 

此时需要使用 MessageFormat 类,方法:

● format(String pattern , Object... values) : 返回后面的多个参数值填充前面的 pattern 字符串,其中 pattern 字符串就是一个带有占位符的字符串

 

PlaceHolderMsg.java

import java.util.*;
import java.text.*;

public class PlaceHolderMsg {
    public static void main(String[] args) {
        // 定义一个Locale变量
        Locale currentLocale = null;
        // 如果运行程序指定了两个参数
        if (args.length == 2) {
            // 使用运行程序的两个参数构造Locale实例
            currentLocale = new Locale(args[0], args[1]);
        } else {
            // 否则直接使用系统默认的Locale
            currentLocale = Locale.getDefault();
        }

        // 根据Locale加载语言资源
        ResourceBundle bundle = ResourceBundle.getBundle("MyResource",
            currentLocale);

        // 取得已加载的语言资源文件中msg对应消息
        String msg = bundle.getString("msg");

        // 使用MessageFormat为带占位符的字符串传入参数
        System.out.println(MessageFormat.format(msg, "yeeku", new Date()));
    }
}
 

如果程序不能找到对应的资源文件,系统会如下搜索:(假设是简体中文环境)

 

MyResource_zh_CN.properties

    如果没有找到,即搜索如下文件:

MyResource_zh.properties

    如果没有找到,即搜索如下文件:

MyResource.properties

    如果上面 3 个文件都找不到,则系统会出现异常。

 

 

1.6 使用类文件代替资源文件

 

使用 java 文件来代替资源文件,必须满足如下条件

 类的名字必须为 baseName_language_country ,这与属性文件的命名相似

  类必须继承 ListResourceBundle,并重写 getContents() 方法,返回 Object 数组,该数组的每个项都是 key-value对


MyResource_zh_CN.java

import java.util.*;

public class MyResource_zh_CN extends ListResourceBundle {
    // 定义资源
    private final Object myData[][] = {{"msg", "类文件消息:{0},您好!今天是{1}"}};

    // 重写方法getContents()
    public Object[][] getContents() {
        // 该方法返回资源的key-value对
        return myData;
    }
}
 

上面文件如果在简体中文环境下,可以代替 MyResource_zh_CN.properties

 

如果系统中存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件

 

对于简体中文的 Locale ResourceBundle 搜索资源的顺序 是:

 baseName_zh_CN.class

 baseName_zh_CN.properties

 baseName_zh.class

 baseName_zh.properties

 baseName.class

 baseName.properties

 

系统按上面的顺序搜索资源文件,如果前面的文件不存在,才会使用下一个。如果一直找不到对应的文件,系统将抛出异常

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    struts2国际化例子源码

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

    Struts2国际化的实现原理

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

    Struts2国际化Demo

    通过以上步骤,我们可以构建一个基本的Struts2国际化应用,使我们的应用能够适应不同地区和文化的用户需求。这只是一个简单的示例,实际项目中可能需要更复杂的逻辑来处理各种情况,如缓存策略、多区域支持等。

    struts2国际化 标签 页面 处理类

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

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

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

    STRUTS2国际化的问题

    #### 一、Struts2国际化的概述 Struts2作为一个流行的Web应用框架,为了满足全球用户的使用需求,提供了一系列国际化(Internationalization, 简称I18N)的支持。这包括了如何在配置文件中进行国际化设置,以及在...

    struts2国际化MyEclipse开发

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

    struts1.2 国际化

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

    struts2国际化测试

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

    Struts1 和 Struts 2 国际化全局资源

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

    struts2国际化处理全解

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

    Struts2国际化支持引导(初)

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

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

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

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

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

    struts2国际化demo

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

    struts2 国际化使用

    Struts2是一个流行的Java ...总的来说,Struts2的国际化是一个涉及资源文件创建、配置、Action类、JSP页面和框架核心组件协作的过程。通过熟练掌握这一功能,开发者能够为他们的应用提供更加全球化、友好的用户体验。

    Struts2 使用 Struts2 实现国际化

    在Struts2中实现国际化是一项关键功能,它允许应用程序为不同的语言和地区提供本地化的用户体验。下面将详细介绍如何使用Struts2来实现国际化,并探讨相关的源码和工具。 **一、国际化基础** 国际化(i18n)是软件...

    struts2框架国际化

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

    struts2实现国际化

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

    Struts2国际化(可选择语言)

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

Global site tag (gtag.js) - Google Analytics