Многие сайты используют AJAX для динамического добавления / отображения / изменения контента. Иногда он используется вместо навигации по сайту, поэтому текущий URL-адрес изменяется программно, а сценарии содержимого в этом случае автоматически не выполняются браузером, так как страница не извлекается с удаленного сервера целиком.
pjax:end
в document
, используемое многими сайтами на основе pjax, например. GitHub, см. Как запустить jQuery до и после загрузки pjax? message
на window
, используемом, например, Поиск Google в браузере Chrome, см. Расширение Chrome обнаруживает обновление поиска Google spfdone
в document
, используемое Youtube, см. . Как определить навигацию по страницам на Youtube и изменять HTML до отображения страницы? document.head.appendChild(document.createElement('script')).text = '(' +
function() {
// injected DOM script is not a content script anymore,
// it can modify objects and functions of the page
var _pushState = history.pushState;
history.pushState = function(state, title, url) {
_pushState.call(this, state, title, url);
window.dispatchEvent(new CustomEvent('state-changed', {detail: state}));
};
// repeat the above for replaceState too
} + ')(); this.remove();'; // remove the DOM script element
// And here content script listens to our DOM script custom events
window.addEventListener('state-changed', function(e) {
console.log('History state changed', e.detail, location.hash);
doSomething();
});
window.addEventListener('hashchange', function(e) {
console.log('URL hash changed', e);
doSomething();
});
window.addEventListener('popstate', function(e) {
console.log('State changed', e);
doSomething();
});
Для работы с навигацией существует расширенный API: webNavigation , webRequest , но мы будем использовать простой chrome.tabs.onUpdated прослушиватель событий, который посылает сообщение к скрипту содержимого:
"tabs"
разрешено . var rxLookfor = /^https?:\/\/(www\.)?google\.(com|\w\w(\.\w\w)?)\/.*?[?#&]q=/;
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (rxLookfor.test(changeInfo.url)) {
chrome.tabs.sendMessage(tabId, 'url-update');
}
});
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg === 'url-update') {
doSomething();
}
});
Постарайтесь не создавать ссылки в длинных блоках текста. Предпочтите более короткий текст, который может действовать как логически полный и независимый канал.
Обычно это приведет к меньшему количеству проблем. Иногда необходимо поставить под угрозу дизайн 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.
Возможно:
#
alert=Please update your {0}address{1} and {2}contact information{3}.
Один подход, который приходит на ум, состоит в том, что Вы могли сохранить переведенные заменяющие параметры т.е. "адрес" и "контактную информацию" в файле раздельного имущества, один на локаль. Затем имейте свой класс Действия (или вероятно некоторый класс помощника) ищут значения от корректного ResourceBundle для текущей локали и передают их тегу сообщения.
Тег сообщения сообщения API позволяет только 5 параметрических аргументов
А-ч! Я обвиняю свое полное незнание Struts API.
Заключить руководство в кавычки:
Некоторые функции в этом taglib также доступны в Библиотеке тегов Стандарта Страниц JavaServer (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 (тот же архитектор), затем существует, вероятно, поддержка конфигурирования заменяющего управления. Я или заменил бы существующее управление более гибким или добавил бы новое.
Каждый раз, когда я получаю недавно-переведенный-текст, я должен решить, что окружить
<a>...</a>
разметка.
Нет никакого способа, которым необходимо делать это, и я рассматриваю это как отказ в процессе перевода (я - инженер экс-локализации и экс-разработчик инструментов локализации). {0}
символы должны быть включены в файлы, которые отправляются в переводчиков. Инструкции по локализации должны объяснить контекст строки и значение любых переменных.
Можно программно проверить пакеты свойства по возврату. Определенный для строки regex's мог бы добиться цели. Это не вне областей возможности, что "адрес" и "контактная информация" подкачали бы порядок во время перевода.
Простое решение состоит в том, чтобы перепроектировать сообщения для рендеринга:
<a href="/address.do">Please update your address.</a>
<a href="/contact.do">Please update your contact information.</a>
Я признаю, что это не могло бы быть решением во всех случаях и может иметь Вашего разработчика UI, плюющегося зубами.