Предоставление доступа message.properties к javascript?

#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:

http://jawr.java.net/docs/messages_gen.html

Комментарии:

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