【问题标题】:play framework 2.0 - internationalization - how to translate a messageplay framework 2.0 - 国际化 - 如何翻译消息
【发布时间】:2012-05-03 17:32:02
【问题描述】:

第一个问题:如何在控制器中检索文本的翻译?

第二个问题:如何在模板中检索文本的翻译?

api 说有一个 .get 方法可以翻译消息:

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

但是我的应用程序无法识别此方法。在 Eclipse 中打开 Message.class 显示其中有一个 .apply 方法,用 Scala 和 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))
  }

现在 eclipse 告诉我,我可以像这样调用这个方法:

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

但是我应该输入什么作为“Seq”参数?

--解决办法--

问题是我导入了 play.api.i18n.Messages 而不是 play.i18n.Messages ...

定义了两个消息文件(messages.de-DE 和 messages.en-UK)并使用以下代码一切正常:

控制器:

    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"));

应用程序.conf

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

【问题讨论】:

    标签: internationalization playframework-2.0


    【解决方案1】:

    在控制器内部获取翻译:

    // in messages file
    msg.key=Hello Translation
    
    // in you controller
    Messages.get("msg.key");
    

    你甚至可以传递参数:

    // in messages file
    msg.key=Hello {0}, here is your translation
    
    //in controller
    Messages.get("msg.key", User.firstName);
    

    从视图上你可以使用:Messages("msg.key")

    您甚至可以应用 HTML 格式(当然只适用于视图):

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

    请注意以下几点: 目前无法明确定义语言,请参阅错误报告:https://play.lighthouseapp.com/projects/82401/tickets/174-20-i18n-add-ability-to-define-implicit-lang-for-java-api

    之前有人问过类似的问题: Access translated i18n messages from Scala templates (Play! Internationalization)

    i18n error: controller and templates uses different implicit languages

    【讨论】:

    • 我的播放框架不知道 Messages.get("msg.key") 方法。它抛出错误:找不到符号 [symbol: method get(java.lang.String)] [location: class play.api.i18n.Messages] - 也许我使用了错误的播放源?实际上控制台说“玩!2.0,”。也许我在创建我的应用程序时选择了“1 - 创建一个简单的 Scale 应用程序”而不是“2 - 创建一个简单的 Java 应用程序”。这可能是这种行为的原因吗?
    • hmm... 我想知道我选择了“1 - 简单的 scala 应用程序”,但我会在今天晚些时候试一试。而且我不认为这是原因,因为在我的应用程序中创建的所有模板文件都在 .java 中;-)
    • hmm.. 我正在导入“import play.api.i18n.Messages;”。框架如何决定是使用 Java 还是 Scala 类?这是某处的配置吗?它显然使用了 Scala 类。
    • 不只是在 Play2 中,确切的方法是 Messages("your key") 没有 get 方法。那是 Play1。
    • @i.am.michiel:甚至在代码中?在您看来是对的,但在 Java 代码中我必须使用:Messages.get("key"),如文档中所述(对于 java):github.com/playframework/Play20/wiki/JavaI18N
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2019-06-08
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多