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

> 原文： [https://howtodoinjava.com/java/date-time/java-locale-api-examples/](https://howtodoinjava.com/java/date-time/java-locale-api-examples/)

如果要以符合用户语言和文化期望的用户友好方式显示数字，日期和时间，则需要使用 Java 语言环境 api。 在 Java 中，[`java.util.Locale`](https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html)类表示世界上特定的语言和地区。

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

```java
Table of Contents

Create Locale Instance
Set Default Locale

```

## 创建语言环境实例

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

1.  #### 静态语言环境对象

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

    ```java
    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`的区域部分未定义。 因此，以下两个语句本质上是相等的：
    > 
    > ```java
    > //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)`

    ```java
    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

    ```

3.  #### `Locale.Builder`类

    `Locale.Builder`工具类可用于构造符合 [IETF BCP（最佳通用实践）47](https://tools.ietf.org/html/bcp47) 语法的`Locale`对象。

    ```java
    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`错误。

4.  #### `Locale.forLanguageTag()`方法

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

    ```java
    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`实例。

```java
Locale.setDefault(Locale.FRANCE);

```

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

#### 语言环境类别

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

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

```java
Locale.setDefault(Locale.Category.DISPLAY, Locale.US);
Locale.setDefault(Locale.Category.FORMAT, Locale.FR);

```

让我们来看一个例子。

```java
//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 国家/地区代码](http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html)

[ISO 语言代码](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)