Многопользовательская интернационализация в Play Framework 1.3.2 - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть приложение, написанное на Play Framework (версия - 1.3.2).

Я реализовал его как мультитенантное приложение. Моя задача - сохранить файл messages.en, специфичный для каждого арендатора, так, чтобы ключ оставался таким же, но текст изменился в соответствии с арендатором, который я бы включил в игру как:

Воспроизведение / CONF / жилец папка / tenant_1 / messages.en
воспроизведение / CONF / жилец папка / tenant_2 / messages.en
play / conf / messages.en (запасной вариант по умолчанию)

У меня есть идея о расширении реализации класса MessagePlugin.java, но как мне перехватить & {...}, чтобы получить значения из расширенного класса реализации Messages.java. Любая помощь?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я нашел рабочее решение этой проблемы.

(Создайте папку в conf, например conf / tenant_1 / messages.en ; conf / tenant_2 / messages.en и т. Д.)

  1. Создайте класс TenantMessagePlugin.java, который переопределяет play.i18n.MessagesPlugin class. Дайте реализацию метода onApplicationStart(), чтобы загрузить conf / tenant_N / messages.en файл из N арендаторов.
  2. Создайте файл / или используйте тот же класс и создайте Map<tenant_id,properties file>, который содержит файл messages.en для каждого конкретного арендатора.
  3. В классе TenantMessagePlugin, переопределить метод getMessage() класса play.PlayPlugin (родительский класс корневого плагина), это вернет сообщение из Map<>, созданного в (2) для арендатора в запросе, если ключ найден вернуть значение, иначе вернуть ноль. Возврат значения null приведет к возврату к исходным messages.en [Фактическая реализация play.PlayPlugin возвращает ноль для всех других классов, но мы явно подключаем наш метод для возврата значения ключа - тогда как игровые плагины имеют дополнительный класс, например. play.i18n.Messages.java удерживать Map<locale, properties>]
  4. создайте файл в conf/play.plugins и добавьте эту строку {приоритет: имя_пакета: имя_класса} например 490:tenantcustomisation.TenantMessagePlugin где 490 - приоритет пользовательского плагина (должен быть выше, чем по умолчанию MessagesPlugin, чтобы платформа сначала проверила файл messages.en арендатора)

Это определенно должно работать, и &{'key'} из html-файлов возвращает желаемое значение из getMessage() method

0 голосов
/ 22 ноября 2018

ИМО правильный способ решить вашу проблему - использовать модули. Создайте базу messages.en для всех сообщений в вашем приложении и поместите ее в папку conf вашего проекта. После этого создайте модуль для каждого арендатора. И добавьте файл messages.en, включающий только те сообщения, которые вы хотите переопределить для этого клиента.

Когда вы добавляете модуль tenant_1 в ваш файл dependencies.yml, клавиши messages.en в файле modules/tenant_1/conf/messages.en переопределяют сообщения приложения. И вы увидите текст, специально предназначенный для вашего арендатора.

...