Java 语言环境 – 创建和设置默认语言环境

Java 语言环境 – 创建和设置默认语言环境

原文: https://howtodoinjava.com/java/date-time/java-locale-api-examples/

如果要以符合用户语言和文化期望的用户友好方式显示数字,日期和时间,则需要使用 Java 语言环境 api。 在 Java 中,java.util.Locale类表示世界上特定的语言和地区。

如果一个类根据语言环境改变其行为,则称其为对语言环境敏感的。 例如,NumberFormatDateFormat类是对语言环境敏感的。 数字和日期的格式,它的返回取决于语言环境

Table of Contents

Create Locale Instance
Set Default Locale

创建语言环境实例

您可以通过以下方式创建 Java 语言环境实例:

  1. 静态语言环境对象

    这是最简单的方法,并使用Locale类中的预定义常量。

    Locale usLocale = Locale.US;
    
    long number = 123456789L;
    NumberFormat nf = NumberFormat.getInstance(usLocale);
    System.out.println( nf.format(number) );     //123,456,789
    
    Date now = new Date();
    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, usLocale);
    System.out.println( df.format(now) );    //July 19, 2016 12:43:12 PM IST
    
    

    请注意,以这种方式构建语言环境时,Locale的区域部分未定义。 因此,以下两个语句本质上是相等的:

    //Region is missing in both cases
    Locale usLocale = Locale.US;       //1
    Locale usLocale = new Locale.Builder().setLanguage("en").build();        //2
    
    
  2. 语言环境构造器

    Locale类中提供了三个构造器:

  • Locale(String language)
  • Locale(String language, String country)
  • Locale(String language, String country, String variant)

    Locale usLocale = new Locale("en");
    //Locale usLocale = new Locale("en", "US");
    
    long number = 123456789L;
    NumberFormat nf = NumberFormat.getInstance(usLocale);
    System.out.println( nf.format(number) );    //123,456,789
    
    Date now = new Date();
    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, usLocale);
    System.out.println( df.format(now) );    //July 19, 2016 12:43:12 PM IST
    
    
  1. Locale.Builder

    Locale.Builder工具类可用于构造符合 IETF BCP(最佳通用实践)47 语法的Locale对象。

    Locale usLocale = new Locale.Builder().setLanguage("en").setRegion("US").build();
    
    long number = 123456789L;
    NumberFormat nf = NumberFormat.getInstance(usLocale);
    System.out.println( nf.format(number) );    //123,456,789
    
    Date now = new Date();
    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, usLocale);
    System.out.println( df.format(now) );    //July 19, 2016 12:43:12 PM IST
    
    

    如果其参数不是BCP 47标准的格式正确的元素,则此方法将返回java.util.IllformedLocaleException错误。

  2. Locale.forLanguageTag()方法

    如果您具有符合 IETF BCP 47 标准的语言标签字符串,则可以使用forLanguageTag(String)工厂方法。

    Locale usLocale = Locale.forLanguageTag("en-US");
    
    long number = 123456789L;
    NumberFormat nf = NumberFormat.getInstance(usLocale);
    System.out.println( nf.format(number) );    //123,456,789
    
    Date now = new Date();
    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, usLocale);
    System.out.println( df.format(now) );    //July 19, 2016 12:43:12 PM IST
    
    

设置默认语言环境

尽管可以在运行时在所有对语言环境敏感的类中设置Locale,但是如果我们可以在启动时为每个用户请求设置默认语言环境(或特定于应用程序的语言环境),则无需为每个应用程序代码中的语言环境敏感的对象设置语言环境,因此我们可以避免很多代码行,并且也很少出现缺陷。

使用Locale.setDefault()方法设置默认情况下将使用所有对语言环境敏感的类的Locale实例。

Locale.setDefault(Locale.FRANCE);

Locale类还允许您为两个不同的类别设置默认的Locale

语言环境类别

Locale.Category枚举表示两个区域设置类别:

  1. Locale.Category.DISPLAY – 适用于应用程序的用户界面,例如资源束消息。
  2. Locale.Category.FORMAT – 用于日期和数字格式,具体取决于特定的区域信息
Locale.setDefault(Locale.Category.DISPLAY, Locale.US);
Locale.setDefault(Locale.Category.FORMAT, Locale.FR);

让我们来看一个例子。

//Set them at application startup or where request cycle begin
Locale.setDefault(Locale.Category.DISPLAY, Locale.US);
Locale.setDefault(Locale.Category.FORMAT, Locale.FRANCE);

ResourceBundle resourceBundle =  ResourceBundle.getBundle("bundleName", Locale.getDefault(Locale.Category.DISPLAY));
String message = resourceBundle.getString("message.key");

Date now = new Date();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
String date = df.format(now);

将我的问题放在评论部分。

学习愉快!

资源:

ISO 国家/地区代码

ISO 语言代码