【发布时间】:2011-12-12 08:31:40
【问题描述】:
我们有一个网站将用于两个不同的客户。在第一次请求期间,将要求用户选择一个客户端。根据该文本,应显示标签和网站内容。
是否可以在 Play 框架中有两个消息文件,并且在会话启动期间将决定消息文件
根据我的研究,对于每个区域设置,我们可以拥有多个文件,消息将根据请求中的区域设置获取。
【问题讨论】:
标签: internationalization playframework
我们有一个网站将用于两个不同的客户。在第一次请求期间,将要求用户选择一个客户端。根据该文本,应显示标签和网站内容。
是否可以在 Play 框架中有两个消息文件,并且在会话启动期间将决定消息文件
根据我的研究,对于每个区域设置,我们可以拥有多个文件,消息将根据请求中的区域设置获取。
【问题讨论】:
标签: internationalization playframework
不,目前不支持。 您可以在插件中轻松做到这一点(Look at MessagesPlugin),甚至可以使用带有@onApplicationStartup 注释的bootstrap job
// From MessagesPlugin.java
//default languange messages
VirtualFile appDM = Play.getVirtualFile("conf/messages");
if(appDM != null && appDM.exists()) {
Messages.defaults.putAll(read(appDM));
}
static Properties read(VirtualFile vf) {
if (vf != null) {
return IO.readUtf8Properties(vf.inputstream());
}
return null;
}
【讨论】:
您可以编写自己的PlayPlugin 和处理工具play.PlayPlugin.getMessage(String, Object, Object...)。然后你可以选择正确的文件。 play.i18n.Messages 类可以作为实现该方法的灵感。
【讨论】:
通过以下解决方案解决了这个问题,
MessagesPlugIn,它扩展了play.i18n.MessagesPlugin
Messages,就像play.i18n.Messages
Messages.java 中有一个静态地图messaagesByClientID
MessagesPlugIn 中覆盖onApplicationStart()
messaagesByClientID 中的属性加载为locales 加载在play.i18n.MessagesPlugin
Messages.java 中有一个方法get(),从会话中基于ClientId 的messaagesByClientID 检索属性。如果该物业不可用,请致电get()play.i18n.Messages
7.创建了一个自定义标签il8nTag,并将其用于HTML模板。 il8nTag 将调用Messages.get() 中的方法。
【讨论】:
基于play.api.i18n.I18nModule 创建您自己的Module,但绑定到您自己的MessagesApi 实现,基于Play 的DefaultMessagesApi(here 是定义要加载的文件的部分)
然后在您的application.conf、disable Play's play.api.i18n.I18nModule 中启用您自己的模块。
【讨论】: