[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 }
指定区域和语言
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 }
获取当前默认区域和语言
1 public class Locale_Demo { 2 public static void main(String[] args) { 3 Locale loc = Locale.getDefault(); 4 System.out.println(loc); 5 } 6 }
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 }
格式化文本
- 动态的文本处理
- 修改资源文件
- 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 }
数字格式化
- 通过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 }
百分比对象
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 }
货币对象
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 }
参考
https://zhidao.baidu.com/question/414732825.html