迁移到 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

也考虑I18N API Migration guide