国际化与格式化
即使再小的帆也能远航~
一.内容
概念
java国际化思路
java支持的国家和语言
完成java程序国际化
Properties集合
加载.properties配置文件的方式
二.目录
概念
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。例如,如果请求来自中文操作系统的客户端,则应用程序中的各个提示信息和帮助等都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并做出英文的响应。
java国际化思路
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支持绝大部分的国家和语言,如果需要获取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) {
//Local对象封装了语言和国家信息
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语言信息:克罗地亚文
.................
.................
完成java程序国际化
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。
比如做一个中英双版本的网站~
需要创建两个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集合
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) 用指定的键在此属性列表中搜索属性 //通过key找到value Set<String> stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串 //相当于Map集合的Keyset集合
代码示例
public class PropertiesDemo { public static void main(String[] args) { //创建Properties集合对象 Properties prop=new Properties(); //使用setProperty方法往集合中添加数据,key,value只能是字符串 prop.setProperty("山东", "济南"); prop.setProperty("河北","石家庄"); prop.setProperty("西藏","拉萨"); prop.setProperty("中国","北京"); //使用stringPropertyName将Properties集合中的key拿出,存储到set集合中 Set<String> set = prop.stringPropertyNames(); //遍历set集合,取出每一个key for (String key : set) { //使用getProperty方法通过key获取value 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 { //1.创建Properties集合对象,添加数据 Properties prop=new Properties(); prop.setProperty("山东", "济南"); prop.setProperty("河北","石家庄"); prop.setProperty("西藏","拉萨"); prop.setProperty("中国","北京"); //2.创建字节输出流或字符输出流对象,构造方法中绑定要输出的目的地 FileWriter fw = new FileWriter("data1.txt"); //3.使用Properties集合中的store方法,把集合中的临时数据,持久化写入到硬盘中存储 prop.store(fw,"sava data"); //4.释放资源 fw.close(); } } //结果 Process finished with exit code 0 //打开data1.txt看一看 #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 { //1.创建Properties集合对象,添加数据 Properties prop=new Properties(); //2.使用properties集合对象中的方法load读取保存键值对的文件 prop.load(new FileReader("data1.txt")); //遍历properties集合 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配置文件的方式
第一种:通过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集合对象 Properties pro = new Properties(); //通过ClassLoader中的getResourceAsStream将配置文件读取到字节流中 InputStream is = GetProperties.class.getClassLoader().getResourceAsStream("pro.properties"); //将文件内容存入properties集合中 pro.load(is); //获取文件中所有的键 Set<String> keys = pro.stringPropertyNames(); //遍历所有的内容 for (String s : keys){ System.out.println(s + "=" + pro.getProperty(s)); }