【问题标题】:Grails i18n: Setting Accept-Language headerGrails i18n:设置 Accept-Language 标头
【发布时间】:2014-11-06 18:01:21
【问题描述】:

根据 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,以便客户端请求始终具有与给定 URL 匹配的 Accept-Language 标头/TLD?


更新

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

【问题讨论】:

    标签: grails internationalization http-accept-language


    【解决方案1】:

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

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

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

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

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

    更新

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 感谢@Joshua Moore (+1) - 请查看我的更新及其下方的问题。你是对的:我可能想多了。它可能很简单:假设用户的浏览器将设置正确的Accept-Language 标头,如果没有,则默认为en_US。听起来对吗?
    • 它使用 JVM 的默认语言环境。通常是 en_US。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2014-07-13
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多