Как использовать HTML в сообщениях Grails.properties для отправки почты

В Grails я использую шаблон GSP для отображения электронной почты в формате HTML, отправленной с помощью почтового плагина. Это прекрасно работает, однако шаблон GSP использует параметр, который, в свою очередь, извлекается из моего файла messages.properties. Теперь я хочу использовать HTML, например. <br/> внутри messages.properties, но в почте он отображается как текст и тег не интерпретируется.

Я уже пытался использовать .decodeHTML() для параметра в GSP, но это не сработало.

Где я должен кодировать/декодировать или вообще возможно ли использовать теги HTML внутри messages.properties?

<%@ page contentType="text/html"%>
<html>
<body>
${variableWithHTMLTextFromMessagesProperties}
</body>
</html>

person Jörg Brenninkmeyer    schedule 02.07.2010    source источник
comment
Можете ли вы опубликовать GSP? Используете ли вы атрибут encodeAs в теге сообщения в шаблоне GSP?   -  person proflux    schedule 02.07.2010


Ответы (4)


Вы не можете сделать локализацию в GSP с помощью тега сообщения, подобного следующему? Контроллер -

sendMail {
    to "[email protected]"
    subject "cheese"
    html g.render(template:"myTemplate")
}

А затем в вашем _myTemplate.gsp -

<%@ page contentType="text/html" %>
<html><head></head>
<body>
    <p>test: <g:message code="a.test"/></p>
</body>
</html>

А потом в messages.properties -

a.test=this <br/><br/> is a test

Этот способ отлично работает для меня (Grails 1.3.1, почта 0.9), я получаю 2 разрыва строки в полученном электронном письме html. Есть ли причина, по которой вы не можете сделать это таким образом?

person Chris    schedule 06.07.2010
comment
На самом деле в моем случае текст из messages.properties заранее сохраняется как String в сохраняемом классе, а затем передается в представление. Конечно, теоретически я мог бы вместо этого сохранить код сообщения, но тогда мне также нужно было бы сохранить параметры, которые должны использоваться позже, поэтому я бы предпочел сохранить сообщение напрямую... Но, думаю, я собираюсь используйте свое решение в качестве запасного решения, если оно не работает по-другому, так что спасибо! - person Jörg Brenninkmeyer; 08.07.2010

Решение найдено здесь. Самый простой способ - просто использовать <%=variableWithHTMLTextFromMessagesProperties%> вместо ${variableWithHTMLTextFromMessagesProperties}. Это останавливает экранирование HTML.

person Jörg Brenninkmeyer    schedule 08.07.2010

Я сделал свое собственное решение с пользовательской taglib.

def htmlMessage = { attrs, body ->
    out << g.message(attrs, body).decodeHTML()
}

Затем, чтобы определить сообщение, оно должно быть с экранированным html:

my.html.message={0,choice,0#There is no elements|1#There is &lt;strong&gt;1&lt;/strong&gt; element|1<There are &lt;strong&gt;{0}&lt;/strong&gt; elements}

Для html просто:

<g:htmlMessage code="my.html.message" args="[qElements]" />

В результате получается HTML-код i18n с номером, выделенным сильным шрифтом. Нравится:

"Есть 9 элементов"

person Norberto Yoan    schedule 31.07.2013

Из документов:

<g:encodeAs codec="HTML">
   Profile for user ${user.name} is:
   <g:render template="/fragments/showprofile"/>
</g:encodeAs>
person Brian    schedule 02.07.2010
comment
Это работает в неправильном направлении; теперь ‹br/› в messages.properties отображается как br/ - person Jörg Brenninkmeyer; 03.07.2010