Используйте свойства Java в Freemarker - PullRequest
6 голосов
/ 16 мая 2011

HI

В моем приложении типичный файл messages.properties. Я пытаюсь создать электронное письмо с помощью Freemarker.

Шаблон Freemarker должен сгенерироваться в String, после чего я отправлю String пользователю по электронной почте. Однако нам это нужно многоязычно. Итак, Properties пришло на ум.

Мой файл свойств выглядит так:

mail.layout.contactus=Contacteer ons
mail.layout.greeting=Hoi

В Java я ввожу файл Properties в свой HashMap следующим образом:

rootMap.put("lang", (mail.getLanguage().equals(Language.FRENCH) ? langFR : langNL));

И попробуйте прочитать его во FreeMarker так:

<p>${lang.mail.layout.greeting} ${user.firstname},</p>

Но получите следующее исключение:

freemarker.core.InvalidReferenceException: Expression lang.mail is undefined on line 10, column 116 in layout/email.ftl.

Странно, он говорит только lang.mail, а не lang.mail.layout.greeting

Edit: Я попытался определить мои ключи следующим образом:

mail_layout_contactus=Contacteer ons
mail_layout_greeting=Hoi

который работает

1 Ответ

4 голосов
/ 16 мая 2011

Я считаю, что проблема в том, что с ключом lang.mail.layout.greeting Freemarker обрабатывает каждую часть между . s как хеш , т. Е. Переменную контейнера, которая может иметь подвариабельных переменных ,Таким образом, он пытается получить объект, на который ссылается lang из модели данных, а затем пытается получить переменную, на которую ссылается mail из lang.В вашем случае, однако, такого объекта нет, следовательно, ошибка.

В документации есть, что сказать об именах переменных :

В этом выраженииимя переменной может содержать только буквы (включая нелатинские), цифры (включая нелатинские), подчеркивание (_), доллар ($), знак (@) и хэш (#).Кроме того, имя не должно начинаться с цифры.

Вы можете использовать альтернативный синтаксис для получения данных из хеша (до тех пор, пока выражение оценивается как строка)

<p>${lang["mail.layout.greeting"]} ${user.firstname},</p>
...