2009-10-14 77 views
21

如何更改当前语言环境?Grails如何更改当前语言环境

  • 我试图把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

任何想法改变语言环境?

回答

25

根据Grails文档的章10. Internationalization,Grails支持i18n的开箱即用,你确实应该能够使用lang参数更改地区:

默认情况下,当检测 用户区域来自Accept-Language 表头。但是,可以为用户提供 通过 只是传递了一个名为lang 中的Grails的请求参数参数切换语言环境的能力:

/book/list?lang=de 

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

但有时您可能想要预设默认语言,因为不是所有的应用程序都是英文的。要做到这一点,所有你需要做的是设置localeResolverresources.groovy Spring配置文件如下图所示:现在

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

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

+0

感谢您的回复。我试过你的解决方案来改变defaultLocale,但我仍然得到一个en_US语言环境。检索我的当前语言环境的好问题我使用'request.locale'。我也可以看到,grails仍然在阅读默认的捆绑消息,而不是'de'版本。感谢任何线索! – 2009-10-14 23:38:47

+0

只是想确保你的验证过程是好的,它是:) 但我必须说这真的很奇怪。你可以说是否设置了“Accept-Language”标题?你使用的是什么版本的grails? – 2009-10-14 23:42:50

+0

是的怪异无疑是这个词...我使用的是Grails 1.1。我刚刚检查了http请求的头部,我可以看到:'Accept-Language:en-us,en; q = 0.5' – 2009-10-14 23:53:20

6

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

在尝试更改应用程序根URL中的区域设置的Grails基本设置不起作用。 Grails在localChangeInterceptor中更改语言环境,在调用所有控制器之前调用该语言环境。当你访问应用程序根URL时,没有控制器被调用,因为可以在默认UrlMappings中看到。

这就是为什么更改应用程序根URL中的区域设置不起作用。如果您尝试在某个控制器中更改网址,则该网址有效。

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

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

+0

感谢您的回答。但是,是的,我试图改变我的控制器上的区域设置,它不起作用。这真的很奇怪,因为文档描述的是与你讲的相同的行为,但我的语言环境没有变化......所以我使用会话变量构建了自己的国际化功能来存储当前的语言环境。 – 2009-12-11 14:04:27

5

这problably太晚,但参考,我做这在我的索引页控制器:

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

据我了解你正在检查的区域“request.locale”的方式是错误的,它给出了浏览器的语言环境,而不是Grails应用程序的语言环境。

您应该使用“LocaleContextHolder.locale”。

2.0.3它通过简单地通过参数lang=someLocale来改变语言环境。

+1

感谢您的解释,这是有道理的。 – 2012-11-23 17:55:18

1

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

[space]messages_de.properties代替messages_de.properties

0

我有这个问题一段时间回来代理荷兰国际集团通过旧版本APACHE2.2和使用Grails的(2.3.9)战争文件时。我使用mod_proxy_html(3.1)/ Apache 2.4获得了更好的运气。也许更高级的grails修复了这个问题。

相关问题