Controller:i18n errore: controller e modelli utilizzano diversi linguaggi impliciti
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>
Messaggi risorsa, conf/messages.zh-CN
:
error.required=该字段必填
Cercando
Utilizza un Firefox inglese che invia l'intestazione della richiesta
Accept-Language:en-us,en;q=0.5
per visitare l'azionetest
. Il risultato è:Language from controller: Lang(en,), Message: This field is required Message in view: 该字段必填
utilizza un Google Chrome cinese che manda l'intestazione della richiesta
Accept-Language:zh-CN,zh;q=0.8
a visitarla. Il risultato è:Language: Lang(zh,CN), Message: 该字段必填 Message in view: 该字段必填
Dai test, sappiamo che:
- La lingua implicita nel controller è da
Accept-Language
- La lingua implicita della intestazione di richiesta utilizzato in modello è determinato dal sistema operativo
Ambiente:
- Play 2 è l'ultima play2.1-SNAPSHOT da GitHub (2012-03-16)
- Il mio sistema operativo è Windows 7 x64 versione cinese
penso Play 2 dovrebbe utilizzare la stessa implicita lingua per controllori e viste. Posso risolvere il problema con l'aggiunta di qualcosa in Build.sbt
:
val main = PlayProject(...) (
templatesImport ++= Seq("utilis.TemplateMixin._")
)
Qualora il TemplateMixin
è solo: (. Si estende Controller e è solo quello di riutilizzare alcuni metodi, come implicit def lang(request)
)
object TemplateMixin extends play.api.mvc.Controller
Ma penso che dovrebbe essere fatto dal framework Play.
Grazie ancora. Una buona risposta dovrebbe essere aggiunta ai documenti di play2. – Freewind
Perché non può essere il comportamento predefinito? Immagino che la maggior parte delle app vorrebbe che la Land implicita nella vista sia la stessa utilizzata nel controller. – Ike
Per rendere questo comportamento predefinito è necessario distinguere tra i modelli destinati ad essere utilizzati con i controller Java (che non possono fornire valori impliciti) e i modelli destinati ad essere utilizzati con i controller Scala. –