🎓博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖DeepSeek-行业融合之万象视界(附实战案例详解100+)
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
在这里插入图片描述

SpringBoot国际化方案:从资源文件到数据库动态加载

一、引言

在全球化的今天,软件应用需要支持多种语言以满足不同地区用户的需求。Spring Boot 作为一款流行的 Java 开发框架,提供了强大的国际化支持。本文将详细介绍 Spring Boot 国际化的实现方案,从传统的资源文件方式,逐步过渡到数据库动态加载的高级方案,帮助技术人员深入理解和掌握 Spring Boot 国际化的实现。

二、Spring Boot 国际化基础:资源文件方式

2.1 配置国际化资源文件

在 Spring Boot 项目中,我们可以在 src/main/resources 目录下创建 i18n 文件夹,用于存放国际化资源文件。例如,创建 messages.properties(默认语言)、messages_en_US.properties(美式英语)、messages_zh_CN.properties(中文简体)等文件。

messages.properties

welcome.message=Welcome to our application!

messages_zh_CN.properties

welcome.message=欢迎使用我们的应用程序!

2.2 配置 Spring Boot 国际化

application.properties 中配置国际化资源文件的基础名称:

spring.messages.basename=i18n/messages

2.3 创建国际化配置类

创建一个配置类,用于配置 MessageSourceLocaleResolver

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

2.4 在控制器中使用国际化消息

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@RestController
@RequestMapping("/api")
public class HelloController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/hello")
    public String hello(Locale locale) {
        String message = messageSource.getMessage("welcome.message", null, locale);
        return message;
    }
}

通过以上步骤,我们就可以实现基于资源文件的 Spring Boot 国际化。用户可以通过在请求参数中添加 lang 参数来切换语言,例如 /api/hello?lang=zh_CN

三、数据库动态加载国际化消息

3.1 数据库设计

创建一个名为 messages 的表,用于存储国际化消息:

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(255) NOT NULL,
    locale VARCHAR(10) NOT NULL,
    message TEXT NOT NULL
);

3.2 配置数据源

application.properties 中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/internationalization_db
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.3 创建实体类和仓库接口

创建 Message 实体类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private String locale;
    private String message;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getLocale() {
        return locale;
    }

    public void setLocale(String locale) {
        this.locale = locale;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

创建 MessageRepository 仓库接口:

import org.springframework.data.jpa.repository.JpaRepository;

public interface MessageRepository extends JpaRepository<Message, Long> {
    Message findByCodeAndLocale(String code, String locale);
}

3.4 自定义 MessageSource

创建一个自定义的 MessageSource 实现类,用于从数据库中加载国际化消息:

import org.springframework.context.support.AbstractMessageSource;
import org.springframework.stereotype.Component;

import java.text.MessageFormat;
import java.util.Locale;

@Component
public class DatabaseMessageSource extends AbstractMessageSource {

    @Autowired
    private MessageRepository messageRepository;

    @Override
    protected MessageFormat resolveCode(String code, Locale locale) {
        Message message = messageRepository.findByCodeAndLocale(code, locale.toString());
        if (message != null) {
            return new MessageFormat(message.getMessage(), locale);
        }
        return null;
    }
}

3.5 配置自定义 MessageSource

WebConfig 类中,将 messageSource 方法的返回值改为自定义的 DatabaseMessageSource

@Bean
public MessageSource messageSource() {
    return new DatabaseMessageSource();
}

通过以上步骤,我们就可以实现从数据库动态加载国际化消息。当需要更新国际化消息时,只需要修改数据库中的记录即可,无需重新部署应用。

四、总结

本文详细介绍了 Spring Boot 国际化的两种实现方案:资源文件方式和数据库动态加载方式。资源文件方式适用于国际化消息相对稳定的场景,而数据库动态加载方式则更适合需要频繁更新国际化消息的场景。技术人员可以根据项目的实际需求选择合适的方案。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐