Как я могу реорганизовать разметку HTML из моих файлов свойств?

Недавно я унаследовал интернационализированное веб-приложение Struts 1.1 с большим количеством текста. Многие файлы JSP выглядят так:

<p>
    <bean:message key = "alert" />
</p>

а файлы свойств выглядят так:

messages.properties
alert=Please update your <a href = "/address.do">address</a> and <a href = "/contact.do">contact information</a>.

с соответствующими переводами на N других языков (messages_fr.properties и т. д.).

Проблемы:

  1. СУХОЕ нарушение - у меня есть N ссылок на URL-адреса действий Struts вместо 1, что делает рефакторинг URL-адресов действий подверженным ошибкам.
  2. Смешанные опасения - разметка моего приложения теперь находится не только в моих файлах JSP, что затрудняет настройку разметки веб-специалистом (с использованием CSS и т. д.).
  3. Разметка после перевода - Каждый раз, когда я получаю только что переведенный текст, я должен решить, что окружать разметкой <a>...</a>. Легко для английского, но в меньшей степени для незнакомых языков.

Я подумал о добавлении заполнителей в файл сообщений, например:

alert=Please update your {0} and {1}.

но тогда слова «адрес» и «контактная информация» нужно как-то локализовать, обернуть разметкой и передать в мой тег сообщения - и я не вижу простого способа сделать это.

Что я могу сделать, чтобы это улучшить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
2 595
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Возможно:

#
alert=Please update your {0}address{1} and {2}contact information{3}.

Один из подходов, который приходит на ум, заключается в том, что вы можете сохранить переведенные параметры замены, то есть «адрес» и «контактную информацию», в отдельном файле свойств, по одному для каждой локали. Затем пусть ваш класс Action (или, возможно, какой-то вспомогательный класс) найдет значения из правильного ResourceBundle для текущей локали и передаст их тегу сообщения.

The message message tag API allows only 5 parametric arguments

Ах! Я виню свое полное незнание API Struts.

Процитируем руководство:

Some of the features in this taglib are also available in the JavaServer Pages Standard Tag Library (JSTL). The Struts team encourages the use of the standard tags over the Struts specific tags when possible.

Вероятно, вы могли бы сделать это с помощью библиотеки тегов http://java.sun.com/jsp/jstl/fmt.

<fmt:bundle basename = "messages">
    <fmt:message key = "alert">
        <fmt:param value='<a href = "/">' />
        <fmt:param value = "</a>" />
        <fmt:param value='<a href = "/">' />
        <fmt:param value = "</a>" />
    </fmt:message>
</fmt:bundle>

Обратной стороной является то, что это недопустимый XML, и перенос значений в переменные требует большего количества косвенных обращений, поиска и многословия. Это не лучшее решение.

Я не знаю Struts, но если это что-то вроде JavaServer Faces (тот же архитектор), то, вероятно, есть поддержка для настройки заменяющего элемента управления. Я бы либо заменил существующий элемент управления на более гибкий, либо добавил новый.

Anytime I receive newly-translated text, I must decide what to surround with the <a>...</a> markup.

Нет никакого способа, которым вы должны это делать, и я считаю это ошибкой в ​​вашем процессе перевода (я бывший инженер по локализации и бывший разработчик инструментов локализации). Символы {0} должны быть включены в файлы, отправляемые переводчикам. Рекомендации по локализации должны объяснять контекст строки и значение любых переменных.

Вы можете программно проверить комплекты свойств по возвращении. Регулярное выражение, специфичное для строки, может помочь. Не исключено, что «адрес» и «контактная информация» поменяются местами во время перевода.

Самое простое решение - изменить дизайн сообщений для отображения:

<a href = "/address.do">Please update your address.</a>
<a href = "/contact.do">Please update your contact information.</a>

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

Ответ принят как подходящий

Avoid creating links within long blocks of text. Prefer shorter text that can act as a logically complete and independent link.

Как правило, это приводит к меньшему количеству проблем. Иногда приходится идти на компромисс с дизайном пользовательского интерфейса, чтобы приспособиться к локализации; иногда вам нужно поставить под угрозу процесс локализации, чтобы приспособиться к пользовательскому интерфейсу.

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

Если подумать, что-то вроде этого могло бы быть менее уродливым:

<p>Please update your address and contact information.
<br />
<a href = "/address.do">update address</a>
<br />
<a href = "/contact.do">update contact information</a></p>

... но я не UI дизайнер.

Другие вопросы по теме