AI智能
改变未来

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_CNString tag = CNLocale.toLanguageTag();// 获取资源包ResourceBundle bundle = ResourceBundle.getBundle(messagesPath, locale);// 获取资源包内部的值bundle.getString("key");

2. 示例

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

2.1 创建国际化文件

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

messages:path: i18n/messages

2.2 创建工具类

@Componentpublic 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 {@Autowiredprivate MessagesUtil messagesUtil;@GetMapping("/message")public String message() {String message = messagesUtil.getMessages("greet");return message;}}

3. SpringBoot 集成

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

3.1 国际化配置

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

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

3.2 创建国际化文件

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

3.3 使用

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

@RestController@RequestMapping("/i8n")public class I8nController {@Autowiredprivate 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 文件可以配置该内容
  • 赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Java 国际化