在Freemarker中使用Java属性

Bar*_*den 7 java multilingual freemarker

HI,

messages.properties我的应用程序中有一个典型的文件.我正在尝试使用Freemarker生成电子邮件.

Freemarker模板应生成a String,之后我将String通过电子邮件发送给用户.但是,我们需要多语言.所以Properties想到了.

我的属性文件如下所示:

mail.layout.contactus=Contacteer ons
mail.layout.greeting=Hoi
Run Code Online (Sandbox Code Playgroud)

在Java中,我输入我的Properties文件HashMap:

rootMap.put("lang", (mail.getLanguage().equals(Language.FRENCH) ? langFR : langNL));
Run Code Online (Sandbox Code Playgroud)

并尝试在FreeMarker中阅读它:

<p>${lang.mail.layout.greeting} ${user.firstname},</p>
Run Code Online (Sandbox Code Playgroud)

但得到以下异常:

freemarker.core.InvalidReferenceException: Expression lang.mail is undefined on line 10, column 116 in layout/email.ftl.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它只是说lang.mail而不是lang.mail.layout.greeting

编辑: 我尝试像这样定义我的键:

mail_layout_contactus=Contacteer ons
mail_layout_greeting=Hoi
Run Code Online (Sandbox Code Playgroud)

哪个确实有效

no.*_*ing 4

我认为问题在于,使用 的键,Freemarker 将slang.mail.layout.greeting之间的每个部分视为散列,即可以具有子变量的容器变量。因此它尝试从数据模型中获取引用的对象,然后尝试获取from引用的变量。然而,在您的情况下,不存在这样的对象,因此会出现错误。.langmaillang

该文档对变量名称有这样的说法

在此表达式中,变量名称只能包含字母(包括非拉丁字母)、数字(包括非拉丁数字)、下划线 (_)、美元 ($)、at 符号 (@) 和井号 (#)。此外,名称不能以数字开头。

您可以使用替代语法从哈希中获取数据(只要表达式计算结果为字符串)

<p>${lang["mail.layout.greeting"]} ${user.firstname},</p>
Run Code Online (Sandbox Code Playgroud)