Grails如何更改当前区域设置

Ben*_*chi 22 grails locale internationalization

如何更改当前区域设置?

  • 我试图放,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"))
    
    Run Code Online (Sandbox Code Playgroud)

没有改变.

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

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

而且......什么都没发生.我仍然将我的语言环境设置为en_US.

有什么想改变语言环境的吗?

Pas*_*ent 27

根据第10章Grails文档的国际化,Grails支持开箱即用的i18n,你确实应该能够使用lang参数更改语言环境:

默认情况下,从传入Accept-Language 标头中检测用户区域设置.但是,您可以通过简单地将名为lang Grails 的参数作为请求参数传递来为用户提供切换区域设置的功能:

/book/list?lang=de
Run Code Online (Sandbox Code Playgroud)

Grails将自动切换用户区域设置并将其存储在cookie中,以便后续请求具有新标头.

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

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

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


Ond*_*nik 6

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

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

这就是为什么在应用程序根URL中更改区域设置不起作用的原因.如果您尝试更改某个控制器中的URL,则可以正常工作.

当前区域设置存储org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME在http会话中的密钥下.你可以在那里查看.

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


小智 6

据我所知,你检查语言环境"request.locale"的方式是错误的,它给出了浏览器的语言环境,而不是grails applciation的语言环境.

您应该使用" LocaleContextHolder.locale ".

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


jec*_*lon 5

这可能太晚了但作为参考,我在我的索引页面控制器中这样做:

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