迁移到 2.6:lang 没有从请求中隐式传播出去
Migrating to 2.6: lang is not being implicitly propagated out of the request
我有一个控制器的简化版本,如下所示(请参阅完整文件 here):
@Singleton
class Application @Inject() (implicit
indexView: views.html.index,
deadbolt: DeadboltActions,
userService: UserService) extends InjectedController with I18nSupport {
import scala.concurrent._
def index =
TryCookieAuthAction { implicit jContext =>
deadbolt.WithAuthRequest()() { implicit request =>
Future {
implicit val lang = request.acceptLanguages.head
Ok(indexView(userService))
}
}
}
}
我遇到的问题是,如果我评论 lang
的显式提取,那么视图将看不到它。这是为什么?它曾经在 Play 2.6 之前工作...
Messages
文档指出
...you can wrap a given Lang
together with the MessagesApi
to
create a play.api.i18n.Messages
instance.
所以考虑重构视图
implicit messages: Messages
而不是
implicit messagesApi: MessagesApi, lang: Lang
这样我们就不必显式处理 Lang
,因为 I18nSupport.request2messages
隐式转换会在后台处理。
例如,假设我们有以下 view/index.scala.html
@()(implicit messages: Messages)
@messages("salutation")
以及以下英文外化消息conf/messages.en
salutation=live long and prosper
以及以下意大利语外化信息conf/messages.it
salutation=vivi a lungo ed in prosperita
以及以下允许的语言 conf/application.conf
play.i18n.langs = [ "en", "it" ]
然后控制器不需要显式处理 Lang
只要我们扩展 I18nSupport
并且在范围内有一个隐式请求
@Singleton
class HomeController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {
def index = Action { implicit request =>
Ok(views.html.index())
}
}
现在带有 Accept-Language: it
header 的 HTTP 请求应该以
响应
vivi a lungo ed in prosperita
同时一个 Accept-Language: en
和
live long and prosper
我有一个控制器的简化版本,如下所示(请参阅完整文件 here):
@Singleton
class Application @Inject() (implicit
indexView: views.html.index,
deadbolt: DeadboltActions,
userService: UserService) extends InjectedController with I18nSupport {
import scala.concurrent._
def index =
TryCookieAuthAction { implicit jContext =>
deadbolt.WithAuthRequest()() { implicit request =>
Future {
implicit val lang = request.acceptLanguages.head
Ok(indexView(userService))
}
}
}
}
我遇到的问题是,如果我评论 lang
的显式提取,那么视图将看不到它。这是为什么?它曾经在 Play 2.6 之前工作...
Messages
文档指出
...you can wrap a given
Lang
together with theMessagesApi
to create aplay.api.i18n.Messages
instance.
所以考虑重构视图
implicit messages: Messages
而不是
implicit messagesApi: MessagesApi, lang: Lang
这样我们就不必显式处理 Lang
,因为 I18nSupport.request2messages
隐式转换会在后台处理。
例如,假设我们有以下 view/index.scala.html
@()(implicit messages: Messages)
@messages("salutation")
以及以下英文外化消息conf/messages.en
salutation=live long and prosper
以及以下意大利语外化信息conf/messages.it
salutation=vivi a lungo ed in prosperita
以及以下允许的语言 conf/application.conf
play.i18n.langs = [ "en", "it" ]
然后控制器不需要显式处理 Lang
只要我们扩展 I18nSupport
并且在范围内有一个隐式请求
@Singleton
class HomeController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {
def index = Action { implicit request =>
Ok(views.html.index())
}
}
现在带有 Accept-Language: it
header 的 HTTP 请求应该以
vivi a lungo ed in prosperita
同时一个 Accept-Language: en
和
live long and prosper