[Java] 国际化

背景

  • 一个程序可以被不同国家的用户同时使用,可极大降低程序的开发及维护成本
  • 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

 

参考

https://zhidao.baidu.com/question/414732825.html

 

posted @ 2020-03-09 23:59  cxc1357  阅读(241)  评论(0编辑  收藏  举报