将 message.properties 暴露给 javascript?
Posted
技术标签:
【中文标题】将 message.properties 暴露给 javascript?【英文标题】:Exposing message.properties to javascript? 【发布时间】:2011-09-07 06:03:22 【问题描述】:有没有一种简单的方法可以将所有已翻译的字符串公开给 javascript?我希望能够在我的 JS 文件中使用翻译后的字符串,而无需在 GSP 中手动构建它们。
有没有简单的方法可以做到这一点?
【问题讨论】:
只是添加一个使用上述 JAWR 作为 grails 插件的有价值的介绍链接:mrhaki.blogspot.de/2011/11/… 【参考方案1】:Jawr 插件(用于优化 JS 和 CSS 资源的好插件)可以将部分或全部 i18n 消息包暴露给 Javascript:
http://jawr.java.net/docs/messages_gen.html
【讨论】:
如何用jawr缩小JS? 你可以使用资源插件来缩小JS。 AFAIK 这将在 1.4 版中移入核心 grails 此答案中的链接似乎已损坏。此链接似乎有效:j-a-w-r.github.io【参考方案2】:将i18n/messages.properties
公开为JSON
I18nController.groovy
>package myproject
import grails.converters.JSON
import grails.plugin.springsecurity.annotation.Secured
@Secured("permitAll")
class I18nController
static defaultAction = "index"
I18nService i18nService
def index()
render i18nService.getAllTranslations(params, request) as JSON
I18nService.groovy
>package myproject
import grails.transaction.Transactional
import grails.web.servlet.mvc.GrailsParameterMap
import org.springframework.context.MessageSource
import javax.servlet.http.HttpServletRequest
@Transactional
class I18nService
MessageSource messageSource
LocaleService localeService
/**
* http://www.razum.si/blog/grails-javascript-i18n-messages
* @return
*/
Properties getAllTranslations(GrailsParameterMap params, HttpServletRequest request)
Locale locale = localeService.prepareLocale(params, request)
Properties keys = messageSource.withTraits(MessagePropertiesTrait).getMessageKeys(locale)
//def jsKeys = keys.findAll code, value -> ((String) code).startsWith('js.')
//render jsKeys as JSON
return keys
LocaleService.groovy
>package myproject
import grails.transaction.Transactional
import grails.web.servlet.mvc.GrailsParameterMap
import org.springframework.web.servlet.support.RequestContextUtils
import javax.servlet.http.HttpServletRequest
@Transactional
class LocaleService
public static final String DEFAULT_LANG = 'es'
public static final String PARAM_LANG_KEY = 'langKey'
public static final String COOKIE_LANG_KEY = 'language'
Locale prepareLocale(GrailsParameterMap params, HttpServletRequest request)
Locale locale = null
int i = 0
List<String> langStrings = new ArrayList<>()
langStrings.add(params.get(PARAM_LANG_KEY) as String)
langStrings.add(request.cookies.find COOKIE_LANG_KEY == it.name ?.value)
while ((locale == null) && (i < langStrings.size()))
String str = langStrings.get(i)
if (str)
try
locale = new Locale(str)
catch (Exception ex)
ex.printStackTrace()
i++
if (locale == null)
try
// From Request
locale = RequestContextUtils.getLocale(request)
catch (Exception e)
// Default
locale = new Locale(DEFAULT_LANG)
return locale
Helpers.groovy
>在utils/myproject
创建这个文件:
package myproject
import groovy.transform.CompileStatic
import groovy.transform.TypeCheckingMode
@CompileStatic(TypeCheckingMode.SKIP)
trait MessagePropertiesTrait
Properties getMessageKeys(Locale locale)
this.getMergedProperties(locale).properties
Properties getPluginMessageKeys(Locale locale)
this.getMergedPluginProperties(locale).properties
UrlMappings.groovy
>添加跟随 URL 映射:
"/i18n/$langKey?(.$format)?"(controller: 'i18n', action: 'index')
用法
网址
http://localhost:8080/i18n # Default language
http://localhost:8080/i18n/.json # Default language
http://localhost:8080/i18n/en.json
http://localhost:8080/i18n/en
http://localhost:8080/i18n/es.json
http://localhost:8080/i18n/es
Cookie
使用语言 (es
, en
, ...) 设置名为 language
的 Cookie 并调用 http://localhost:8080/i18n
或 http://localhost:8080/i18n/.json
【讨论】:
以上是关于将 message.properties 暴露给 javascript?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 javascript 文件中使用来自 message.properties 的 Thymeleaf 消息?
如何在UI上更新记录后显示来自message.properties的消息
除了实例化 DAL 的 BLL 之外,还有啥选项允许在 n 层解决方案中进行单元测试,而不会将 DAL 暴露给 UI 或将 BLL 暴露给 DAL?