我有一个play2.5应用程序和一个表单,我想在其中将错误消息国际化。我将表单放在一个单独的对象中,并在控制器中使用它。但是播放不编译,因为找不到隐式消息。
我想这是一个微不足道的解决方案,但我是玩和 scala 的新手,如果有任何提示,我将不胜感激。
错误:(14, 45) 找不到参数消息的隐式值:play.api.i18n.消息 "username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
object LoginForm {
val form = Form(
mapping(
"username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
"pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
)(Data.apply)(Data.unapply)
)
case class Data(
username: String,
password: String
)
}
使用 I18nSupport
特征来获取作用域中的隐式play.api.i18n.Messages
值。 完整解释在这里:
https://www.playframework.com/documentation/2.5.x/ScalaI18N#Externalizing-messages
对于您的用例,最简单的方法是在使用I18nSupport
特征的控制器内部定义表单。 由于您是Scala和Play的新手,因此我推荐这种方法。
更高级的方法是在LoginForm
特征中定义形式并声明对I18nSupport
特征的依赖关系。 这看起来像:
trait LoginForm{
self: I18nSupport =>
//define form here
}
然后,您只需将这个LoginForm
特征混合到您需要它的控制器中(它应该混合在I18nSupport
特征中)。
如果您像这样隐式地为表单提供 lang 是否有效?
def form(implicit lang: Lang) = Form(
mapping(
"username" -> email.verifying(Messages("error.email.required"), {!_.isEmpty}),
"pasword" -> nonEmptyText(8,20).verifying(Messages("error.password.required"), {!_.isEmpty})
)(Data.apply)(Data.unapply)
)
有时将窗体移动到 case 类的配套对象会很好:
case class Data(
username: String,
password: String
)
object Data {
def form(implicit lang: Lang) = ...
}