Grails如何更改当前语言环境

22

我怎样可以改变当前的区域设置?

  • 我尝试了将controller/action?lang=de加入URL,但我的区域设置仍为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

有任何想法可以更改语言环境吗?

6个回答

28
根据Grails文档的10.国际化章节,Grails支持开箱即用的i18n,您确实可以使用lang参数更改语言环境:

By default the user locale is detected from the incoming Accept-Language header. However, you can provide users the capability to switch locales by simply passing a parameter called lang to Grails as a request parameter:

/book/list?lang=de

Grails will automatically switch the user locale and store it in a cookie so subsequent requests will have the new header.

但有时您可能想预设默认语言,因为并非所有应用程序都是英语。要做到这一点,您只需按照下面所示在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仍在读取默认的bundle消息而不是'de'版本。感谢任何线索! - Benoit Wickramarachi
只是想确认您的验证过程是否正常,看来没问题 :) 但我必须说这真的很奇怪。您能否说明“Accept-Language”标头是否已设置?您使用的Grails版本是什么? - Pascal Thivent
是的,奇怪绝对是正确的词...我正在使用Grails 1.1。我刚刚检查了http请求的头部,我可以看到:'Accept-Language: en-us,en; q = 0.5'。 - Benoit Wickramarachi
这不是预期的行为。然而,在Grails的Jira中,我找不到任何与您的问题相似的内容。如果这是一个错误,那么它不可能被忽略。我不明白。 - Pascal Thivent
2.4.3 版本中测试过,可以成功设置起始语言环境。我需要将荷兰语设置为默认语言。 - A.W.
我使用了jawr-plugin来翻译JavaScript中的文本。我发现只需将defaultLocale = new Locale('fi', 'FI')设置为默认语言即可,而Locale.setDefault(defaultLocale)实际上防止了jawr更改语言。 - niko.makela

6

您是否尝试在应用程序根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中的某个控制器。


谢谢你的回答。但是,我确实尝试在我的一个控制器上更改区域设置,但它没有起作用。这真的很奇怪,因为文档描述的行为与您所说的相同,但我的区域设置并没有改变...所以我使用会话变量构建了自己的国际化功能来存储当前的区域设置。 - Benoit Wickramarachi

6
据我所知,您检查区域设置的方式“request.locale”是错误的,它给出的是浏览器的区域设置,而不是Grails应用程序的区域设置。
您应该使用“LocaleContextHolder.locale”。
2.0.3中,只需传递参数lang=someLocale即可更改区域设置。

5

也许已经晚了,但供参考,我在我的索引页控制器中执行以下操作:

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

1

我遇到了类似的问题,原因是由于空格。我写成了:

[空格]messages_de.properties 而不是 messages_de.properties


0

我曾经在通过旧版Apache2.2代理并使用grails(2.3.9)war文件时遇到过问题。使用mod_proxy_html(3.1)/ Apache 2.4的效果更好。也许更新版本的grails可以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接