前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 国际化

Java 国际化

作者头像
晚上没宵夜
发布2021-12-02 21:09:35
1.1K0
发布2021-12-02 21:09:35
举报

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

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 使用

代码语言:javascript
复制
// 中文简体
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 下创建国际化文件,填入对应的国际化信息,并在配置文件中填入国际化文件的路径方便统一管理

代码语言:javascript
复制
messages:
  path: i18n/messages

2.2 创建工具类

代码语言:javascript
复制
@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 使用

代码语言:javascript
复制
@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 国际化配置

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

代码语言:javascript
复制
server:
  port: 8080
  
spring:
  messages:
    basename: messages
    encoding: UTF-8

3.2 创建国际化文件

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

3.3 使用

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

代码语言:javascript
复制
@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 文件可以配置该内容
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 国际化
    • 1.1 语言资源包
      • 1.2 Locale
        • 1.3 ResourceBundle
          • 1.4 使用
          • 2. 示例
            • 2.1 创建国际化文件
              • 2.2 创建工具类
                • 2.3 使用
                • 3. SpringBoot 集成
                  • 3.1 国际化配置
                    • 3.2 创建国际化文件
                      • 3.3 使用
                        • 3.4 MessageSource 分析
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档