We finally resolved it by doing this Filter:
package controllers.Filters
import play.api.Play
import play.api.Play.current
import play.api.http.HeaderNames
import play.api.i18n.Lang
import play.api.mvc._
import scala.concurrent.Future
object LangFilter extends Filter {
def apply (nextFilter: (RequestHeader) => Future[Result]) (request: RequestHeader): Future[Result] = {
val applicationLangs = Lang.availables
val requestlangs: Seq[Lang] = request.acceptLanguages
val countryLessLangs: Seq[Lang] = requestlangs.map(l => Lang(l.language)) //we use them as defaults for latam countries (es,pt,en)
val maybeLangFromCookie: Option[Lang] = request.cookies.get(Play.langCookieName).flatMap(c => Lang.get(c.value))
//First, read from cookie
val l: Lang = maybeLangFromCookie.getOrElse {
//Second, look for the lang in request headers
requestlangs.collectFirst(Function.unlift {
lang => applicationLangs.find(_.satisfies(lang))
}).getOrElse {
//Third, we remove the COUNTRY from the headers, "pt-BR" -> "pt" and look for the lang
countryLessLangs.collectFirst(Function.unlift {
lang => applicationLangs.find(_.satisfies(lang))
}).getOrElse(applicationLangs.headOption.getOrElse(Lang.defaultLang))
//Finally, we use the first on the application.conf list.
}
}
//After finding the language, we set it as the "Accept-Language" Header while clonning the request.
val newHeaders = new Headers { val data = (request.headers.toMap + (HeaderNames.ACCEPT_LANGUAGE -> Seq(l.code))).toList }
nextFilter(request.copy(headers = newHeaders))
}
}