2012-05-03 22 views
6

Pierwsze pytanie: jak mogę odzyskać tłumaczenie tekstu w kontrolerze?gra framework 2.0 - internacjonalizacja - jak tłumaczyć wiadomość

Drugie pytanie: jak mogę odzyskać tłumaczenie tekstu w szablonie?

API mówi, że istnieje metoda, która przekłada .get wiadomość:

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

Jednak moja aplikacja nie rozpoznaje tej metody. Otwieranie w eclipse Message.class pokazuje, że istnieje metoda .apply, napisana w Scala i 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)) 
    } 

Teraz zaćmienie mówi mi, że mogę wywołać tę metodę tak:

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

Ale co mam wpisać jako „Seq” argumentu?

--The solution--

Problemem było to, że importowany play.api.i18n.Messages zamiast play.i18n.Messages ...

Po zdefiniowaniu dwóch plików wiadomość (messages.de -DE i messages.en-UK) i przy użyciu kodu następujące wszystko działa poprawnie:

Kontroler:

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" 

Odpowiedz

10

Pierwsze tłumaczenie wewnątrz sterownika:

// in messages file 
msg.key=Hello Translation 

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

Można nawet przekazać parametry:

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

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

z widoku można użyć: Messages("msg.key")

Można nawet zastosować HTML formatowanie (dotyczy tylko widoków oczywiście):

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

Proszę zwrócić uwagę na następujące: Obecnie nie jest to możliwe w celu określenia języka wyraźnie, patrz raport o błędzie: https://play.lighthouseapp.com/projects/82401/tickets/174-20-i18n-add-ability-to-define-implicit-lang-for-java-api

Podobne pytanie został poproszony wcześniej: Access translated i18n messages from Scala templates (Play! Internationalization)

i18n error: controller and templates uses different implicit languages

+0

Moja struktura gry nie zna metody Messages.get ("msg.key"). Zgłasza błąd: nie można znaleźć symbolu [symbol: method get (java.lang.String)] [location: class play.api.i18n.Messages] - Może używam złego źródła gry? Właściwie konsola mówi "play! 2.0". Może podczas tworzenia mojej aplikacji wybrałem opcję "1 - Utwórz prostą aplikację" zamiast "2 - Utwórz prostą aplikację Java". Czy to może być powód takiego zachowania? –

+0

Tak, tak może być, używam aplikacji Java Play, a nie scala .. – adis

+0

hmm ... Zastanawiam się, że wybrałem "1 - prosta aplikacja scala", ale spróbuję później tego dnia. I nie sądzę, że to jest powód, ponieważ wszystkie pliki szablonów utworzone w mojej aplikacji są w .java ;-) –