Scala 如何在不重新启动的情况下重新加载messages.en?
似乎只有当我重新编译/重新启动应用程序时,Scala 如何在不重新启动的情况下重新加载messages.en?,scala,playframework,internationalization,Scala,Playframework,Internationalization,似乎只有当我重新编译/重新启动应用程序时,messages.en文件才会重新加载。在Prod模式下,如何在不重新启动的情况下重新加载它 我正在使用Play 2.3简短回答:绕过依赖注入单例,创建我们自己的MessagesApi: implicit val messagesApi = new DefaultMessagesApi(Environment.simple(), current.configuration, new DefaultLangs(current.configuration))
messages.en
文件才会重新加载。在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
中禁用了play框架中的默认messageapi,并编写了一个新的messageapi插件,然后通过在`conf/play.plugins中添加一行1001:services.DMessages
来启用它。dmessage的实现是:
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)
}
}
谢谢你的回答。似乎
DefaultMessagesApi
仅在播放2.4中可用。很抱歉,我忘了提到我当前的系统在播放2.3