Grails如何更改当前语言环境

Posted

技术标签:

【中文标题】Grails如何更改当前语言环境【英文标题】:Grails how to change the current locale 【发布时间】:2010-12-06 20:49:42 【问题描述】:

如何更改当前语言环境?

我尝试输入controller/action?lang=de,但我的语言环境仍然是en_US

我尝试使用这段代码覆盖该值:

def key = "org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER"
def localeResolver = request.getAttribute(key)
localeResolver.setLocale(request, response, new Locale("de","DE"))

没有任何改变。

我尝试使用这段代码覆盖该值:

import org.springframework.web.servlet.support.RequestContextUtils as RCU;
RCU.getLocaleResolver(request).setLocale(request, response, new Locale("de","DE"))

然后……什么也没发生。我仍然将语言环境设置为en_US

有改变语言环境的想法吗?

【问题讨论】:

【参考方案1】:

根据 Grails 文档的 10. Internationalization 章节,Grails 支持 i18n 开箱即用,您确实应该能够使用 lang 参数更改语言环境:

默认情况下会检测到用户区域设置 来自传入的Accept-Language 标题。但是,您可以为用户提供 切换语言环境的能力 只需传递一个名为lang 的参数 到 Grails 作为请求参数:

/book/list?lang=de

Grails 会自动切换 用户语言环境并将其存储在 cookie 中 因此后续请求将具有 新标题。

但有时您可能需要预设默认语言,因为并非所有应用程序都是英文的。为此,您所要做的就是在您的resources.groovy spring 配置文件中设置您的localeResolver,如下所示:

beans = 
   localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) 
      defaultLocale = new Locale("de","DE")
      java.util.Locale.setDefault(defaultLocale)
   

现在,如果没有更多详细信息,我无法说明为什么在您的情况下使用 lang 参数不起作用。以防万一,你怎么知道语言环境仍然是 en_US?。

【讨论】:

感谢您的回复。我尝试了您的解决方案来更改 defaultLocale,但我仍然得到 en_US 语言环境。检索我当前语言环境的好问题,我使用“request.locale”。我还可以看到 grails 仍在读取默认捆绑消息,而不是“de”版本。感谢您提供任何线索! 只是想确定您的验证过程是正常的,它是 :) 但我必须说这真的很奇怪。你能说是否设置了Accept-Language 标头吗?您使用的是什么版本的 grails? 是的,这个词肯定很奇怪...我使用的是 Grails 1.1。我刚刚检查了 http 请求的标头,我可以看到:'Accept-Language: en-us,en;q=0.5' 这不是预期的行为。但是,我在 Grails 的 Jira 中找不到任何与您的问题相关的内容。如果这是一个错误,则不能错过。我不明白。 2.4.3 中对此进行了测试,这正在设置起始语言环境。我需要这个来将 NL 设置为默认语言。【参考方案2】:

据我了解,您检查区域设置“request.locale”的方式是错误的,它提供了浏览器的区域设置,而不是 grails 应用程序的区域设置。

您应该使用“LocaleContextHolder.locale”。

2.0.3 中,它通过简单地传递参数 lang=someLocale 来更改语言环境。

【讨论】:

感谢您的解释,这很有道理。【参考方案3】:

您是否尝试更改应用程序根 URL 中的区域设置(例如 http://localhost:8080/myapp/?lang=de)?

在 Grails 中,尝试更改应用程序根 url 中的语言环境的基本设置不起作用。 Grails 更改localChangeInterceptor 中的语言环境,在调用所有控制器之前调用它。当您访问应用程序根 url 时,不会调用任何控制器,如默认 UrlMappings 所示。

这就是为什么在应用程序根 url 中更改语言环境不起作用的原因。如果您尝试在某些控制器中更改 url,它会起作用。

当前语言环境存储在 http 会话中的键 org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME 下。你可以在那里查看。

正确的解决方案是将根 url 映射到 UrlMappings 中的某个控制器。

【讨论】:

感谢您的回答。但是,是的,我试图更改我的一个控制器上的语言环境,但它没有用。这真的很奇怪,因为文档描述的行为与您所说的相同,但我的语言环境没有改变……所以我使用会话变量构建了自己的国际化功能来存储当前的语言环境。【参考方案4】:

这可能为时已晚,但作为参考,我在我的索引页面控制器中执行此操作:

session['org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE'] = new Locale("es", "PR")

【讨论】:

【参考方案5】:

我遇到了类似的问题,这是因为一个空格。我有:

[space]messages_de.properties 而不是messages_de.properties

【讨论】:

【参考方案6】:

不久前,当我通过旧版本的 Apache2.2 代理并使用 grails (2.3.9) 战争文件时,我遇到了这个问题。使用 mod_proxy_html (3.1) / Apache 2.4 时我的运气更好。也许更高级的 grails 版本可以解决这个问题。

【讨论】:

以上是关于Grails如何更改当前语言环境的主要内容,如果未能解决你的问题,请参考以下文章

当我在android中更改应用程序中的语言环境时如何重新加载当前视图

如何在 chrome 浏览器中更改语言环境

如何在不同的语言环境中对日期对象进行 strftime? [复制]

动态更改我的应用程序上下文的语言环境

如何更改格式化日期的语言环境?

如何更改Spring语言环境cookie名称?