国际化与格式化
即使再小的帆也能远航~
一.内容
二.目录
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。例如,如果请求来自中文操作系统的客户端,则应用程序中的各个提示信息和帮助等都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并做出英文的响应。
Java程序的国际化思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就对应提供相应的资源文件。
Java程序的国际化主要通过三个类来完成: 1、java.util.ResourceBundle:用于加载国家、语言资源包 2、java.util.Locale:用于封装特定的国家/区域、语言环境。 3、java.text.MessageFormat:用于格式化带占位符的字符串。
为了实现程序的国际化,必须先提供程序所需的资源文件。资源文件的内容时很多key-value对,其中key是程序使用的部分,而value则是程序界面的显示字符串。
资源文件的命名可以有如下三种形式: 1、baseName_language_country.properties 2、baseName_language.properties 3、baseName.properties 其中baseName是资源文件的基本名,可随意指定,而language和country都不可以随意变化而必须是Java所支持的语言和国家。
Java支持绝大部分的国家和语言,如果需要获取Java所支持的国家和语言,则可调用Locale类的getAvailableLocales()方法,该方法返回个Locale数组,该数组包含了Java所支持的国家和语言。
Local的构造方法
Locale(String language)
根据语言代码构造一个语言环境。
Locale(String language, String country)
根据语言和国家/地区构造一个语言环境。
Locale(String language, String country, String variant)
根据语言、国家/地区和变量构造一个语言环境
Local的常用方法
String getCountry()
返回此语言环境的国家/地区代码,将为空字符串或大写的 ISO 3166 两字母代码。
String getLanguage()
返回此语言环境的语言代码,可以是空字符串或小写的 ISO 639 代码。
String getDisplayLanguage()
返回适合向用户显示的语言环境语言名。
String getDisplayCountry()
返回适合向用户显示的语言环境国家/地区名
static Locale[] getAvailableLocales()
返回所有已安装语言环境的数组。
static Locale getDefault()
获取系统默认的国家/语言环境
示例
public class LocalDemo {
public static void main(String[] args) {
Locale[] locales = Locale.getAvailableLocales();
for (Locale locale : locales) {
System.out.println(locale.getLanguage()+"语言信息:"+ locale.getDisplayLanguage());
System.out.println(locale.getCountry()+"国家信息:"+ locale.getDisplayCountry());
}
}
}
语言信息:
国家信息:
ar语言信息:阿拉伯文
AE国家信息:阿拉伯联合酋长国
ar语言信息:阿拉伯文
JO国家信息:约旦
ar语言信息:阿拉伯文
SY国家信息:叙利亚
hr语言信息:克罗地亚文
.................
.................
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。
比如做一个中英双版本的网站~
需要创建两个properties文件,把不同的标签存入properties文件(properties文件是常用的三大配置文件(.properties; .xml; .yaml)之一,是一种保存键值对的文件,每行一个键值对对象.形如: key=value)
-
创建另外一个类路径的文件夹:配置文件夹,来存放properties文件(不要将properties文件放在src目录下,src也是类路径的一个文件夹,但src下的 java文件会被编译,是用来放类文件的) 具体做法(idea为例):
- 项目名右键–>new–>Directory,取名为config;(此时就是一个普通文件夹)
- config右键–>Mark Directory as–>Resource Root;(变成类路径文件夹)
-
在国际化中,.properties文件是用来做国际化资源文件的. 存放不同国家与地区语言下的一些字符串信息. 命名方式: 基础名_语言名_地区.properties
-
创建一个.properties文件,存放某一个国家的语言, 具体做法: config右键–>new–>properties–>命名 # my_en_US
username=Username
password=Password
index=Index
# my_zh_CN.properties
username=用户名
password=密码
index=首页
注:如果config右键–>new的时候没有找到properties这个模板,先建这个模板: File–>settings–>Editor–>File and Code Templates–>在第一个Files下点"+“号–>Name, Extension都写"properties”–>两个方框勾对号–>Apply,Ok -
用java代码演示(并没有实际效果,因为实际效果是由用户在页面点) public class ResourceBundle {
public static void main(String[] args) {
Locale localeCn = new Locale("zh", "CN");
Locale localeUs = new Locale("en", "US");
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("my", localeCn);
String username = bundle.getString("username");
System.out.println(username);
}
}
用户名
Process finished with exit code 0
Properties集合是唯一一个和IO流相结合的集合
-
Properties 类表示了一个持久的属性集。Properties可保存在流中或从流中加载。继承了Hashtable<k,v>. -
属性列表中每个键及其对应值都是一个字符串。properties集合是一个双列集合,key和value默认都是字符串 -
常用构造方法 Properties()
创建一个无默认值的空属性列表。
-
常用方法 void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
void load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
void store(OutputStream out, String comments)
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void store(Writer writer, String comments)
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
Object setProperty(String key, String value)
调用 Hashtable 的方法 put
String getProperty(String key)
用指定的键在此属性列表中搜索属性
Set<String> stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串
代码示例 public class PropertiesDemo {
public static void main(String[] args) {
Properties prop=new Properties();
prop.setProperty("山东", "济南");
prop.setProperty("河北","石家庄");
prop.setProperty("西藏","拉萨");
prop.setProperty("中国","北京");
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key+"-->"+value);
}
}
}
中国-->北京
河北-->石家庄
西藏-->拉萨
山东-->济南
Process finished with exit code 0
-
properties集合中的store方法 void store(OutputStream out, String comments)
void store(Writer writer, String comments)
OutputStream out :字节输出流,不能写中文
Writer writer :字符输出流,可以写中文
String comments:注释,用来解释保存的文件是做什么用的
不能使用中文,会产生乱码.默认是Unicode编码
一般使用""全空字符
使用步骤:
- 创建Properties集合对象
- 创建字节输出流或字符输出流对象,构造方法中绑定要输出的目的地
- 使用Properties集合中的store方法,把集合中的临时数据,持久化写入到硬盘中存储
- 释放资源
代码示例: public class PropertiesDemo {
public static void main(String[] args) throws IOException {
Properties prop=new Properties();
prop.setProperty("山东", "济南");
prop.setProperty("河北","石家庄");
prop.setProperty("西藏","拉萨");
prop.setProperty("中国","北京");
FileWriter fw = new FileWriter("data1.txt");
prop.store(fw,"sava data");
fw.close();
}
}
Process finished with exit code 0
#sava data
#Thu Aug 19 23:59:22 CST 2021
中国=北京
西藏=拉萨
河北=石家庄
山东=济南
-
properties集合中的load方法 void load(InputStream inStream)
void load(Reader reader)
InputStream inStream:字节输入流,不能读取含有中文的键值对
Reader reader: 字符输入流,能读取含有中文的键值对
使用步骤:
- 创建Properties集合对象
- 使用properties集合对象中的方法load读取保存键值对的文件
- 遍历properties集合
注意:
- 存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他字符)
- 存储键值对的文件中,可以使用#进行注释,该注释的键值对不会再被读取
- 存储键值对的文件中,键与值默认的都是字符串,不用再加引号
代码示例: public class PropertiesDemo {
public static void main(String[] args) throws IOException {
Properties prop=new Properties();
prop.load(new FileReader("data1.txt"));
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key+"<--"+value);
}
}
}
中国<--北京
西藏<--拉萨
河北<--石家庄
山东<--济南
Process finished with exit code 0
第一种:通过properties集合load方法的方式 具体见上. 第二种:通过ResourceBundle的方式加载 ResourceBundle:资源束 -
常用方法 static ResourceBundle getBundle(String baseName, Locale locale)
使用指定的基本名称、语言环境和调用者的类加载器获取资源包。
String getString(String key)
从此资源包或它的某个父包中获取给定键的字符串
-
代码演示 public class ResourceBundle {
public static void main(String[] args) {
Locale localeCn = new Locale("zh", "CN");
Locale localeUs = new Locale("en", "US");
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("my", localeCn);
String username = bundle.getString("username");
System.out.println(username);
}
}
第三种方式:通过类加载器的方式
Properties pro = new Properties();
InputStream is = GetProperties.class.getClassLoader().getResourceAsStream("pro.properties");
pro.load(is);
Set<String> keys = pro.stringPropertyNames();
for (String s : keys){
System.out.println(s + "=" + pro.getProperty(s));
}
|