Java直通车系列19【Spring MVC】(国际化支持)

目录

国际化支持机制概述

1. 资源束(Resource Bundle)

2. MessageSource

3. LocaleResolver

4. LocaleChangeInterceptor

场景示例

1. 创建资源束文件

2. 配置 MessageSource

3. 配置 LocaleResolver

4. 配置 LocaleChangeInterceptor

5. 创建控制器和视图

解释


国际化支持机制概述

Spring MVC 的国际化支持主要基于以下几个核心组件和概念:

1. 资源束(Resource Bundle)

资源束是一组包含本地化信息的属性文件,文件名遵循特定的命名规则,格式为 basename_locale.properties。其中,basename 是资源束的基本名称,locale 是语言和地区代码,例如 messages_en_US.properties 表示美国英语的资源文件,messages_zh_CN.properties 表示中国中文的资源文件。如果没有指定 locale,则使用默认的资源文件,如 messages.properties

2. MessageSource

MessageSource 是 Spring 框架中用于管理和解析资源束的接口。它可以根据指定的 locale 从相应的资源束中获取本地化消息。Spring 提供了多个 MessageSource 的实现类,常用的是 ResourceBundleMessageSource

3. LocaleResolver

LocaleResolver 用于确定当前请求的 locale。它可以根据请求的参数、会话信息或客户端的浏览器设置等方式来解析 locale。Spring 提供了多种 LocaleResolver 的实现类,如 AcceptHeaderLocaleResolverCookieLocaleResolverSessionLocaleResolver 等。

4. LocaleChangeInterceptor

LocaleChangeInterceptor 是一个拦截器,用于拦截请求并根据请求参数动态改变当前的 locale。通过在请求 URL 中添加特定的参数,用户可以在不重新启动应用程序的情况下切换语言。

场景示例

1. 创建资源束文件

在 src/main/resources 目录下创建以下资源束文件:

  • messages.properties(默认资源文件)
welcome.message=Welcome to our application!
  • messages_en_US.properties(美国英语资源文件)
welcome.message=Welcome to our application!
  • messages_zh_CN.properties(中国中文资源文件)
welcome.message=欢迎使用我们的应用程序!
2. 配置 MessageSource

在 Spring 配置文件(如 dispatcher-servlet.xml 或 Java 配置类)中配置 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");
        return messageSource;
    }
}
3. 配置 LocaleResolver

可以选择不同的 LocaleResolver 实现,这里以 SessionLocaleResolver 为例:


    

Java 配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

@Configuration
public class AppConfig {
    // ... 其他配置

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.US);
        return sessionLocaleResolver;
    }
}
4. 配置 LocaleChangeInterceptor

    
        
    

Java 配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 AppConfig implements WebMvcConfigurer {
    // ... 其他配置

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

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

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}
5. 创建控制器和视图
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
    @GetMapping("/")
    public String home(Model model) {
        return "home";
    }
}

在 JSP 视图 home.jsp 中使用 spring:message 标签获取本地化消息:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>



    国际化示例


    

English 中文

解释

  • 资源束文件:不同的资源束文件包含了相同键的不同语言的消息内容,Spring MVC 会根据当前的 locale 选择合适的资源束文件来获取消息。
  • MessageSource:负责加载和解析资源束文件,通过 messageSource.getMessage() 方法可以根据键和 locale 获取相应的消息。
  • LocaleResolver:确定当前请求的 localeSessionLocaleResolver 将 locale 信息存储在会话中,方便在多个请求之间保持语言设置。
  • LocaleChangeInterceptor:拦截请求,根据请求参数 lang 的值动态改变当前的 locale,用户可以通过点击链接切换语言。
  • spring:message 标签:在 JSP 视图中使用该标签可以方便地获取本地化消息,根据当前的 locale 显示相应的文本。

通过以上步骤,就可以在 Spring MVC 应用程序中实现基本的国际化支持,为不同语言和地区的用户提供本地化的内容。

你可能感兴趣的:(Java直通车,java,spring,mvc,开发语言)