我有一个简化的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之前可以工作...
答案 0 :(得分:2)
Messages
文档指出
...您可以将给定的
Lang
与MessagesApi
一起包装到 创建一个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。