如何在不重新启动的情况下重新加载 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)
}
}
似乎 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)
}
}