2012-05-03 17 views
6

Prima domanda: come posso recuperare la traduzione di un testo in un controller?play framework 2.0 - internazionalizzazione - come tradurre un messaggio

Seconda domanda: come posso recuperare la traduzione di un testo in un modello?

l'API dice che c'è un metodo .get che traduce un messaggio:

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

Tuttavia la mia domanda non riconosce questo metodo. Aprendo in eclissi Message.class mostra che c'è un metodo .apply in esso, scritto in Scala e 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)) 
    } 

Ora eclissare mi dice che posso richiamare questo metodo come questo:

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

Ma quello che devo entrare come l'argomento "Seq"?

--La solution--

Il problema era che ho importato play.api.i18n.Messages invece di play.i18n.Messages ...

aver definito due file dei messaggi (messages.de -DE e messages.en-UK) e utilizzando il seguente codice tutto funziona bene:

controller:

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

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

risposta

10

Ottenere la traduzione all'interno del controller:

// in messages file 
msg.key=Hello Translation 

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

È anche possibile passare parametri:

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

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

Dalla vista è possibile utilizzare: Messages("msg.key")

si può anche applicare HTML formattazione (applicabile solo per le viste del corso):

// 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) 

Si prega di notare quanto segue: Al momento non è possibile definire la lingua in modo esplicito, vedi bug report: https://play.lighthouseapp.com/projects/82401/tickets/174-20-i18n-add-ability-to-define-implicit-lang-for-java-api

domanda simile è stata fatta prima: Access translated i18n messages from Scala templates (Play! Internationalization)

i18n error: controller and templates uses different implicit languages

+0

Il mio framework di gioco non conosce il metodo Messages.get ("msg.key"). Genera l'errore: impossibile trovare il simbolo [simbolo: metodo get (java.lang.String)] [location: class play.api.i18n.Messages] - Forse sto usando la fonte di riproduzione sbagliata? In realtà la console dice "gioca! 2.0". Forse ho selezionato mentre creavo la mia app su "1 - Crea una semplice applicazione in scala" invece di "2 - Crea una semplice applicazione Java". Potrebbe essere questo un motivo per questo comportamento? –

+0

Sì, questo può essere il caso, sto usando un'app Java Play e non scala .. – adis

+0

hmm ... Mi meraviglia che abbia selezionato "1 - semplice scala app", ma ci riproverò più tardi. E non penso che questo sia il motivo perché tutti i file di modello creati nella mia app sono in .java ;-) –

Problemi correlati