Как я могу реорганизовать разметку 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 и т. д.).
Проблемы:
- Нарушение DRY - у меня N ссылок на URL-адреса действий Struts вместо 1, что делает URL-адреса действий рефакторинга подверженными ошибкам.
- Смешанные проблемы - разметка моего приложения теперь находится не только в моих файлах JSP, что затрудняет настройку разметки для веб-специалиста (с использованием CSS и т. Д.).
- Разметка после перевода - каждый раз, когда я получаю только что переведенный текст, я должен решить, что окружить
<a>...</a>
разметкой. Легко для английского, но в меньшей степени для незнакомых языков.
Я подумал о добавлении заполнителей в файл сообщений, например:
alert=Please update your {0} and {1}.
но тогда слова «адрес» и «контактная информация» нужно как-то локализовать, обернуть разметкой и передать в мой тег сообщения - и я не вижу простого способа сделать это.
Что я могу сделать, чтобы это улучшить?
Ответов (4)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 дизайнер.
Один из подходов, который приходит на ум, заключается в том, что вы можете сохранить переведенные параметры замены, то есть «адрес» и «контактную информацию», в отдельном файле свойств, по одному для каждой локали. Затем пусть ваш класс 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>
Я согласен с тем, что это может быть решением не во всех случаях, и ваш дизайнер пользовательского интерфейса может выплюнуть зубы.