Grails:如何使用当前本地化获取i18消息?

Grails:如何使用当前本地化获取i18消息?,grails,localization,internationalization,Grails,Localization,Internationalization,我正在使用Grails(2.2.4)+groovy应用程序进行编码,我需要获取i18消息,返回这种值的可能方法是什么?查看官方文档-您可以在那里找到关于如何设置和读取i18n消息的所有有趣信息 实质上: 将您的i18n消息放在grails app/i18n/messages\u[lang\u code]属性中,其中[lang\u code]表示您感兴趣的语言代码。该文件类似于简单的ini文件,因此它包含key=value,例如 site_title=Your site international

我正在使用Grails(2.2.4)+groovy应用程序进行编码,我需要获取i18消息,返回这种值的可能方法是什么?

查看官方文档-您可以在那里找到关于如何设置和读取i18n消息的所有有趣信息

实质上:

将您的i18n消息放在grails app/i18n/messages\u[lang\u code]属性中,其中[lang\u code]表示您感兴趣的语言代码。该文件类似于简单的ini文件,因此它包含key=value,例如

site_title=Your site internationalized site name
然后您可以使用此消息。如果您想在gsp视图中显示,请使用简单标记:

<g:message code="site_title" />
之后,您可以使用以下方法在控制器操作中接收消息:

messageSource.getMessage('site_title', null, request.locale, 'here you can put some default value if i18n label is not found')
它将返回与“站点标题”键关联的消息


还有一件事——Grails应用程序使用您的浏览器区域设置。如果要更改它们,请在url请求中传递lang参数,例如

您的意思是如何在运行时更改它们

您主要使用

与spring/resource.groovy文件类似。还有传球的方式

消息传递涉及两个类 1.
消息bean本身

2.
PluginAwareMessage
。。。某种程度上。。确保你有注射或可用的。您甚至可以使用此服务使用代码访问消息。

如果要在src中使用g.message标记,请使用此代码:

def grailsApplication = ApplicationHolder.application
def g = grailsApplication.mainContext.getBean(
    'org.codehaus.groovy.grails.plugins.web.taglib.ValidationTagLib')
g.message(code:'your.code.in.message.property', locale:'locale.name') // set locale only for this message
或者,您可以将其用于应用程序级别:

def localeResolver = RequestContextUtils.getLocaleResolver(request); // returns a SessionLocaleResolver
def locale = new Locale("fr", "CA");
localeResolver.setLocale(request, response, locale);

当我使用时,效果很好:

def getMessage( String code, Object[] args = null)
{
    // assuming the test cwd is the project dir (where application.properties is)
    URL url = new File('grails-app/i18n').toURI().toURL()
    def messageSource = new ResourceBundleMessageSource()
    messageSource.bundleClassLoader = new URLClassLoader(url)
    messageSource.basename = 'messages'
    messageSource.getMessage(code, args, Locale.ENGLISH)
}
在设置函数中,我模拟了我的函数,如下所示(使用上述函数):


我之前看到过这个链接,它对我帮助不大。我需要找到一些好的实践。实际上,我的问题是在运行Spock单元测试时得到一些消息,似乎文件不可读或类似的东西,我总是不断地得到“org.springframework.context.NoSuchMessageException:在语言环境“en_US”的代码“default.access.denied.message”下找不到消息,当我在groovy类中,而不是在GSP文件中时,我需要调用这个函数。第一个选项抛出异常-org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“org.codehaus.groovy.grails.plugins.web.taglib.ValidationTagLib”的bean。对于第二个,我无法获取请求对象,也许有一个代码?
def getMessage( String code, Object[] args = null)
{
    // assuming the test cwd is the project dir (where application.properties is)
    URL url = new File('grails-app/i18n').toURI().toURL()
    def messageSource = new ResourceBundleMessageSource()
    messageSource.bundleClassLoader = new URLClassLoader(url)
    messageSource.basename = 'messages'
    messageSource.getMessage(code, args, Locale.ENGLISH)
}
    ResponsHelper.metaClass.static.jsonError = { String code, Object[] args = null ->
        getMessage(code, args)
    }

    ResponsHelper.metaClass.static.jsonErrorsNoArgsInList = { List errors ->
        errors.collect {
            getMessage(it, [])
        }
    }