#javascript #grails #groovy #internationalization #translation
#javascript #grails #groovy #интернационализация #перевод
Вопрос:
Есть ли простой способ предоставить доступ ко всем переведенным строкам на javascript? Я хочу иметь возможность использовать переведенные строки в своих JS-файлах, не создавая их вручную в GSP.
Есть ли простой способ сделать это?
Комментарии:
1. Просто чтобы добавить ценную вводную ссылку, которая использует вышеупомянутый JAWR в качестве плагина grails: mrhaki.blogspot.de/2011/11 /…
Ответ №1:
Плагин Jawr (в любом случае, хороший плагин для оптимизации ваших ресурсов JS и CSS) может предоставлять части или все ваши пакеты сообщений i18n на Javascript:
Комментарии:
1. Как минимизировать JS с помощью jawr?
2. вы можете использовать плагин resources для минимизации JS. AFAIK это будет перенесено в core grails в версии 1.4
3. Ссылка в этом ответе, похоже, не работает. Кажется, эта ссылка работает: 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) amp;amp; (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
}
}
Помощники.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')
Использование
URL
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
Установите файл cookie с именем, language
указывающим язык ( es
, en
, …), и вызовите http://localhost:8080/i18n
или http://localhost:8080/i18n/.json