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
相关产品推荐
相关产品推荐

