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

3

我有一个传统的Spring4/Thymeleaf国际化应用程序。我可以使用经典方式轻松切换语言环境。

org.springframework.web.servlet.i18n.LocaleChangeInterceptor

并且

org.springframework.web.servlet.i18n.CookieLocaleResolver

当我切换时,我总是将/home?lang=fr发送到服务器。 这很有效。 但我需要更复杂的行为。 我需要做的是在切换语言环境的同时保留当前页面

我通过以下thymeleaf片段找到了一个半工作的解决方案:

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

问题在于我需要处理许多边缘情况:

  • 当已经有查询参数时
  • 如果有一个lang=en参数,
  • 等等。

有人知道如何使用本地的 Spring 或 Thymeleaf 工具来处理这个问题吗?还是我需要编写自己的 Thymeleaf 处理器?


你有一个正在测试这个功能的示例应用程序吗?能够针对已经设置好的项目进行工作并尝试找到解决方案会很好。我猜你的语言选择器会显示在每个页面的页眉或页脚上。我会尝试设置一些拦截器,将包含当前页面url的值添加到模型中。然后模板只需要负责输出该页面的特定语言的url即可。 - Shawn Clark
这也可能是答案: https://dev59.com/lmAg5IYBdhLWcg3wjbdt#41343229 - David
2个回答

1
最简单的解决方案是将“requestURI”和“queryString”连接起来。这种方法的缺点是,如果您在同一个链接上多次点击,则参数会不断添加。
一种解决方法是编写一个函数,在添加参数之前“清理”URL。
有关代码示例,请参见此问题:Thymeleaf: add parameter to current url

谢谢,运行得很好。只有一个精度问题 - 在引用的ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam(param).build().toUriString();中忘记了.build()函数调用。 - Yev
@Yev,build()方法没有被遗漏调用,因为根据文档:toUriString() 是一个快捷方法,它将调用build()、UriComponents.encode()和UriComponents.toUriString()进行组合。 - Ortomala Lokni

0

我在我的项目中使用它,它运行良好。当语言环境改变时,我不会特别重定向到任何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;
}

当更改区域设置时,用户应该停留在同一页上。您的代码不合适。 - Yev
你打算如何更改语言环境?难道不是使用“lang”查询参数吗? - nmy
我正在使用经典方法,就像你一样,但我的问题是如何动态生成带有语言参数的当前页面链接。 - Yev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接