Spring实现国际化与本地化的详细步骤

 更新时间:2025年06月18日 10:52:41   作者:潜意识Java  
在全球化背景下,应用支持多语言和本地化显示是满足不同地区用户需求的关键,Spring 的国际化与本地化功能,能帮助开发者轻松实现应用的语言切换与区域适配,下面从核心概念、实现步骤、应用场景等方面详细解析其实现方式,需要的朋友可以参考下

一、核心概念:国际化(i18n)与本地化(l10n)

  • 国际化(Internationalization):简称 i18n,指设计应用时使其能够适应不同语言和区域的过程。开发者需将应用中的固定文本(如提示信息、按钮标签)提取为可替换的资源,避免硬编码。
  • 本地化(Localization):简称 l10n,是根据用户的语言、地区等偏好,将国际化后的应用内容显示为对应语言和格式(如日期、货币)的过程。例如,将英文界面切换为中文,或者根据地区显示不同格式的日期(美式 “MM/dd/yyyy” vs 中式 “yyyy-MM-dd”)。

二、Spring 国际化实现步骤

1. 创建资源文件

src/main/resources目录下创建以messages为基础名,后跟语言代码和区域代码的属性文件。常见的语言代码如zh(中文)、en(英文),区域代码如CN(中国)、US(美国)。

  • messages.properties:默认资源文件,用于未匹配到特定语言时的兜底显示。
  • messages_zh_CN.properties:简体中文资源文件。
  • messages_en_US.properties:美式英语资源文件。

示例内容:

messages.properties

greeting=Hello!

messages_zh_CN.properties

greeting=你好!

messages_en_US.properties

greeting=Hello!

2. 配置 MessageSource

在 Spring 配置类(如@Configuration类)或application.properties中配置MessageSource,用于加载和管理资源文件。

Java 配置方式

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
 
@Configuration
public class AppConfig {
    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages"); // 指定资源文件基础名
        messageSource.setDefaultEncoding("UTF-8"); // 设置编码
        return messageSource;
    }
}

application.properties 配置方式

spring.messages.basename=messages
spring.messages.encoding=UTF-8

3. 在代码中使用 MessageSource

通过注入MessageSource,调用getMessage方法获取对应语言的文本。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
 
@Component
public class MessageService {
    private final MessageSource messageSource;
 
    @Autowired
    public MessageService(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
 
    public String getGreeting() {
        return messageSource.getMessage("greeting", null, LocaleContextHolder.getLocale());
    }
}

上述代码中,LocaleContextHolder.getLocale()获取当前用户的区域设置,messageSource.getMessage根据区域设置查找对应的资源文件,返回相应的文本。

三、本地化实现:处理日期、数字和货币

Spring 通过DateFormatNumberFormat等类实现不同区域的格式转换,结合@Bean配置和@Autowired注入使用。

1. 配置日期格式化

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
 
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatterForFieldType(Date.class, new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()));
    }
}

上述配置将Date类型数据格式化为 “yyyy-MM-dd”,并根据用户的区域设置动态调整。

2. 货币格式化

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.NumberFormat;
import java.util.Currency;
import java.util.Locale;
 
@Configuration
public class AppConfig {
    @Bean
    public NumberFormat currencyFormat() {
        Locale locale = Locale.getDefault();
        Currency currency = Currency.getInstance(locale);
        return NumberFormat.getCurrencyInstance(locale).setCurrency(currency);
    }
}

通过上述配置,在显示货币金额时,会根据用户区域自动使用对应货币符号和格式(如¥、$)。

四、在 Web 应用中实现语言切换

1. 通过请求参数切换语言

在 Controller 中接收lang参数,设置Locale

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils;
 
import javax.servlet.http.HttpServletRequest;
import java.util.Locale;
 
@RestController
public class LanguageController {
    @GetMapping("/setLang")
    public String setLanguage(@RequestParam String lang, HttpServletRequest request) {
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
        if (localeResolver != null) {
            localeResolver.setLocale(request, new Locale(lang));
        }
        return "Language set to: " + lang;
    }
}

用户访问/setLang?lang=zh即可将语言切换为中文,访问/setLang?lang=en切换为英文。

2. 通过 Cookie 或 Session 切换语言

实现自定义的LocaleResolver,将用户选择的语言存储在 Cookie 或 Session 中,下次访问时自动应用。

import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
 
public class CustomLocaleResolver extends CookieLocaleResolver {
    private static final String LANG_COOKIE_NAME = "myapp_lang";
 
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        Locale locale = super.resolveLocale(request);
        if (locale == null) {
            // 从Cookie获取语言,若不存在则使用默认语言
            String lang = request.getCookies() != null ? findCookieValue(request.getCookies(), LANG_COOKIE_NAME) : null;
            if (lang != null) {
                locale = new Locale(lang);
            }
        }
        return locale;
    }
 
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        // 将语言存储到Cookie
        super.setLocale(request, response, locale);
        setCookie(response, LANG_COOKIE_NAME, locale.getLanguage());
    }
 
    private String findCookieValue(javax.servlet.http.Cookie[] cookies, String cookieName) {
        for (javax.servlet.http.Cookie cookie : cookies) {
            if (cookie.getName().equals(cookieName)) {
                return cookie.getValue();
            }
        }
        return null;
    }
}

在 Spring 配置类中注册自定义LocaleResolver

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
 
@Configuration
public class AppConfig {
    @Bean
    public LocaleResolver localeResolver() {
        return new CustomLocaleResolver();
    }
}

五、总结

Spring 的国际化与本地化功能通过资源文件管理、MessageSource配置和Locale设置,为开发者提供了一套完整的解决方案。通过合理配置和代码实现,能够轻松满足不同地区用户的语言和格式需求,提升应用的用户体验和全球化竞争力。在实际开发中,可根据项目需求灵活选择语言切换方式,并结合前端技术(如 Vue、React)实现更流畅的多语言交互效果。

以上就是Spring实现国际化与本地化的详细步骤的详细内容,更多关于Spring国际化与本地化的资料请关注脚本之家其它相关文章!

相关文章

  • java生成随机数(字符串)示例分享

    java生成随机数(字符串)示例分享

    这篇文章主要介绍了java生成随机数(字符串)示例分享,需要的朋友可以参考下
    2014-03-03
  • springboot无法从静态上下文中引用非静态变量的解决方法

    springboot无法从静态上下文中引用非静态变量的解决方法

    这篇文章主要介绍了springboot无法从静态上下文中引用非静态变量的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 浅谈Spring-cloud 之 sleuth 服务链路跟踪

    浅谈Spring-cloud 之 sleuth 服务链路跟踪

    本篇文章主要介绍了浅谈Spring-cloud 之 sleuth 服务链路跟踪,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java实现BASE64编码和解码的方法

    Java实现BASE64编码和解码的方法

    本篇文章主要介绍了Java实现BASE64编码和解码的方法,BASE64编码通常用于转换二进制数据为文本数据,有需要的可以了解一下。
    2016-11-11
  • SpringBoot实战教程之新手入门篇

    SpringBoot实战教程之新手入门篇

    Spring Boot使我们更容易去创建基于Spring的独立和产品级的可以"即时运行"的应用和服务,下面这篇文章主要给大家介绍了关于SpringBoot实战教程之入门篇的相关资料,需要的朋友可以参考下
    2022-03-03
  • Spring Boot使用线程池处理上万条数据插入功能

    Spring Boot使用线程池处理上万条数据插入功能

    这篇文章主要介绍了Spring Boot使用线程池处理上万条数据插入功能,使用步骤是先创建一个线程池的配置,让Spring Boot加载,用来定义如何创建一个ThreadPoolTaskExecutor,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-08-08
  • Java语言实现最大堆代码示例

    Java语言实现最大堆代码示例

    这篇文章主要介绍了Java语言实现最大堆代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • 如何将java或javaweb项目打包为jar包或war包

    如何将java或javaweb项目打包为jar包或war包

    本文主要介绍了如何将java或javaweb项目打包为jar包或war包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java高效实现复制PPT(PowerPoint)幻灯片

    Java高效实现复制PPT(PowerPoint)幻灯片

    在日常的开发工作中,我们经常会遇到需要对Office文档进行编程处理的需求,本文将为您揭示如何利用强大的 Spire.Presentation for Java进行PPT复制,有需要的小伙伴可以了解下
    2025-09-09
  • Java的IO流实现文件和文件夹的复制

    Java的IO流实现文件和文件夹的复制

    这篇文章主要为大家详细介绍了Java的IO流实现文件和文件夹的复制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论