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

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

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

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

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

Ответов (4)

Решение

Избегайте создания ссылок в длинных блоках текста. Предпочитайте более короткий текст, который может действовать как логически полная и независимая ссылка.

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

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

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

<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 дизайнер.

Возможно:

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

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

API тега сообщения сообщения допускает только 5 параметрических аргументов.

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

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

Некоторые функции в этой библиотеке тегов также доступны в стандартной библиотеке тегов JavaServer Pages (JSTL). Команда Struts рекомендует по возможности использовать стандартные теги вместо тегов, специфичных для Struts.

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

<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 (тот же архитектор), то, вероятно, есть поддержка для настройки заменяющего элемента управления. Я бы либо заменил существующий элемент управления на более гибкий, либо добавил новый.

Каждый раз, когда я получаю только что переведенный текст, я должен решить, что окружить <a>...</a>разметкой.

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

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

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

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

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