如何在不重新启动的情况下重新加载 messages.en?

How to reload messages.en without restarting?

似乎 messages.en 文件仅在我 recompile/restart 应用程序时重新加载。如何在 Prod 模式下不重启就重新加载它。

我正在使用 Play 2.3

简短回答:绕过依赖注入的单例,并创建我们自己的 MessagesApi:

implicit val messagesApi = new DefaultMessagesApi(Environment.simple(), current.configuration, new DefaultLangs(current.configuration))

长答案:

Play 的 MessagesApi 对象是单例,这意味着我们始终使用同一个实例:

@Singleton
class DefaultMessagesApi @Inject() (environment: Environment, configuration: Configuration, langs: Langs) extends MessagesApi { ...

及其保存所有消息的 messages 字段是不可变的。

val messages: Map[String, Map[String, String]] = loadAllMessages

我们无法修改它。

但是...我们可以创建自己的 MessagesApi 并使用它。例如:

implicit val messagesApi = new DefaultMessagesApi(Environment.simple(), current.configuration, new DefaultLangs(current.configuration))

感谢 bjfletcher 的建议,我已经解决了我的问题。

基本上,我通过将 defaultmessagesplugin=disabled 添加到 application.conf 来禁用播放框架中的默认消息 api 并编写一个新消息 api 插件然后通过添加一行启用它1001:services.DMessages 在`conf/play.plugins 中。 DMessages 的实现是:

package services
import play.api.Application
import play.api.i18n.{MessagesApi, MessagesPlugin}
class DMessages(app: Application) extends MessagesPlugin{
  override def enabled = true

  /**
   * This is where we read messages.en file and map it back to messages and pass into MessageApi
   * @return MessageApi that contained mapped messages
   */
  override def api: MessagesApi = {
    var messages:Map[String,Map[String,String]] = Map()
    messages = messages ++ Map("language" -> Map("key"-> "value")) //e.g. Map("en" -> Map("hello" -> "Hello world!"))
    MessagesApi(messages)
  }
}