我有一个巨大的消息文件,我需要将其拆分为不同语言的多个文件。 例如:
我为英语语言环境创建了一个文件夹,即en和另一个用于法语区域设置的文件夹,fr在conf文件夹中。 en包含messages1_en.properties和messages2_en.properties fr包含messages1_fr.properties和messages2_fr.properties
如何在我的视图中访问这些属性文件。
由于
答案 0 :(得分:0)
在没有引入您自己的替代实现并使用它而不是内置消息的情况下,唯一的方法是使用被黑客入侵的语言环境,因此您可以使用fr_type1,fr_type2或类似的方法来选择正确的替代方案。
这可能是一个坏主意,因为以不同于预期的方式使用API总是有风险的,存在意外行为的高风险,并且它可能很脆弱,因为无法保证你将来可以在未来版本中使用组合的语言环境等。
如果你看一下Messages实现,你可能会得到一些关于如何自己实现自己的想法。
祝你好运!答案 1 :(得分:0)
这是一个古老的问题,但是我有一个很接近的问题,而且我在任何地方都找不到解决方案。
此示例使用配置键从具有自定义名称的文件中加载消息。但是您可以轻松地对其进行修改,以从子目录和/或多个消息文件中加载消息文件。
覆盖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"))
}
}
在Module.java
@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)
}