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 电流控制器和动作
使用 Thymeleaf 和 Spring Boot 转换器列出 JSON 字符串
Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles