0

根据 Grails 的国际化文档,i18n 由以下任一方式完成:

  • Accept-Language在请求中设置标头;或者
  • 处理lang查询字符串参数

我选择前者,因为它更符合 HTTP,坦率地说,我只是不喜欢将它添加为查询参数。

但是我首先要如何设置Accept-Language?!?

我希望我的应用程序的语言环境由请求的 TLD 确定。因此,请求http://myapp.example.com将返回en_US我的应用程序的版本,因为*.com传统上与英语/美国相关联。如果http://myapp.example.fr被请求,那么 Grails 应该返回fr_FR我的应用程序的版本。等等。

所以我真正的问题是:

如何将请求的 URL/TLD 映射到 Grails 可以在服务器上设置的变量,然后注入 GSP,以便客户端请求始终具有Accept-Language给定 URL/TLD 的匹配标头?


更新

我想在这里确认浏览器/Grails 的行为:假设当用户配置他们的浏览器时,浏览器相应地调整Accept-Language标题是否安全?如果是这样,我是否还可以假设Grails默认使用的ifAccept-Language未发送lang且未指定为查询参数?en_US

4

1 回答 1

2

你让事情变得比你需要的更困难。尝试在服务器上设置区域设置、注入 GSP 并处理强制客户端请求修改其请求标头(考虑到标头是供用户浏览器而不是您的应用程序控制的,这是一个可怕的想法)已经结束复杂。

更简单且正确的方法是localeResolver在 Grails 应用程序内的新 bean 中实现您自己的自定义逻辑。

这个 bean 可以首先检查您自己的自定义查找,request.getRequestURI()然后决定语言环境应该解析到什么。之后你甚至可以让它回到默认行为。

同样,实现这一点的关键是了解现有localeResolver并了解如何替换它。您必须深入研究 Grails(和 Spring)的内部结构才能发现这一点。

要替换默认实现,您只需在resources.groovy. 重新实施完全取决于您。

更新

一些额外的信息可以让你朝着正确的方向前进。

默认情况下,您的resources.groovy文件不会包含项目的此 bean 定义。您可以在那里创建一个新条目来替换框架创建的条目。

要了解您要实现哪种 bean,您应该查看LocaleResolver接口。根据您处理此问题的方式,您将实现此接口或扩展 Grails 实现。

Github上 i8n 插件的 Grails 实现以及它如何设置语言环境解析器。您会注意到默认实现是Spring 提供的SessionLocaleResolver 。

希望这可以帮助。

于 2014-11-06T19:21:48.360 回答