Compare commits

..

12 Commits

Author SHA1 Message Date
dgtlmoon 68ea3b2ac5 Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-05-05 18:46:58 +02:00
dgtlmoon 88f4beb08f Notifications - extra check for system default #4119 (#4122) 2026-05-05 12:32:14 +02:00
skkzsh e45f87578b i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-05-05 05:51:54 +02:00
skkzsh 281c1ea7e1 i18n: Clear pre-existing dennis warnings in messages.pot (#4112)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-05-02 04:57:13 +02:00
skkzsh cf31823d53 i18n: Enforce dennis lint warnings in CI (#4105)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-04-30 13:04:12 +02:00
dgtlmoon aadf8df7ae API - Add restock config to API /v1/watch/ json output #4099 (#4103)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-04-29 12:10:47 +02:00
dgtlmoon 44ac324a41 API - watch.link was accidently a tuple, enforcing string (#4104) 2026-04-29 12:10:16 +02:00
skkzsh 7831a499b2 i18n: Add dennis .pot/.po lint (#4097) 2026-04-29 09:11:03 +02:00
dgtlmoon e25387f588 Improve LiteLLM deps #4093 (#4102) 2026-04-29 09:08:20 +02:00
dgtlmoon e4bc048280 UI - AI/LLM - "Summary" button should set last viewed (#4095)
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Has been cancelled
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-04-28 19:47:15 +10:00
skkzsh 2839a4276e Ruff INT (flake8-gettext) (#4096) 2026-04-28 19:46:58 +10:00
dgtlmoon 5759a28d89 0.55.3
Build and push containers / metadata (push) Has been cancelled
Build and push containers / build-push-containers (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Has been cancelled
ChangeDetection.io App Test / lint-code (push) Has been cancelled
ChangeDetection.io App Test / lint-translations (push) Has been cancelled
ChangeDetection.io App Test / lint-template-i18n (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Has been cancelled
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-10 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-11 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-12 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-13 (push) Has been cancelled
ChangeDetection.io App Test / test-application-3-14 (push) Has been cancelled
2026-04-28 15:26:20 +10:00
56 changed files with 991 additions and 663 deletions
+29 -2
View File
@@ -11,8 +11,8 @@ jobs:
- name: Lint with Ruff
run: |
pip install ruff
# Check for syntax errors and undefined names
ruff check . --select E9,F63,F7,F82
# Check for syntax errors and undefined names, and gettext misuse
ruff check . --select E9,F63,F7,F82,INT
# Complete check with errors treated as warnings
ruff check . --exit-zero
- name: Validate OpenAPI spec
@@ -31,6 +31,33 @@ jobs:
echo "Checking $f"
msgfmt --check-format -o /dev/null "$f"
done
- name: Lint .po/.pot files with dennis (errors only)
run: |
pip install "$(grep -E '^dennis ?>=' requirements.txt)"
dennis-cmd lint --errorsonly changedetectionio/translations/
- name: Lint .pot template with dennis (warnings)
run: |
output=$(dennis-cmd lint changedetectionio/translations/messages.pot)
echo "$output"
warnings=$(echo "$output" | awk '/Warnings:/ {print $NF; exit}')
if (( ${warnings:-0} > 0 )); then
echo "ERROR: ${warnings} dennis warning(s) detected in messages.pot"
echo "Fix the warning(s)."
exit 1
fi
- name: Lint .po files with dennis (warnings)
# W302 (unchanged) is excluded due to high false-positive rate in this codebase:
# many msgstrs intentionally match msgid (units like "AI", "LLM", and proper nouns).
run: |
output=$(dennis-cmd lint --excluderules=W302 \
changedetectionio/translations/*/LC_MESSAGES/messages.po)
echo "$output"
warnings=$(echo "$output" | awk '/Total number of warnings:/ {print $NF; exit}')
if (( ${warnings:-0} > 0 )); then
echo "ERROR: ${warnings} dennis warning(s) detected in .po files"
echo "Fix the warning(s)."
exit 1
fi
- name: Check translation catalog is up-to-date
run: |
pip install "$(grep -E '^babel==' requirements.txt)"
+5 -1
View File
@@ -20,10 +20,11 @@ exclude = [
select = [
"B", # flake8-bugbear
"B9",
"C",
"C",
"E", # pycodestyle
"F", # Pyflakes
"I", # isort
"INT", # flake8-gettext
"N", # pep8-naming
"UP", # pyupgrade
"W", # pycodestyle
@@ -43,6 +44,9 @@ ignore = [
[lint.mccabe]
max-complexity = 12
[lint.flake8-gettext]
extend-function-names = ["_l", "lazy_gettext", "pgettext", "npgettext"]
[format]
indent-style = "space"
quote-style = "preserve"
+1 -1
View File
@@ -2,7 +2,7 @@
# Read more https://github.com/dgtlmoon/changedetection.io/wiki
# Semver means never use .01, or 00. Should be .1.
__version__ = '0.55.2'
__version__ = '0.55.3'
from changedetectionio.strtobool import strtobool
from json.decoder import JSONDecodeError
+22 -1
View File
@@ -103,7 +103,28 @@ class Watch(Resource):
# attr .last_changed will check for the last written text snapshot on change
watch['last_changed'] = watch_obj.last_changed
watch['viewed'] = watch_obj.viewed
watch['link'] = watch_obj.link,
watch['link'] = watch_obj.link
# Resolved processor config: tag override wins over watch-level config (mirrors restock processor logic)
import json
_restock_path = os.path.join(watch_obj.data_dir, 'restock_diff.json') if watch_obj.data_dir else None
restock_config = {}
if _restock_path and os.path.isfile(_restock_path):
try:
with open(_restock_path, 'r', encoding='utf-8') as _f:
restock_config = json.load(_f).get('restock_diff') or {}
except (json.JSONDecodeError, IOError) as e:
logger.warning(f"Failed to read restock_diff.json for watch {uuid}: {e}")
restock_source = 'watch'
tags = self.datastore.data['settings']['application'].get('tags', {})
for tag_uuid in (watch_obj.get('tags') or []):
tag = tags.get(tag_uuid, {})
if tag.get('overrides_watch'):
restock_config = dict(tag.get('processor_config_restock_diff') or {})
restock_source = f'tag:{tag_uuid}'
break
watch['processor_config_restock_diff'] = restock_config
watch['processor_config_restock_diff_source'] = restock_source
return watch
@@ -75,7 +75,7 @@ class import_url_list(Importer):
self.remaining_data = []
self.remaining_data.append(url)
flash(gettext("{} Imported from list in {:.2f}s, {} Skipped.").format(good, time.time() - now, len(self.remaining_data)))
flash(gettext("{count} Imported from list in {duration}s, {skipped_count} Skipped.").format(count=good, duration=f"{time.time() - now:.2f}", skipped_count=len(self.remaining_data)))
class import_distill_io_json(Importer):
@@ -136,7 +136,7 @@ class import_distill_io_json(Importer):
self.new_uuids.append(new_uuid)
good += 1
flash(gettext("{} Imported from Distill.io in {:.2f}s, {} Skipped.").format(len(self.new_uuids), time.time() - now, len(self.remaining_data)))
flash(gettext("{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped.").format(count=len(self.new_uuids), duration=f"{time.time() - now:.2f}", skipped_count=len(self.remaining_data)))
class import_xlsx_wachete(Importer):
@@ -212,7 +212,7 @@ class import_xlsx_wachete(Importer):
logger.error(e)
flash(gettext("Error processing row number {}, check all cell data types are correct, row was skipped.").format(row_id), 'error')
flash(gettext("{} imported from Wachete .xlsx in {:.2f}s").format(len(self.new_uuids), time.time() - now))
flash(gettext("{count} imported from Wachete .xlsx in {duration}s").format(count=len(self.new_uuids), duration=f"{time.time() - now:.2f}"))
class import_xlsx_custom(Importer):
@@ -293,4 +293,4 @@ class import_xlsx_custom(Importer):
logger.error(e)
flash(gettext("Error processing row number {}, check all cell data types are correct, row was skipped.").format(row_i), 'error')
flash(gettext("{} imported from custom .xlsx in {:.2f}s").format(len(self.new_uuids), time.time() - now))
flash(gettext("{count} imported from custom .xlsx in {duration}s").format(count=len(self.new_uuids), duration=f"{time.time() - now:.2f}"))
@@ -7,7 +7,7 @@
<div class="tabs collapsable">
<ul>
<li class="tab" id=""><a href="#url-list">{{ _('URL List') }}</a></li>
<li class="tab"><a href="#distill-io">{{ _('Distill.io') }}</a></li>
<li class="tab"><a href="#distill-io">Distill.io</a></li>
<li class="tab"><a href="#xlsx">{{ _('.XLSX & Wachete') }}</a></li>
<li class="tab"><a href="{{url_for('backups.restore.restore')}}">{{ _('Backup Restore') }}</a></li>
</ul>
@@ -45,6 +45,7 @@
<div class="tab-pane-inner" id="distill-io">
<div class="pure-control-group">
{{ _('Copy and Paste your Distill.io watch \'export\' file, this should be a JSON file.') }}<br>
{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}
{{ _('This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, <code>config:selections</code>, the rest (including <code>schedule</code>) are ignored.')|safe }}
<br>
<p>
@@ -103,7 +104,7 @@
{% for n in range(4) %}
<td><select name="custom_xlsx[col_type_{{n}}]">
<option value="" style="color: #aaa"> -- {{ _('none') }} --</option>
<option value="url">{{ _('URL') }}</option>
<option value="url">URL</option>
<option value="title">{{ _('Title') }}</option>
<option value="include_filters">{{ _('CSS/xPath filter') }}</option>
<option value="tag">{{ _('Group / Tag name(s)') }}</option>
@@ -181,8 +181,8 @@ def construct_blueprint(datastore: ChangeDetectionStore):
# Check CPU core availability and warn if worker count is high
cpu_count = os.cpu_count()
if cpu_count and new_worker_count >= (cpu_count * 0.9):
flash(gettext("Warning: Worker count ({}) is close to or exceeds available CPU cores ({})").format(
new_worker_count, cpu_count), 'warning')
flash(gettext("Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})").format(
worker_count=new_worker_count, cpu_count=cpu_count), 'warning')
result = worker_pool.adjust_async_worker_count(
new_count=new_worker_count,
+1 -1
View File
@@ -122,7 +122,7 @@ def construct_llm_blueprint(datastore: ChangeDetectionStore):
except OSError as e:
logger.warning(f"Could not remove LLM summary cache file {f}: {e}")
logger.info(f"LLM summary cache cleared: {count} file(s) removed")
flash(gettext("AI summary cache cleared (%(n)s file(s) removed).", n=count), 'notice')
flash(gettext("AI summary cache cleared ({} file(s) removed).").format(count), 'notice')
return redirect(url_for('settings.settings_page') + '#ai')
return llm_blueprint
@@ -24,8 +24,8 @@
<li class="tab"><a href="#fetching">{{ _('Fetching') }}</a></li>
<li class="tab"><a href="#filters">{{ _('Global Filters') }}</a></li>
<li class="tab"><a href="#ui-options">{{ _('UI Options') }}</a></li>
<li class="tab"><a href="#api">{{ _('API') }}</a></li>
<li class="tab"><a href="#rss">{{ _('RSS') }}</a></li>
<li class="tab"><a href="#api">API</a></li>
<li class="tab"><a href="#rss">RSS</a></li>
<li class="tab"><a href="{{ url_for('backups.create') }}">{{ _('Backups') }}</a></li>
<li class="tab"><a href="#timedate">{{ _('Time & Date') }}</a></li>
<li class="tab"><a href="#proxies">{{ _('CAPTCHA & Proxies') }}</a></li>
@@ -333,7 +333,7 @@
<span class="llm-env-badge">{{ _('(set via <code>LLM_MAX_INPUT_CHARS</code>)') | safe }}</span>
{% else %}
{{ form.llm.form.llm_max_input_chars(placeholder='100000', value=llm_stored.get('max_input_chars', 100000) or '') }}
<span class="llm-field-hint">{{ _('characters — currently enforcing: %(n)s', n='{:,}'.format(llm_effective_max_input_chars)) }}</span>
<span class="llm-field-hint">{{ _('characters — currently enforcing: %(limit)s', limit='{:,}'.format(llm_effective_max_input_chars)) }}</span>
{% endif %}
</span>
</div>
@@ -364,7 +364,7 @@
<span class="llm-env-badge">{{ _('(set via <code>LLM_MAX_INPUT_CHARS</code>)') | safe }}</span>
{% else %}
{{ form.llm.form.llm_max_input_chars(placeholder='100000', value=llm_stored.get('max_input_chars', 100000) or '') }}
<span class="llm-field-hint">{{ _('characters — currently enforcing: %(n)s', n='{:,}'.format(llm_effective_max_input_chars)) }}</span>
<span class="llm-field-hint">{{ _('characters — currently enforcing: %(limit)s', limit='{:,}'.format(llm_effective_max_input_chars)) }}</span>
{% endif %}
</span>
</div>
@@ -98,6 +98,7 @@
{% endif %}
<div class="tab-pane-inner" id="filters-and-triggers">
{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}
<p>{{ _('These settings are <strong><i>added</i></strong> to any existing watch configurations.')|safe }}</p>
{% include "edit/include_subtract.html" %}
+2 -2
View File
@@ -307,8 +307,8 @@ def construct_blueprint(datastore: ChangeDetectionStore, update_q, worker_pool,
# Provide feedback about skipped watches
skipped_count = len(watches_to_queue) - len(watches_to_queue_filtered)
if skipped_count > 0:
flash(gettext("Queued {} watches for rechecking ({} already queued or running).").format(
len(watches_to_queue_filtered), skipped_count))
flash(gettext("Queued {count} watches for rechecking ({skipped_count} already queued or running).").format(
count=len(watches_to_queue_filtered), skipped_count=skipped_count))
else:
if len(watches_to_queue_filtered) == 1:
flash(gettext("Queued 1 watch for rechecking."))
+4
View File
@@ -283,6 +283,8 @@ def construct_blueprint(datastore: ChangeDetectionStore):
# Check cache — keyed by version pair + prompt hash (invalidates if prompt changes)
cached = watch.get_llm_diff_summary(from_version, to_version, prompt=cache_prompt)
if cached:
import time
datastore.set_last_viewed(uuid, int(time.time()))
return jsonify({'summary': cached, 'error': None, 'cached': True})
# Check global monthly token budget before making an LLM call
@@ -316,6 +318,8 @@ def construct_blueprint(datastore: ChangeDetectionStore):
except Exception as e:
logger.warning(f"Could not cache llm summary for {uuid}: {e}")
import time
datastore.set_last_viewed(uuid, int(time.time()))
return jsonify({'summary': summary, 'error': None, 'cached': False})
@diff_blueprint.route("/diff/<uuid_str:uuid>/extract", methods=['GET'])
@@ -365,6 +365,7 @@ Math: {{ 1 + 1 }}") }}
</fieldset>
<fieldset class="pure-control-group">
{{ render_checkbox_field(form.sort_text_alphabetically) }}
{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}
<span class="pure-form-message-inline">{{ _('Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below.')|safe }}</span>
</fieldset>
<fieldset class="pure-control-group">
@@ -163,12 +163,13 @@ window.watchOverviewI18n = {
data-confirm-type="danger"
data-confirm-title="{{ _('Clear Histories') }}"
data-confirm-message="{{ _('<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>') }}"
{# TRANSLATORS: Universally recognized; typically left as-is. dennis-ignore: W302 #}
data-confirm-button="{{ _('OK') }}"><i data-feather="trash-2" style="width: 14px; height: 14px; stroke: white; margin-right: 4px;"></i>{{ _('Clear/reset history') }}</button>
<button class="pure-button button-secondary button-xsmall" style="background: #dd4242;" name="op" value="delete"
data-requires-confirm
data-confirm-type="danger"
data-confirm-title="{{ _('Delete Watches?') }}"
data-confirm-message="{{ _('<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>') }}"
data-confirm-message="{{ _('<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>') }}"
data-confirm-button="{{ _('Delete') }}"><i data-feather="trash" style="width: 14px; height: 14px; stroke: white; margin-right: 4px;"></i>{{ _('Delete') }}</button>
</div>
+11 -9
View File
@@ -618,8 +618,8 @@ class ValidateCSSJSONXPATHInput(object):
try:
elementpath.select(tree, line.strip(), parser=SafeXPath3Parser)
except elementpath.ElementPathError as e:
message = field.gettext('\'%s\' is not a valid XPath expression. (%s)')
raise ValidationError(message % (line, str(e)))
message = field.gettext('\'%(expression)s\' is not a valid XPath expression. (%(error)s)')
raise ValidationError(message % {'expression': line, 'error': str(e)})
except:
raise ValidationError("A system-error occurred when validating your XPath expression")
@@ -633,8 +633,8 @@ class ValidateCSSJSONXPATHInput(object):
try:
tree.xpath(line.strip())
except etree.XPathEvalError as e:
message = field.gettext('\'%s\' is not a valid XPath expression. (%s)')
raise ValidationError(message % (line, str(e)))
message = field.gettext('\'%(expression)s\' is not a valid XPath expression. (%(error)s)')
raise ValidationError(message % {'expression': line, 'error': str(e)})
except:
raise ValidationError("A system-error occurred when validating your XPath expression")
@@ -653,8 +653,8 @@ class ValidateCSSJSONXPATHInput(object):
try:
parse(input)
except (JsonPathParserError, JsonPathLexerError) as e:
message = field.gettext('\'%s\' is not a valid JSONPath expression. (%s)')
raise ValidationError(message % (input, str(e)))
message = field.gettext('\'%(expression)s\' is not a valid JSONPath expression. (%(error)s)')
raise ValidationError(message % {'expression': input, 'error': str(e)})
except:
raise ValidationError("A system-error occurred when validating your JSONPath expression")
@@ -677,8 +677,8 @@ class ValidateCSSJSONXPATHInput(object):
validate_jq_expression(input)
jq.compile(input)
except (ValueError) as e:
message = field.gettext('\'%s\' is not a valid jq expression. (%s)')
raise ValidationError(message % (input, str(e)))
message = field.gettext('\'%(expression)s\' is not a valid jq expression. (%(error)s)')
raise ValidationError(message % {'expression': input, 'error': str(e)})
except:
raise ValidationError("A system-error occurred when validating your jq expression")
@@ -728,7 +728,7 @@ class ValidateStartsWithRegex(object):
raise ValidationError(self.message or _l("Invalid value."))
class quickWatchForm(Form):
url = StringField(_l('URL'), validators=[validateURL()])
url = StringField('URL', validators=[validateURL()])
tags = StringTagUUID(_l('Group tag'), validators=[validators.Optional()])
watch_submit_button = SubmitField(_l('Watch'), render_kw={"class": "pure-button pure-button-primary"})
processor = RadioField(_l('Processor'), choices=lambda: processors.available_processors(), default=processors.get_default_processor)
@@ -843,6 +843,7 @@ class processor_text_json_diff_form(commonSettingsForm):
conditions_match_logic = RadioField(_l('Match'), choices=[('ALL', _l('Match all of the following')),('ANY', _l('Match any of the following'))], default='ALL')
conditions = FieldList(FormField(ConditionFormRow), min_entries=1) # Add rule logic here
# dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
use_page_title_in_list = TernaryNoneBooleanField(_l('Use page <title> in list'), default=None)
history_snapshot_max_length = IntegerField(_l('Number of history items per watch to keep'), render_kw={"style": "width: 5em;"}, validators=[validators.Optional(), validators.NumberRange(min=2)])
@@ -991,6 +992,7 @@ class globalSettingsApplicationUIForm(Form):
open_diff_in_new_tab = BooleanField(_l("Open 'History' page in a new tab"), default=True, validators=[validators.Optional()])
socket_io_enabled = BooleanField(_l('Realtime UI Updates Enabled'), default=True, validators=[validators.Optional()])
favicons_enabled = BooleanField(_l('Favicons Enabled'), default=True, validators=[validators.Optional()])
# dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
use_page_title_in_list = BooleanField(_l('Use page <title> in watch overview list')) #BooleanField=True
# datastore.data['settings']['application']..
+17 -7
View File
@@ -65,6 +65,9 @@ def notification_format_align_with_apprise(n_format : str):
:return:
"""
if not n_format:
return NotifyFormat.TEXT.value
if n_format.startswith('html'):
# Apprise only knows 'html' not 'htmlcolor' etc, which shouldnt matter here
n_format = NotifyFormat.HTML.value
@@ -379,6 +382,20 @@ def process_notification(n_object: NotificationContextData, datastore):
n_object['llm_summary'] = _llm_change_summary or (n_object.get('_llm_result') or {}).get('summary', '')
n_object['llm_intent'] = n_object.get('_llm_intent', '')
# Re #3529: diff content from text/plain pages may contain raw '<' chars that break HTML emails.
# Escape only the diff variables before Jinja2 renders them into the template, so the user's
# own HTML in the notification body (e.g. <a href="{{watch_url}}">) is never touched.
# Diff placemarkers (e.g. @removed_PLACEMARKER_OPEN) contain no HTML chars so they survive
# html_escape and are still replaced with <span> tags by apply_service_tweaks later.
watch_mime_type = n_object.get('watch_mime_type')
if (watch_mime_type and 'text/' in watch_mime_type.lower() and 'html' not in watch_mime_type.lower()
and 'html' in requested_output_format):
from markupsafe import escape as html_escape
_page_content_keys = {'raw_diff', 'current_snapshot', 'prev_snapshot', 'triggered_text'}
for key in [k for k in notification_parameters if k.startswith('diff') or k in _page_content_keys]:
if notification_parameters.get(key):
notification_parameters[key] = str(html_escape(str(notification_parameters[key])))
with (apprise.LogCapture(level=apprise.logging.DEBUG) as logs):
for url in n_object['notification_urls']:
@@ -396,13 +413,6 @@ def process_notification(n_object: NotificationContextData, datastore):
logger.info(f">> Process Notification: AppRise start notifying '{url}'")
url = jinja_render(template_str=url, **notification_parameters)
# If it's a plaintext document, and they want HTML type email/alerts, so it needs to be escaped
watch_mime_type = n_object.get('watch_mime_type')
if watch_mime_type and 'text/' in watch_mime_type.lower() and not 'html' in watch_mime_type.lower():
if 'html' in requested_output_format:
from markupsafe import escape
n_body = str(escape(n_body))
if 'html' in requested_output_format:
# Since the n_body is always some kind of text from the 'diff' engine, attempt to preserve whitespaces that get sent to the HTML output
# But only where its more than 1 consecutive whitespace, otherwise "and this" becomes "and&nbsp;this" etc which is too much.
+3 -3
View File
@@ -29,7 +29,7 @@ def _check_cascading_vars(datastore, var_name, watch):
v = watch.get(var_name)
if v and not watch.get('notification_muted'):
if var_name == 'notification_format' and v == USE_SYSTEM_DEFAULT_NOTIFICATION_FORMAT_FOR_WATCH:
return datastore.data['settings']['application'].get('notification_format')
return datastore.data['settings']['application'].get('notification_format') or default_notification_format
return v
@@ -457,7 +457,7 @@ Thanks - Your omniscient changedetection.io installation.
'notification_body': body,
'notification_format': _check_cascading_vars(self.datastore, 'notification_format', watch),
})
n_object['markup_text_links_to_html_links'] = n_object.get('notification_format').startswith('html')
n_object['markup_text_links_to_html_links'] = (n_object.get('notification_format') or '').startswith('html')
if len(watch['notification_urls']):
n_object['notification_urls'] = watch['notification_urls']
@@ -506,7 +506,7 @@ Thanks - Your omniscient changedetection.io installation.
'notification_body': body,
'notification_format': _check_cascading_vars(self.datastore, 'notification_format', watch),
})
n_object['markup_text_links_to_html_links'] = n_object.get('notification_format').startswith('html')
n_object['markup_text_links_to_html_links'] = (n_object.get('notification_format') or '').startswith('html')
if len(watch['notification_urls']):
n_object['notification_urls'] = watch['notification_urls']
+1 -1
View File
@@ -743,7 +743,7 @@ class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore):
current_watch_count = len(self.__data['watching'])
if current_watch_count >= page_watch_limit:
logger.error(f"Watch limit reached: {current_watch_count}/{page_watch_limit} watches. Cannot add {url}")
flash(gettext("Watch limit reached ({}/{} watches). Cannot add more watches.").format(current_watch_count, page_watch_limit), 'error')
flash(gettext("Watch limit reached ({current}/{limit} watches). Cannot add more watches.").format(current=current_watch_count, limit=page_watch_limit), 'error')
return None
except ValueError:
logger.warning(f"Invalid PAGE_WATCH_LIMIT value: {page_watch_limit}, ignoring limit check")
@@ -34,6 +34,7 @@
</tr>
<tr>
<td><code>{{ '{{watch_title}}' }}</code></td>
{# TRANSLATORS: dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213 #}
<td>{{ _('The page title of the watch, uses <title> if not set, falls back to URL') }}</td>
</tr>
<tr>
@@ -46,7 +47,7 @@
</tr>
<tr>
<td><code>{{ '{{change_datetime}}' }}</code></td>
<td>{{ _('Date/time of the change, accepts format=, change_datetime(format=\'%A\')\', default is \'%Y-%m-%d %H:%M:%S %Z\'') }}</td>
<td>{{ _("Date/time of the change, accepts format=, %(call)s, default is '%(default)s'", call="change_datetime(format='%A')", default="%Y-%m-%d %H:%M:%S %Z") }}</td>
</tr>
<tr>
<td><code>{{ '{{diff_url}}' }}</code></td>
@@ -159,7 +160,7 @@
<div class="pure-form-message-inline">
<p>
<strong>{{ _('Tip:') }}</strong> {{ _('Use <a target="newwindow" href="%(url)s">AppRise Notification URLs</a> for notification to just about any service!',
url='https://github.com/caronc/apprise')|safe }} <a target="newwindow" href="https://github.com/dgtlmoon/changedetection.io/wiki/Notification-configuration-notes">{{ _('<i>Please read the notification services wiki here for important configuration notes</i>')|safe }}</a>.<br>
url='https://github.com/caronc/apprise')|safe }} <a target="newwindow" href="https://github.com/dgtlmoon/changedetection.io/wiki/Notification-configuration-notes">{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}{{ _('<i>Please read the notification services wiki here for important configuration notes</i>')|safe }}</a>.<br>
</p>
<div data-target="#advanced-help-notifications" class="toggle-show pure-button button-tag button-xsmall">{{ _('Show advanced help and tips') }}</div>
<ul style="display: none" id="advanced-help-notifications">
@@ -9,6 +9,7 @@ xpath://body/div/span[contains(@class, 'example-class')]",
{% if '/text()' in field %}
<span class="pure-form-message-inline"><strong>{{ _('Note!: //text() function does not work where the <element> contains <![CDATA[]]>') }}</strong></span><br>
{% endif %}
{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}
<span class="pure-form-message-inline">{{ _('One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used.') | safe }}<br>
<span data-target="#advanced-help-selectors" class="toggle-show pure-button button-tag button-xsmall">{{ _('Show advanced help and tips') }}</span><br>
<ul id="advanced-help-selectors" style="display: none;">
+97
View File
@@ -102,6 +102,8 @@ def test_api_simple(client, live_server, measure_memory_usage, datastore_path):
#705 `last_changed` should be zero on the first check
assert before_recheck_info['last_changed'] == 0
assert before_recheck_info['title'] == 'My test URL'
assert isinstance(before_recheck_info['link'], str), "link must be a plain string, not a tuple or list"
assert before_recheck_info['link'] == test_url
# Check the limit by tag doesnt return anything when nothing found
res = client.get(
@@ -903,6 +905,101 @@ def test_api_restock_processor_config(client, live_server, measure_memory_usage,
delete_all_watches(client)
def test_api_watch_get_returns_resolved_restock_processor_config(client, live_server, measure_memory_usage, datastore_path):
"""
GET /api/v1/watch/{uuid} must include processor_config_restock_diff and
processor_config_restock_diff_source in the response.
Two cases:
- Watch-level config only: source == 'watch', config reflects the watch's own settings.
- Tag with overrides_watch=True: source == 'tag:<uuid>', config reflects the tag's settings
regardless of what the watch itself has stored.
"""
api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token')
test_url = url_for('test_endpoint', _external=True)
# --- Case 1: watch-level config, no tag override ---
res = client.post(
url_for("createwatch"),
data=json.dumps({
"url": test_url,
"processor": "restock_diff",
"processor_config_restock_diff": {
"in_stock_processing": "all_changes",
"follow_price_changes": False,
"price_change_min": 1.23,
}
}),
headers={'content-type': 'application/json', 'x-api-key': api_key},
)
assert res.status_code == 201
watch_uuid = res.json.get('uuid')
res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key})
assert res.status_code == 200
data = res.json
assert 'processor_config_restock_diff' in data, "GET should include processor_config_restock_diff"
assert 'processor_config_restock_diff_source' in data, "GET should include processor_config_restock_diff_source"
assert data['processor_config_restock_diff_source'] == 'watch'
assert data['processor_config_restock_diff'].get('in_stock_processing') == 'all_changes'
assert data['processor_config_restock_diff'].get('follow_price_changes') == False
assert data['processor_config_restock_diff'].get('price_change_min') == 1.23
# --- Case 2: tag with overrides_watch=True overrides watch-level config ---
res = client.post(
url_for("tag"),
data=json.dumps({
"title": "Override tag",
"overrides_watch": True,
"processor_config_restock_diff": {
"in_stock_processing": "in_stock_only",
"follow_price_changes": True,
"price_change_min": 999.0,
}
}),
headers={'content-type': 'application/json', 'x-api-key': api_key},
)
assert res.status_code == 201
tag_uuid = res.json.get('uuid')
# Assign the tag to the watch
res = client.put(
url_for("watch", uuid=watch_uuid),
data=json.dumps({"tags": [tag_uuid]}),
headers={'content-type': 'application/json', 'x-api-key': api_key},
)
assert res.status_code == 200
res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key})
assert res.status_code == 200
data = res.json
assert data['processor_config_restock_diff_source'] == f'tag:{tag_uuid}', \
"Source should show the overriding tag UUID"
assert data['processor_config_restock_diff'].get('in_stock_processing') == 'in_stock_only', \
"Tag config should override watch-level config"
assert data['processor_config_restock_diff'].get('price_change_min') == 999.0, \
"Tag price_change_min should override watch-level value"
# processor_config_restock_diff is readonly — PUT attempts to set the resolved field should be
# silently ignored (the field is stripped before the watch is updated, same as other readOnly fields)
res = client.put(
url_for("watch", uuid=watch_uuid),
data=json.dumps({"processor_config_restock_diff": {"in_stock_processing": "off"}}),
headers={'content-type': 'application/json', 'x-api-key': api_key},
)
# PUT with processor_config_restock_diff is still valid (sets watch-level config),
# but the GET response continues to reflect the tag override
assert res.status_code == 200
res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key})
data = res.json
assert data['processor_config_restock_diff_source'] == f'tag:{tag_uuid}', \
"Tag override should still be active after PUT"
assert data['processor_config_restock_diff'].get('in_stock_processing') == 'in_stock_only', \
"Tag config should still win after PUT attempted to change watch-level config"
delete_all_watches(client)
def test_api_conflict_UI_password(client, live_server, measure_memory_usage, datastore_path):
@@ -336,6 +336,58 @@ def test_hardcoded_fallback_when_nothing_set(
delete_all_watches(client)
def test_llm_summary_ajax_sets_last_viewed(
client, live_server, measure_memory_usage, datastore_path):
"""
Calling /diff/<uuid>/llm-summary via AJAX should mark the watch as viewed
(set last_viewed) for both fresh and cached responses.
"""
from unittest.mock import patch, MagicMock
_configure_llm(client)
ds = client.application.config.get('DATASTORE')
test_url = url_for('test_endpoint', content_type='text/html', content='v1', _external=True)
uuid = ds.add_watch(url=test_url)
watch = ds.data['watching'][uuid]
watch.save_history_blob('old content\n', '4000000000', 'snap-old')
watch.save_history_blob('new content\n', '4000000001', 'snap-new')
assert watch['last_viewed'] == 0, "last_viewed should start at 0"
mock_response = MagicMock()
mock_response.choices = [MagicMock()]
mock_response.choices[0].message.content = 'Content changed from old to new.'
mock_response.usage = MagicMock(total_tokens=50, prompt_tokens=40, completion_tokens=10)
with patch('litellm.completion', return_value=mock_response):
res = client.get(
url_for('ui.ui_diff.diff_llm_summary', uuid=uuid,
from_version='4000000000', to_version='4000000001'),
)
assert res.status_code == 200
data = res.get_json()
assert data['summary'] == 'Content changed from old to new.'
assert watch['last_viewed'] > 0, "last_viewed should be set after fresh LLM summary"
# Reset and verify the cached path also sets last_viewed
watch['last_viewed'] = 0
with patch('litellm.completion', return_value=mock_response):
res2 = client.get(
url_for('ui.ui_diff.diff_llm_summary', uuid=uuid,
from_version='4000000000', to_version='4000000001'),
)
assert res2.status_code == 200
data2 = res2.get_json()
assert data2.get('cached') is True
assert watch['last_viewed'] > 0, "last_viewed should be set even when returning cached summary"
delete_all_watches(client)
def test_global_default_saved_and_loaded_via_settings_form(
client, live_server, measure_memory_usage, datastore_path):
"""
@@ -541,6 +541,39 @@ def test_single_send_test_notification_on_watch(client, live_server, measure_mem
assert 'Current snapshot: Example text: example test' in x
os.unlink(os.path.join(datastore_path, "notification.txt"))
# Regression test for #4119 - sending a test notification with 'System default' format caused a crash
def test_send_test_notification_with_system_default_format(client, live_server, measure_memory_usage, datastore_path):
set_original_response(datastore_path=datastore_path)
if os.path.isfile(os.path.join(datastore_path, "notification.txt")):
os.unlink(os.path.join(datastore_path, "notification.txt"))
test_notification_url = url_for('test_notification_endpoint', _external=True).replace('http://', 'post://') + "?status_code=204"
test_url = url_for('test_endpoint', _external=True)
uuid = client.application.config.get('DATASTORE').add_watch(url=test_url)
client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
wait_for_all_checks(client)
# New watches default to USE_SYSTEM_DEFAULT_NOTIFICATION_FORMAT_FOR_WATCH.
# The JS sends this value verbatim from the select; it must not crash.
res = client.post(
url_for("ui.ui_notification.ajax_callback_send_notification_test") + f"/{uuid}",
data={
"notification_urls": test_notification_url,
"notification_body": default_notification_body,
"notification_title": default_notification_title,
"notification_format": USE_SYSTEM_DEFAULT_NOTIFICATION_FORMAT_FOR_WATCH,
},
follow_redirects=True
)
assert res.status_code != 400
assert res.status_code != 500
client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True)
def _test_color_notifications(client, notification_body_token, datastore_path):
set_original_response(datastore_path=datastore_path)
@@ -602,3 +635,68 @@ def test_html_color_notifications(client, live_server, measure_memory_usage, dat
_test_color_notifications(client, '{{diff}}',datastore_path=datastore_path)
_test_color_notifications(client, '{{diff_full}}',datastore_path=datastore_path)
def _test_custom_html_in_notification_body_not_escaped(client, datastore_path, content_type=None):
"""
#4121 - Custom HTML in the notification body (e.g. <a href="{{watch_url}}">) must NOT be
HTML-escaped regardless of the watched page's content-type. Only raw diff content from
text/plain pages needs escaping (to prevent raw '<' chars breaking HTML email rendering).
"""
set_original_response(datastore_path=datastore_path)
if os.path.isfile(os.path.join(datastore_path, "notification.txt")):
os.unlink(os.path.join(datastore_path, "notification.txt"))
test_notification_url = url_for('test_notification_endpoint', _external=True).replace('http://', 'post://')
kwargs = {'content_type': content_type} if content_type else {}
test_url = url_for('test_endpoint', _external=True, **kwargs)
res = client.post(
url_for("settings.settings_page"),
data={
"application-fetch_backend": "html_requests",
"application-minutes_between_check": 180,
"application-notification_body": '<a href="{{watch_url}}">Watch Link</a> had changes\n\n{{diff}}',
"application-notification_format": "htmlcolor",
"application-notification_urls": test_notification_url,
"application-notification_title": "Change detected",
},
follow_redirects=True
)
assert b'Settings updated' in res.data
res = client.post(
url_for("ui.ui_views.form_quick_watch_add"),
data={"url": test_url, "tags": ''},
follow_redirects=True
)
assert b"Watch added" in res.data
wait_for_all_checks(client)
set_modified_response(datastore_path=datastore_path)
res = client.get(url_for("ui.form_watch_checknow"), follow_redirects=True)
assert b'Queued 1 watch for rechecking.' in res.data
wait_for_all_checks(client)
wait_for_notification_endpoint_output(datastore_path=datastore_path)
with open(os.path.join(datastore_path, "notification.txt"), 'r') as f:
x = f.read()
assert '&lt;a href=' not in x, f"Custom HTML <a> tag was incorrectly escaped (content_type={content_type})"
assert '<a href=' in x, f"Custom HTML <a> tag not found unescaped (content_type={content_type})"
assert '<span' in x, f"Expected color <span> tags not found (content_type={content_type})"
client.get(url_for("ui.form_delete", uuid="all"), follow_redirects=True)
def test_plaintext_watch_custom_html_in_notification_body_not_escaped(client, live_server, measure_memory_usage, datastore_path):
# text/plain: diff content may contain raw '<' chars — those must be escaped, but NOT the user's template HTML
_test_custom_html_in_notification_body_not_escaped(client, datastore_path, content_type="text/plain")
# text/html: HTML processor strips tags before diffing, no escaping needed, user's template HTML must be preserved
_test_custom_html_in_notification_body_not_escaped(client, datastore_path, content_type="text/html")
# no MIME type (None): same as HTML case, user's template HTML must be preserved
_test_custom_html_in_notification_body_not_escaped(client, datastore_path, content_type=None)
+52
View File
@@ -223,6 +223,58 @@ Babel auto-discovers the new language on subsequent runs.
---
## Dennis linter
We use [mozilla/dennis](https://github.com/mozilla/dennis) to enforce technical correctness in `.po` and `.pot` files.
See the [Table of Warnings and Errors](https://dennis.readthedocs.io/en/latest/linting.html#table-of-warnings-and-errors)
for the full list of rules.
### Running the linter locally
To match the CI checks, run the following commands:
```bash
# Check for errors only (always enforced)
dennis-cmd lint --errorsonly changedetectionio/translations/
# Check for warnings (excluding W302 unchanged translations)
dennis-cmd lint --excluderules=W302 changedetectionio/translations/
```
### Common problems and resolutions
#### HTML tag mismatch (`W303`)
The `W303` rule ensures that HTML tags in the `msgstr` match the `msgid`. This is crucial for catching broken markup (e.g., missing closing tags).
##### Handling intentional deviations and false positives
Some W303 warnings are intentional or result from upstream false positives.
Use the `dennis-ignore: W303` comment in the source files (templates or Python code) within a `TRANSLATORS` comment to suppress these warnings.
This ensures the ignore instruction is extracted into the `.po` files.
- **CJK italic policy**: When replacing `<i>` with locale-conventional quotation marks, tags will no longer match.
- **Upstream false positive**: Dennis misinterprets certain HTML tags (e.g., `<title>`) within `msgstr`. See https://github.com/mozilla/dennis/issues/213.
**Examples in Jinja2 templates:**
```jinja
{# TRANSLATORS: CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #}
<p>{{ _('These settings are <strong><i>added</i></strong> to any existing watch configurations.')|safe }}</p>
{# TRANSLATORS: dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213 #}
<td>{{ _('The page title of the watch, uses <title> if not set, falls back to URL') }}</td>
```
**Example in Python source:**
```python
# dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
use_page_title_in_list = BooleanField(_l('Use page <title> in watch overview list'))
```
---
## CI linter
A GitHub Actions job (`lint-template-i18n`) checks for adjacent `{{ _(...) }}` calls on the same line
@@ -160,8 +160,8 @@ msgstr "Importuje se prvních 5000 URL adres, další lze načíst opakovaným i
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} importováno ze seznamu za {:.2f}s, {} přeskočeno."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} importováno ze seznamu za {duration}s, {skipped_count} přeskočeno."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "Strukturovaný JSON text je neplatný, byl poškozen?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} importováno z Distill.io za {:.2f}s, {} přeskočeno."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} importováno z Distill.io za {duration}s, {skipped_count} přeskočeno."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,22 +192,18 @@ msgstr "Chyba při zpracování řádku {}, zkontrolujte že všechny typy dat v
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} importováno z Wachete .xlsx za {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} importováno z Wachete .xlsx za {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} importováno z vlastního .xlsx za {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} importováno z vlastního .xlsx za {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Seznam adres URL"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX a Wachete"
@@ -241,6 +237,7 @@ msgstr "URL, které neprojdou validací, zůstanou v textové oblasti."
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Nakopírujte a vložte exportovaný Distill.io soubor, měl by být ve formátu JSON."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -313,8 +310,8 @@ msgstr "Ochrana heslem odebrána."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Upozornění: Počet pracovních procesů ({}) se blíží nebo překračuje počet CPU jader ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Upozornění: Počet pracovních procesů ({worker_count}) se blíží nebo překračuje počet CPU jader ({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -368,8 +365,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -393,14 +390,6 @@ msgstr "Globální filtry"
msgid "UI Options"
msgstr "Možnosti uživatelského rozhraní"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Zálohy"
@@ -1071,7 +1060,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1213,6 +1202,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1429,8 +1419,8 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "Do fronty přidáno {} sledování k opětovné kontrole ({} již ve frontě nebo běží)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "Do fronty přidáno {count} sledování k opětovné kontrole ({skipped_count} již ve frontě nebo běží)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1919,6 +1909,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2176,6 +2167,7 @@ msgstr "Vymazat historie"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>Opravdu chcete vyčistit historii u vybraných položek?</p><p>Tuto akci nelze vzít zpět.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2189,8 +2181,8 @@ msgid "Delete Watches?"
msgstr "Smazat sledování?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>Opravdu chcete smazat vybraná sledování?</p><p>Tuto akci nelze vzít zpět.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>Opravdu chcete smazat vybraná sledování?</strong></p><p>Tuto akci nelze vzít zpět.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2668,18 +2660,18 @@ msgstr "RegEx '%s' není platný regulární výraz."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' není platný výraz XPath. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' není platný výraz XPath. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' není platný výraz JSONPath. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' není platný výraz JSONPath. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' není platný výraz jq. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' není platný výraz jq. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2689,10 +2681,6 @@ msgstr "Prázdná hodnota není povolena."
msgid "Invalid value."
msgstr "Neplatná hodnota."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Skupina / Značka"
@@ -2928,6 +2916,7 @@ msgstr "Spojit všechny následující položky"
msgid "Match any of the following"
msgstr "Přiřaďte kteroukoli z následujících možností"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "V seznamu použijte stránku <title>"
@@ -3027,6 +3016,7 @@ msgstr "Aktualizace UI v reálném čase"
msgid "Favicons Enabled"
msgstr "Povolit favikony"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Použijte stránku <title> v přehledu sledování"
@@ -3381,7 +3371,7 @@ msgstr ""
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3416,6 +3406,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr "UUID monitoru."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3430,7 +3421,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3552,6 +3543,7 @@ msgstr "Více zde"
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3913,6 +3905,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -162,8 +162,8 @@ msgstr "Es werden 5.000 der ersten URLs aus Ihrer Liste importiert, der Rest kan
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} aus Liste importiert in {:.2f}s, {} übersprungen."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} aus Liste importiert in {duration}s, {skipped_count} übersprungen."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -175,8 +175,8 @@ msgstr "JSON-Struktur sieht ungültig aus, ist sie beschädigt?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} aus Distill.io importiert in {:.2f}s, {} übersprungen."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} aus Distill.io importiert in {duration}s, {skipped_count} übersprungen."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,22 +194,18 @@ msgstr "Fehler bei der Verarbeitung von Zeile {}, prüfen Sie, ob alle Zelldaten
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} aus Wachete .xlsx importiert in {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} aus Wachete .xlsx importiert in {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} aus benutzerdefinierter .xlsx importiert in {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} aus benutzerdefinierter .xlsx importiert in {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URL-Liste"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX & Wachete"
@@ -247,6 +243,7 @@ msgstr ""
"Kopieren Sie Ihre Distill.io-Watch-„Export“-Datei und fügen Sie sie ein. Dabei sollte es sich um eine JSON-Datei "
"handeln."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -319,8 +316,8 @@ msgstr "Passwortschutz entfernt."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Warnung: Anzahl der Worker ({}) nähert sich oder überschreitet die verfügbaren CPU-Kerne ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Warnung: Anzahl der Worker ({worker_count}) nähert sich oder überschreitet die verfügbaren CPU-Kerne ({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -374,8 +371,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -399,14 +396,6 @@ msgstr "Globale Filter"
msgid "UI Options"
msgstr "UI-Optionen"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Backups"
@@ -1087,7 +1076,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1229,6 +1218,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "Diese Einstellungen werden zu allen vorhandenen Überwachungskonfigurationen <strong><i>hinzugefügt</i></strong>."
@@ -1339,7 +1329,7 @@ msgid ""
"watches will be removed from it.</p>"
msgstr ""
"<p>Möchten Sie wirklich alle Beobachtungen aus der Gruppe <strong>%(title)s</strong> entfernen?</p><p>Das Tag bleibt "
"erhalten, aber die Beobachtungen werden daraus entfernt."
"erhalten, aber die Beobachtungen werden daraus entfernt.</p>"
#: changedetectionio/blueprint/tags/templates/groups-overview.html
msgid "Unlink"
@@ -1452,8 +1442,8 @@ msgstr "1 Überwachung zur erneuten Überprüfung in Warteschlange gestellt."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} Überwachungen zur erneuten Überprüfung eingereiht ({} bereits in Warteschlange oder laufend)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} Überwachungen zur erneuten Überprüfung eingereiht ({skipped_count} bereits in Warteschlange oder laufend)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1960,6 +1950,7 @@ msgstr ""
"Gut geeignet für Websites, auf denen nur Inhalte verschoben werden und Sie wissen möchten, wann NEUE Inhalte "
"hinzugefügt werden. Vergleicht neue Zeilen mit dem gesamten Verlauf dieser Überwachung."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2225,6 +2216,7 @@ msgstr ""
"<p>Möchten Sie den Verlauf für die ausgewählten Elemente wirklich löschen?</p><p>Diese Aktion kann nicht rückgängig "
"gemacht werden.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2238,10 +2230,10 @@ msgid "Delete Watches?"
msgstr "Überwachungen löschen?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
"<p>Möchten Sie die ausgewählten Überwachungen wirklich löschen?</strong></p><p>Diese Aktion kann nicht rückgängig "
"gemacht werden.</p>"
"<p><strong>Möchten Sie die ausgewählten Überwachungen wirklich löschen?</strong></p><p>Diese Aktion kann nicht "
"rückgängig gemacht werden.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2719,18 +2711,18 @@ msgstr "RegEx „%s“ ist kein gültiger regulärer Ausdruck."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "„%s“ ist kein gültiger XPath-Ausdruck. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "„%(expression)s“ ist kein gültiger XPath-Ausdruck. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "„%s“ ist kein gültiger JSONPath-Ausdruck. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "„%(expression)s“ ist kein gültiger JSONPath-Ausdruck. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "„%s“ ist kein gültiger JQ-Ausdruck. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "„%(expression)s“ ist kein gültiger JQ-Ausdruck. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2740,10 +2732,6 @@ msgstr "Leerer Wert nicht zulässig."
msgid "Invalid value."
msgstr "Ungültiger Wert."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Gruppe / Label"
@@ -2980,9 +2968,10 @@ msgstr "Passen Sie alle folgenden Punkte an"
msgid "Match any of the following"
msgstr "Entspricht einer der folgenden Bedingungen"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Verwenden Sie Seite <Titel> in der Liste"
msgstr "Verwenden Sie Seite <title> in der Liste"
#: changedetectionio/forms.py
msgid "Number of history items per watch to keep"
@@ -3079,9 +3068,10 @@ msgstr "Echtzeit-UI-Updates aktiviert"
msgid "Favicons Enabled"
msgstr "Favicons Aktiviert"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Verwenden Sie die Seite <Titel> in der Übersichtsliste der Beobachtungen"
msgstr "Verwenden Sie die Seite <title> in der Übersichtsliste der Beobachtungen"
#: changedetectionio/forms.py
msgid "API access token security check enabled"
@@ -3133,7 +3123,7 @@ msgstr "RSS-Inhaltsformat"
#: changedetectionio/forms.py
msgid "RSS <description> body built from"
msgstr "RSS-<Beschreibung>-Körper erstellt aus"
msgstr "RSS-<description>-Körper erstellt aus"
#: changedetectionio/forms.py
msgid "RSS \"System default\" template override"
@@ -3435,7 +3425,7 @@ msgstr "Das Protokoll wird nicht unterstützt oder das URL-Format ist ungültig.
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3470,6 +3460,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr "Die UUID der Überwachung."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3484,7 +3475,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3606,6 +3597,7 @@ msgstr "Mehr hier"
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3969,6 +3961,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,7 +160,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -173,7 +173,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -192,22 +192,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ""
@@ -241,6 +237,7 @@ msgstr ""
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -311,7 +308,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
@@ -366,8 +363,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -391,14 +388,6 @@ msgstr ""
msgid "UI Options"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr ""
@@ -1069,7 +1058,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1211,6 +1200,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1425,7 +1415,7 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
@@ -1915,6 +1905,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2172,6 +2163,7 @@ msgstr ""
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr ""
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr ""
@@ -2185,7 +2177,7 @@ msgid "Delete Watches?"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2662,17 +2654,17 @@ msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
@@ -2683,10 +2675,6 @@ msgstr ""
msgid "Invalid value."
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr ""
#: changedetectionio/forms.py
msgid "Group tag"
msgstr ""
@@ -2922,6 +2910,7 @@ msgstr ""
msgid "Match any of the following"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr ""
@@ -3021,6 +3010,7 @@ msgstr ""
msgid "Favicons Enabled"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr ""
@@ -3375,7 +3365,7 @@ msgstr ""
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3410,6 +3400,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3424,7 +3415,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3546,6 +3537,7 @@ msgstr ""
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3907,6 +3899,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,7 +160,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -173,7 +173,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -192,22 +192,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ""
@@ -241,6 +237,7 @@ msgstr ""
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -311,7 +308,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
@@ -366,8 +363,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -391,14 +388,6 @@ msgstr ""
msgid "UI Options"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr ""
@@ -1069,7 +1058,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1211,6 +1200,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1425,7 +1415,7 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
@@ -1915,6 +1905,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2172,6 +2163,7 @@ msgstr ""
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr ""
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr ""
@@ -2185,7 +2177,7 @@ msgid "Delete Watches?"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2662,17 +2654,17 @@ msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
@@ -2683,10 +2675,6 @@ msgstr ""
msgid "Invalid value."
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr ""
#: changedetectionio/forms.py
msgid "Group tag"
msgstr ""
@@ -2922,6 +2910,7 @@ msgstr ""
msgid "Match any of the following"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr ""
@@ -3021,6 +3010,7 @@ msgstr ""
msgid "Favicons Enabled"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr ""
@@ -3375,7 +3365,7 @@ msgstr ""
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3410,6 +3400,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3424,7 +3415,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3546,6 +3537,7 @@ msgstr ""
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3907,6 +3899,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,8 +160,8 @@ msgstr "Importando 5.000 de las primeras URL de tu lista, el resto se puede impo
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} importado de la lista en {:.2f}s, {} omitido."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} importado de la lista en {duration}s, {skipped_count} omitido."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "La estructura JSON parece no válida, ¿estaba rota?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} importado de Distill.io en {:.2f}s, {} omitido."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} importado de Distill.io en {duration}s, {skipped_count} omitido."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,22 +194,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} importado de Wachete .xlsx en {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} importado de Wachete .xlsx en {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} importado desde .xlsx personalizado en {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} importado desde .xlsx personalizado en {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Lista de URL"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX y Wachete"
@@ -245,6 +241,7 @@ msgstr "Las URL que no pasen la validación permanecerán en el área de texto."
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Copie y pegue el archivo de 'exportación' del monitor Distill.io, este debería ser un archivo JSON."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -317,8 +314,10 @@ msgstr "Se eliminó la protección con contraseña."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Advertencia: recuento de trabajadores ({} ) está cerca o excede los núcleos de CPU disponibles ({} )"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr ""
"Advertencia: recuento de trabajadores ({worker_count} ) está cerca o excede los núcleos de CPU disponibles "
"({cpu_count} )"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -372,8 +371,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -397,14 +396,6 @@ msgstr "Filtros globales"
msgid "UI Options"
msgstr "Opciones de interfaz de usuario"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Copias de seguridad"
@@ -1105,7 +1096,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1247,6 +1238,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "Estas configuraciones son <strong><i>agregadas</i></strong> a cualquier configuración de monitor existente."
@@ -1470,8 +1462,8 @@ msgstr "1 monitor en cola para volver a verificar."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} monitores en cola para volver a comprobar ({} ya en cola o en ejecución)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} monitores en cola para volver a comprobar ({skipped_count} ya en cola o en ejecución)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1972,6 +1964,7 @@ msgstr ""
"Bueno para sitios web que simplemente mueven el contenido y desea saber cuándo se agrega contenido NUEVO, compara "
"nuevas líneas con todo el historial de este monitor."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2239,6 +2232,7 @@ msgstr ""
"<p>¿Está seguro de que desea borrar el historial de los elementos seleccionados?</p><p>Esta acción no se puede "
"deshacer.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2252,9 +2246,9 @@ msgid "Delete Watches?"
msgstr "¿Eliminar monitores?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
"<p>¿Está seguro de que desea eliminar los monitores seleccionados?</strong></p><p>Esta acción no se puede "
"<p><strong>¿Está seguro de que desea eliminar los monitores seleccionados?</strong></p><p>Esta acción no se puede "
"deshacer.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2733,18 +2727,18 @@ msgstr "Expresión regular '%s' no es una expresión regular válida."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' no es una expresión XPath válida. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' no es una expresión XPath válida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' no es una expresión JSONPath válida. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' no es una expresión JSONPath válida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' no es una expresión jq válida. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' no es una expresión jq válida. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2754,10 +2748,6 @@ msgstr "Valor vacío no permitido."
msgid "Invalid value."
msgstr "Valor no válido."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Etiqueta de grupo"
@@ -2993,9 +2983,10 @@ msgstr "Coincide con todo lo siguiente"
msgid "Match any of the following"
msgstr "Coincide con cualquiera de los siguientes"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Usar página<title>en la lista"
msgstr "Usar página <title> en la lista"
#: changedetectionio/forms.py
msgid "Number of history items per watch to keep"
@@ -3092,6 +3083,7 @@ msgstr "Actualizaciones de UI en tiempo real habilitadas"
msgid "Favicons Enabled"
msgstr "Favicones habilitados"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Usar <title> de la página en la lista general de monitores"
@@ -3446,8 +3438,8 @@ msgstr "El protocolo de visualización no está permitido o el formato de URL no
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "Límite de visualización alcanzado ({} /{} monitores). No se pueden agregar más monitores."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "Límite de visualización alcanzado ({current} /{limit} monitores). No se pueden agregar más monitores."
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3481,9 +3473,10 @@ msgstr "La URL que se está viendo."
msgid "The UUID of the watch."
msgstr "El UUID del monitor."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "El título de la página del monitor, utiliza<title>si no se establece, vuelve a la URL"
msgstr "El título de la página del monitor, utiliza <title> si no se establece, vuelve a la URL"
#: changedetectionio/templates/_common_fields.html
msgid "The watch group / tag"
@@ -3495,7 +3488,7 @@ msgstr "La URL de la página de vista previa generada por changetection.io."
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3619,6 +3612,7 @@ msgstr ""
"¡Use las <a target=\"newwindow\" href=\"%(url)s\">URL de notificación de AppRise</a> para notificar a casi cualquier "
"servicio!"
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<i>Lea la wiki de servicios de notificación aquí para obtener notas de configuración importantes</i>"
@@ -3982,6 +3976,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,8 +160,8 @@ msgstr "Importation de 5 000 des premières URL de votre liste, le reste peut ê
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} importées de la liste en {:.2f}s, {} ignorées."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} importées de la liste en {duration}s, {skipped_count} ignorées."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "La structure JSON semble invalide, est-elle corrompue ?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} importées de Distill.io en {:.2f}s, {} ignorées."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} importées de Distill.io en {duration}s, {skipped_count} ignorées."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,22 +194,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} importées de Wachete .xlsx en {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} importées de Wachete .xlsx en {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} importées de .xlsx personnalisé en {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} importées de .xlsx personnalisé en {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Liste d'URL"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX et Wachete"
@@ -243,6 +239,7 @@ msgstr "Les URL qui ne passent pas la validation resteront dans la zone de texte
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -315,8 +312,8 @@ msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Avertissement: Le nombre de workers ({}) approche ou dépasse les cœurs CPU disponibles ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Avertissement: Le nombre de workers ({worker_count}) approche ou dépasse les cœurs CPU disponibles ({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -370,8 +367,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -395,14 +392,6 @@ msgstr "Filtres globaux"
msgid "UI Options"
msgstr "Options de l'interface utilisateur"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "SAUVEGARDES"
@@ -1075,7 +1064,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1217,6 +1206,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1434,8 +1424,8 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} moniteurs mis en file d'attente ({} déjà en file ou en cours)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} moniteurs mis en file d'attente ({skipped_count} déjà en file ou en cours)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1926,6 +1916,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2183,6 +2174,7 @@ msgstr "Effacer les historiques"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr ""
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "D'ACCORD"
@@ -2196,7 +2188,7 @@ msgid "Delete Watches?"
msgstr "Supprimer les montres ?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2675,18 +2667,18 @@ msgstr "RegEx '%s' n'est pas une expression régulière valide."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' n'est pas une expression XPath valide. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' n'est pas une expression XPath valide. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' n'est pas une expression JSONPath valide. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' n'est pas une expression JSONPath valide. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' n'est pas une expression jq valide. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' n'est pas une expression jq valide. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2696,10 +2688,6 @@ msgstr "Valeur vide non autorisée."
msgid "Invalid value."
msgstr "Valeur invalide."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Groupe / Étiquette"
@@ -2935,9 +2923,10 @@ msgstr "Faites correspondre tous les éléments suivants"
msgid "Match any of the following"
msgstr "Faites correspondre l'un des éléments suivants"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Utiliser la page <titre> dans la liste"
msgstr "Utiliser la page <title> dans la liste"
#: changedetectionio/forms.py
msgid "Number of history items per watch to keep"
@@ -3034,9 +3023,10 @@ msgstr "Mises à jour en temps réel hors ligne"
msgid "Favicons Enabled"
msgstr "Favicons Activés"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Utiliser la page <titre> dans la liste de présentation des moniteurs"
msgstr "Utiliser la page <title> dans la liste de présentation des moniteurs"
#: changedetectionio/forms.py
msgid "API access token security check enabled"
@@ -3388,7 +3378,7 @@ msgstr ""
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3423,6 +3413,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr "L'UUID du moniteur."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3437,7 +3428,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3559,6 +3550,7 @@ msgstr "Plus d'infos ici"
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3922,6 +3914,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,8 +160,8 @@ msgstr "Importazione delle prime 5.000 URL dalla tua lista, il resto può essere
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} Importate dalla lista in {:.2f}s, {} Ignorate."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} Importate dalla lista in {duration}s, {skipped_count} Ignorate."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "La struttura JSON sembra non valida, è danneggiata?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} Importate da Distill.io in {:.2f}s, {} Ignorate."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} Importate da Distill.io in {duration}s, {skipped_count} Ignorate."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,22 +194,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} importate da Wachete .xlsx in {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} importate da Wachete .xlsx in {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} importate da .xlsx personalizzato in {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} importate da .xlsx personalizzato in {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Lista URL"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX & Wachete"
@@ -243,6 +239,7 @@ msgstr ""
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -313,8 +310,8 @@ msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Avviso: Il numero di worker ({}) si avvicina o supera i core CPU disponibili ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Avviso: Il numero di worker ({worker_count}) si avvicina o supera i core CPU disponibili ({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -368,8 +365,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -393,14 +390,6 @@ msgstr "Filtri globali"
msgid "UI Options"
msgstr "Opzioni interfaccia"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Backup"
@@ -1071,7 +1060,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1213,6 +1202,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1427,8 +1417,8 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} monitor in coda ({} già in coda o in esecuzione)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} monitor in coda ({skipped_count} già in coda o in esecuzione)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1917,6 +1907,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2174,6 +2165,7 @@ msgstr "Cancella cronologie"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr ""
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2187,7 +2179,7 @@ msgid "Delete Watches?"
msgstr "Eliminare monitoraggi?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2664,18 +2656,18 @@ msgstr "La RegEx '%s' non è un'espressione regolare valida."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' non è un'espressione XPath valida. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' non è un'espressione XPath valida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' non è un'espressione JSONPath valida. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' non è un'espressione JSONPath valida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' non è un'espressione jq valida. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' non è un'espressione jq valida. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2685,10 +2677,6 @@ msgstr "Valore vuoto non consentito."
msgid "Invalid value."
msgstr "Valore non valido."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Gruppo / Etichetta"
@@ -2924,6 +2912,7 @@ msgstr "Corrisponde a tutti i seguenti"
msgid "Match any of the following"
msgstr "Corrisponde a uno qualsiasi dei seguenti"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Usa <title> pagina nell'elenco"
@@ -3023,6 +3012,7 @@ msgstr "Aggiornamenti UI in tempo reale attivi"
msgid "Favicons Enabled"
msgstr "Favicon attive"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Usa <title> pagina nell'elenco osservati"
@@ -3377,7 +3367,7 @@ msgstr "Protocollo non consentito o formato URL non valido"
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3412,6 +3402,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr "L'UUID del monitor."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3426,7 +3417,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3548,6 +3539,7 @@ msgstr ""
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3909,6 +3901,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -161,8 +161,8 @@ msgstr "リストの最初の5,000件のURLをインポートしています。
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} 件をリストから {:.2f}秒でインポートしました。{} 件をスキップしました。"
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} 件をリストから {duration}秒でインポートしました。{skipped_count} 件をスキップしました。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -174,8 +174,8 @@ msgstr "JSONの構造が無効のようです。ファイルが壊れていま
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} 件を Distill.io から {:.2f}秒でインポートしました。{} 件をスキップしました。"
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} 件を Distill.io から {duration}秒でインポートしました。{skipped_count} 件をスキップしました。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -193,22 +193,18 @@ msgstr "行番号 {} の処理中にエラーが発生しました。すべて
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} 件を Wachete .xlsx から {:.2f}秒でインポートしました"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} 件を Wachete .xlsx から {duration}秒でインポートしました"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} 件をカスタム .xlsx から {:.2f}秒でインポートしました"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} 件をカスタム .xlsx から {duration}秒でインポートしました"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URLリスト"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX & Wachete"
@@ -243,6 +239,7 @@ msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON
msgstr "Distill.io ウォッチの「エクスポート」ファイルをコピーして貼り付けてください。JSONファイルである必要があります。"
# 訳注: 日本語を斜体にすると字形が崩れるため、強調表示は<strong>に置き換える。
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -315,8 +312,8 @@ msgstr "パスワード保護が解除されました。"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "警告:ワーカー数({})が利用可能なCPUコア数({})に近いか超えています"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "警告:ワーカー数({worker_count})が利用可能なCPUコア数({cpu_count})に近いか超えています"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -370,8 +367,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -395,14 +392,6 @@ msgstr "グローバルフィルタ"
msgid "UI Options"
msgstr "UI オプション"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "バックアップ"
@@ -1076,7 +1065,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1219,6 +1208,7 @@ msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr "タグ名に基づく自動生成色を使用する場合はチェックを外してください。"
# 訳注: 日本語を斜体にすると字形が崩れるため、<strong> のみで強調し <i> は外す
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "これらの設定は既存のすべてのウォッチ設定に<strong>追加</strong>されます。"
@@ -1433,8 +1423,8 @@ msgstr "1件のウォッチを再チェックのためキューに追加しま
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} 件のウォッチを再チェックのためキューに追加しました({} 件はすでにキュー済みまたは実行中)。"
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} 件のウォッチを再チェックのためキューに追加しました({skipped_count} 件はすでにキュー済みまたは実行中)。"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1930,6 +1920,7 @@ msgid ""
msgstr "コンテンツを移動させるだけのウェブサイトに適しています。新しいコンテンツが追加されたときに知りたい場合に便利で、このウォッチのすべての履歴と新しい行を比較します。"
# 訳注: 日本語を斜体にすると字形が崩れるため、参照は「」で囲む。
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr "サイトが行を並べ替えることで発生する不要な変更検知を減らすのに役立ちます。下の「ユニーク行をチェック」と組み合わせてください。"
@@ -2191,6 +2182,7 @@ msgstr "履歴をすべてクリア"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>選択した項目の履歴をクリアしてもよいですか?</p><p>この操作は元に戻せません。</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2204,8 +2196,8 @@ msgid "Delete Watches?"
msgstr "ウォッチを削除しますか?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>選択したウォッチを削除してもよいですか?</strong></p><p>この操作は元に戻せません。</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>選択したウォッチを削除してもよいですか?</strong></p><p>この操作は元に戻せません。</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2681,18 +2673,18 @@ msgstr "正規表現 '%s' は有効な正規表現ではありません。"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' は有効なXPath式ではありません。(%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' は有効なXPath式ではありません。(%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' は有効なJSONPath式ではありません。(%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' は有効なJSONPath式ではありません。(%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' は有効なjq式ではありません。(%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' は有効なjq式ではありません。(%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2702,10 +2694,6 @@ msgstr "空の値は許可されていません。"
msgid "Invalid value."
msgstr "無効な値です。"
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "グループタグ"
@@ -2941,6 +2929,7 @@ msgstr "以下のすべてに一致"
msgid "Match any of the following"
msgstr "以下のいずれかに一致"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "リストでページの <title> を使用"
@@ -3040,6 +3029,7 @@ msgstr "リアルタイムUI更新を有効化"
msgid "Favicons Enabled"
msgstr "ファビコンを有効化"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "ウォッチ一覧リストでページの <title> を使用"
@@ -3394,8 +3384,8 @@ msgstr "ウォッチのプロトコルが許可されていないか、URL形式
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "ウォッチの上限に達しました({}/{} ウォッチ)。これ以上ウォッチを追加できません。"
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "ウォッチの上限に達しました({current}/{limit} ウォッチ)。これ以上ウォッチを追加できません。"
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3429,6 +3419,7 @@ msgstr "監視中のURL。"
msgid "The UUID of the watch."
msgstr "ウォッチのUUID。"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "ウォッチのページタイトル。設定されていない場合は <title> を使用し、それもなければURLにフォールバックします。"
@@ -3443,8 +3434,8 @@ msgstr "changedetection.io が生成したプレビューページのURL。"
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgstr "変更の日時。format= を受け付けます(例: change_datetime(format='%A'))。デフォルトは '%Y-%m-%d %H:%M:%S %Z'。"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr "変更の日時。format= を受け付けます(例: %(call)s)。デフォルトは '%(default)s'。"
#: changedetectionio/templates/_common_fields.html
msgid "The URL of the diff output for the watch."
@@ -3572,6 +3563,7 @@ msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a
msgstr "<a target=\"newwindow\" href=\"%(url)s\">AppRise 通知URL</a> を使えば、ほぼすべてのサービスへの通知に対応できます!"
# 訳注: 日本語を斜体にすると字形が崩れるため、強調表示は<strong>に置き換える。
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<strong>重要な設定に関するメモについては、通知サービスのWikiをこちらでお読みください</strong>"
@@ -3941,6 +3933,7 @@ msgid "Note!: //text() function does not work where the <element> contains <![CD
msgstr "注意: <element> が <![CDATA[]]> を含む場合、//text() 関数は動作しません"
# 訳注: 日本語を斜体にすると字形が崩れるため、強調表示は<strong>に置き換える。
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr "1行につき1つのCSS、xPath 1 & 2、JSON Path/JQセレクタを指定してください。一致した<strong>すべての</strong>ルールが使用されます。"
@@ -160,8 +160,8 @@ msgstr "목록의 처음 5,000개 URL만 가져옵니다. 나머지는 다시
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "목록에서 {}개를 {:.2f}초 만에 가져왔습니다. {}개는 건너뛰었습니다."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "목록에서 {count}개를 {duration}초 만에 가져왔습니다. {skipped_count}개는 건너뛰었습니다."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "JSON 구조가 올바르지 않습니다. 파일이 손상되었나요?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "Distill.io에서 {}개를 {:.2f}초 만에 가져왔습니다. {}개는 건너뛰었습니다."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "Distill.io에서 {count}개를 {duration}초 만에 가져왔습니다. {skipped_count}개는 건너뛰었습니다."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,22 +192,18 @@ msgstr "{}행 처리 중 오류가 발생했습니다. 모든 셀 데이터 형
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "Wachete .xlsx에서 {}개를 {:.2f}초 만에 가져왔습니다."
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "Wachete .xlsx에서 {count}개를 {duration}초 만에 가져왔습니다."
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "사용자 지정 .xlsx에서 {}개를 {:.2f}초 만에 가져왔습니다."
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "사용자 지정 .xlsx에서 {count}개를 {duration}초 만에 가져왔습니다."
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URL 목록"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX 및 Wachete"
@@ -241,6 +237,7 @@ msgstr "유효성 검사를 통과하지 못한 URL은 텍스트 영역에 유
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Distill.io 모니터링 '내보내기' 파일을 복사해 붙여 넣어 주세요. JSON 파일이어야 합니다."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -313,8 +310,8 @@ msgstr "비밀번호 보호가 해제되었습니다."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "경고: 워커 수({})가 사용 가능한 CPU 코어 수({})에 근접하거나 초과합니다"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "경고: 워커 수({worker_count})가 사용 가능한 CPU 코어 수({cpu_count})에 근접하거나 초과합니다"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -368,9 +365,9 @@ msgid "AI / LLM configuration removed."
msgstr "AI / LLM 설정이 제거되었습니다."
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
msgstr "AI 요약 캐시가 지워졌습니다(%(n)s개 파일 제거됨)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr "AI 요약 캐시가 지워졌습니다({}개 파일 제거됨)."
#: changedetectionio/blueprint/settings/templates/notification-log.html
msgid "Notification debug log"
@@ -393,14 +390,6 @@ msgstr "전역 필터"
msgid "UI Options"
msgstr "UI 옵션"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "백업"
@@ -1077,8 +1066,8 @@ msgstr "(<code>LLM_MAX_INPUT_CHARS</code>로 설정됨)"
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgstr "문자 - 현재 적용 중: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr "문자 - 현재 적용 중: %(limit)s"
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
msgid "No AI usage recorded yet."
@@ -1219,6 +1208,7 @@ msgstr "사용자 지정 색상"
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr "체크하지 않으면 태그 이름을 기준으로 자동 생성된 색상을 사용합니다."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "이 설정은 기존 모니터링 설정에 <strong><i>추가</i></strong>됩니다."
@@ -1435,8 +1425,8 @@ msgstr "모니터링 1개를 재확인 대기열에 추가했습니다."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{}개 모니터링을 재확인 대기열에 추가했습니다. ({}개는 이미 대기 중이거나 실행 중)"
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count}개 모니터링을 재확인 대기열에 추가했습니다. ({skipped_count}개는 이미 대기 중이거나 실행 중)"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1925,6 +1915,7 @@ msgid ""
"lines against all history for this watch."
msgstr "사이트가 콘텐츠 위치만 자주 바꾸고 새 콘텐츠가 추가될 때만 알고 싶을 때 유용합니다. 새 줄을 이 모니터링의 전체 기록과 비교합니다."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr "사이트가 줄 순서를 섞어 발생하는 변경 감지를 줄이는 데 도움이 됩니다. 아래의 <i>고유한 줄 확인</i>과 함께 사용해 보세요."
@@ -2182,6 +2173,7 @@ msgstr "기록 지우기"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>선택한 항목의 기록을 지우시겠습니까?</p><p>이 작업은 되돌릴 수 없습니다.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "확인"
@@ -2195,8 +2187,8 @@ msgid "Delete Watches?"
msgstr "모니터링을 삭제하시겠습니까?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>선택한 모니터링을 삭제하시겠습니까?</p><p>이 작업은 되돌릴 수 없습니다.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>선택한 모니터링을 삭제하시겠습니까?</strong></p><p>이 작업은 되돌릴 수 없습니다.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2672,18 +2664,18 @@ msgstr "정규식 '%s'은(는) 유효하지 않습니다."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s'은(는) 유효한 XPath 표현식이 아닙니다. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s'은(는) 유효한 XPath 표현식이 아닙니다. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s'은(는) 유효한 JSONPath 표현식이 아닙니다. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s'은(는) 유효한 JSONPath 표현식이 아닙니다. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s'은(는) 유효한 jq 표현식이 아닙니다. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s'은(는) 유효한 jq 표현식이 아닙니다. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2693,10 +2685,6 @@ msgstr "빈 값은 허용되지 않습니다."
msgid "Invalid value."
msgstr "값이 잘못되었습니다."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "그룹 / 태그"
@@ -2932,6 +2920,7 @@ msgstr "다음 모두와 일치"
msgid "Match any of the following"
msgstr "다음 중 하나와 일치"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "목록에 페이지 <title> 사용"
@@ -3031,6 +3020,7 @@ msgstr "실시간 UI 업데이트 활성화"
msgid "Favicons Enabled"
msgstr "파비콘 활성화"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "모니터링 목록에 페이지 <title> 사용"
@@ -3385,8 +3375,8 @@ msgstr "모니터링 프로토콜이 허용되지 않거나 URL 형식이 올바
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "모니터링 한도에 도달했습니다. ({}/{}개) 더 이상 모니터링을 추가할 수 없습니다."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "모니터링 한도에 도달했습니다. ({current}/{limit}개) 더 이상 모니터링을 추가할 수 없습니다."
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3420,9 +3410,10 @@ msgstr "모니터링 중인 URL입니다."
msgid "The UUID of the watch."
msgstr "모니터링 UUID입니다."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "모니터링의 페이지 제목입니다. 설정되지 않았으면 <title>을 사용하고, 없으면 URL을 사용합니다."
msgstr "모니터링의 페이지 제목입니다. 설정되지 않았으면 <title> 을 사용하고, 없으면 URL을 사용합니다."
#: changedetectionio/templates/_common_fields.html
msgid "The watch group / tag"
@@ -3434,8 +3425,8 @@ msgstr "changedetection.io가 생성한 미리보기 페이지의 URL입니다."
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgstr "변경 발생 일시입니다. format= 인자를 사용할 수 있으며 change_datetime(format='%A') 형식입니다. 기본값은 '%Y-%m-%d %H:%M:%S %Z'입니다."
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr "변경 발생 일시입니다. format= 인자를 사용할 수 있으며 %(call)s 형식입니다. 기본값은 '%(default)s'입니다."
#: changedetectionio/templates/_common_fields.html
msgid "The URL of the diff output for the watch."
@@ -3556,6 +3547,7 @@ msgstr "더보기"
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr "거의 모든 서비스에 알림을 보내려면 <a target=\"newwindow\" href=\"%(url)s\">AppRise 알림 URL</a>을 사용하세요."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<i>중요한 설정 참고 사항은 여기의 알림 서비스 위키를 읽어 주세요</i>"
@@ -3843,7 +3835,7 @@ msgstr "이 태그/그룹의 모든 모니터링에 판단 기준을 설정합
#: changedetectionio/templates/edit/include_llm_intent.html
#, python-format
msgid "From group '%(name)s': %(value)s"
msgstr "'%(name)s' 그룹에서 가져옴: %(value)s"
msgstr ""
#: changedetectionio/templates/edit/include_llm_intent.html
msgid "e.g. Alert me when the price drops below $300, or a new product is launched. Ignore footer and navigation changes."
@@ -3917,6 +3909,7 @@ msgstr "이 그룹의 AI 기능을 사용하려면 <a href=\"%(url)s\">설정
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr "참고: <element>에 <![CDATA[]]>가 포함된 경우 //text() 함수는 동작하지 않습니다."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr "한 줄에 CSS, XPath 1/2, JSON Path/JQ 선택자를 하나씩 입력하세요. 일치하는 규칙은 <i>모두</i> 사용됩니다."
+26 -33
View File
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: changedetection.io 0.55.2\n"
"Project-Id-Version: changedetection.io 0.55.3\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-04-28 15:22+1000\n"
"POT-Creation-Date: 2026-05-02 18:29+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -159,7 +159,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -172,7 +172,7 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -191,22 +191,18 @@ msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ""
@@ -240,6 +236,7 @@ msgstr ""
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -310,7 +307,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr ""
#: changedetectionio/blueprint/settings/__init__.py
@@ -365,8 +362,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -390,14 +387,6 @@ msgstr ""
msgid "UI Options"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr ""
@@ -1068,7 +1057,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1210,6 +1199,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr ""
@@ -1424,7 +1414,7 @@ msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr ""
#: changedetectionio/blueprint/ui/__init__.py
@@ -1914,6 +1904,7 @@ msgid ""
"lines against all history for this watch."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2171,6 +2162,7 @@ msgstr ""
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr ""
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr ""
@@ -2184,7 +2176,7 @@ msgid "Delete Watches?"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
@@ -2661,17 +2653,17 @@ msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr ""
#: changedetectionio/forms.py
@@ -2682,10 +2674,6 @@ msgstr ""
msgid "Invalid value."
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr ""
#: changedetectionio/forms.py
msgid "Group tag"
msgstr ""
@@ -2921,6 +2909,7 @@ msgstr ""
msgid "Match any of the following"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr ""
@@ -3020,6 +3009,7 @@ msgstr ""
msgid "Favicons Enabled"
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr ""
@@ -3374,7 +3364,7 @@ msgstr ""
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3409,6 +3399,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr ""
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3423,7 +3414,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3545,6 +3536,7 @@ msgstr ""
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3906,6 +3898,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -161,8 +161,8 @@ msgstr "Importando as primeiras 5.000 URLs da sua lista, o restante pode ser imp
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} Importados da lista em {:.2f}s, {} Ignorados."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} Importados da lista em {duration}s, {skipped_count} Ignorados."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -174,8 +174,8 @@ msgstr "A estrutura do JSON parece inválida, ele está corrompido?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} Importados do Distill.io em {:.2f}s, {} Ignorados."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} Importados do Distill.io em {duration}s, {skipped_count} Ignorados."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -193,22 +193,18 @@ msgstr "Erro ao processar a linha {}, verifique se os tipos de dados das célula
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} importados do Wachete .xlsx em {:.2f}s"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} importados do Wachete .xlsx em {duration}s"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} importados do .xlsx personalizado em {:.2f}s"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} importados do .xlsx personalizado em {duration}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Lista de URLs"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX & Wachete"
@@ -242,6 +238,7 @@ msgstr "URLs que não passarem na validação permanecerão na caixa de texto."
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Copie e cole seu arquivo de 'exportação' do Distill.io, que deve ser um arquivo JSON."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -316,8 +313,8 @@ msgstr "Proteção por senha removida."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Aviso: O número de workers ({}) está próximo ou excede os núcleos de CPU disponíveis ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Aviso: O número de workers ({worker_count}) está próximo ou excede os núcleos de CPU disponíveis ({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -371,8 +368,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -396,14 +393,6 @@ msgstr "Filtros Globais"
msgid "UI Options"
msgstr "Opções de Interface"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Backups"
@@ -1094,7 +1083,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1236,6 +1225,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "Estas configurações são <strong><i>adicionadas</i></strong> a quaisquer configurações de monitoramento existentes."
@@ -1457,8 +1447,8 @@ msgstr "1 monitoramento enfileirado para rechecagem."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} monitoramentos enfileirados para rechecagem ({} já na fila ou rodando)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} monitoramentos enfileirados para rechecagem ({skipped_count} já na fila ou rodando)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1959,6 +1949,7 @@ msgstr ""
"Útil para sites que apenas movem o conteúdo de lugar. Se você quer saber quando um NOVO conteúdo é adicionado, isso "
"compara novas linhas contra todo o histórico."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2220,6 +2211,7 @@ msgstr "Limpar Históricos"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>Tem certeza que deseja limpar o histórico para os itens selecionados?</p><p>Esta ação não pode ser desfeita.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "OK"
@@ -2233,8 +2225,10 @@ msgid "Delete Watches?"
msgstr "Excluir Monitoramentos?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>Tem certeza que deseja excluir os monitoramentos selecionados?</strong></p><p>Esta ação não pode ser desfeita.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr ""
"<p><strong>Tem certeza que deseja excluir os monitoramentos selecionados?</strong></p><p>Esta ação não pode ser "
"desfeita.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2710,18 +2704,18 @@ msgstr "RegEx '%s' não é uma expressão regular válida."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' não é uma expressão XPath válida. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' não é uma expressão XPath válida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' não é uma expressão JSONPath válida. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' não é uma expressão JSONPath válida. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' não é uma expressão jq válida. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' não é uma expressão jq válida. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2731,10 +2725,6 @@ msgstr "Valor vazio não permitido."
msgid "Invalid value."
msgstr "Valor inválido."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Tag de grupo"
@@ -2970,6 +2960,7 @@ msgstr "Corresponder a TODOS os seguintes"
msgid "Match any of the following"
msgstr "Corresponder a QUALQUER um dos seguintes"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Usar <title> da página na lista"
@@ -3069,6 +3060,7 @@ msgstr "Atualizações de Interface em Tempo Real Ativadas"
msgid "Favicons Enabled"
msgstr "Favicons Ativados"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Usar <title> da página na lista de visão geral"
@@ -3423,8 +3415,8 @@ msgstr "O protocolo de monitoramento não é permitido ou o formato da URL é in
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "Limite de monitoramentos atingido ({}/{}). Não é possível adicionar mais."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "Limite de monitoramentos atingido ({current}/{limit}). Não é possível adicionar mais."
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3458,6 +3450,7 @@ msgstr "A URL que está sendo monitorada."
msgid "The UUID of the watch."
msgstr "O UUID do monitoramento."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "O título da página do monitoramento, usa <title> se não definido, ou a URL"
@@ -3472,8 +3465,8 @@ msgstr "A URL da página de pré-visualização gerada pelo changedetection.io."
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgstr "Data/hora da mudança, aceita format=, change_datetime(format='%A')', o padrão é '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr "Data/hora da mudança, aceita format=, %(call)s, o padrão é '%(default)s'"
#: changedetectionio/templates/_common_fields.html
msgid "The URL of the diff output for the watch."
@@ -3596,6 +3589,7 @@ msgstr ""
"Use as <a target=\"newwindow\" href=\"%(url)s\">URLs de Notificação AppRise</a> para enviar notificações para quase "
"qualquer serviço!"
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<i>Por favor, leia a wiki dos serviços de notificação aqui para notas importantes de configuração</i>"
@@ -3957,6 +3951,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -165,8 +165,8 @@ msgstr "Listenizden ilk 5.000 URL içe aktarılıyor, geri kalanı daha sonra te
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} kayıt listeden {:.2f} saniyede içe aktarıldı, {} atlandı."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} kayıt listeden {duration} saniyede içe aktarıldı, {skipped_count} atlandı."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -178,8 +178,8 @@ msgstr "JSON yapısı geçersiz görünüyor, bozuk olabilir mi?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} kayıt Distill.io'dan {:.2f} saniyede içe aktarıldı, {} atlandı."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} kayıt Distill.io'dan {duration} saniyede içe aktarıldı, {skipped_count} atlandı."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -197,22 +197,18 @@ msgstr "Satır numarası {} işlenirken hata oluştu, tüm hücre veri tiplerini
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} kayıt Wachete .xlsx dosyasından {:.2f} saniyede içe aktarıldı"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} kayıt Wachete .xlsx dosyasından {duration} saniyede içe aktarıldı"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} kayıt özel .xlsx dosyasından {:.2f} saniyede içe aktarıldı"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} kayıt özel .xlsx dosyasından {duration} saniyede içe aktarıldı"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URL Listesi"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX ve Wachete"
@@ -248,6 +244,7 @@ msgstr "Doğrulamadan geçemeyen URL'ler metin alanında kalacaktır."
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Distill.io izleyici 'dışa aktarım' dosyanızı kopyalayıp yapıştırın, bu bir JSON dosyası olmalıdır."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -320,8 +317,8 @@ msgstr "Parola koruması kaldırıldı."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Uyarı: Çalışan sayısı ({}), mevcut CPU çekirdek sayısına ({}) yakın veya bunu aşıyor"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "Uyarı: Çalışan sayısı ({worker_count}), mevcut CPU çekirdek sayısına ({cpu_count}) yakın veya bunu aşıyor"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -375,8 +372,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -400,14 +397,6 @@ msgstr "Genel Filtreler"
msgid "UI Options"
msgstr "Arayüz Seçenekleri"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Yedeklemeler"
@@ -1104,7 +1093,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1246,6 +1235,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "Bu ayarlar, mevcut izleyici yapılandırmalarına <strong><i>eklenerek</i></strong> uygulanır."
@@ -1464,8 +1454,8 @@ msgstr "1 izleyici yeniden kontrol için sıraya alındı."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{} izleyici yeniden kontrol için sıraya alındı ({} tanesi zaten sırada veya çalışıyor)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count} izleyici yeniden kontrol için sıraya alındı ({skipped_count} tanesi zaten sırada veya çalışıyor)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1962,6 +1952,7 @@ msgstr ""
"Yalnızca içeriği hareket ettiren web siteleri için iyidir ve YENİ içerik eklendiğinde bilmek istersiniz, yeni "
"satırları bu izleyicinin tüm geçmişiyle karşılaştırır."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2225,6 +2216,7 @@ msgstr "Geçmişleri Temizle"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>Seçili öğeler için geçmişi temizlemek istediğinizden emin misiniz?</p><p>Bu işlem geri alınamaz.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "Tamam"
@@ -2238,8 +2230,8 @@ msgid "Delete Watches?"
msgstr "İzleyiciler Silinsin mi?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>Seçili izleyicileri silmek istediğinizden emin misiniz?</p><p>Bu işlem geri alınamaz.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>Seçili izleyicileri silmek istediğinizden emin misiniz?</strong></p><p>Bu işlem geri alınamaz.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2715,18 +2707,18 @@ msgstr "'%s' RegEx'i geçerli bir düzenli ifade değil."
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' geçerli bir XPath ifadesi değil. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' geçerli bir XPath ifadesi değil. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' geçerli bir JSONPath ifadesi değil. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' geçerli bir JSONPath ifadesi değil. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' geçerli bir jq ifadesi değil. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' geçerli bir jq ifadesi değil. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2736,10 +2728,6 @@ msgstr "Boş değere izin verilmez."
msgid "Invalid value."
msgstr "Geçersiz değer."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Grup etiketi"
@@ -2975,6 +2963,7 @@ msgstr "Aşağıdakilerin tümünü eşleştir"
msgid "Match any of the following"
msgstr "Aşağıdakilerden herhangi birini eşleştir"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Listede sayfa <title>'ını kullan"
@@ -3074,6 +3063,7 @@ msgstr "Gerçek Zamanlı Arayüz Güncellemeleri Etkin"
msgid "Favicons Enabled"
msgstr "Favicon'lar Etkin"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "İzleyici genel bakış listesinde sayfa <title>'ını kullan"
@@ -3428,8 +3418,8 @@ msgstr "İzleyici protokolüne izin verilmiyor veya geçersiz URL formatı"
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "İzleyici sınırına ulaşıldı ({}/{} izleyici). Daha fazla izleyici eklenemez."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "İzleyici sınırına ulaşıldı ({current}/{limit} izleyici). Daha fazla izleyici eklenemez."
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3463,6 +3453,7 @@ msgstr "İzlenen URL."
msgid "The UUID of the watch."
msgstr "İzleyicinin UUID'si."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "İzleyicinin sayfa başlığı, ayarlanmamışsa <title> kullanır, URL'ye geri döner"
@@ -3477,7 +3468,7 @@ msgstr "changedetection.io tarafından oluşturulan önizleme sayfasının URL's
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3601,6 +3592,7 @@ msgstr ""
"<a target=\"newwindow\" href=\"%(url)s\">AppRise Bildirim URL'leri</a> ile hemen hemen her hizmete bildirim "
"gönderebilirsiniz!"
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<i>Önemli yapılandırma notları için lütfen buradaki bildirim hizmetleri wiki'sini okuyun</i>"
@@ -3964,6 +3956,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -159,8 +159,8 @@ msgstr "Імпортуються перші 5000 URL з вашого списк
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} Імпортовано зі списку за {:.2f}с, {} Пропущено."
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} Імпортовано зі списку за {duration}с, {skipped_count} Пропущено."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -172,8 +172,8 @@ msgstr "Структура JSON виглядає некоректною, мож
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} Імпортовано з Distill.io за {:.2f}с, {} Пропущено."
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} Імпортовано з Distill.io за {duration}с, {skipped_count} Пропущено."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -191,22 +191,18 @@ msgstr "Помилка обробки рядка {}, перевірте прав
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} імпортовано з Wachete .xlsx за {:.2f}с"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} імпортовано з Wachete .xlsx за {duration}с"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} імпортовано з власного .xlsx за {:.2f}с"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} імпортовано з власного .xlsx за {duration}с"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "Список URL"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX та Wachete"
@@ -240,6 +236,7 @@ msgstr "URL, що не пройшли перевірку, залишаться
msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file."
msgstr "Скопіюйте та вставте вміст файлу експорту з Distill.io (файл JSON)."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -312,8 +309,10 @@ msgstr "Захист паролем вимкнено."
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "Увага: Кількість воркерів ({}) наближається до кількості доступних ядер процесора або перевищує її ({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr ""
"Увага: Кількість воркерів ({worker_count}) наближається до кількості доступних ядер процесора або перевищує її "
"({cpu_count})"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -367,8 +366,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -392,14 +391,6 @@ msgstr "Глобальні фільтри"
msgid "UI Options"
msgstr "Налаштування інтерфейсу"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "Резервні копії"
@@ -1082,7 +1073,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1224,6 +1215,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "Ці налаштування <strong><i>додаються</i></strong> до будь-яких існуючих конфігурацій завдань."
@@ -1443,8 +1435,8 @@ msgstr "1 завдання додано в чергу на перевірку."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "Додано {} завдань у чергу ({} вже в черзі або виконуються)."
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "Додано {count} завдань у чергу ({skipped_count} вже в черзі або виконуються)."
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1941,6 +1933,7 @@ msgstr ""
"Корисно для сайтів, які просто переміщують контент, коли ви хочете знати лише про НОВИЙ контент. Порівнює нові рядки "
"з усією історією цього завдання."
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr ""
@@ -2202,6 +2195,7 @@ msgstr "Очистити історії"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>Ви впевнені, що хочете очистити історію для вибраних елементів?</p><p>Цю дію неможливо скасувати.</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "ОК"
@@ -2215,8 +2209,8 @@ msgid "Delete Watches?"
msgstr "Видалити завдання?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>Ви впевнені, що хочете видалити вибрані завдання?</p><p>Цю дію неможливо скасувати.</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>Ви впевнені, що хочете видалити вибрані завдання?</strong></p><p>Цю дію неможливо скасувати.</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2692,18 +2686,18 @@ msgstr "RegEx '%s' не є допустимим регулярним вираз
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "'%s' не є допустимим виразом XPath. (%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "'%(expression)s' не є допустимим виразом XPath. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "'%s' не є допустимим виразом JSONPath. (%s)"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "'%(expression)s' не є допустимим виразом JSONPath. (%(error)s)"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "'%s' не є допустимим виразом jq. (%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "'%(expression)s' не є допустимим виразом jq. (%(error)s)"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2713,10 +2707,6 @@ msgstr "Порожнє значення неприпустиме."
msgid "Invalid value."
msgstr "Неприпустиме значення."
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "Тег групи"
@@ -2952,6 +2942,7 @@ msgstr "Збіг усіх наступних умов"
msgid "Match any of the following"
msgstr "Збіг будь-якої з наступних умов"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "Використовувати <title> сторінки у списку"
@@ -3051,6 +3042,7 @@ msgstr "Оновлення UI в реальному часі увімкнено"
msgid "Favicons Enabled"
msgstr "Фавіконки увімкнено"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "Використовувати <title> сторінки у списку огляду завдань"
@@ -3405,8 +3397,8 @@ msgstr "Протокол завдання не дозволено або нев
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgstr "Досягнуто ліміту завдань ({}/{}). Неможливо додати більше."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr "Досягнуто ліміту завдань ({current}/{limit}). Неможливо додати більше."
#: changedetectionio/templates/_common_fields.html
msgid "Body for all notifications — You can use"
@@ -3440,6 +3432,7 @@ msgstr "URL, за яким ведеться спостереження."
msgid "The UUID of the watch."
msgstr "UUID завдання."
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "Заголовок сторінки завдання, використовує <title>, якщо не задано - URL"
@@ -3454,7 +3447,7 @@ msgstr "URL сторінки попереднього перегляду, ств
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3578,6 +3571,7 @@ msgstr ""
"Використовуйте <a target=\"newwindow\" href=\"%(url)s\">URL сповіщень AppRise</a> для сповіщень практично в будь-який"
" сервіс!"
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<i>Будь ласка, прочитайте вікі по сервісах сповіщень тут для важливих нотаток щодо конфігурації</i>"
@@ -3939,6 +3933,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,8 +160,8 @@ msgstr "仅导入列表前 5,000 个 URL,其余可稍后继续导入。"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "从列表导入 {} 条,用时 {:.2f} 秒,跳过 {} 条。"
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "从列表导入 {count} 条,用时 {duration} 秒,跳过 {skipped_count} 条。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "JSON 结构无效,文件是否损坏?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "从 Distill.io 导入 {} 条,用时 {:.2f} 秒,跳过 {} 条。"
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "从 Distill.io 导入 {count} 条,用时 {duration} 秒,跳过 {skipped_count} 条。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,22 +192,18 @@ msgstr "处理第 {} 行时出错,请检查单元格数据类型是否正确
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "从 Wachete .xlsx 导入 {} 条,用时 {:.2f} 秒"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "从 Wachete .xlsx 导入 {count} 条,用时 {duration} 秒"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "从自定义 .xlsx 导入 {} 条,用时 {:.2f} 秒"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "从自定义 .xlsx 导入 {count} 条,用时 {duration} 秒"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URL 列表"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX 与 Wachete"
@@ -242,6 +238,7 @@ msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON
msgstr "复制并粘贴 Distill.io 监控的“导出”文件(JSON)。"
# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead.
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -315,8 +312,8 @@ msgstr "已移除密码保护。"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "警告:工作线程数({})接近或超过可用CPU核心数({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "警告:工作线程数({worker_count})接近或超过可用CPU核心数({cpu_count}"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -370,8 +367,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -395,14 +392,6 @@ msgstr "全局过滤器"
msgid "UI Options"
msgstr "界面选项"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "备份"
@@ -1073,7 +1062,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1215,6 +1204,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "这些设置会<strong><i>应用</i></strong>到现有的所有监控项配置中。"
@@ -1429,8 +1419,8 @@ msgstr "已将 1 个监控项加入重新检查队列。"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "{}个监视器已加入队列({}个已在队列中)。"
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "{count}个监视器已加入队列({skipped_count}个已在队列中)。"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1920,6 +1910,7 @@ msgid ""
msgstr "适合仅移动内容的网站,想知道新增内容时使用,会将新行与该监控项的全部历史进行比对。"
# TN: CJK scripts degrade when italicized; reference is wrapped in “” instead.
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr "有助于减少因行顺序变化导致的变更,可结合下方的“检查唯一行”一起使用。"
@@ -2177,6 +2168,7 @@ msgstr "清除历史记录"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>确定要清除所选项的历史记录吗?</p><p>此操作不可撤销。</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "确定"
@@ -2190,8 +2182,8 @@ msgid "Delete Watches?"
msgstr "删除监控项?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>确定要删除所选监控项吗?</p><p>此操作不可撤销。</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>确定要删除所选监控项吗?</strong></p><p>此操作不可撤销。</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2667,18 +2659,18 @@ msgstr "正则表达式“%s”无效。"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "“%s”不是有效的 XPath 表达式。(%s)"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "“%(expression)s”不是有效的 XPath 表达式。(%(error)s"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "“%s”不是有效的 JSONPath 表达式。(%s"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "“%(expression)s”不是有效的 JSONPath 表达式。(%(error)s"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "“%s”不是有效的 jq 表达式。(%s)"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "“%(expression)s”不是有效的 jq 表达式。(%(error)s"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2688,10 +2680,6 @@ msgstr "不允许为空。"
msgid "Invalid value."
msgstr "值无效。"
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "分组 / 标签"
@@ -2927,6 +2915,7 @@ msgstr "匹配以下全部"
msgid "Match any of the following"
msgstr "匹配以下任意"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "列表中使用页面 <title>"
@@ -3026,6 +3015,7 @@ msgstr "启用实时界面更新"
msgid "Favicons Enabled"
msgstr "启用站点图标"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "在监控概览列表中使用页面 <title>"
@@ -3092,7 +3082,7 @@ msgstr "移除密码"
#: changedetectionio/forms.py
msgid "Render anchor tag content"
msgstr "渲染 <a> 标签内容"
msgstr "渲染 a 标签内容"
#: changedetectionio/forms.py
msgid "Allow anonymous access to watch history page when password is enabled"
@@ -3380,7 +3370,7 @@ msgstr "监控协议不允许或 URL 格式无效"
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3415,6 +3405,7 @@ msgstr "被监控的 URL。"
msgid "The UUID of the watch."
msgstr "监视器的UUID。"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr "监控项的页面标题,未设置时使用 <title>,否则回退为 URL"
@@ -3429,7 +3420,7 @@ msgstr "changedetection.io 生成的预览页面 URL。"
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3552,6 +3543,7 @@ msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a
msgstr "使用 <a target=\"newwindow\" href=\"%(url)s\">AppRise通知URL</a>,向几乎任何服务发送通知!"
# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead.
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr "<strong>请阅读通知服务 Wiki 以了解重要配置说明</strong>"
@@ -3913,6 +3905,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
@@ -160,8 +160,8 @@ msgstr "正在匯入清單中的前 5,000 個 URL,其餘的可以再次匯入
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from list in {:.2f}s, {} Skipped."
msgstr "{} 已從清單匯入,耗時 {:.2f} 秒,跳過 {} 筆。"
msgid "{count} Imported from list in {duration}s, {skipped_count} Skipped."
msgstr "{count} 已從清單匯入,耗時 {duration} 秒,跳過 {skipped_count} 筆。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read JSON file, was it broken?"
@@ -173,8 +173,8 @@ msgstr "JSON 結構看起來無效,檔案是否已損毀?"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} Imported from Distill.io in {:.2f}s, {} Skipped."
msgstr "{} 已從 Distill.io 匯入,耗時 {:.2f} 秒,跳過 {} 筆。"
msgid "{count} Imported from Distill.io in {duration}s, {skipped_count} Skipped."
msgstr "{count} 已從 Distill.io 匯入,耗時 {duration} 秒,跳過 {skipped_count} 筆。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,22 +192,18 @@ msgstr "處理第 {} 行時發生錯誤,請檢查所有儲存格資料類型
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from Wachete .xlsx in {:.2f}s"
msgstr "{} 已從 Wachete .xlsx 匯入,耗時 {:.2f} 秒"
msgid "{count} imported from Wachete .xlsx in {duration}s"
msgstr "{count} 已從 Wachete .xlsx 匯入,耗時 {duration} 秒"
#: changedetectionio/blueprint/imports/importer.py
#, python-brace-format
msgid "{} imported from custom .xlsx in {:.2f}s"
msgstr "{} 已從自訂 .xlsx 匯入,耗時 {:.2f} 秒"
msgid "{count} imported from custom .xlsx in {duration}s"
msgstr "{count} 已從自訂 .xlsx 匯入,耗時 {duration} 秒"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
msgstr "URL 列表"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "Distill.io"
msgstr "Distill.io"
#: changedetectionio/blueprint/imports/templates/import.html
msgid ".XLSX & Wachete"
msgstr ".XLSX 和 Wachete"
@@ -242,6 +238,7 @@ msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON
msgstr "複製並貼上您的 Distill.io 監測任務「匯出」檔案,這應該是一個 JSON 檔案。"
# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead.
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/imports/templates/import.html
msgid ""
"This is <i>experimental</i>, supported fields are <code>name</code>, <code>uri</code>, <code>tags</code>, "
@@ -314,8 +311,8 @@ msgstr "密碼保護已移除。"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
msgid "Warning: Worker count ({}) is close to or exceeds available CPU cores ({})"
msgstr "警告:工作程式數量({})接近或超過可用CPU核心數({})"
msgid "Warning: Worker count ({worker_count}) is close to or exceeds available CPU cores ({cpu_count})"
msgstr "警告:工作程式數量({worker_count})接近或超過可用CPU核心數({cpu_count}"
#: changedetectionio/blueprint/settings/__init__.py
#, python-brace-format
@@ -369,8 +366,8 @@ msgid "AI / LLM configuration removed."
msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
msgid "AI summary cache cleared (%(n)s file(s) removed)."
#, python-brace-format
msgid "AI summary cache cleared ({} file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -394,14 +391,6 @@ msgstr "全域過濾器"
msgid "UI Options"
msgstr "介面選項"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "API"
msgstr "API"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "RSS"
msgstr "RSS"
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Backups"
msgstr "備份"
@@ -1072,7 +1061,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
#, python-format
msgid "characters — currently enforcing: %(n)s"
msgid "characters — currently enforcing: %(limit)s"
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -1214,6 +1203,7 @@ msgstr ""
msgid "Leave unchecked to use the auto-generated colour based on the tag name."
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/tags/templates/edit-tag.html
msgid "These settings are <strong><i>added</i></strong> to any existing watch configurations."
msgstr "這些設定會<strong><i>新增</i></strong>至任何現有的監測設定中。"
@@ -1428,8 +1418,8 @@ msgstr "已將 1 個監測任務排入複查佇列。"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
msgid "Queued {} watches for rechecking ({} already queued or running)."
msgstr "已將 {} 個監測任務排入複查佇列({} 個已在佇列中或正在執行)。"
msgid "Queued {count} watches for rechecking ({skipped_count} already queued or running)."
msgstr "已將 {count} 個監測任務排入複查佇列({skipped_count} 個已在佇列中或正在執行)。"
#: changedetectionio/blueprint/ui/__init__.py
#, python-brace-format
@@ -1919,6 +1909,7 @@ msgid ""
msgstr "適用於內容僅會移動的網站,且您想知道何時新增了「新」內容,此功能會將新行與此監測任務的所有歷史記錄進行比較。"
# TN: CJK scripts degrade when italicized; UI label reference is wrapped in 「」 instead.
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/blueprint/ui/templates/edit.html
msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below."
msgstr "有助於減少因網站重新排列行而檢測到的變更,結合下方的「檢查獨特行」使用。"
@@ -2176,6 +2167,7 @@ msgstr "清除歷史記錄"
msgid "<p>Are you sure you want to clear history for the selected items?</p><p>This action cannot be undone.</p>"
msgstr "<p>您確定要清除所選項目的歷史記錄嗎?</p><p>此動作無法復原。</p>"
#. Universally recognized; typically left as-is. dennis-ignore: W302
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "OK"
msgstr "確定"
@@ -2189,8 +2181,8 @@ msgid "Delete Watches?"
msgstr "刪除監測任務?"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "<p>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p>您確定要刪除所選的監測任務嗎?</strong></p><p>此動作無法復原。</p>"
msgid "<p><strong>Are you sure you want to delete the selected watches?</strong></p><p>This action cannot be undone.</p>"
msgstr "<p><strong>您確定要刪除所選的監測任務嗎?</strong></p><p>此動作無法復原。</p>"
#: changedetectionio/blueprint/watchlist/templates/watch-overview.html
msgid "Queued size"
@@ -2666,18 +2658,18 @@ msgstr "RegEx 「%s」不是有效的正規表示式。"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid XPath expression. (%s)"
msgstr "「%s」不是有效的 XPath 表達式 (%s)。"
msgid "'%(expression)s' is not a valid XPath expression. (%(error)s)"
msgstr "「%(expression)s」不是有效的 XPath 表達式 (%(error)s)。"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid JSONPath expression. (%s)"
msgstr "「%s」不是有效的 JSONPath 表達式 (%s)。"
msgid "'%(expression)s' is not a valid JSONPath expression. (%(error)s)"
msgstr "「%(expression)s」不是有效的 JSONPath 表達式 (%(error)s)。"
#: changedetectionio/forms.py
#, python-format
msgid "'%s' is not a valid jq expression. (%s)"
msgstr "「%s」不是有效的 jq 表達式 (%s)。"
msgid "'%(expression)s' is not a valid jq expression. (%(error)s)"
msgstr "「%(expression)s」不是有效的 jq 表達式 (%(error)s)。"
#: changedetectionio/forms.py
msgid "Empty value not allowed."
@@ -2687,10 +2679,6 @@ msgstr "不允許空值。"
msgid "Invalid value."
msgstr "數值無效。"
#: changedetectionio/blueprint/imports/templates/import.html changedetectionio/forms.py
msgid "URL"
msgstr "URL"
#: changedetectionio/forms.py
msgid "Group tag"
msgstr "群組 / 標籤"
@@ -2926,6 +2914,7 @@ msgstr "符合以下所有條件"
msgid "Match any of the following"
msgstr "符合以下任一條件"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in list"
msgstr "在列表中使用頁面 <title>"
@@ -3025,6 +3014,7 @@ msgstr "已啟用即時 UI 更新"
msgid "Favicons Enabled"
msgstr "啟用網站圖示 (Favicons)"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/forms.py
msgid "Use page <title> in watch overview list"
msgstr "在監測概覽列表中使用頁面 <title>"
@@ -3379,7 +3369,7 @@ msgstr "監測協定不被允許或 URL 格式無效"
#: changedetectionio/store/__init__.py
#, python-brace-format
msgid "Watch limit reached ({}/{} watches). Cannot add more watches."
msgid "Watch limit reached ({current}/{limit} watches). Cannot add more watches."
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3414,6 +3404,7 @@ msgstr ""
msgid "The UUID of the watch."
msgstr "監測任務的 UUID。"
#. dennis-ignore: W303 - False positive caused by <title>. https://github.com/mozilla/dennis/issues/213
#: changedetectionio/templates/_common_fields.html
msgid "The page title of the watch, uses <title> if not set, falls back to URL"
msgstr ""
@@ -3428,7 +3419,7 @@ msgstr ""
#: changedetectionio/templates/_common_fields.html
#, python-format
msgid "Date/time of the change, accepts format=, change_datetime(format='%A')', default is '%Y-%m-%d %H:%M:%S %Z'"
msgid "Date/time of the change, accepts format=, %(call)s, default is '%(default)s'"
msgstr ""
#: changedetectionio/templates/_common_fields.html
@@ -3550,6 +3541,7 @@ msgstr "更多資訊"
msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/_common_fields.html
msgid "<i>Please read the notification services wiki here for important configuration notes</i>"
msgstr ""
@@ -3911,6 +3903,7 @@ msgstr ""
msgid "Note!: //text() function does not work where the <element> contains <![CDATA[]]>"
msgstr ""
#. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303
#: changedetectionio/templates/edit/include_subtract.html
msgid "One CSS, xPath 1 & 2, JSON Path/JQ selector per line, <i>any</i> rules that matches will be used."
msgstr ""
+32 -1
View File
@@ -28,7 +28,7 @@ info:
For example: `x-api-key: YOUR_API_KEY`
version: 0.1.6
version: 0.1.7
contact:
name: ChangeDetection.io
url: https://github.com/dgtlmoon/changedetection.io
@@ -727,6 +727,37 @@ components:
description: Number of history snapshots available
readOnly: true
x-computed: true
processor_config_restock_diff:
type: object
readOnly: true
x-computed: true
description: |
Resolved restock/price processor config for this watch.
If a tag with `overrides_watch: true` is assigned to this watch, the tag's config is
returned here instead of the watch's own config. Use `processor_config_restock_diff_source`
to determine where the config originated.
properties:
in_stock_processing:
type: string
enum: [in_stock_only, all_changes, 'off']
follow_price_changes:
type: boolean
price_change_min:
type: [number, 'null']
price_change_max:
type: [number, 'null']
price_change_threshold_percent:
type: [number, 'null']
minimum: 0
maximum: 100
processor_config_restock_diff_source:
type: string
readOnly: true
x-computed: true
description: |
Indicates the origin of `processor_config_restock_diff`.
- `watch`: config comes from the watch itself
- `tag:<uuid>`: config is overridden by the tag with the given UUID
CreateWatch:
allOf:
+23 -7
View File
File diff suppressed because one or more lines are too long
+10 -3
View File
@@ -99,6 +99,12 @@ pytest-mock ~=3.15
# OpenAPI validation support
openapi-core[flask] ~= 0.23
# openapi-spec-validator (pulled in by openapi-core) requires jsonschema>=4.24.0.
# litellm 1.83.11.83.14 exact-pin jsonschema==4.23.0, which is below that floor —
# the two can never coexist. Without this pin, pip walks back through ~14 litellm
# patch releases before finding 1.83.0 (jsonschema>=4.23.0,<5.0.0, accepts 4.24.x).
# Pinning >=4.24.0 here lets the resolver reject incompatible litellm versions immediately.
jsonschema>=4.24.0,<5.0.0
loguru
@@ -120,7 +126,7 @@ greenlet >= 3.0.3
# Default SOCKETIO_MODE=threading is recommended for better compatibility
gevent
referencing # Don't pin — jsonschema-path (required by openapi-core>=0.18) caps referencing<0.37.0, so pinning 0.37.0 forces openapi-core back to 0.17.2. Revisit once jsonschema-path>=0.3.5 relaxes the cap.
referencing==0.37.0 # jsonschema-path>=0.4.x allows <0.38.0; 0.37.0 is current latest
# For conditions
panzi-json-logic
@@ -131,7 +137,7 @@ price-parser
# Lightweight MIME type detection (saves ~14MB memory vs python-magic/libmagic)
# Used for detecting correct favicon type and content-type detection
puremagic
puremagic<2.0 # 2.x requires Python >=3.12; unpin once 3.10/3.11 support is dropped
# Scheduler - Windows seemed to miss a lot of default timezone info (even "UTC" !)
tzdata
@@ -141,7 +147,7 @@ tzdata
pluggy ~= 1.6
# LLM intent-based change evaluation (multi-provider via litellm)
litellm>=1.40.0
litellm>=1.40.0,<1.83.1 # 1.83.11.83.14 exact-pin jsonschema==4.23.0, conflicting with openapi-spec-validator's >=4.24.0 floor; re-evaluate when litellm fixes this
# BM25 relevance trimming for large snapshots (pure Python, no ML)
rank-bm25>=0.2.2
@@ -150,6 +156,7 @@ psutil==7.2.2
ruff >= 0.11.2
pre_commit >= 4.2.0
dennis >= 1.2.0
# For events between checking and socketio updates
blinker
+1 -1
View File
@@ -7,7 +7,7 @@ mapping_file = babel.cfg
output_file = changedetectionio/translations/messages.pot
input_paths = changedetectionio
keywords = _ _l gettext pgettext:1c,2
add_comments = TRANSLATORS:
add_comments = TRANSLATORS:,dennis-ignore:
# Options to reduce unnecessary changes in .pot files
sort_by_file = true
width = 120