【问题标题】:How to split messages file into multiple files in play 2.0 framework如何在play 2.0框架中将消息文件拆分为多个文件
【发布时间】:2013-11-08 07:41:38
【问题描述】:

我有一个巨大的消息文件,我需要将其拆分为不同语言的多个文件。 例如:

我为英语语言环境创建了一个文件夹,即 en 和另一个用于法语语言环境的文件夹,fr 在 conf 文件夹中。 en 包含 messages1_en.properties 和 messages2_en.properties fr 包含 messages1_fr.properties 和 messages2_fr.properties

如何在我的视图中访问这些属性文件。

谢谢

【问题讨论】:

    标签: html playframework-2.0


    【解决方案1】:

    在不引入您自己的替代实现并使用它而不是内置消息的情况下做到这一点的唯一方法是使用被黑的语言环境,因此您可以执行 fr_type1、fr_type2 或类似的操作来选择正确的替代方案。

    这可能是个坏主意,因为以与预期使用方式不同的方式使用 API 总是有风险的,出现意外行为的风险很高,而且它可能很脆弱,因为无法保证您将能够在未来的版本等中使用虚构的语言环境。

    如果您查看 Messages 实现,您可能会得到一些关于如何轻松实现自己的想法。

    祝你好运!

    【讨论】:

    • 我试图了解 Messages 的实现,但我无法理解何时以及调用哪个 Messages 类。在 framework/src 中,有一个 Messages.java ,在 scala 中也有 Message 类我可以在 play 2.10 jar 中看到多个 Messages 和 Messages$ 类文件。我很困惑...请帮助我
    • 请确认 Play 2.0 国际化功能中任何其他语言的标签转换是服务器端还是客户端工作。
    • 有一个 Java 消息实现,它只调用 Scala 实现。转换在服务器端完成。
    【解决方案2】:

    这是一个老问题,但我有一个很接近的问题,我在任何地方都没有找到解决方案。

    此示例使用配置键从具有自定义名称的文件中加载消息。但您可以轻松修改它以从子目录和/或多个消息文件加载消息文件。

    1. 覆盖play.api.i18n.DefaultMessagesApiProvider

      @Singleton
      class CustomMessagesApiProvider  @Inject() (
                                                  environment: Environment,
                                                  config: Configuration,
                                                  langs: Langs,
                                                  httpConfiguration: HttpConfiguration)
        extends DefaultMessagesApiProvider(environment, config, langs, httpConfiguration) {
      
      
        def filename =
          config.get[String]("play.i18n.filename")
      
        override protected def loadAllMessages: Map[String, Map[String, String]] = {
          langs.availables.map(_.code).map { lang =>
            (lang, loadMessages(filename +"."  + lang))
          }.toMap
            .+("default" -> loadMessages(filename))
            .+("default.play" -> loadMessages(filename+".default"))
        }
      
      }
      
    2. Module.java中添加Guice绑定

      @Override
      public void configure() {
          bind(DefaultMessagesApiProvider.class).to(CustomMessagesApiProvider.class);
      }
      

    这是我的第一个 Scala 课程,所以也许可以改进。但它有效。

    加载多个文件(编译但未测试)

        override protected def loadAllMessages: Map[String, Map[String, String]] = {
          langs.availables.map(_.code).map { lang =>
            (lang,
              loadMessageFiles("." + lang))
          }.toMap
            .+("default" -> loadMessageFiles(""))
            .+("default.play" -> loadMessageFiles(".default"))
        }
    
        private def loadMessageFiles(suffix: String) = {
          loadMessages("messages-1" + suffix) ++ loadMessages("messages-2" + suffix)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多