Haoyuan's blog Haoyuan's blog
首页
导航站
  • Java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • Spring Cloud
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
留言区
GitHub (opens new window)

Somnus Haoyuan

Word is cheap, show me the code.
首页
导航站
  • Java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • Spring Cloud
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
留言区
GitHub (opens new window)
  • Spring

    • Spring6 - 概述
    • Spring6 - 入门
    • Spring6 - 容器
    • Spring6 - 手写容器
    • Spring6 - AOP
    • Spring6 - Junit
    • Spring6 - 事务
    • Spring6 - Resource
    • Spring6 - 国际化
      • i18n 概述
      • Java 国际化
      • Spring6 国际化
        • MessageSource 接口
        • 使用 Spring6 国际化
    • Spring6 - 数据校验
    • Spring - Cache
  • Spring MVC

  • Spring Boot

  • Spring Security

  • Spring Cloud

  • Spring生态
  • Spring
Haoyuan
2023-10-28
目录

Spring6 - 国际化

  • i18n 概述
  • Java 国际化
  • Spring6 国际化
    • MessageSource 接口
    • 使用 Spring6 国际化

# i18n 概述

国际化也称作 i18n,其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件。

# Java 国际化

Java 自身是支持国际化的,Java.util.Locale 用于指定当前用户所属的语言环境等信息,Java.util.ResourceBundle 用于查找绑定对应的资源文件。Locale 包含了 language 信息和 country 信息,Locale 创建默认 locale 对象时使用的静态方法:

    /**
     * This method must be called only for creating the Locale.*
     * constants due to making shortcuts.
     */
    private static Locale createConstant(String lang, String country) {
        BaseLocale base = BaseLocale.createInstance(lang, country);
        return getInstance(base, null);
    }
1
2
3
4
5
6
7
8

配置文件命名规则:basename_language_country.properties。

必须遵循以上的命名规则,Java 才会识别。其中,basename 是必须的,语言和国家是可选的。这里存在一个优先级概念,如果同时提供了 messages.properties 和 messages_zh_CN.propertes 两个配置文件,如果提供的 locale 符合 en_CN,那么优先查找 messages_en_CN.propertes 配置文件,如果没查找到,再查找 messages.properties 配置文件。最后,提示下,所有的配置文件必须放在 classpath 中,一般放在 resources 目录下

实验:演示 Java 国际化

第一步:创建子模块 Spring6-i18n,引入 Spring 依赖

image-20221207122500801

第二步:在 resource 目录下创建两个配置文件:messages_zh_CN.propertes 和 messages_en_GB.propertes

image-20221207124839565

第三步:测试

package cn.youngkbt.Spring6.javai18n;

import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.ResourceBundle;

public class Demo1 {

    public static void main(String[] args) {
        System.out.println(ResourceBundle.getBundle("messages",
                new Locale("en","GB")).getString("test"));

        System.out.println(ResourceBundle.getBundle("messages",
                new Locale("zh","CN")).getString("test"));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Spring6 国际化

# MessageSource 接口

Spring 中国际化是通过 MessageSource 这个接口来支持的。

常见实现类

ResourceBundleMessageSource

这个是基于 Java 的 ResourceBundle 基础类实现,允许仅通过资源名加载国际化资源。

ReloadableResourceBundleMessageSource

这个功能和第一个类的功能类似,多了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。

StaticMessageSource

它允许通过编程的方式提供国际化信息,一会我们可以通过这个来实现db中存储国际化信息的功能。

# 使用 Spring6 国际化

第一步:创建资源文件

国际化文件命名格式:基本名称_ 语言_ 国家.properties

{0},{1} 这样内容,就是动态参数

image-20221207140024056

创建 youngkbt_en_US.properties

www.youngkbt.com=welcome {0},时间:{1}
1

创建 youngkbt_zh_CN.properties

www.youngkbt.com=欢迎 {0},时间:{1}
1

第二步:创建 Spring 配置文件,配置 MessageSource

<?xml version="1.0" encoding="UTF-8"?>
<Beans xmlns="http://www.Springframework.org/schema/Beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.Springframework.org/schema/Beans http://www.Springframework.org/schema/Beans/Spring-Beans.xsd">

    <Bean id="messageSource"
          class="org.Springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>youngkbt</value>
            </list>
        </property>
        <property name="defaultEncoding">
            <value>utf-8</value>
        </property>
    </Bean>
</Beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

第三步:创建测试类

package cn.youngkbt.Spring6.javai18n;

import org.Springframework.context.ApplicationContext;
import org.Springframework.context.annotation.AnnotationConfigApplicationContext;
import org.Springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
import java.util.Locale;

public class Demo2 {

    public static void main(String[] args) {
        
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        
        // 传递动态参数,使用数组形式对应 {0} {1} 顺序
        Object[] objs = new Object[]{"youngkbt",new Date().toString()};

        // www.youngkbt.com 为资源文件的 key 值
        // objs 为资源文件 value 值所需要的参数,Local.CHINA 为国际化为语言
        String str=context.getMessage("www.youngkbt.com", objs, Locale.CHINA);
        System.out.println(str);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
编辑此页 (opens new window)
#Spring6
更新时间: 2025/04/06, 01:04:59
Spring6 - Resource
Spring6 - 数据校验

← Spring6 - Resource Spring6 - 数据校验→

最近更新
01
技术随笔 - Element Plus 修改包名 原创
11-02
02
Reactor - 扩展性
11-02
03
Reactor - 最佳实践
11-02
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Somnus Haoyuan | MIT License
京公网安备 11010802034042号 京ICP备2025120692号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式