欢迎 on it road

设置默认语言环境

虽然可以在运行时在所有语言环境敏感类中设置Locale,但是如果我们可以在启动时为每个用户请求设置默认语言环境(或者特定于应用程序的语言环境),那么我们就不需要为每个语言环境敏感类设置语言环境应用程序代码中的对象,因此我们可以避免多行代码和很少的缺陷。

使用 Locale.setDefault()方法设置一个 Locale实例,所有语言环境敏感的类都将默认使用该实例。

Locale.setDefault(Locale.FRANCE);

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

语言环境类别

Locale.Category枚举表示两个语言环境类别:

  • Locale.Category.DISPLAY- 用于应用程序的用户界面,例如资源包消息。
  • Locale.Category.FORMAT- 用于根据特定区域信息格式化日期和数字
Locale.setDefault(Locale.Category.DISPLAY, Locale.US);
Locale.setDefault(Locale.Category.FORMAT, Locale.FR);

示例:

//在应用程序启动或者请求周期开始时设置它们
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);

创建语言环境实例

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

  • 静态 Locale 对象

这是最简单的,它使用了 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

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

//Region is missing in both cases
Locale usLocale = Locale.US;       //1
Locale usLocale = new Locale.Builder().setLanguage("en").build();        //2
  • Locale 构造函数

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
  • 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”错误。

  • 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
Java Locale类

在 java 中,java.util.Locale 类代表世界的特定语言和地区。

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

日期:2020-09-17 00:09:37 来源:oir作者:oir