我正在使用PlayFramework模板做一些工作,但我遇到了一个问题。我们正在使用需要Messages
的播放助手(从play.api.i18n
导入)。一切都很好,直到我们的设计师想要以Modal的形式登录表单...因为它将附加到每个模板,我们需要在任何地方添加该消息参数 - 这是丑陋的恕我直言。
有办法解决这个问题吗?将它传递到任何地方意味着我必须在任何地方Inject()
,即使只需要通过它来关闭类型检查器。
示例页面:
@(project: model.Project)(implicit request: Request[AnyContent], messages: Messages)
@main(project.name){
<h1>@project.name</h1>
<ul>
@for(member <- project.members) {
<li><a href="@routes.UsersController.view(member)">@member</a></li>
}
</ul>
}{}
主模板的片段:
@(title: String)(content: Html)(additionalImport: Any)(implicit req: Request[AnyContent], messages: Messages)
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
@* this call actually needs that param. *@
@header.navbar()
<div class="container">
@req.flash.get("error").map { error =>
<div class="flash-error">@error</div>
}
@content
</div>
</body>
</html>
表格:
@import model.UserLoginData
@(loginForm: Form[UserLoginData])(implicit req: Request[AnyContent], messages: Messages)
@helper.form(action = routes.AuthenticationController.login()) {
@loginForm.globalErrors.map { error =>
<div class="error">@error.message</div>
}
@helper.inputText(loginForm("login"))
@helper.inputPassword(loginForm("password"))
<input type="submit" value="Zaloguj"/>
}
<a href="@routes.AuthenticationController.recoverForm()">Zapomniałem hasła</a>
答案 0 :(得分:1)
在这里,我看到两个解决方法。不幸的是,我现在无法测试它们,但我相信它们都会起作用。
messages
参数。使用Play.current.injector.instanceOf[MessagesApi]
在模板(here is a question about accessing injector without an @Inject
annotation)内部实施MessagesApi
。然后,您可以调用方法preferred(Http.RequestHeader request):Messages
来获取Messages
实例,然后您需要将其显式传递给辅助方法。messages
参数传递给每个模板,您可以实现自己的I18nSupport
特征版本。这里我的意思是你通常用以下方式编写控制器:
class SomeController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport
。 messagesApi
val覆盖I18nSupport
特征的相同值。您可以使用自己的MyI18Support
特征扩展此特征,并在其中注入MessagesApi
(UPD:您可以@Iinject
或使用Play.current.injector
)。然后,您只需按如下方式编写控制器:class SomeController extends Controller with MyI18nSupport
。