背景
- 一个程序可以被不同国家的用户同时使用,可极大降低程序的开发及维护成本
- Google、Youtube、Facebook、Twitter、Ins
- 首先确定项目中核心结构,及所处的行业背景,核心业务完成后再考虑国际化
- 语言文字不放在代码中,放在配置文件中
- 用户根据自身情况选择相应配置文件,根据用户动态实现语言文字的切换
- 需要将不同国家不同的文字配置信息,在程序运行时通过配置文件加载相关的数据
- 如何动态获取当前用户所处的国家及语言
Locale类
- java.util.Locale:可进行国家及语切换的控制类
- public static final Locale CHINA:中国区域
- public static final Locale US:美国区域
- public Locale ( String language, String country ):设置语言及城市
- public static Locale getDefault():获取当前系统所处环境
- 实例化Locale类对象,需要有语言及城市编码
- IE > 工具 > Internet选项 > 外观 > 语言 > 设置语言首选项 > 添加语言(win7前)
获取区域和语言码
1 public class Locale_Demo {
2 public static void main(String[] args) {
3 Locale loc = Locale.CHINA;
4 System.out.println(loc);
5 }
6 }
View Code
指定区域和语言
1 public class Locale_Demo {
2 public static void main(String[] args) {
3 Locale loc = new Locale("zh","CN");
4 System.out.println(loc);
5 }
6 }
View Code
获取当前默认区域和语言
1 public class Locale_Demo {
2 public static void main(String[] args) {
3 Locale loc = Locale.getDefault();
4 System.out.println(loc);
5 }
6 }
View Code
ResourceBundle类
- Locale 实现定位,资源文件实现文字信息的存储
- 国际化文字保存在属性文件(或称资源文件)中
- 属性文件(或称资源文件)必须保存在“*.properties”后缀的文件中
- 资源文件进行保存时按照类的形式存储,放在CLASSPATH中(考虑包的问题)
- 资源文件进行定位时,所有内容采用“key=value”的形式声明
- 资源文件中注释用“#”开头
- 资源文件放在CLASSPATH可识别的目录中,同时可设置包名称
- Eclipse中资源文件显示中文,JDK 1.8 以前需进行转码处理,需要单独配置额外插件(JDK 1.9 以后默认UTF-8)
- IDEA可使用UTF-8编码
- 等号前后不加空格
- 资源读取
- java.util.ResourceBundle:实现CLASSPATH下指定资源的读取
- public static final ResourceBundle getBundle(String baseName):获取指定的资源对象
- public static final ResourceBundle getBundle(String baseName, Locale locale):获取指定区域下的资源对象
- public final String getString(String key):根据key读取value
- 所处的语言环境为中文,如果没有进行Locale的配置,则默认加载中文的文字信息(zh_CN)进行资源内容的读取,如果有需要可通过Locale进行指派
- 如果读取数据时发现指定的key不存在,则会自动查找公共的资源文件,如果key存在则会加载具体文字语言信息的资源文件
1 import java.util.Locale;
2 import java.util.ResourceBundle;
3
4 public class Locale_Demo {
5 public static void main(String[] args) {
6 Locale loc = Locale.US;
7
8 ResourceBundle resouceBundle = ResourceBundle.getBundle("a.Message",loc);
9 System.out.println(resouceBundle.getString("welcome.info"));
10 System.out.println(resouceBundle.getString("teacher.info"));
11 }
12 }
View Code
格式化文本
- 动态的文本处理
- 修改资源文件
- login.info=success,welcome {0}, Please Access {1} Web Site.
- java.text.MessageFormat
1 import java.text.MessageFormat;
2 import java.util.Locale;
3 import java.util.ResourceBundle;
4
5 public class Locale_Demo {
6 public static void main(String[] args) {
7 Locale loc = Locale.US;
8
9 ResourceBundle resourceBundle = ResourceBundle.getBundle("a.Message",loc);
10 String value = resourceBundle.getString("login.info");
11 System.out.println(MessageFormat.format(value, "aaa","bbb"));
12 }
13 }
View Code
数字格式化
- 通过NumberFormat 类实现数据的国际化显示
- java.text.NumberFormat
- public static final NumberFormat getInstance():得到一个默认Locale的NumberFormat实例
- public static final NumberFormat getPercentInstance(Locale inLocale):得到一个指定Locale的NumberFormat实例
- public static final NumberFormat getPercentInstance():得到一个默认Locale计算百分比的实例
- public static final NumberFormat getPercentInstance(Locale inLocale):得到一个指定Locale计算百分比的实例
- public static final NumberFormat getCurrencyInstance():获取默认Locale的货币实例
- public static final NumberFormat getCurrencyInstance(Locale inLocale):获取指定Locale的货币实例
- java.text.DecimalFormat:默认格式,每三位加“,”
- 直接通过子类实例化不妥,最佳方法是将之前的代码更换为NumberFormat类内部提供的静态方法完成处理
- 若仅仅获取一个NumberFormat类的对象进行默认格式的数字的格式化,则直接依靠NumberFormat类就可以完成,但如果要想使用一些特殊方法,就必须通过DecimalFormat类的对象实例配置
- 在DecimalFormat类中有一些重要的数字格式化标记
- 很少开发中很少需要特殊处理,因为大家习惯NumberFormat中的getInstance()方法里所给出的格式化格式已经是国际通用的
数字对象
1 import java.math.RoundingMode;
2 import java.text.DecimalFormat;
3 import java.text.NumberFormat;
4
5 public class Locale_Demo {
6 public static void main(String[] args) {
7 DecimalFormat numberFormat = (DecimalFormat) NumberFormat.getInstance();
8 numberFormat.applyPattern("####,####,####.000"); // 保留三位小数
9 numberFormat.setRoundingMode(RoundingMode.DOWN); // 不进位
10 numberFormat.setPositivePrefix("当年的收入流水:"); // 增加前置说明
11 numberFormat.setMinimumFractionDigits(5); // 保留五位小数
12 System.out.println(numberFormat.format(2826548.264785));
13 }
14 }
View Code
百分比对象
1 import java.text.DecimalFormat;
2 import java.text.NumberFormat;
3
4 public class Locale_Demo {
5 public static void main(String[] args) {
6 NumberFormat numberFormat = (DecimalFormat) NumberFormat.getPercentInstance();
7 System.out.println(numberFormat.format(0.9854623));
8 // 自定义处理,强制向下转型
9 DecimalFormat decimalFormat = (DecimalFormat) numberFormat;
10 decimalFormat.setMinimumFractionDigits(5);
11 System.out.println(decimalFormat.format(0.9878546));
12 }
13 }
View Code
货币对象
1 import java.text.NumberFormat;
2 import java.util.Locale;
3
4 public class Locale_Demo {
5 public static void main(String[] args) {
6 NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
7 System.out.println(numberFormat.format(789.46));
8 }
9 }
View Code