我制作了这个控制器,用于发送电子邮件.我需要访问i18n才能发送本地化的电子邮件.
class MailController {
MessageSource messageSource
static transactional = false
public void sendEmail() {
String name = "some name..."
String subject = message(code:"somemessagekey", args:[name])
// do some fancy stuff here...
}
}
Run Code Online (Sandbox Code Playgroud)
i18n然后是文件(位于i18n文件夹中):
file name: messages.properties
content: somemessagekey = Blabla {0} - blablabla
Run Code Online (Sandbox Code Playgroud)
运行之后,它会抛出(在集成测试中):
groovy.lang.MissingPropertyException:没有这样的属性:class的messageSource:org.codehaus.groovy.grails.support.MockApplicationContext
我没有想法如何处理控制器中的本地化(我也在服务中尝试过,但这更复杂).
小智 23
如果您使用的是grails 1.3.7,则需要将消息源声明为:
def messageSource
Run Code Online (Sandbox Code Playgroud)
这样它就会被注入你的控制器.我认为在2.0中您可以按照发布的方式进行,但即便如此,我认为值得尝试按上述方式声明它.
sbg*_*ius 14
我知道有答案,但这是我的看法.我做了一项服务(灵感来自他人)
import org.springframework.web.servlet.i18n.SessionLocaleResolver
import org.springframework.context.MessageSource
class I18nService {
boolean transactional = false
SessionLocaleResolver localeResolver
MessageSource messageSource
/**
*
* @param msgKey
* @param defaultMessage default message to use if none is defined in the message source
* @param objs objects for use in the message
* @return
*/
def msg(String msgKey, String defaultMessage = null, List objs = null) {
def msg = messageSource.getMessage(msgKey,objs?.toArray(),defaultMessage,localeResolver.defaultLocale)
if (msg == null || msg == defaultMessage) {
log.warn("No i18n messages specified for msgKey: ${msgKey}")
msg = defaultMessage
}
return msg
}
/**
* Method to look like g.message
* @param args
* @return
*/
def message(Map args) {
return msg(args.code, args.default, args.attrs)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在服务中注入i18nService,你就可以了!这也使得对其他服务的单元测试变得轻而易举,因为您可以模拟i18nService
作为奖励,该服务将尝试查找当前webrequest的当前区域设置,该服务在webrequest上下文中运行.
在Grails 2.2.3中它应该工作:
import org.springframework.context.MessageSource
...
def MessageSource messageSource
...
String subject = messageSource.getMessage("somemessagekey", [name], null)
...
Run Code Online (Sandbox Code Playgroud)
参考链接和更多可能性:http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/context/MessageSource.html
小智 6
上面的回答对我没有帮助.我使用的是Grails 3.0.1,下面的解决方案对我很有用
import org.springframework.context.i18n.LocaleContextHolder as LCH
import grails.util.Holders;
class MyService{
def messageSource = Holders.getGrailsApplication().getParentContext();
public String MyMethod()
{
String message = messageSource.getMessage("code",args,LCH.getLocale());
}
}
Run Code Online (Sandbox Code Playgroud)