具有i18n路径部分的Spring MVC RequestMapping

时间:2017-07-27 17:13:05

标签: spring spring-mvc spring-boot

映射i18n翻译的url路径有哪些方法?

例如,假设我们谈论了以下网址(对于locale en):

www.foo.tld/car/manufacturer

在德语(de)中,这个网址将是

www.foo.tld/auto/hersteller

我对Controller RequestMapping的了解我可以使用severel值来映射这些url的方法,例如

@GetMapping(value={"/car/manufacturer/", "/auto/hersteller/"})

更多seo优化可能与路径中的当前区域设置相似,如

@GetMapping(value={"/en/car/manufacturer/", "/de/auto/hersteller/"})

...但我不想开始讨论什么是最好的uri seo明智。

如果仅使用少数语言环境/语言,这并不是很糟糕,但我想以某种方式使它变得动态。 目前我使用messages_xx.properties映射url路径部分以在我的应用程序中生成URL,如:

messages.properties

uri.car=car
uri.manufacturer=manufacturer

messages_de.properties

uri.car=auto
uri.manufacturer=hersteller

我已经使用它们来构建链接,以查看工作正常的用户区域设置。

我现在正在搜索的是一种优雅的,更少错误的修剪方式来映射我的控制器中的这些网址。如果我会更改密钥uri.car的值,并且在我的控制器中有一个静态RequestMapping,就像上面的例子一样,我也需要在那里更改它(如果我不忘记!)。 此外,如果我想添加对另一种语言的支持,我需要在所有控制器中搜索并检查是否需要添加另一个值映射。

有没有更聪明的方法如何在Spring控制器中映射i18n路径部分,理想情况下是否遵循请求语言环境并在messages_xx.properties的帮助下解析路径字符串? 或者是根据请求的语言环境提取路径部分的过滤器,并在内部仅使用一种语言来映射URL?

1 个答案:

答案 0 :(得分:0)

假设你有一个EN message.properties 和一个带有以下属性的DE message.properties

EN中的

url.car=/car/manufacturer/

DE中的

url.car=/auto/hersteller/

在@Controller中,您可以轻松获取配置messageSource的属性,并使用它来获取属性:

注入已配置的MessageSource以允许Spring解析消息:

 @Autowired
 private MessageSource messageSource;

然后,您可以从 message.properties 文件中获取所有属性:

String url= messageSource.getMessage("url.car", put_here_your_locale);