Как я могу реорганизовать HTML-разметку из моих файлов свойств?
-
08-06-2019 - |
Вопрос
Недавно я унаследовал интернационализированное веб-приложение 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 и т.д.).
Проблемы:
- СУХОЕ нарушение - У меня есть N ссылок на URL-адреса моих действий Struts вместо 1, что делает URL-адреса действий рефакторинга подверженными ошибкам.
- Смешанные опасения - Разметка моего приложения теперь находится не только в моих JSP-файлах, что затрудняет веб-специалисту настройку разметки (с помощью CSS и т.д.).
- Разметка после перевода - Всякий раз, когда я получаю недавно переведенный текст, я должен решить, чем окружить текст.
<a>...</a>
разметка.Легко для английского, но в меньшей степени для незнакомых языков.
Я рассматривал возможность добавления заполнителей в файл сообщений, например:
alert=Please update your {0} and {1}.
но тогда слова "адрес" и "контактная информация" каким-то образом должны были бы быть локализованы, обернуты разметкой и переданы в мой тег message - и я не вижу простого способа сделать это.
Что я могу сделать, чтобы улучшить это?
Решение
Избегайте создания ссылок внутри длинных блоков текста.Предпочитайте более короткий текст который может выступать в качестве логически завершенной и независимой ссылки.
Как правило, это приведет к меньшему количеству проблем.Иногда вам приходится идти на компромисс с дизайном пользовательского интерфейса, чтобы приспособиться к локализации;иногда вам приходится идти на компромисс с процессом локализации, чтобы приспособиться к пользовательскому интерфейсу.
Каждый раз, когда разработчик вручную манипулирует строками после перевода, это источник потенциально дорогостоящих ошибок.Вырезание / вставка или редактирование строк может привести к повреждению символов, неуместным строкам и т.д.Для устранения дефекта перевода требуется участие внешних сторон, что сопряжено с затратами и требует времени.
Размышляя об этом, что-то подобное могло бы быть менее уродливым:
<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>
... но я не дизайнер пользовательского интерфейса.
Другие советы
Один из подходов, который приходит на ум, заключается в том, что вы могли бы сохранить переведенные параметры замены, т. е."адрес" и "контактная информация" в отдельном файле свойств, по одному для каждой локали.Затем попросите ваш класс Action (или, возможно, какой-нибудь вспомогательный класс) найти значения из правильного ResourceBundle для текущей локали и передать их тегу message.
Возможно:
#
alert=Please update your {0}address{1} and {2}contact information{3}.
API тегов сообщений message позволяет использовать только 5 параметрических аргументов
Ах!Я виню в этом свое полное незнание Struts API.
Процитирую руководство пользователя:
Некоторые функции этой библиотеки тегов также доступны в JavaServer Стандартной библиотеке тегов Pages (JSTL).Команда Struts рекомендует использовать стандартные теги поверх специальных тегов Struts, когда это возможно.
Вероятно, вы могли бы сделать это с помощью 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 (тот же архитектор), то, вероятно, есть поддержка настройки элемента управления заменой.Я бы либо заменил существующий элемент управления более гибким, либо добавил новый.
В любое время я получаю вновь перевода текст, я должен решить, что окружают с
<a>...</a>
разметка.
Вы ни в коем случае не должны этого делать, и я рассматриваю это как ошибку в вашем процессе перевода (я бывший инженер по локализации и бывший разработчик инструментов локализации).Тот Самый {0}
символы должны быть включены в файлы, которые отправляются переводчикам.Рекомендации по локализации должны объяснять контекст строки и значение любых переменных.
Вы можете программно проверить пакеты свойств при возврате.Регулярные выражения, зависящие от конкретной строки, могут сделать свое дело.Вполне возможно, что "адрес" и "контактная информация" поменяются местами при переводе.
Самое простое решение - изменить дизайн сообщений для отображения:
<a href="/address.do">Please update your address.</a>
<a href="/contact.do">Please update your contact information.</a>
Я согласен с тем, что это может быть решением не во всех случаях, и ваш дизайнер пользовательского интерфейса может выплюнуть зубы.