Сведения о вопросе

HOLY

14:57, 1st August, 2020

Теги

Как я могу рефакторинг HTML markup из моих файлов свойств?

Просмотров: 447   Ответов: 4

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

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

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

но тогда слова "address" и "contact information" каким - то образом должны быть локализованы, обернуты markup и переданы в мой тег сообщения-и я не вижу простого способа сделать это.

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



  Сведения об ответе

dump

16:23, 22nd August, 2020

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

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

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

Думая об этом, что-то вроде этого может быть менее уродливым:

<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.


  Сведения об ответе

darknet

17:52, 3rd August, 2020

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


  Сведения об ответе

DO__IT

09:55, 10th August, 2020

Возможно:

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


  Сведения об ответе

Chhiki

07:00, 28th August, 2020

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

Ай! Я виню в этом свое полное незнание Struts API.

Цитирую из инструкции :

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

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

Вы можете программно проверить пакеты свойств при возврате. Специфичные для строки regex могут сделать этот трюк. Это не выходит за рамки возможного, что "address" и "contact information" поменялись бы местами во время перевода.

Самое простое решение-перепроектировать сообщения для визуализации:

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться