2012-05-03 17 views
6

Primera pregunta: ¿cómo puedo recuperar la traducción de un texto en un controlador?play framework 2.0 - internacionalización - cómo traducir un mensaje

Segunda pregunta: ¿cómo puedo recuperar la traducción de un texto en una plantilla?

la API dice que hay un método .get que traduce un mensaje:

http://www.playframework.org/documentation/api/2.0/java/play/i18n/Messages.html

Sin embargo mi aplicación no reconoce este método. Al abrir en eclipse, Message.class muestra que hay un método .apply en él, escrito en Scala y Java?

object Messages { 

    /** 
    * Translates a message. 
    * 
    * Uses `java.text.MessageFormat` internally to format the message. 
    * 
    * @param key the message key 
    * @param args the message arguments 
    * @return the formatted message or a default rendering if the key wasn’t defined 
    */ 
    def apply(key: String, args: Any*)(implicit lang: Lang): String = { 
    Play.maybeApplication.flatMap { app => 
     app.plugin[MessagesPlugin].map(_.api.translate(key, args)).getOrElse(throw new Exception("this plugin was not registered or disabled")) 
    }.getOrElse(noMatch(key, args)) 
    } 

Ahora eclipsar me dice que puedo invocar este método como este:

> String play.api.i18n.Messages.apply(String arg0, Seq<Object> arg1, 
> Lang arg2) 

Pero, ¿qué debo ingresar como argumento "Sec"?

--La solution--

El problema era que importé play.api.i18n.Messages en lugar de play.i18n.Messages ...

Habiendo definido dos archivos de mensajes (messages.de -DE y messages.en-UK) y utilizando el código siguiente todo funciona bien:

controlador:

import play.i18n.Messages; 
    import play.api.i18n.Lang; 

    Lang en = new Lang("en","GB"); 
    play.i18n.Lang en_lang = new play.i18n.Lang(en); 

    Lang de = new Lang("de", "DE"); 
    play.i18n.Lang de_lang = new play.i18n.Lang(de); 

    Logger.info(Messages.get("home.title")); 
    Logger.info(Messages.get(en_lang, "home.title")); 
    Logger.info(Messages.get(de_lang, "home.title")); 

application.conf

application.langs="en-GB,de-DE" 

Respuesta

10

Conseguir la traducción dentro del controlador:

// in messages file 
msg.key=Hello Translation 

// in you controller 
Messages.get("msg.key"); 

Incluso puede pasar parámetros:

// in messages file 
msg.key=Hello {0}, here is your translation 

//in controller 
Messages.get("msg.key", User.firstName); 

Desde el punto de vista que puede utilizar: Messages("msg.key")

Incluso puede aplicar HTML formateo (solo aplicable para vistas del curso):

// in messages file 
msg.key=Hello <strong>{0}</strong>, here is your translation 

// in controller 
Messages.get("msg.key", User.firstName); 

//in view 
@Html(objectInView) 

Tenga en cuenta lo siguiente: Actualmente no es posible definir el idioma de forma explícita, véase el informe de error: https://play.lighthouseapp.com/projects/82401/tickets/174-20-i18n-add-ability-to-define-implicit-lang-for-java-api

pregunta similar fue preguntado antes: Access translated i18n messages from Scala templates (Play! Internationalization)

i18n error: controller and templates uses different implicit languages

+0

My play framework no conoce el método Messages.get ("msg.key"). Lanza el error: no se puede encontrar el símbolo [symbol: method get (java.lang.String)] [location: class play.api.i18n.Messages] - ¿Tal vez estoy usando el Play Source incorrecto? En realidad, la consola dice "play! 2.0". Quizás seleccioné al crear mi aplicación para "1 - Crear una aplicación de Escala simple" en lugar de "2 - Crear una aplicación Java simple". ¿Podría ser esta una razón para este comportamiento? –

+0

Sí, este puede ser el caso, estoy usando una aplicación Java Play y no scala .. – adis

+0

hmm ... Me pregunto si he seleccionado "1 - simple scala app", pero lo probaré más adelante este día. Y no creo que este sea el motivo porque todos los archivos de plantilla creados en mi aplicación están en .java ;-) –

Cuestiones relacionadas