zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12452666.html
Copyright © 2011-2022 走看看