J'ai une bibliothèque qui permet à un utilisateur de basculer entre l'anglais et le gallois pendant une session de navigateur qui fonctionne avec Play 2.3. Après le passage à Play 2.5, cette bibliothèque ne fonctionne plus. J'ai essayé de suivre la 'documentation' au https://www.playframework.com/documentation/2.5.x/ScalaI18N mais jusqu'ici je n'ai pas eu de chance.Lecture 2.5 I18n - Changement de langue
Ma mise en œuvre jusqu'à présent est:
modèle Twirl contenant le commutateur
@import play.api.Play.current
@import play.api.i18n.Messages.Implicits._
@import uk.my-org.urls.Link
@(langMap : Map[String, Lang], langToCall : (String => Call), customClass: Option[String] = None)(implicit lang: Lang)
<p>Current = @lang</p>
<p class="@if(customClass.isDefined) {@customClass.get}">
@langMap.map { case (key: String, value: Lang) =>
@if(lang.code != value.code) {
@Link.toInternalPage(
id = Some(s"$key-switch"),
url = s"${langToCall(key)}",
value = Some(key.capitalize)
).toHtml
} else {
@key.capitalize
}
@if(key != langMap.last._1) { @Html(" | ") }
}
</p>
page contenant le commutateur
@import uk.my-org.exampleplay25.controllers.LanguageController
@import play.api.Application
@import play.api.i18n.Messages
@()(implicit request: Request[_], application: Application, messages: Messages, lang: Lang, messagesApi: MessagesApi)
<h1 id="message">Hello from example-play-25-frontend !</h1>
<h1>@Messages("test.message")</h1>
@clc = @{ Application.instanceCache[LanguageController].apply(application) }
@uk.my-org.exampleplay25.views.html.language_selection(clc.languageMap, clc.langToCall, Some("custom-class"))
Le SwitchingController
package uk.my-org.exampleplay25.controllers
import javax.inject.Inject
import play.api.Play
import play.api.i18n._
import play.api.mvc._
import uk.my-org.play.config.RunMode
class LanguageController @Inject()(implicit val messagesApi: MessagesApi, lang: Langs) extends Controller with I18nSupport with RunMode {
protected def fallbackURL: String = Play.current.configuration.getString(s"$env.language.fallbackUrl").getOrElse("/")
def languageMap: Map[String, Lang] = Map(
"english" -> Lang("en"),
"cymraeg" -> Lang("cy-GB"),
"french" -> Lang("fr")
)
def langToCall(lang: String): Call = routes.LanguageController.switchToLanguage(lang)
def switchToLanguage(language: String) = Action { implicit request =>
val lang = languageMap.getOrElse(language, LanguageUtils.getCurrentLang)
val redirectURL = request.headers.get(REFERER).getOrElse(fallbackURL)
Redirect(redirectURL).withLang(Lang.apply(lang.code)).flashing(LanguageUtils.FlashWithSwitchIndicator)
}
}
Application.conf
play.i18n.langs = [ "en", "cy", "fr" ]
routes App
GET /hello-world @uk.my-org.exampleplay25.controllers.HelloWorld.helloWorld
GET /language/:lang @uk.my-org.exampleplay25.controllers.LanguageController.switchToLanguage(lang: String)
Bonjour contrôleur monde
package uk.my-org.exampleplay25.controllers
import javax.inject.{Inject, Singleton}
import play.api.Play.current
import play.api.i18n.{I18nSupport, MessagesApi}
import play.api.mvc._
import uk.my-org.play.frontend.controller.FrontendController
import scala.concurrent.Future
@Singleton
class HelloWorld @Inject()(implicit val messagesApi: MessagesApi) extends FrontendController with I18nSupport {
val helloWorld = Action.async { implicit request =>
Future.successful(Ok(uk.my-org.exampleplay25.views.html.helloworld.hello_world()))
}
}
Quelqu'un peut-il voir ce que je fais mal ??
Il est trop code et la question n'a pas vraiment été rétréci vers le bas du tout. Je vous suggère d'abord migrer pour jouer 2.4 et vérifier si cela fonctionne. Puis migrez vers 2.5. Si cela ne fonctionne pas, essayez d'affiner le problème et essayez d'identifier à quel point le code ne se comporte plus comme prévu. – rethab