我的index.html.eex中的内部标记我可以使用此语法来检索文本。
<%= gettext "Login failed!"%>
现在我有一个用于验证字段的js文件,我将此文件作为index.html.eex中的脚本加载。
一切正常但我需要在js文件中使用gettext for Phoenix文本翻译。我知道&lt;%=%&gt;语法不会在.eex文件外编译,但我拒绝将所有验证逻辑代码放在index.html.eex中 如何在js文件中获取phoenix代码?
答案 0 :(得分:2)
您可以将翻译存储在index.html.eex
中的变量中,然后从JS文件中访问它。这是一个例子:
将其添加到index.html.eex
的顶部:
<script>
var Translations = {
"login_failed": <%= raw Poison.encode!(gettext("Login failed!")) %>,
};
</script>
现在在你的JS文件中,执行:
console.log(Translations.login_failed)
更好的方法是创建此类翻译列表并将其注入布局文件中:
<script>
var Translations = {
"login_failed": <%= raw Poison.encode!(gettext("Login failed!")) %>,
"some_other_error": <%= raw Poison.encode!(gettext("Some other error!")) %>,
};
</script>
这样,所有翻译都将在app.js
中提供。
为什么raw
和Poison.encode!
?
如果"<%= thing %>"
包含引号或换行符(可能还有其他一些特殊字符),那么简单地执行'<%= thing %>'
或thing
就会中断。 Poison.encode!
会将值转换为有效的JSON(也是有效的JS),raw
将确保此值不会被双重转义。