В Grails, как я могу получить ConfigObject messages.properties для локали? - PullRequest
3 голосов
/ 20 августа 2010

В Grails я хотел бы получить ConfigObject ссылку на файл свойств загруженных сообщений для текущей локали.Или какой-нибудь способ легко прочитать свойства сообщения (для текущей локали) целиком.Я хочу преобразовать его в JSON и отправить обратно клиенту, который будет использоваться для поиска строк через javascript.

По сути, я хочу сделать что-то вроде этого:

def props = new java.util.Properties()
props.load(... the right message bundle ...);
def messages = new ConfigSlurper().parse(props)
render messages as JSON

I 'Я предполагаю, что есть более изящный способ сделать это.Интерфейс messageSource позволяет вам получить сообщение только для определенного ключа.Мне нужен весь пакет ресурсов, чтобы я мог преобразовать его в JSON.

Ответы [ 3 ]

1 голос
/ 20 августа 2010

Я нашел работоспособное решение, просто загрузив свойства непосредственно из соответствующего пакета свойств сообщений в зависимости от текущей локали.

Похоже, я могу просто загрузить файл с путем относительно корня приложения.Это работало для локального запуска как со встроенным tomcat, так и в качестве войны ('grails run-app' и 'grails run-war'), но я не проверял развертывание в контейнере, чтобы узнать, будет ли путь разрешен правильно.

Вот мой тестовый контроллер:

import grails.converters.*
import org.springframework.context.i18n.LocaleContextHolder as LCH 

class I18nController {

    def index = {
        def locale = LCH.getLocale().toString();
        def langSuffix = ( locale == "en" ) ? "" : "_${locale}" 
        def props = new java.util.Properties()
        props.load( new FileInputStream( "grails-app/i18n/messages${langSuffix}.properties" ) )
        render ( new ConfigSlurper().parse(props) ) as JSON
    }

}

Доступен как:

http://localhost:8080/myapp/i18n
http://localhost:8080/myapp/i18n?lang=es
http://localhost:8080/myapp/i18n?lang=en
0 голосов
/ 09 апреля 2013

Я знаю, что это старо, но я пришел сюда, чтобы сделать то же самое.Использование LocaleContextHolder для получения желаемой локали - хорошая отправная точка, хотя я решил использовать RequestContextUtils.В моей реализации я хотел использовать собственную стратегию разрешения локали java.Итак, здесь (в настоящее время используется Grails 2.1.2):

// Controller
import org.springframework.web.servlet.support.RequestContextUtils
import grails.converters.JSON


class I18nController {
    def strings() {
    ResourceBundle clientMessages = ResourceBundle.getBundle("com.example.ClientMessages",
        RequestContextUtils.getLocale(request),
        Thread.currentThread().contextClassLoader)
    render clientMessages as JSON
    }
}

Когда вы сериализуете эту вещь, используя маршаллер JSON по умолчанию, это не то, что вам нужно.Так что добавьте это к вашему BootStrap.groovy в закрытии init:

    // JSON Marshaller to serialize ResourceBundle to string table.
    JSON.registerObjectMarshaller(ResourceBundle) { bundle ->
        def returnObject = [:]
        bundle.keys.each {
            returnObject."${it}" = bundle.getString(it)
        }
        returnObject
    }

И, наконец, поместите ресурсы, которые вы хотите отправить, на стороне клиента javascript в вашем classpath.В моем примере это было бы в src / java / com / example / ClientMessages.properties.

size.small=Small
size.wide=Wide
size.large=Large

В клиенте, перейдя к myapp/i18n/strings, вы увидите JSON следующим образом:

{"size.small":"Small","size.wide":"Wide","size.large":"Large"}

Таким образом, с этим решением вы помещаете все и только строки, которые вы хотите отправить на сторону javascript для поиска, и помещаете все остальное в папку Grails i18n.Одно предостережение: строки здесь недоступны для g: message и наоборот.Если кто-нибудь может найти решение для выделения одного базового имени в i18n для этой цели, я бы хотел это увидеть.

0 голосов
/ 20 августа 2010

Тип реализации MessageSource: org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource .Возможно, в этом классе есть методы (или один из его родителей), которые позволят вам получить ссылку на весь набор Properties.

. Похоже, что это может работать (хотя у меня нетt протестировал его):

// Get a reference to the message Source either via dependency injection or looking-up
// the bean in the application context
def messageSource
Properties messages = messageSource.getProperties("messages.properties").properties
// Now convert the Properties instance to JSON using your favorite Java-JSON library

Это не очень хорошее решение, так как метод getProperties(filename) защищен, поэтому вы не должны вызывать его, но можете из-за ошибки в Groovy.Он также делает некоторые неявные предположения о типе реализации mesageSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...