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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:15:33