Springboot3国际化

国际化实现步骤

Spring Boot 3 提供了强大的国际化支持,使得应用程序可以根据用户的语言和区域偏好适配不同的语言和地区需求。

  1. 添加国际化资源文件: 国际化资源文件通常放在 src/main/resources 目录下,并按照不同的语言和地区命名,例如:

    • messages.properties:默认语言(如英文)
    • messages_zh_CN.properties:中文简体
    • messages_fr.properties:法语
  2. 配置 MessageSource Bean: 可以通过在 application.propertiesapplication.yml 中进行简单配置来加载国际化资源文件:

    复制代码
    spring:
      messages:
        basename: messages
        encoding: UTF-8

    或者在配置类中定义 MessageSource Bean:

    java 复制代码
    @Configuration
    public class MessageConfig {
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    }
  3. 使用国际化资源: 在代码中可以通过 MessageSource 来获取国际化消息。例如,在控制器中根据请求参数确定语言环境并获取对应的消息。

  4. 模板中的国际化: 如果使用 Thymeleaf 作为模板引擎,可以在模板中直接使用国际化消息。需要确保在 application.properties 中启用了国际化支持,并且在模板中使用 #{} 表达式引用消息键。

  5. 自动检测客户端语言: Spring Boot 提供了 LocaleResolver 来自动检测和设置客户端的语言环境。可以使用 AcceptHeaderLocaleResolver 或自定义的 LocaleResolver

  6. 缓存本地语言设置: 若要将本地语言设置缓存,可以在自己的配置类中增加 LocaleChangeInterceptor 拦截器和实现 LocaleResolver 方法。比如使用 CookieLocaleResolver 将语言设置存储在 Cookie 中。

  7. 与 Spring Security 结合: 在使用 Spring Security 时,可以通过在资源文件中添加相应的消息并在 Spring Security 配置中使用这些消息来实现登录页面和错误信息的多语言支持。

示例

配置国际化yaml

java 复制代码
spring:
  messages:
    encoding: UTF-8
    basename: i18n/messages
  profiles:
    active: zh_CN
#-Dspring.profiles.active=en_US

英文

java 复制代码
server:
  port: 8000
spring:
  jackson:
    date-format: MM-dd-yyyy

中文

java 复制代码
spring:
  jackson:
    date-format: yyyy-MM-dd
server:
  port: 8000

国际化配置

java 复制代码
package com.cokerlk.language;

import com.cokerlk.language.service.EnUSProductService;
import com.cokerlk.language.service.IProductService;
import com.cokerlk.language.service.ZhCNProductService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Data
public class I18NConfiguration {
    @Value("${spring.profiles.active}")
    private String locale;

    @Profile("zh_CN")
    @Bean
    public IProductService zhCNBussService(){
        return new ZhCNProductService();
    }

    @Profile("en_US")
    @Bean
    public IProductService enUSBussService(){
        return new EnUSProductService();
    }
}

产品接口

java 复制代码
package com.cokerlk.language.service;

import java.util.Map;


public interface IProductService {
     Map<String,String> getProduct();
}

中文产品

java 复制代码
package com.cokerlk.language.service;

import com.cokerlk.language.I18NConfiguration;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;

import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

@Slf4j
public class ZhCNProductService implements IProductService {
    @Resource
    I18NConfiguration i18NConfiguration;
    @Resource
    MessageSource messageSource;

    @Override
    public Map getProduct() {
        log.info("中文");
        Map result = new HashMap();
        result.put("create-date", new Date());
        result.put("text", messageSource.getMessage("product_name", null, Locale.of(i18NConfiguration.getLocale())));
        return result;
    }
}

英文产品

java 复制代码
package com.cokerlk.language.service;

import com.cokerlk.language.I18NConfiguration;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;

import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

@Slf4j
public class EnUSProductService implements IProductService {
    @Resource
    I18NConfiguration i18NConfiguration;
    @Resource
    MessageSource messageSource;

    @Override
    public Map<String,String> getProduct() {
        log.info("英文");
        Map result = new HashMap();
        result.put("create-date", new Date());
        result.put("text", messageSource.getMessage("product_name", null, Locale.of(i18NConfiguration.getLocale())));
        return result;
    }
}

message配置

java 复制代码
#messages.properties
product_name=huawei mate 70
#messages_en_US.properties
product_name=Hua wei mate 70
#messages_zh_CN.properties
product_name=华为mate70

测试结果

相关推荐
NE_STOP4 分钟前
SpringBoot--简单入门
java·spring
hqxstudying31 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队2 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端