背景

  • 一个程序可以被不同国家的用户同时使用,可极大降低程序的开发及维护成本
  • Google、Youtube、Facebook、Twitter、Ins
  • 首先确定项目中核心结构,及所处的行业背景,核心业务完成后再考虑国际化
  • 语言文字不放在代码中,放在配置文件中
  • 用户根据自身情况选择相应配置文件,根据用户动态实现语言文字的切换
  • 需要将不同国家不同的文字配置信息,在程序运行时通过配置文件加载相关的数据
  • 如何动态获取当前用户所处的国家及语言

[Java] 国际化_java

 

 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前) 

[Java] 国际化_加载_02

获取区域和语言码


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

指定区域和语言


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

获取当前默认区域和语言


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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存在则会加载具体文字语言信息的资源文件

[Java] 国际化_配置文件_09[Java] 国际化_加载_10


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

[Java] 国际化_java_03[Java] 国际化_配置文件_04


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()方法里所给出的格式化格式已经是国际通用的

数字对象


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

百分比对象


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

货币对象


[Java] 国际化_java_03[Java] 国际化_配置文件_04


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

[Java] 国际化_资源文件_21