Grails如何更改当前区域设置

时间:2009-10-14 22:52:34

标签: grails internationalization locale

如何更改当前区域设置?

  • 我尝试放置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

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

6 个答案:

答案 0 :(得分:27)

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

  

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

/book/list?lang=de
     

Grails会自动切换   用户区域设置并将其存储在cookie中   所以后续的请求将有   新标题。

但有时您可能希望预设默认语言,因为并非所有应用程序都使用英语。要做到这一点,您所要做的就是在localeResolver弹簧配置文件中设置resources.groovy,如下所示:

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

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

答案 1 :(得分:6)

您是否尝试更改应用程序根网址中的区域设置(例如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下。你可以在那里查看。

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:5)

据我所知,您检查语言环境“request.locale”的方式是错误的,它提供了浏览器的语言环境,而不是grails applciation的语言环境。

您应该使用“ LocaleContextHolder.locale ”。

2.0.3 中,只需传递参数lang=someLocale即可更改区域设置。

答案 4 :(得分:1)

我有类似的问题,这是因为一个空间。我有:

[space]messages_de.properties代替messages_de.properties

答案 5 :(得分:0)

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