From ea6201bcc9201f20ee10990040201334c0388e62 Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Wed, 22 Jul 2026 16:05:55 +0200 Subject: [PATCH] Ability to have a preview of the 'processor' output in add-watch-ui/ --- .../blueprint/add_watch_ui/__init__.py | 13 ++++++++++ .../add_watch_ui/static/add-watch.js | 17 ++++++++++++ .../add_watch_ui/templates/add-watch-ui.html | 4 +++ changedetectionio/processors/__init__.py | 21 +++++++++++++++ changedetectionio/processors/base.py | 11 ++++++++ .../processors/restock_diff/processor.py | 26 +++++++++++++++++++ .../translations/cs/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/de/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../en_GB/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../en_US/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/es/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/fr/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/it/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/ja/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/ko/LC_MESSAGES/messages.po | 23 ++++++++++++++++ changedetectionio/translations/messages.pot | 25 +++++++++++++++++- .../pt_BR/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/ru/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/tr/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/uk/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../translations/zh/LC_MESSAGES/messages.po | 23 ++++++++++++++++ .../zh_Hant_TW/LC_MESSAGES/messages.po | 23 ++++++++++++++++ 22 files changed, 461 insertions(+), 1 deletion(-) diff --git a/changedetectionio/blueprint/add_watch_ui/__init__.py b/changedetectionio/blueprint/add_watch_ui/__init__.py index b06d64bb..aa7c3973 100644 --- a/changedetectionio/blueprint/add_watch_ui/__init__.py +++ b/changedetectionio/blueprint/add_watch_ui/__init__.py @@ -142,10 +142,23 @@ def construct_blueprint(datastore: ChangeDetectionStore): logger.error(f"Add-watch snapshot: could not park temporary data for {url}: {e}") temp_uuid = None + # Optional per-processor previews of what each would read off this page (e.g. restock shows + # the detected price/stock). Computed once here from the fetched HTML for every processor + # offered on the page; the client shows the one for the selected processor and swaps on + # change. Only processors that implement the hook and return something are included. + previews = {} + if html: + from changedetectionio import processors + for pname, _ in processors.available_processors(processor_filter={'supports_visual_selector': True}): + preview = processors.get_processor_preview(datastore, pname, html, url=url) + if preview: + previews[pname] = preview + return jsonify({ "temporary_uuid": temp_uuid, "screenshot": f"data:image/jpeg;base64,{base64.b64encode(screenshot).decode('ascii')}", "xpath_data": xpath_data, + "processor_previews": previews, }) return add_watch_ui_blueprint diff --git a/changedetectionio/blueprint/add_watch_ui/static/add-watch.js b/changedetectionio/blueprint/add_watch_ui/static/add-watch.js index 7a34ded0..c6ca2169 100644 --- a/changedetectionio/blueprint/add_watch_ui/static/add-watch.js +++ b/changedetectionio/blueprint/add_watch_ui/static/add-watch.js @@ -13,6 +13,16 @@ $(document).ready(() => { const $clear = $('#clear-selector'); const $includeFilters = $('#include_filters'); const $temporaryUuid = $('#temporary_uuid'); + const $processorPreview = $('#processor-add-watch-ui-preview-text'); + + // Per-processor previews from the last snapshot ({processor_name: "line to show"}). + let processorPreviews = {}; + + function renderProcessorPreview() { + const selected = $('input[name="processor"]:checked').val(); + const text = selected ? processorPreviews[selected] : null; + $processorPreview.text(text || '').toggle(!!text); + } const vs = window.initVisualSelector({ $canvas: $('#selector-canvas'), @@ -50,6 +60,8 @@ $(document).ready(() => { showState('loading'); // A previous parked snapshot is now stale; drop it until this fetch succeeds. $temporaryUuid.val(''); + processorPreviews = {}; + renderProcessorPreview(); // Preview with whichever interactive browser the user picked (defaults to the checked one). const browser = $('input[name="fetch_backend"]:checked').val() || ''; @@ -61,6 +73,8 @@ $(document).ready(() => { }).done((data) => { showState('ready'); $temporaryUuid.val(data.temporary_uuid || ''); + processorPreviews = data.processor_previews || {}; + renderProcessorPreview(); vs.load({screenshotSrc: data.screenshot, xpathData: data.xpath_data}); }).fail((xhr) => { const msg = (xhr && xhr.responseText) ? xhr.responseText : 'Could not fetch a preview for that URL.'; @@ -69,6 +83,9 @@ $(document).ready(() => { }); } + // Swap the preview line when the processor selection changes (no re-fetch needed). + $(document).on('change', 'input[name="processor"]', renderProcessorPreview); + $go.on('click', fetchSnapshot); // Enter in the URL box should fetch a preview, not submit the whole form diff --git a/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html b/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html index d5fbca46..b42007bb 100644 --- a/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +++ b/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -69,6 +69,10 @@
{{ render_simple_field(form.processor) }} + +
diff --git a/changedetectionio/processors/__init__.py b/changedetectionio/processors/__init__.py index c9f5e7a9..394a6781 100644 --- a/changedetectionio/processors/__init__.py +++ b/changedetectionio/processors/__init__.py @@ -276,6 +276,27 @@ def _processor_capability(name, capability, default=False): return default +def get_processor_preview(datastore, name, html_content, url=None): + """Run a processor's OPTIONAL Add-Watch-UI preview and return a short human string (or None). + + A processor opts in by overriding `add_watch_ui_processor_preview(self, html_content, url=None)` + on its `perform_site_check` class (default on the base ABC returns None). We instantiate it with + no watch (watch_uuid=None is tolerated) since the preview runs against the raw fetched HTML, not + a saved watch. Best-effort UI sugar: a missing override, an error, or a None/empty return all + yield None so the caller shows nothing for that processor. Never raises. + """ + module = get_processor_module(name) + if not module or not hasattr(module, 'perform_site_check'): + return None + try: + handler = module.perform_site_check(datastore=datastore, watch_uuid=None) + preview = handler.add_watch_ui_processor_preview(html_content=html_content, url=url) + return preview or None + except Exception as e: + logger.debug(f"Processor '{name}' add-watch-ui preview failed: {e}") + return None + + def available_processors(processor_filter=None): """ Get a list of processors by name and description for the UI elements. diff --git a/changedetectionio/processors/base.py b/changedetectionio/processors/base.py index 94798cc2..de5b5a1c 100644 --- a/changedetectionio/processors/base.py +++ b/changedetectionio/processors/base.py @@ -97,6 +97,17 @@ class difference_detection_processor(): logger.warning(f"Failed to read checksum file for {self.watch_uuid}: {e}") self.last_raw_content_checksum = None + def add_watch_ui_processor_preview(self, html_content, url=None): + """Optional Add-Watch-UI preview hook. + + Return a short human string describing what THIS processor would read off the just-fetched + page (shown under the processor picker on /add-watch-ui, so the user can see the processor + "works" before saving), or None for no preview. Best-effort UI sugar - the caller swallows + exceptions and treats None/empty as "show nothing". Override in a processor to opt in; the + default is no preview. Runs against the raw fetched HTML, so it does not need a saved watch. + """ + return None + async def validate_iana_url(self): """Pre-flight SSRF check — runs DNS lookup in executor to avoid blocking the event loop. Covers all fetchers (requests, playwright, puppeteer, plugins) since every fetch goes diff --git a/changedetectionio/processors/restock_diff/processor.py b/changedetectionio/processors/restock_diff/processor.py index d09022bd..169c682d 100644 --- a/changedetectionio/processors/restock_diff/processor.py +++ b/changedetectionio/processors/restock_diff/processor.py @@ -404,6 +404,32 @@ class perform_site_check(difference_detection_processor): screenshot = None xpath_data = None + def add_watch_ui_processor_preview(self, html_content, url=None): + """Add-Watch-UI preview: reuse the exact price/availability extraction the real check uses, + so the line shown under the processor picker matches what a saved watch would detect.""" + from flask_babel import gettext + try: + r = extract_itemprop_availability_safe(html_content) + except MoreThanOnePriceFound: + return gettext("More than one price detected on this page - restock/price detection needs a single-product page.") + except Exception: + return None + + price = r.get('price') + availability = r.get('availability') + if price is None and not availability: + return gettext("No price or stock information was detected on this page.") + + parts = [] + if price is not None: + currency = r.get('currency') or '' + parts.append(gettext("price: %(price)s", price=f"{currency}{price}".strip())) + if availability: + # availability is often a schema.org URL (e.g. https://schema.org/InStock) - show the tail. + parts.append(gettext("availability: %(availability)s", + availability=str(availability).rstrip('/').split('/')[-1])) + return gettext("Detected — %(details)s", details=", ".join(parts)) + def run_changedetection(self, watch, force_reprocess=False): import hashlib diff --git a/changedetectionio/translations/cs/LC_MESSAGES/messages.po b/changedetectionio/translations/cs/LC_MESSAGES/messages.po index bc54a08f..27f73e10 100644 --- a/changedetectionio/translations/cs/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/cs/LC_MESSAGES/messages.po @@ -4147,6 +4147,29 @@ msgstr "Doplnění zásob a zjištění ceny pro stránky s JEDINÝM produktem" msgid "Detects if the product goes back to in-stock" msgstr "Zjistí, zda se produkt vrátí na sklad" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/de/LC_MESSAGES/messages.po b/changedetectionio/translations/de/LC_MESSAGES/messages.po index eb0cbc99..ba94008c 100644 --- a/changedetectionio/translations/de/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/de/LC_MESSAGES/messages.po @@ -4199,6 +4199,29 @@ msgstr "Wiederauffüllung und Preiserkennung für Seiten mit einem EINZELNEN Pro msgid "Detects if the product goes back to in-stock" msgstr "Erkennt, ob das Produkt wieder auf Lager ist" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po index d801d87c..a39b3c85 100644 --- a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po @@ -4139,6 +4139,29 @@ msgstr "" msgid "Detects if the product goes back to in-stock" msgstr "" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po index 2fdc63ac..7316d573 100644 --- a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po @@ -4139,6 +4139,29 @@ msgstr "" msgid "Detects if the product goes back to in-stock" msgstr "" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/es/LC_MESSAGES/messages.po b/changedetectionio/translations/es/LC_MESSAGES/messages.po index 474410d8..1d149523 100644 --- a/changedetectionio/translations/es/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/es/LC_MESSAGES/messages.po @@ -4212,6 +4212,29 @@ msgstr "Reabastecimiento y detección de precios para páginas con un ÚNICO pro msgid "Detects if the product goes back to in-stock" msgstr "Detecta si el producto vuelve a estar en stock" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/fr/LC_MESSAGES/messages.po b/changedetectionio/translations/fr/LC_MESSAGES/messages.po index 657e7200..3ae3bc4e 100644 --- a/changedetectionio/translations/fr/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/fr/LC_MESSAGES/messages.po @@ -4152,6 +4152,29 @@ msgstr "Détection de réapprovisionnement et de prix pour les pages avec un SEU msgid "Detects if the product goes back to in-stock" msgstr "Détecte si le produit revient en stock" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/it/LC_MESSAGES/messages.po b/changedetectionio/translations/it/LC_MESSAGES/messages.po index 1616ad74..c8994ac2 100644 --- a/changedetectionio/translations/it/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/it/LC_MESSAGES/messages.po @@ -4141,6 +4141,29 @@ msgstr "Rilevamento disponibilità e prezzi per pagine con UN SINGOLO prodotto" msgid "Detects if the product goes back to in-stock" msgstr "Rileva se il prodotto torna disponibile" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/ja/LC_MESSAGES/messages.po b/changedetectionio/translations/ja/LC_MESSAGES/messages.po index 1abc22ae..54ddeafd 100644 --- a/changedetectionio/translations/ja/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/ja/LC_MESSAGES/messages.po @@ -4158,6 +4158,29 @@ msgstr "単一製品ページの在庫補充&価格検知" msgid "Detects if the product goes back to in-stock" msgstr "製品が在庫ありに戻ったかどうかを検知します" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/ko/LC_MESSAGES/messages.po b/changedetectionio/translations/ko/LC_MESSAGES/messages.po index 1d6d5466..461a4635 100644 --- a/changedetectionio/translations/ko/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/ko/LC_MESSAGES/messages.po @@ -4149,6 +4149,29 @@ msgstr "단일 제품이 포함된 페이지의 재입고 및 가격 감지" msgid "Detects if the product goes back to in-stock" msgstr "제품이 다시 재고 있음 상태가 되었는지 감지합니다." +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/messages.pot b/changedetectionio/translations/messages.pot index 5a4921fe..8ec58866 100644 --- a/changedetectionio/translations/messages.pot +++ b/changedetectionio/translations/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: changedetection.io 0.55.8\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-07-22 10:10+0200\n" +"POT-Creation-Date: 2026-07-22 15:56+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -4138,6 +4138,29 @@ msgstr "" msgid "Detects if the product goes back to in-stock" msgstr "" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po index 4da8589a..947d0e67 100644 --- a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po @@ -4189,6 +4189,29 @@ msgstr "Detecção de Estoque e Preço para páginas com um ÚNICO produto" msgid "Detects if the product goes back to in-stock" msgstr "Detecta se o produto volta ao estoque" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/ru/LC_MESSAGES/messages.po b/changedetectionio/translations/ru/LC_MESSAGES/messages.po index e045857f..bdc99c24 100644 --- a/changedetectionio/translations/ru/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/ru/LC_MESSAGES/messages.po @@ -4255,6 +4255,29 @@ msgstr "Пополнение запасов и определение цен д msgid "Detects if the product goes back to in-stock" msgstr "Определяет, возвращается ли товар на склад" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/tr/LC_MESSAGES/messages.po b/changedetectionio/translations/tr/LC_MESSAGES/messages.po index ca0868be..601e37ba 100644 --- a/changedetectionio/translations/tr/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/tr/LC_MESSAGES/messages.po @@ -4192,6 +4192,29 @@ msgstr "TEK bir ürüne sahip sayfalar için Yeniden Stoklama ve Fiyat tespiti" msgid "Detects if the product goes back to in-stock" msgstr "Ürünün tekrar stoka girip girmediğini tespit eder" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/uk/LC_MESSAGES/messages.po b/changedetectionio/translations/uk/LC_MESSAGES/messages.po index 3fedc751..6f2ba4c9 100644 --- a/changedetectionio/translations/uk/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/uk/LC_MESSAGES/messages.po @@ -4171,6 +4171,29 @@ msgstr "Виявлення поповнення та ціни для сторі msgid "Detects if the product goes back to in-stock" msgstr "Визначає, чи повернувся товар у наявність" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/zh/LC_MESSAGES/messages.po b/changedetectionio/translations/zh/LC_MESSAGES/messages.po index af077117..24e13e81 100644 --- a/changedetectionio/translations/zh/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/zh/LC_MESSAGES/messages.po @@ -4145,6 +4145,29 @@ msgstr "适用于单一商品页面的补货与价格检测" msgid "Detects if the product goes back to in-stock" msgstr "检测商品是否恢复有库存" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr "" diff --git a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po index e89bec1e..d26e6839 100644 --- a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po @@ -4145,6 +4145,29 @@ msgstr "針對單一產品頁面的補貨與價格檢測" msgid "Detects if the product goes back to in-stock" msgstr "檢測產品是否恢復庫存" +#: changedetectionio/processors/restock_diff/processor.py +msgid "More than one price detected on this page - restock/price detection needs a single-product page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +msgid "No price or stock information was detected on this page." +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "price: %(price)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "availability: %(availability)s" +msgstr "" + +#: changedetectionio/processors/restock_diff/processor.py +#, python-format +msgid "Detected — %(details)s" +msgstr "" + #: changedetectionio/processors/restock_diff/templates/restock_diff/difference.html msgid "Price & stock history" msgstr ""