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




Возможно:
#
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 дизайнер.