为了账号安全,请及时绑定邮箱和手机立即绑定

Play Framework 1.3.2 中的多租户特定国际化

Play Framework 1.3.2 中的多租户特定国际化

莫回无 2021-12-30 17:28:20
我有一个用 Play Framework(版本 - 1.3.2)编写的应用程序。我已将其实现为基于多租户的应用程序。我关心的是保留特定于每个租户的 messages.en 文件,以便密钥保持不变,但文本会根据租户而变化,我将其用作:play/conf/tenant-folder/tenant_1/messages.enplay/conf/tenant-folder/tenant_2/messages.enplay/conf/messages.en(默认回退)我对扩展 MessagePlugin.java 类的实现有一些想法,但是我如何拦截 &{...} 以从 Messages.java 类的扩展实现中检索值。有什么帮助吗?
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

IMO 解决问题的正确方法是使用模块。messages.en为应用程序中的所有消息创建一个基础并将其放置在项目的 conf 文件夹中。之后,为每个租户创建一个模块。并添加一个messages.en仅包含您要为该租户覆盖的消息的文件。

将tenant_1 模块添加到dependencies.yml文件中时,文件中的messages.enmodules/tenant_1/conf/messages.en将覆盖应用程序消息。您将看到专门为您的租户提供的文本。


查看完整回答
反对 回复 2021-12-30
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我已经找到了解决这个问题的有效方法。

(在conf中创建一个文件夹,比如conf/tenant_1/messages.enconf/tenant_2/messages.en等)

  1. 创建一个类TenantMessagePlugin.java,它覆盖play.i18n.MessagesPlugin class. 给出onApplicationStart()方法的实现,加载N个租户的conf/tenant_N/messages.en文件。

  2. 创建一个文件/或使用相同的类并Map<tenant_id,properties file>为每个特定租户创建一个保存 messages.en 文件的文件。

  3. 在类TenantMessagePlugin,重写getMessage()的方法play.PlayPlugin的类(根插件父类),这将返回该消息从Map<>在请求(2)中创建的租户,如果密钥被发现返回的值否则返回空。返回 null 将回退到原始消息。en [实际实现play.PlayPlugin为所有其他类返回 null,但我们明确地钩住我们的方法以返回键的值 - 而播放插件有一个额外的类,例如play.i18n.Messages.javato hold Map<locale, properties>]

  4. 在其中创建一个文件conf/play.plugins并添加这一行 {priority:package_name:class_name} 例如490:tenantcustomisation.TenantMessagePlugin where 490 - 自定义插件的优先级(应该高于默认值,MessagesPlugin以便框架首先检查租户的 messages.en 文件)

这肯定可以工作,并且&{'key'}从 html 文件中返回getMessage()方法所需的值


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信