随机名言

Java 国际化

和印度团队开了几次会扯皮,真服他们的英语口语,想着来弄个国际化试试把


1. 国际化

当产品有多语言环境的需求时,我们就需要为不同的语言提供不同的处理。前端解决了绝大多数的国际化问题,偶尔后端也需要一些国际化需求,刚好 Java 就支持这种操作


1.1 语言资源包

资源包是 properties 文件,以键值对报文对应的国际化信息。必须创建默认的语言资源包(其命名为 baseName.proerties ),而其他语言资源包其命名为 baseName_语言类型_国家地区.properties。下面举例 baseName 为 messages:

  • messages.properties
  • messages_zh_CN.properties
  • messages_en_US.properties


1.2 Locale

本身是标签,用于表示本地化对象。本地化信息要由 语言类型 和 国家/地区 二者才能唯一确定,比如中文加上中国是简体,中文加上中国台湾是繁体



1.3 ResourceBundle

用于加载对应的资源包,并获取资源包内部的信息。其根据 资源包地址 和 本地化对象 来确认加载哪个语言的资源包



1.4 使用

// 中文简体
Locale CNLocale = new Locale("zh", "CN");

// 输出:zh_CN
String tag = CNLocale.toLanguageTag();

// 获取资源包
ResourceBundle bundle = ResourceBundle.getBundle(messagesPath, locale);

// 获取资源包内部的值
bundle.getString("key");






2. 示例

展示没有 SpringBoot 集成的使用方式


2.1 创建国际化文件

在 resources/i18n 下创建国际化文件,填入对应的国际化信息,并在配置文件中填入国际化文件的路径方便统一管理

messages:
  path: i18n/messages


2.2 创建工具类

@Component
public class MessagesUtil {

    @Value("${messages.path}")
    private String messagesPath;

    public String getMessages(String key) {
        return getMessages(key, Locale.getDefault());
    }

    public String getMessages(String key, Locale locale) {
        ResourceBundle bundle = ResourceBundle.getBundle(messagesPath, locale);
        return bundle.getString("greet");
    }
}


2.3 使用

@RestController
@RequestMapping("/i18n")
public class I18nController {

    @Autowired
    private MessagesUtil messagesUtil;

    @GetMapping("/message")
    public String message() {
        String message = messagesUtil.getMessages("greet");
        return message;
    }
}






3. SpringBoot 集成

SpringBoot 集成了国际化,有自动化配置等处理,让我们使用更加方便快捷


3.1 国际化配置

下面是默认值可不设置,也可自行设置命名

server:
  port: 8080
  
spring:
  messages:
    basename: messages
    encoding: UTF-8


3.2 创建国际化文件

message.properties 缺省的文件必须要有,然后创建各种语言国际化文件,并放入 resource/i18n 下



3.3 使用

自动注入 MessageSource 类即可,然后根据 key 可以获取对应的国际化信息

@RestController
@RequestMapping("/i8n")
public class I8nController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/message")
    public String message() {
        String message = messageSource.getMessage("greet", null, new Locale("en", "US"));
        return message;
    }
}


3.4 MessageSource 分析

  • SpringBoot 自动加载 MessageSource 组件,组件内有 ResourceBundleMessageSource 来加载国际化资源
  • MessageSource 组件使用配置文件 MessageSourceProperties,内有默认值:
    • basename = messages
    • encoding = StandardCharsets.UTF_8
  • MessageSourceProperties 指定前缀 spring.messages,所以我们在 YML 文件可以配置该内容



posted @ 2021-11-30 23:07  Howlet  阅读(68)  评论(0编辑  收藏  举报

Copyright © By Howl