0

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 ??

+0

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

Répondre

1

La réponse courte est que vous ne déclarez pas cy-GB comme langue, mais que vous essayez d'y accéder.

La réponse longue est que vous êtes trop compliquer les choses. Voici un exemple pour illustrer le changement de langue avec un code minimal.

Le modèle

Ceci affichera un message des messages pertinents fichier ainsi que de montrer l'lang dérivé de l'en-tête de demande.

@()(implicit messages: Messages, lang: Lang) 

<h3>@messages("greeting")</h3> 

<p>Current = @lang</p> 
<ul> 
    <li><a href="@routes.LanguageController.switchToLanguage("en")">English</a></li> 
    <li><a href="@routes.LanguageController.switchToLanguage("cy")">Welsh</a></li> 
</ul> 

La configuration

Déclarez les langues que vous souhaitez soutenir:

play.i18n.langs = [ "en", "cy" ] 

Le contrôleur demande

La seule chose spéciale est le trait I18nSupport ici.

package controllers 

import javax.inject.Inject 

import play.api.i18n.{I18nSupport, MessagesApi} 
import play.api.mvc.{Action, Controller} 
import views.html.index 

import scala.concurrent.{ExecutionContext, Future} 

class FooController @Inject()(val messagesApi: MessagesApi, 
           exec: ExecutionContext) extends Controller with I18nSupport { 

    def home = Action.async { implicit request => 
    Future {Ok(index())}(exec) 
    } 
} 

Changer la langue

Encore une fois, rien un soutien particulier et pas supplémentaire.

package controllers 

import javax.inject.Inject 

import play.api.i18n._ 
import play.api.mvc._ 

class LanguageController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport { 

    def switchToLanguage(language: String) = Action { implicit request => 
    Redirect(routes.FooController.home()).withLang(Lang(language)) 
    } 
} 

Les traductions

conf/messages.en

greeting=Good morning 

conf/messages.cy

greeting=Bore da 

circuits

GET /     controllers.FooController.home 
GET  /lang/:lang   controllers.LanguageController.switchToLanguage(lang: String) 

C'est tout ce dont vous avez besoin

L'exécution de cette affiche d'abord dans la langue de votre navigateur utilise. Cliquez sur un lien pour passer à la langue sélectionnée.

enter image description here

enter image description here