有没有一种简单的方法可以将所有已翻译的字符串公开给javascript?我希望能够在我的JS文件中使用已翻译的字符串,而无需在GSP中手动构建它们。
有一种简单的方法吗?
答案 0 :(得分:6)
Jawr插件(无论如何用于优化JS和CSS资源的好插件)可以将部分或整个i18n消息包暴露给Javascript:
答案 1 :(得分:0)
i18n/messages.properties
公开为JSON
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
}
}
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
}
}
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
}
}
在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
}
}
添加以下网址映射:
"/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
使用语言(language
,es
,...)设置名为en
的Cookie,然后致电http://localhost:8080/i18n
或http://localhost:8080/i18n/.json