Как я могу реорганизовать разметку 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}.

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

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

16.08.2008 16:42:50
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>

... но я не дизайнер пользовательского интерфейса.

2
11.06.2013 14:20:36

Может быть:

#
alert=Please update your {0}address{1} and {2}contact information{3}.
0
16.08.2008 16:55:36

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

1
16.08.2008 17:40:46

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

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

Цитировать руководство :

Некоторые из функций этого taglib также доступны в стандартной библиотеке тегов 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>

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

0
11.06.2013 14:23:30