Java多语言编程-程序国际化

来源:互联网 发布:淘宝可以拦截差评吗 编辑:程序博客网 时间:2024/06/05 18:25

引言

本篇阐述的是Java中的国际化,国际化在开发框架和页面中有着更为便捷的使用方式,如Spring mvc,struts,jsp;

程序多语言原理:在不同地区根据主机不同的设定去匹配与之对应的语言环境。一个程序可以同时适应多种语言。

国际化(Internationalization),简称i18n。i,n为单词首尾字母,18为中间字符数。

i18n支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等;

除了i18n还有其他多语言,分别是:
1、L10n(localization),支持2种语言,英文和另外一种语言(例如中文);
2、g11n(globalization),简单的理解可以认为g11n = i18n + L10n。
3、m17n(multilingualization)可以在同一时间支持多种语言,例如你可以在一个页面里看到中文、英文、德文和韩文。

Java程序中需要使用的工具类

1.Java.util.Locale:用于表示一个国家语言类
2.Java.util.ResourceBundle:用于访问资源文件
3.Java.text.MessageFormat:格式化资源文件的占位字符串

1、Local

Java.util.Locale是表示语言和国家/地区信息的本地化类,它是创建国际化应用的基础。可以通过Locale类创建一个本地语言环境对象,常用的3种方法:

第一个是通过构造函数指定语言和地区指定;
public Locale(String language, String country)
第二个是通过语言代码构造语言环境
Locale.语言常量;
第三个是获取此JAVA虚拟机实例的当前默认语言环境
Locale.getDefault();

2.ResourceBundle

这个类是专门完成属性文件读取操作的,读取的时候直接指定文件名即可(此文件名称一般不需要指定后缀名,统一为*.properties),可以更具Locale所指定的区域码来自动选择所需要的资源文件。

获取ResourceBundle对象常用方法:

//指定操作的资源文件,并传入Locale对象Public staticfinal ResourceBundle getBundle(String baseName,Local locale)

3、MessageFormat

JDK的java.util包中提供了几个支持本地化的格式化操作工具类:NumberFormat、DateFormat、MessageFormat。

MessageFormat在NumberFormat和DateFormat的基础上提供了强大的占位符(”{0-n}:第一个参数-第n-1个参数”)字符串的格式化功能,它支持时间、货币、数字以及对象属性的格式化操作。

常用方法:

//patttern指的是含有占位符的原字符串,arguments指的是每个占位符的值。方法返回格式化后的字符串。public static String format(String pattern, Object ... arguments)

国际化一般步骤

1、建立国际化资源文件

国际化资源文件的命名规范规定资源名称采用以下的方式进行命名:

<资源名><语言代码><国家/地区代码>.properties
如:info_en_US.properties

标准的语言代码请参考:http://www.loc.gov/standards/iso639-2/php/English_list.php

标准的ISO国家/地区代码请参考:http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

文件示例:
这里写图片描述

文件代码示例:

#info_en_US.properties内容username=usernamepasswd=passwdinput=inputinfo.success=welcome,{0}info.error=error
#info_zh_CN.properties内容#对应中文转换为Unicode编码username=\u7528\u6237\u540dpasswd=\u5BC6\u7801input=\u8BF7\u8F93\u5165info.success=\u6B22\u8FCE\uff0c{0}info.error=\u767B\u5f55

2、创建一个本地语言环境对象

代码示例:

Locale locale = new Locale("zh", "CN");Locale locale1 = Locale.US;Locale locale2 = Locale.getDefault();

3、通过ResourceBundle工具类绑定资源文件

注意:绑定的资源文件名是包名.文件基本名,不包括语言,国家地区和文件后缀名,然后指定当前的语言环境

代码示例:

ResourceBundle res = ResourceBundle.getBundle("info", Locale.getDefault());

4、获取资源文件中的值

资源文件,通过key=value的方式保存值,使用ResourceBundle对象直接通过key获取value;

ResourceBundle常用方法:

public final Object getObject(String key)public final String getString(String key)public Locale getLocale();

代码示例:

String input = res.getString("input");String username = res.getString("username");String passwd = res.getString("passwd");String infoSuccess = res.getString("info.success");String infoError = res.getString("info.error");

5、处理动态文本

使用MessgeFormat中的静态方法format处理动态文本(包含占位符)。

format方法:

//第一个参数就是要进行动态处理的包含占位符的字符串,后续的参数个数可变,分别对应前面字符串中的通配符public static String format(String pattern, Object ... arguments)

代码示例:

String pattern="你好,{0}";String name="先生";String success = MessageFormat.format(pattern, name);//结果:success="你好,先生";

完整Demo示例

代码:

import java.text.MessageFormat;import java.util.Locale;import java.util.ResourceBundle;import java.util.Scanner;public class LocalDemo {    public static void main(String[] args) {        //创建一个本地语言环境对象(中文,英文,本地默认)        Locale locale = new Locale("zh", "CN");        Locale locale1 = Locale.US;        Locale locale2 = Locale.getDefault();        //通过ResourceBundle工具类绑定资源文件(包名.文件名(基本名称不包括语言部分和后缀部分))        ResourceBundle res = ResourceBundle.getBundle("info", locale);        //从属性文件中根据key获取value值        String input = res.getString("input");        String username = res.getString("username");        String passwd = res.getString("passwd");        String infoSuccess = res.getString("info.success");        String infoError = res.getString("info.error");        //模拟用户登陆        Scanner in = new Scanner(System.in);        System.out.println(input +""+ username);        String userName = in.next();        System.out.println(input +""+ passwd);        String password = in.next();        if ("admin".equals(userName) && "123".equals(password)) {            //处理动态文本(模式, 要替换的值……)            String success = MessageFormat.format(infoSuccess, userName);            System.out.println(success);        } else {            System.out.println(infoError);        }    }}

程序结果:
程序结果

原创粉丝点击