在我的 Scala 项目中,我使用了 Twirl 模板引擎。俄语和英语的模板文件结构是重复的,例如我有以下两条路径:en.Send.txt.MonoEnsure
和 ru.Send.txt.MonoEnsure
在我的代码中,我希望能够动态加载 en
或 ru
模板,如下所示:
def render(lang: String) = lang.Send.txt.MonoEnsure("hi")
render("en") // does not work, just to illustrate my point
我怎样才能做到这一点?
最佳答案
我认为这是应该实现的代码:
import play.twirl.api.Template1
def getTemplate[T](name : String)(implicit man: Manifest[T]) : T =
Class.forName(name + "$").getField("MODULE$").get(man.erasure).asInstanceOf[T]
def render(lang: String) =
getTemplate[Template1[String,String]](s"$lang.Send.txt.MonoEnsure").render("hi")
render("en")
模板被编译为 BaseScalaTemplate
,因此您可以使用反射调用它。您只需要知道模板的参数数量,就可以将其加载为特征 play.api.twirl.TemplateX
的实例。在这种情况下 Template1[String, String]
(参数的第一个字符串和渲染响应类型的第二个字符串)。
查看此线程以获取有关 scala 中反射的更多信息 How do I call a Scala Object method using reflection?
关于scala - 动态加载旋转模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24578073/