You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何根据客户端语言设置支持的会话Locale?

Spring Boot实现客户端语言偏好适配的国际化配置

要实现会话初始化时检测客户端语言偏好,仅使用支持列表中的语言,否则回退到英文的需求,你可以通过自定义SessionLocaleResolver来实现,具体步骤如下:

1. 定义支持的语言列表

首先明确网站支持的语言集合,注意语言代码要遵循标准(比如西班牙语的标准代码是es而非sp,建议修正):

private static final List<Locale> SUPPORTED_LOCALES = Arrays.asList(
        Locale.ENGLISH,
        new Locale("de"),   // 德语
        new Locale("fr"),   // 法语
        new Locale("es"),   // 西班牙语(修正原代码的sp为标准代码es)
        new Locale("it")    // 意大利语
);

2. 自定义LocaleResolver

继承SessionLocaleResolver并重写resolveLocale方法,在会话首次初始化时(即第一次请求)自动检测客户端语言并校验是否在支持列表中:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

@Configuration
public class LocaleConfiguration {

    private static final List<Locale> SUPPORTED_LOCALES = Arrays.asList(
            Locale.ENGLISH,
            new Locale("de"),
            new Locale("fr"),
            new Locale("es"),
            new Locale("it")
    );

    @Bean
    public SessionLocaleResolver localeResolver() {
        return new SessionLocaleResolver() {
            @Override
            public Locale resolveLocale(HttpServletRequest request) {
                // 获取客户端请求头Accept-Language中的语言偏好
                Locale clientPreferredLocale = request.getLocale();
                
                // 校验是否在支持列表中,匹配则返回该语言,否则使用默认英文
                return SUPPORTED_LOCALES.contains(clientPreferredLocale) 
                        ? clientPreferredLocale 
                        : Locale.ENGLISH;
            }
        };
    }
}

3. 扩展:支持语言代码模糊匹配

如果需要兼容客户端发送的带地区的Locale(比如en-US、de-DE),可以修改匹配逻辑,只校验语言代码而非完整Locale:

@Override
public Locale resolveLocale(HttpServletRequest request) {
    Locale clientPreferredLocale = request.getLocale();
    // 遍历支持列表,匹配语言代码(忽略地区差异)
    for (Locale supportedLocale : SUPPORTED_LOCALES) {
        if (supportedLocale.getLanguage().equals(clientPreferredLocale.getLanguage())) {
            return supportedLocale;
        }
    }
    // 无匹配时返回默认英文
    return Locale.ENGLISH;
}

功能说明

  • 会话初始化触发:SessionLocaleResolver会在会话首次创建时(即用户第一次访问网站)执行语言检测,之后的请求会直接使用会话中已保存的Locale,无需重复检测。
  • 客户端语言获取:通过request.getLocale()自动解析请求头Accept-Language中的语言偏好,无需手动处理头信息。
  • 默认 fallback:当客户端语言不在支持列表中时,自动回退到英文。

内容的提问来源于stack exchange,提问作者qarabala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:20:29