Java Locale
最后修改日期:2024 年 7 月 10 日
本文介绍如何本地化 Java 程序。
国际化 是指设计一个应用程序,使其可以适应各种语言和地区的过程。 本地化 是指为特定地区或语言定制应用程序的过程。
Locale 代表一个特定的地理、政治或文化区域。
Locale 敏感数据包括
- 消息
- 日期和时间
- 数字
- 货币
- 度量单位
- 电话号码
- 姓名
- 邮政地址
默认 Locale
默认的 Locale 通过 Locale.getDefault 确定。
import java.util.Locale;
void main() {
var defLoc = Locale.getDefault();
System.out.println(defLoc.getDisplayCountry());
System.out.println(defLoc.getDisplayLanguage());
System.out.println(defLoc.getDisplayName());
System.out.println(defLoc.getISO3Country());
System.out.println(defLoc.getISO3Language());
System.out.println(defLoc.getLanguage());
System.out.println(defLoc.getCountry());
System.out.println("------------------------");
var skLoc = Locale.of("SK", "sk");
System.out.println(skLoc.getDisplayCountry());
System.out.println(skLoc.getDisplayLanguage());
System.out.println(skLoc.getDisplayName());
System.out.println(skLoc.getISO3Country());
System.out.println(skLoc.getISO3Language());
System.out.println(skLoc.getLanguage());
System.out.println(skLoc.getCountry());
}
该程序打印默认 Locale 和斯洛伐克 Locale 的属性。
var defLoc = Locale.getDefault(); System.out.println(defLoc.getDisplayCountry()); System.out.println(defLoc.getDisplayLanguage()); System.out.println(defLoc.getDisplayName());
我们获取默认的 Locale 并打印显示国家名称、语言和名称。
$ java Main.java United States English English (United States) USA eng en US ------------------------ Slovakia Slovak Slovak (Slovakia) SVK slk sk SK
Locale 常量
有一些内置的 Locale 常量,例如 Locale.US。
import java.text.NumberFormat;
import java.util.Locale;
void main() {
double n = 1240.35;
NumberFormat nf = NumberFormat.getInstance(Locale.US);
System.out.println(nf.format(n));
NumberFormat nf2 = NumberFormat.getInstance(Locale.FRANCE);
System.out.println(nf2.format(n));
NumberFormat nf3 = NumberFormat.getInstance(Locale.GERMAN);
System.out.println(nf3.format(n));
}
该程序以 Locale.US、Locale.FRANCE 和 Locale.GERMAN Locale 打印一个数字。
NumberFormat nf = NumberFormat.getInstance(Locale.US);
NumberFormat.getInstance 返回指定 Locale 的通用数字格式。
System.out.println(nf.format(n));
我们将值传递给 NumberFormat 的 format 方法。
$ java Main.java 1,240.35 1 240,35 1.240,35
Locale.Builder
可以使用 Locale.Builder 创建 Locale。
import java.text.NumberFormat;
import java.util.Locale;
void main() {
double n = 1240.35;
var loc = new Locale.Builder()
.setLanguage("sk")
.setRegion("SK")
.build();
NumberFormat nf = NumberFormat.getInstance(loc);
System.out.println(nf.format(n));
var loc2 = new Locale.Builder()
.setLanguage("ja")
.setRegion("JP")
.build();
NumberFormat nf2 = NumberFormat.getInstance(loc2);
System.out.println(nf2.format(n));
}
该程序本地化斯洛伐克语和日语的值。 Locale 是使用构建器创建的。
var loc = new Locale.Builder()
.setLanguage("sk")
.setRegion("SK")
.build();
Locale 是用构建器构建的。 我们使用 setLanguage 设置语言,使用 setRegion 设置区域。
$ java Main.java 1 240,35 1,240.35
Locale.of 方法
有三种方法可以创建 Locale 对象。
Locale.of(String language) Locale.of(String language, String country) Locale.of(String language, String country, String variant)
我们可以将语言、国家/地区和变体指定为参数。
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Locale;
void main() {
var val = new BigDecimal("2530.45");
var skLoc = Locale.of("sk", "SK");
var huLoc = Locale.of("hu", "HU");
var ruLoc = Locale.of("ru", "RU");
NumberFormat cf1 = NumberFormat.getCurrencyInstance(skLoc);
System.out.println(cf1.format(val));
NumberFormat cf2 = NumberFormat.getCurrencyInstance(huLoc);
System.out.println(cf2.format(val));
NumberFormat cf3 = NumberFormat.getCurrencyInstance(ruLoc);
System.out.println(cf3.format(val));
}
在该示例中,我们打印斯洛伐克语、匈牙利语和俄语 Locale 中的货币值。
var val = new BigDecimal("2530.45");
对于货币值,我们应该使用 BigDecimal。
NumberFormat cf1 = NumberFormat.getCurrencyInstance(skLoc);
要格式化货币值,我们使用 NumberFormat.getCurrencyInstance 并将 Locale 传递给它。
$ java Main.java 2 530,45 € 2 530,45 Ft 2 530,45 ₽
Locale 格式化日期时间
使用 Locale 和 DateTimeFormatter,我们可以格式化日期时间值。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
void main() {
var now = LocalDateTime.now();
var dtf1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.FRANCE);
System.out.println(now.format(dtf1));
var dtf2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.US);
System.out.println(now.format(dtf2));
var dtf3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.TRADITIONAL_CHINESE);
System.out.println(now.format(dtf3));
}
在该程序中,我们以法语、美国和中文 Locale 格式化当前日期时间。
var dtf1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.FRANCE);
我们使用 ofLocalizedDateTime 选择日期时间格式样式,并使用 withLocale 设置 Locale。
$ java Main.java 10 juil. 2024, 11:53:59 Jul 10, 2024, 11:53:59 AM 2024年7月10日 上午11:53:59
Locale ResourceBundle
资源包是一个 Java 属性文件,其中包含特定于 Locale 的数据。 我们使用资源包本地化消息。
w1=Earth w2=ocean
这是默认的属性文件;它通常使用英语。 文件中有两个单词。
w1=Erde w2=ozean
words_de.properties 文件包含德语单词。
w1=Земля w2=океан
words_ru.properties 文件包含俄语单词。
使用 IntelliJ IDEA 时,我们需要将属性文件的编码更改为 utf-8;默认值为 ISO-8859-1。
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.ResourceBundle;
void main() {
Locale[] locales = {
Locale.GERMAN,
Locale.of("ru", "RU"),
Locale.ENGLISH
};
System.out.println("w1:");
for (Locale locale : locales) {
getWord(locale, "w1");
}
System.out.println("w2:");
for (Locale locale : locales) {
getWord(locale, "w2");
}
}
void getWord(Locale curLoc, String key) {
ResourceBundle words = ResourceBundle.getBundle("main/resources/words", curLoc);
String value = words.getString(key);
System.out.printf("Locale: %s, Value: %s %n", curLoc, value);
}
在代码示例中,我们打印三个资源包中使用的所有单词。
ResourceBundle words = ResourceBundle.getBundle("main/resources/words", curLoc);
使用 ResourceBundle.getBundle 方法,我们获取当前使用的 Locale 的捆绑包。
String value = words.getString(key);
从捆绑包中,我们使用 getString 检索值。
$ java Main.java w1: Locale: de, Value: Erde Locale: ru_RU, Value: Земля Locale: en, Value: Earth w2: Locale: de, Value: ozean Locale: ru_RU, Value: океан Locale: en, Value: ocean
来源
在本文中,我们展示了如何本地化 Java 程序。
作者
列出所有Java教程。