迁移到2.6:lang不会隐式传播到请求之外

时间:2019-05-07 22:23:57

标签: scala playframework playframework-2.6

我有一个简化的Controller版本,看起来像这样(请参见完整文件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之前可以工作...

1 个答案:

答案 0 :(得分:2)

Messages文档指出

  

...您可以将给定的LangMessagesApi一起包装到   创建一个play.api.i18n.Messages实例。

因此请考虑重构视图以获取

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标头的HTTP请求应该以

响应
vivi a lungo ed in prosperita

Accept-Language: en一起使用

live long and prosper

也考虑使用I18N API Migration guide