spring / thymeleaf i18n для содержимого базы данных

Мне нужно локализовать существующее приложение, написанное на тимелеафе и пружине 4. Для статического контента хорошо работает создание messages_FR.properties и messages_ES.properties, а также традиционная стратегия Spring i18n.

Проблема возникает из-за динамического содержимого (хранящегося в записи базы данных). Предыдущая версия содержания была показана th:text="${product.title}".

Теперь содержимое базы данных локализовано путем дублирования полей с суффиксом lang, поэтому для таблицы product и строки title у меня есть две дополнительные строки title_ES и title_FR

и теперь мне нужно сделать этот дисплей локальным, т.е. для французского локального он должен использовать th:text="${product.title_FR}" или что-то вроде th:text=${@beans.i18n(product.title)}

Как рекомендуется реализовать такую ​​логику?

Любая помощь приветствуется.


person Yev    schedule 15.08.2016    source источник
comment
Непонятно, что вы имели в виду - предыдущая версия контента отображалась с помощью th: text = $ {product.title}, и теперь мне нужно сделать это отображение локальным. Если это в базе данных, о какой локализации вы говорите ??   -  person sanluck    schedule 15.08.2016
comment
Извините, если быть не очень точным. Я обновил пост. Да, локальные данные хранятся в БД, и я спрашивал, как реализовать логику, связанную с i18n, в существующих представлениях.   -  person Yev    schedule 15.08.2016
comment
Я думаю, вам нужно расширить Thymeleaf своим собственным диалектом для этого сложного решения. Предположим, что лучше создать в базе данных дополнительную колонку «локализация» и прослушивать локализацию на более высоком уровне.   -  person sanluck    schedule 15.08.2016


Ответы (1)


У вас есть несколько возможностей:

  • используйте свой собственный bean-компонент, такой как ваш i18n, и используйте th:text. Вы можете использовать LocaleContextHolder для доступа к языку запроса (не совсем уверен в имени). У вас будет полный контроль над тем, как разрешить ключи.
  • напишите MessagesResolver, который разрешает ключи в базе данных. Затем вы используете стандартное выражение для i18n: #{...}. Возможно, вам придется позаботиться об удалении кеша, поскольку при разрешении сообщений используется внутренний кеш.

Писать собственный диалект не обязательно, поскольку в большинстве случаев это просто для того, чтобы обернуть некоторые вызовы bean-компонентов в более удобный синтаксис.

Вероятно, самый простой подход - использовать bean-компонент и соответствующим образом адаптировать текстовые выражения. Второй подход имеет то преимущество, что все сообщения будут разрешаться в базе данных, и вы можете легко переопределить значения внутри файлов свойств во время выполнения.

person Martin Frey    schedule 15.08.2016