我有现有的网络应用程序(Spring MVC)。我需要为所有内容制作i18n。
管理语言的要求是直接在URL中使用语言代码。因此,对于现有网址:
http://example.com/product1
我需要创建N 虚拟网址,例如
http://example.com/EN/product1
http://example.com/FR/product1
我正在研究实现这一目标的不同方案。我找到的一个肮脏的解决方案是使用拦截器,它将检查URL中的语言代码,删除语言代码,制作有效的URL并设置重定向。但它太丑了......
实施此方法的最佳方法是什么?
答案 0 :(得分:1)
有多种方法可以做到这一点,它们在某种程度上取决于您的应用规模。
我个人可以很快想到
为Spring mvc-dispatcher分配多个URL映射:
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/EN/*</url-pattern>
<url-pattern>/FR/*</url-pattern>
<url-pattern>/GR/*</url-pattern>
</servlet-mapping>
如果你有备用RAM,你可以简单地多次部署应用程序 - 对于你想要支持的每种语言环境一次。这将允许在多个服务器上复制繁重的语言,否则会使用低容量的语言。
答案 1 :(得分:1)
我相信实现这一切的所有可行方法都会很难看。这只是因为要求没有任何意义(你正在实施语言切换器反模式,不是吗?)。
对于我的咆哮,最简单的方法是使用&#34; classic&#34; Spring MessageSources并捕获控制器中的语言环境。由于我不知道你是如何实现你的控制器,你正在使用什么视图技术等等,让我们说:
@RequestMapping("/")
public class SomeController {
@RequestMapping(value="{lang}/product1" method=RequestMethod.GET)
public getProduct(@PathVariable String lang) {
Locale locale = Locale.forLanguageTag(lang);
LocaleContextHolder.setLocale(locale);
return "product1";
}
}
这将设置区域设置,并且视图将使用它们来解析消息(前提是它已国际化)。
这个例子的唯一问题是,我还没有对它进行测试,我不太确定它是否会起作用:)你可能需要重新组织参数,或者制作参数更糟糕的是使用一个控制器来处理所有事情(这将是一个可怕的解决方案)。