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

xiaoxiao2021-02-28  60

引言

本篇阐述的是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=username passwd=passwd input=input info.success=welcome,{0} info.error=error #info_zh_CN.properties内容 #对应中文转换为Unicode编码 username=\u7528\u6237\u540d passwd=\u5BC6\u7801 input=\u8BF7\u8F93\u5165 info.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); } } }

程序结果:

转载请注明原文地址: https://www.6miu.com/read-83099.html

最新回复(0)