Play Framework 1.3.2 中的多租户特定国际化
Posted
技术标签:
【中文标题】Play Framework 1.3.2 中的多租户特定国际化【英文标题】:Multi-tenant specific internationalization in Play Framework 1.3.2 【发布时间】:2018-11-05 09:27:02 【问题描述】:我有一个用 Play Framework(版本 - 1.3.2)编写的应用程序。
我已将其实现为基于多租户的应用程序。 我关心的是保持messages.en文件特定于每个租户,这样密钥保持不变,但文本会根据租户而变化,我将把它作为:
play/conf/tenant-folder/tenant_1/messages.en play/conf/tenant-folder/tenant_2/messages.en play/conf/messages.en(默认后备)
我对扩展 MessagePlugin.java 类的实现有一些想法,但是如何拦截 &... 以从 Messages.java 类的扩展实现中检索值。 有什么帮助吗?
【问题讨论】:
【参考方案1】:IMO 解决问题的正确方法是使用模块。为应用程序中的所有消息创建一个基础messages.en
,并将其放在项目的 conf 文件夹中。之后,为每个租户创建一个模块。并添加一个 messages.en
文件,其中仅包含您要为该租户覆盖的消息。
当您将tenant_1 模块添加到您的dependencies.yml
文件时,modules/tenant_1/conf/messages.en
文件中的messages.en
键将覆盖应用程序消息。您将看到专门针对您的租户的文本。
【讨论】:
【参考方案2】:我找到了解决这个问题的有效方法。
(在conf中创建一个文件夹,如conf/tenant_1/messages.en;conf/tenant_2/messages.en等)
-
创建一个类
TenantMessagePlugin.java
,它会覆盖play.i18n.MessagesPlugin class
。
给出onApplicationStart()
方法的实现,加载N个租户的conf/tenant_N/messages.en文件。
创建一个文件/或使用相同的类并创建一个Map<tenant_id,properties file>
,其中包含每个特定租户的messages.en 文件。
在TenantMessagePlugin
类中,覆盖play.PlayPlugin
类(根插件父类)的getMessage()
方法,这将返回来自Map<>
在(2)中为租户在请求中创建的消息,如果找到密钥返回值,否则返回null。返回 null 将回退到原始消息。
[play.PlayPlugin
的实际实现为所有其他类返回 null,但我们显式挂钩我们的方法以返回键值 - 而 play 插件有一个额外的类,例如play.i18n.Messages.java
持有Map<locale, properties>
]
在conf/play.plugins
中创建一个文件并添加这一行priority:package_name:class_name
例如490:tenantcustomisation.TenantMessagePlugin
其中 490 - 自定义插件的优先级(应高于默认 MessagesPlugin
以便框架首先检查租户的 messages.en 文件)
这绝对可以工作,并且来自 html 文件的 &'key'
从 getMessage()
方法返回所需的值
【讨论】:
以上是关于Play Framework 1.3.2 中的多租户特定国际化的主要内容,如果未能解决你的问题,请参考以下文章
Play Framework:如何不查看文件夹以了解 Play Framework 中的更改