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.enconf/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 中的更改

Play Framework 路由中的变量

Play Framework Routes 中的 Scala 反引号

Play Framework表单中的Scala奇怪类型错误

Play Framework 2.2.2 中的 OAuth

Play Framework Java 中的 POST 请求