controlador:i18n error: controlador y plantillas utiliza diferentes lenguajes implícitos
def test = Action { implicit request =>
import play.api.i18n._
val msg = Messages("error.invalid")
implicit val langInController = lang(request)
Ok(views.html.test(langInController, msg))
}
Vista:
@(langInController: play.api.i18n.Lang, msg:String)(implicit request: Request[_])
<div>Lang from controller: @langInController, Message: @msg</div>
<div>Message from view: @play.api.i18n.Messages("error.required")</div>
Mensajes de recursos, conf/messages.zh-CN
:
error.required=该字段必填
Tratando
Utiliza un Firefox inglés que envía el encabezado de solicitud
Accept-Language:en-us,en;q=0.5
para visitar la accióntest
. El resultado es:Language from controller: Lang(en,), Message: This field is required Message in view: 该字段必填
Utiliza un chino de Google Chrome que envía el encabezado de la solicitud
Accept-Language:zh-CN,zh;q=0.8
a visitarla. El resultado es:Language: Lang(zh,CN), Message: 该字段必填 Message in view: 该字段必填
De las pruebas, sabemos que:
- El lenguaje implícito en el controlador es de
Accept-Language
- El lenguaje implícito del encabezado de la solicitud utilizada en la plantilla es determinado por el OS
Entorno:
- Play 2 es la última play2.1-instantánea en GitHub (2012-03-16)
- Mi sistema operativo es Windows 7 x64 versión china
creo Play 2 debe utilizar el mismo implícita lenguaje para controladores y vistas. I puede fijarlo mediante la adición de algo en Build.sbt
:
val main = PlayProject(...) (
templatesImport ++= Seq("utilis.TemplateMixin._")
)
Cuando el TemplateMixin
es simplemente: (. Se extiende controlador y es sólo para volver a usar algunos métodos, como implicit def lang(request)
)
object TemplateMixin extends play.api.mvc.Controller
Pero creo que debería hacerse con Play framework.
Gracias de nuevo. Se debe agregar una buena respuesta a los documentos de play2. – Freewind
¿Por qué no puede ser este el comportamiento predeterminado? Me imagino que la mayoría de las aplicaciones querrían que el Land implícito en la vista sea el mismo que se usa en el controlador. – Ike
Hacer esto el comportamiento predeterminado requeriría diferenciar entre las plantillas destinadas a ser utilizadas con los controladores Java (que no pueden proporcionar valores implícitos) y las plantillas destinadas a ser utilizadas con los controladores Scala. –