Grails i18n:设置Accept-Language标题

时间:2014-11-06 18:01:22

标签: grails internationalization http-accept-language

根据Grails'internationalization doc,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标头是否安全?如果是这样,我是否还可以假设如果未发送Accept-Language,并且未将lang指定为查询参数,那么Grails默认使用en_US

1 个答案:

答案 0 :(得分:2)

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

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

此bean可以首先根据request.getRequestURI()检查您自己的自定义查找,并确定区域设置应该解析的内容。你甚至可以让它后来回到默认行为。

再次实现这一点的关键是了解现有的localeResolver并了解如何替换它。你将不得不深入研究Grails(和Spring)的内部结构来发现它。

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

<强>更新

一些额外的信息可以帮助您朝着正确的方向前进。

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

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

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

希望这有帮助。