基于Session属性配置Thymeleaf多语言切换
问题描述
- 会话初始化时,若
session.user_lang为null,默认使用英文(对应messages.properties);已注册用户可切换语言,语言需保存至session.user_lang属性及数据库。 - Thymeleaf需根据
session.user_lang的值加载对应语言翻译,但当前配置无法实现预期功能。
用户提供的代码如下:
LocaleInterceptor 实现
@Component public class LocaleInterceptor implements HandlerInterceptor { private LocaleResolver localeResolver; @Autowired public void setLocaleResolver(LocaleResolver localeResolver) { this.localeResolver = localeResolver; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); String language = (String) session.getAttribute("user_lang"); if (language != null) { Locale locale = new Locale(language); localeResolver.setLocale(request, response, locale); } return true; } }
WebConfig 配置类
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private LocaleInterceptor localeInterceptor; @Autowired public void setLocaleInterceptor(LocaleInterceptor localeInterceptor) { this.localeInterceptor = localeInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeInterceptor); } }
修复方案
1. 配置会话级LocaleResolver
默认AcceptHeaderLocaleResolver不会持久化Locale到会话,需替换为SessionLocaleResolver并设置默认英文Locale:
@Configuration public class LocaleConfig { @Bean public LocaleResolver localeResolver() { SessionLocaleResolver resolver = new SessionLocaleResolver(); resolver.setDefaultLocale(Locale.ENGLISH); return resolver; } }
2. 优化拦截器逻辑
补充语言切换请求处理,同时规范Locale创建方式:
@Component public class LocaleInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 处理语言切换请求(如?lang=zh-CN) String langParam = request.getParameter("lang"); if (langParam != null) { Locale locale = Locale.forLanguageTag(langParam); HttpSession session = request.getSession(); session.setAttribute("user_lang", langParam); // 同步更新数据库用户语言(需注入对应的用户服务实现) // userService.updateLanguage(currentUserId, langParam); LocaleContextHolder.setLocale(locale); } else { // 从会话读取已保存的语言 String language = (String) request.getSession().getAttribute("user_lang"); if (language != null) { Locale locale = Locale.forLanguageTag(language); LocaleContextHolder.setLocale(locale); } // 会话无语言时,自动使用LocaleResolver的默认英文 } return true; } }
3. 完善拦截器注册
确保拦截器覆盖所有请求路径:
@Configuration public class WebConfig implements WebMvcConfigurer { private final LocaleInterceptor localeInterceptor; public WebConfig(LocaleInterceptor localeInterceptor) { this.localeInterceptor = localeInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeInterceptor) .addPathPatterns("/**"); } }
4. 验证Thymeleaf与消息文件
- 消息文件需放在
src/main/resources下,命名规范:- 英文:
messages.properties - 中文:
messages_zh_CN.properties
- 英文:
- Thymeleaf中使用
#{key}调用翻译:
<h2 th:text="#{user.welcome}"></h2>
内容的提问来源于stack exchange,提问作者qarabala
相关产品推荐
相关产品推荐

