Я знаю, что это старо, но я пришел сюда, чтобы сделать то же самое.Использование 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 для этой цели, я бы хотел это увидеть.