Spring & Thymeleaf:改变语言环境并停留在当前页面

Posted

技术标签:

【中文标题】Spring & Thymeleaf:改变语言环境并停留在当前页面【英文标题】:Spring & Thymeleaf: changing locale and stay on the current page 【发布时间】:2016-12-12 17:17:33 【问题描述】:

我有一个传统的 Spring4/Thymeleaf i18n 应用程序 我用经典轻松切换语言环境

org.springframework.web.servlet.i18n.LocaleChangeInterceptor

org.springframework.web.servlet.i18n.CookieLocaleResolver

切换时我总是发送到服务器 /home?lang=fr。它工作正常。但我需要更复杂的行为。 我需要做的是在切换语言环境的同时保留当前页面

我用这个 thymeleaf sn-p 找到了一个半有效的解决方案:

th:with="currentUrl=($#httpServletRequest.pathInfo + '?' + #strings.defaultString(#httpServletRequest.queryString, ''))

问题是我需要自己实现很多极端情况:

当已经有任何查询参数时 如果有 lang=en 参数, 等。

有人知道如何使用 native Spring 或 Thymeleaf 工具来管理这个案例吗?或者我需要为 Thymeleaf 编写自己的处理器?

【问题讨论】:

您有用于测试此功能的示例应用程序吗?能够针对已经设置的项目尝试并找到解决方案会很高兴。我猜你的语言选择器在每一页上都显示为页眉或页脚。我希望设置一些拦截器,为模型添加一个值,其中包含当前页面的 url。然后模板只负责为页面输出那些语言特定的 url。 这也可能是答案:***.com/questions/23466130/… 【参考方案1】:

我在我的项目中使用它并且效果很好。当语言环境更改时,我不会专门重定向到任何 URL。

@Bean
public LocaleResolver localeResolver()

    Locale defaultLocale = new Locale( env.getProperty( Constants.DEFAULT_LOCALE ) );
    CookieLocaleResolver clr = new CookieLocaleResolver();
    clr.setDefaultLocale( defaultLocale );
    return clr;


@Bean
public LocaleChangeInterceptor localeChangeInterceptor()

    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName( "lang" );
    return lci;

【讨论】:

更改区域设置后,用户应停留在同一页面上。您的代码不合适。 您将如何更改语言环境?不是用了'lang'查询参数吗? 我使用的是经典方法,就像你一样,但我的问题是如何使用 lang 参数动态生成当前页面链接。【参考方案2】:

最简单的解决方案是连接“requestURI”和“queryString”。 这种方法的缺点是,如果您在同一个链接上多次单击,则只会一遍又一遍地添加参数。

一种解决方法是在添加参数之前编写一个“清理”url的函数

对于代码示例,看看这个问题:Thymeleaf: add parameter to current url

【讨论】:

谢谢你的作品就像一个魅力。只有一个精度 - 在引用的 ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam(param).build().toUriString(); 中忘记了 .build(). 函数调用; @Yev,没有缺少 build() 方法调用,因为根据文档:toUriString()is a shortcut method which combines calls to build(), then UriComponents.encode() and finally UriComponents.toUriString().

以上是关于Spring & Thymeleaf:改变语言环境并停留在当前页面的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 和 Spring MVC 电流控制器和动作

Spring Boot 和 Thymeleaf:链接列表

使用 Thymeleaf 和 Spring Boot 转换器列出 JSON 字符串

Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles

在 Spring Boot 2.1 中热重载 Thymeleaf 模板和资源包

从 DB 生成 Thymeleaf 和 Spring 图像 - 会遇到奇怪的行为