除了上述答案之外,您可能需要在以下地方实现国际化或从消息包中获取消息。
- 观看次数
- 控制器
- 服务
- 过滤器
- 实用程序文件(例如,在 util 包或通用异常消息处理中)
- 特殊文件,例如在 Shiro 安全休息领域
以下是详细的使用场景:
Views:- 我们有带有消息标签的标签库。在视图上使用它。
controllers :- 默认情况下,此处提供消息方法,并自动处理区域设置转换。见enter link description here
-
服务:我们可以在服务内部调用标签库,如下所示:
def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
或者注入messageSource bean作为
def messageSource
4.过滤器/实用程序/特殊文件:- 对于这些,您可以创建如下所示的内容,然后在整个过程中使用它。
String i18nMessage(def input,String defaultMessage) {
String[] languageCode = RequestContextHolder.currentRequestAttributes().request.getHeader("Accept-Language").split("-")
Locale locale = languageCode.length == 2 ? new Locale(languageCode[0], languageCode[1]) : new Locale(languageCode[0])
String message = defaultMessage
try {
message = messageSource.getMessage(input.code,input?.args?.toArray(),locale)
}catch (NoSuchMessageException nsme ){
log.info("No such error message--> ${nsme.getMessage()}")
}
return message
}
另外,如果您在下面遇到异常:
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
然后,您可能需要在 web.xml 中添加请求侦听器
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
注意: web.xml 默认不可用,需要从模板生成。
这些是您可能需要消息包转换的最常见位置。
第 4 点的解决方案几乎适用于所有情况。如果您注意到此处已手动处理语言环境,我们可以在从 requestHeader 或请求参数中获取后传递。
希望对你有帮助。