根据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
?
答案 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。
希望这有帮助。