国际化与本地化

面试官问:"Java 怎么实现国际化?"

候选人小武答:"用 Locale 和 ResourceBundle。"

面试官追问:"具体怎么用?"

小武说不上来。

【面试官心理】 国际化是 Java 基础中相对冷门的知识点。能说出 ResourceBundle 机制和 MessageFormat 用法的候选人,说明有企业级开发经验。

一、核心 API 🔴

1.1 Locale

// Locale 表示语言和地区
Locale cn = new Locale("zh", "CN");   // 中文-中国
Locale us = new Locale("en", "US");   // 英文-美国
Locale uk = new Locale("en", "GB");   // 英文-英国

// 常用 Locale
Locale.CHINESE;   // zh
Locale.SIMPLIFIED_CHINESE; // zh_CN
Locale.US;        // en_US

// 获取默认 Locale
Locale defaultLocale = Locale.getDefault();

// JVM 启动时设置
// -Duser.language=zh -Duser.country=CN

1.2 ResourceBundle

// messages.properties(默认,英文)
greeting=Hello
farewell=Goodbye
welcome=Welcome, {0}!

// messages_zh.properties(中文)
greeting=\u4F60\u597D
farewell=\u518D\u89C1
welcome=\u6B22\u8FCE\uFF0C{0}\uFF01

// 加载
ResourceBundle bundle = ResourceBundle.getBundle("messages", Locale.CHINA);
String greeting = bundle.getString("greeting"); // 你好

二、消息格式化 🔴

2.1 MessageFormat

String pattern = "Hello, {0}! Today is {1,date,yyyy-MM-dd}.";
Object[] args = {"Alice", new Date()};
String msg = MessageFormat.format(pattern, args);

// 支持数字格式化
String price = MessageFormat.format("{0} costs {1,number,currency}.", "Book", 99.9);

// 支持多种格式
// {0,number,integer}
// {0,number,percent}
// {0,date}
// {0,time}

2.2 NumberFormat

// 数字格式化
NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
nf.format(1234567.89); // "1,234,567.89"

// 货币
NumberFormat cf = NumberFormat.getCurrencyInstance(Locale.CHINA);
cf.format(99.9); // "¥99.90"

// 百分比
NumberFormat pf = NumberFormat.getPercentInstance(Locale.US);
pf.format(0.75); // "75%"

三、Spring Boot 中的国际化 🟡

// application.yml
spring:
  messages:
    basename: i18n/messages
    encoding: UTF-8

// Controller 中使用
@RestController
public class UserController {
    @Autowired
    private MessageSource messageSource;

    public String getMessage(@RequestParam String code) {
        return messageSource.getMessage(code, null, LocaleContextHolder.getLocale());
    }
}

// HTML 中使用 Thymeleaf
// <span th:text="#{welcome}"></span>

四、追问升级

面试官:"properties 文件的中文怎么输入?"

// 方法一:Unicode 转义
// \u4F60\u597D = 你好

// 方法二:JDK 工具 native2ascii
// native2ascii -encoding UTF-8 src.properties dest.properties

// 方法三:IDEA / Eclipse 自动处理