diff --git a/.github/workflows/test-only.yml b/.github/workflows/test-only.yml
index fb4d0964..2316d05d 100644
--- a/.github/workflows/test-only.yml
+++ b/.github/workflows/test-only.yml
@@ -35,20 +35,14 @@ jobs:
run: |
pip install "$(grep -E '^dennis ?>=' requirements.txt)"
dennis-cmd lint --errorsonly changedetectionio/translations/
- - name: Lint .pot template with dennis (baseline-limited warnings)
- # BASELINE: dennis warnings present when this check was introduced. Ratchet down only.
- # Each time a warning is fixed, lower BASELINE_LIMIT to lock in the improvement.
- # Once it reaches 0, replace this step with a strict (`warnings > 0` fails) check,
- # matching the `.po` step.
- env:
- BASELINE_LIMIT: 12
+ - 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} > BASELINE_LIMIT )); then
- echo "ERROR: ${warnings} dennis warning(s) exceed baseline of ${BASELINE_LIMIT} in messages.pot"
- echo "Fix the new warning(s). BASELINE_LIMIT may only ratchet downward."
+ 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)
diff --git a/changedetectionio/blueprint/imports/importer.py b/changedetectionio/blueprint/imports/importer.py
index 5e18209b..aa4379dc 100644
--- a/changedetectionio/blueprint/imports/importer.py
+++ b/changedetectionio/blueprint/imports/importer.py
@@ -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:.2f}s, {skipped_count} Skipped.").format(count=good, duration=time.time() - now, 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:.2f}s, {skipped_count} Skipped.").format(count=len(self.new_uuids), duration=time.time() - now, 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:.2f}s").format(count=len(self.new_uuids), duration=time.time() - now))
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))
\ No newline at end of file
+ flash(gettext("{count} imported from custom .xlsx in {duration:.2f}s").format(count=len(self.new_uuids), duration=time.time() - now))
\ No newline at end of file
diff --git a/changedetectionio/blueprint/settings/__init__.py b/changedetectionio/blueprint/settings/__init__.py
index 9bacff0f..7e4e5750 100644
--- a/changedetectionio/blueprint/settings/__init__.py
+++ b/changedetectionio/blueprint/settings/__init__.py
@@ -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,
diff --git a/changedetectionio/blueprint/settings/llm.py b/changedetectionio/blueprint/settings/llm.py
index 356358b0..2658633e 100644
--- a/changedetectionio/blueprint/settings/llm.py
+++ b/changedetectionio/blueprint/settings/llm.py
@@ -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 (%(count)s file(s) removed).", count=count), 'notice')
return redirect(url_for('settings.settings_page') + '#ai')
return llm_blueprint
diff --git a/changedetectionio/blueprint/settings/templates/settings_llm_tab.html b/changedetectionio/blueprint/settings/templates/settings_llm_tab.html
index 541d1026..636b348d 100644
--- a/changedetectionio/blueprint/settings/templates/settings_llm_tab.html
+++ b/changedetectionio/blueprint/settings/templates/settings_llm_tab.html
@@ -333,7 +333,7 @@
{{ _('(set via LLM_MAX_INPUT_CHARS)') | safe }}
{% else %}
{{ form.llm.form.llm_max_input_chars(placeholder='100000', value=llm_stored.get('max_input_chars', 100000) or '') }}
- {{ _('characters — currently enforcing: %(n)s', n='{:,}'.format(llm_effective_max_input_chars)) }}
+ {{ _('characters — currently enforcing: %(limit)s', limit='{:,}'.format(llm_effective_max_input_chars)) }}
{% endif %}
@@ -364,7 +364,7 @@
{{ _('(set via LLM_MAX_INPUT_CHARS)') | safe }}
{% else %}
{{ form.llm.form.llm_max_input_chars(placeholder='100000', value=llm_stored.get('max_input_chars', 100000) or '') }}
- {{ _('characters — currently enforcing: %(n)s', n='{:,}'.format(llm_effective_max_input_chars)) }}
+ {{ _('characters — currently enforcing: %(limit)s', limit='{:,}'.format(llm_effective_max_input_chars)) }}
{% endif %}
diff --git a/changedetectionio/blueprint/ui/__init__.py b/changedetectionio/blueprint/ui/__init__.py
index 751b4023..663bacf4 100644
--- a/changedetectionio/blueprint/ui/__init__.py
+++ b/changedetectionio/blueprint/ui/__init__.py
@@ -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."))
diff --git a/changedetectionio/forms.py b/changedetectionio/forms.py
index eaaedefa..ff5abdfb 100644
--- a/changedetectionio/forms.py
+++ b/changedetectionio/forms.py
@@ -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")
diff --git a/changedetectionio/store/__init__.py b/changedetectionio/store/__init__.py
index db17b2bb..f469fdfd 100644
--- a/changedetectionio/store/__init__.py
+++ b/changedetectionio/store/__init__.py
@@ -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")
diff --git a/changedetectionio/translations/cs/LC_MESSAGES/messages.mo b/changedetectionio/translations/cs/LC_MESSAGES/messages.mo
index bdb14d81..7a7d9394 100644
Binary files a/changedetectionio/translations/cs/LC_MESSAGES/messages.mo and b/changedetectionio/translations/cs/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/cs/LC_MESSAGES/messages.po b/changedetectionio/translations/cs/LC_MESSAGES/messages.po
index 61bec172..5b4d3d71 100644
--- a/changedetectionio/translations/cs/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/cs/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importováno ze seznamu za {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importováno z Distill.io za {duration:.2f}s, {skipped_count} přeskočeno."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,13 +192,13 @@ 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:.2f}s"
+msgstr "{count} importováno z Wachete .xlsx za {duration:.2f}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:.2f}s"
+msgstr "{count} importováno z vlastního .xlsx za {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -313,8 +313,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
@@ -369,7 +369,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1071,7 +1071,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
@@ -1429,8 +1429,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
@@ -2668,18 +2668,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."
@@ -3381,7 +3381,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
diff --git a/changedetectionio/translations/de/LC_MESSAGES/messages.mo b/changedetectionio/translations/de/LC_MESSAGES/messages.mo
index 72fcc225..1f74db27 100644
Binary files a/changedetectionio/translations/de/LC_MESSAGES/messages.mo and b/changedetectionio/translations/de/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/de/LC_MESSAGES/messages.po b/changedetectionio/translations/de/LC_MESSAGES/messages.po
index e8ead9b0..62e67247 100644
--- a/changedetectionio/translations/de/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/de/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} aus Liste importiert in {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} aus Distill.io importiert in {duration:.2f}s, {skipped_count} übersprungen."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,13 +194,13 @@ 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:.2f}s"
+msgstr "{count} aus Wachete .xlsx importiert in {duration:.2f}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:.2f}s"
+msgstr "{count} aus benutzerdefinierter .xlsx importiert in {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -319,8 +319,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
@@ -375,7 +375,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1087,7 +1087,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
@@ -1452,8 +1452,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
@@ -2719,18 +2719,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."
@@ -3435,7 +3435,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
diff --git a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po
index edd9ad78..aa094f98 100644
--- a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po
@@ -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:.2f}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:.2f}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -192,12 +192,12 @@ 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:.2f}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:.2f}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
@@ -311,7 +311,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
@@ -367,7 +367,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1069,7 +1069,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
@@ -1425,7 +1425,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
@@ -2662,17 +2662,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
@@ -3375,7 +3375,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
diff --git a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po
index 9e25a1c6..1c6b87c0 100644
--- a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po
@@ -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:.2f}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:.2f}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -192,12 +192,12 @@ 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:.2f}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:.2f}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
@@ -311,7 +311,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
@@ -367,7 +367,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1069,7 +1069,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
@@ -1425,7 +1425,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
@@ -2662,17 +2662,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
@@ -3375,7 +3375,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
diff --git a/changedetectionio/translations/es/LC_MESSAGES/messages.mo b/changedetectionio/translations/es/LC_MESSAGES/messages.mo
index 2d6d61e2..5a57c19c 100644
Binary files a/changedetectionio/translations/es/LC_MESSAGES/messages.mo and b/changedetectionio/translations/es/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/es/LC_MESSAGES/messages.po b/changedetectionio/translations/es/LC_MESSAGES/messages.po
index 46f78610..89931980 100644
--- a/changedetectionio/translations/es/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/es/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importado de la lista en {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importado de Distill.io en {duration:.2f}s, {skipped_count} omitido."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,13 +194,13 @@ 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:.2f}s"
+msgstr "{count} importado de Wachete .xlsx en {duration:.2f}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:.2f}s"
+msgstr "{count} importado desde .xlsx personalizado en {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -317,8 +317,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
@@ -373,7 +375,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1105,7 +1107,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
@@ -1470,8 +1472,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
@@ -2733,18 +2735,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."
@@ -3446,8 +3448,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"
diff --git a/changedetectionio/translations/fr/LC_MESSAGES/messages.mo b/changedetectionio/translations/fr/LC_MESSAGES/messages.mo
index 0fc2de1e..650de025 100644
Binary files a/changedetectionio/translations/fr/LC_MESSAGES/messages.mo and b/changedetectionio/translations/fr/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/fr/LC_MESSAGES/messages.po b/changedetectionio/translations/fr/LC_MESSAGES/messages.po
index 433925c6..13a62a71 100644
--- a/changedetectionio/translations/fr/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/fr/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importées de la liste en {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} importées de Distill.io en {duration:.2f}s, {skipped_count} ignorées."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,13 +194,13 @@ 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:.2f}s"
+msgstr "{count} importées de Wachete .xlsx en {duration:.2f}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:.2f}s"
+msgstr "{count} importées de .xlsx personnalisé en {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -315,8 +315,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
@@ -371,7 +371,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1075,7 +1075,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
@@ -1434,8 +1434,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
@@ -2675,18 +2675,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."
@@ -3388,7 +3388,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
diff --git a/changedetectionio/translations/it/LC_MESSAGES/messages.mo b/changedetectionio/translations/it/LC_MESSAGES/messages.mo
index d4e1f39a..a49ecffa 100644
Binary files a/changedetectionio/translations/it/LC_MESSAGES/messages.mo and b/changedetectionio/translations/it/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/it/LC_MESSAGES/messages.po b/changedetectionio/translations/it/LC_MESSAGES/messages.po
index 10094f9c..789dd5dd 100644
--- a/changedetectionio/translations/it/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/it/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Importate dalla lista in {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Importate da Distill.io in {duration:.2f}s, {skipped_count} Ignorate."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -194,13 +194,13 @@ 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:.2f}s"
+msgstr "{count} importate da Wachete .xlsx in {duration:.2f}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:.2f}s"
+msgstr "{count} importate da .xlsx personalizzato in {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -313,8 +313,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
@@ -369,7 +369,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1071,7 +1071,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
@@ -1427,8 +1427,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
@@ -2664,18 +2664,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."
@@ -3377,7 +3377,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
diff --git a/changedetectionio/translations/ja/LC_MESSAGES/messages.mo b/changedetectionio/translations/ja/LC_MESSAGES/messages.mo
index 56223d1e..562ad453 100644
Binary files a/changedetectionio/translations/ja/LC_MESSAGES/messages.mo and b/changedetectionio/translations/ja/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/ja/LC_MESSAGES/messages.po b/changedetectionio/translations/ja/LC_MESSAGES/messages.po
index 78b234a1..098f827d 100644
--- a/changedetectionio/translations/ja/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/ja/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} 件をリストから {duration:.2f}秒でインポートしました。{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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} 件を Distill.io から {duration:.2f}秒でインポートしました。{skipped_count} 件をスキップしました。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -193,13 +193,13 @@ 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:.2f}s"
+msgstr "{count} 件を Wachete .xlsx から {duration:.2f}秒でインポートしました"
#: 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:.2f}s"
+msgstr "{count} 件をカスタム .xlsx から {duration:.2f}秒でインポートしました"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -315,8 +315,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
@@ -371,7 +371,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1076,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
@@ -1433,8 +1433,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
@@ -2681,18 +2681,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."
@@ -3394,8 +3394,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"
diff --git a/changedetectionio/translations/ko/LC_MESSAGES/messages.mo b/changedetectionio/translations/ko/LC_MESSAGES/messages.mo
index 0ab9e7fd..19538596 100644
Binary files a/changedetectionio/translations/ko/LC_MESSAGES/messages.mo and b/changedetectionio/translations/ko/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/ko/LC_MESSAGES/messages.po b/changedetectionio/translations/ko/LC_MESSAGES/messages.po
index 1078b3c7..9d62c841 100644
--- a/changedetectionio/translations/ko/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/ko/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "목록에서 {count}개를 {duration:.2f}초 만에 가져왔습니다. {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:.2f}s, {skipped_count} Skipped."
+msgstr "Distill.io에서 {count}개를 {duration:.2f}초 만에 가져왔습니다. {skipped_count}개는 건너뛰었습니다."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,13 +192,13 @@ 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:.2f}s"
+msgstr "Wachete .xlsx에서 {count}개를 {duration:.2f}초 만에 가져왔습니다."
#: 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:.2f}s"
+msgstr "사용자 지정 .xlsx에서 {count}개를 {duration:.2f}초 만에 가져왔습니다."
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -313,8 +313,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 +369,8 @@ msgstr "AI / LLM 설정이 제거되었습니다."
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
-msgstr "AI 요약 캐시가 지워졌습니다(%(n)s개 파일 제거됨)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
+msgstr "AI 요약 캐시가 지워졌습니다(%(count)s개 파일 제거됨)."
#: changedetectionio/blueprint/settings/templates/notification-log.html
msgid "Notification debug log"
@@ -1077,8 +1077,8 @@ msgstr "(LLM_MAX_INPUT_CHARS로 설정됨)"
#: 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."
@@ -1435,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
@@ -2672,18 +2672,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."
@@ -3385,8 +3385,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"
@@ -3843,7 +3843,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."
diff --git a/changedetectionio/translations/messages.pot b/changedetectionio/translations/messages.pot
index ce4f2330..6f2a7138 100644
--- a/changedetectionio/translations/messages.pot
+++ b/changedetectionio/translations/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: changedetection.io 0.55.3\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-04-28 16:31+0900\n"
+"POT-Creation-Date: 2026-04-30 19:35+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \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:.2f}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:.2f}s, {skipped_count} Skipped."
msgstr ""
#: changedetectionio/blueprint/imports/importer.py
@@ -191,12 +191,12 @@ 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:.2f}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:.2f}s"
msgstr ""
#: changedetectionio/blueprint/imports/templates/import.html
@@ -310,7 +310,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,7 +366,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1068,7 +1068,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
@@ -1424,7 +1424,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
@@ -2661,17 +2661,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
@@ -3374,7 +3374,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
diff --git a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.mo b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.mo
index 7acab35d..41f45929 100644
Binary files a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.mo and b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po
index f99ed7d2..63dacadb 100644
--- a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Importados da lista em {duration:.2f}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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Importados do Distill.io em {duration:.2f}s, {skipped_count} Ignorados."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -193,13 +193,13 @@ 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:.2f}s"
+msgstr "{count} importados do Wachete .xlsx em {duration:.2f}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:.2f}s"
+msgstr "{count} importados do .xlsx personalizado em {duration:.2f}s"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -316,8 +316,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
@@ -372,7 +372,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1094,7 +1094,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
@@ -1457,8 +1457,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
@@ -2710,18 +2710,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."
@@ -3423,8 +3423,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"
diff --git a/changedetectionio/translations/tr/LC_MESSAGES/messages.mo b/changedetectionio/translations/tr/LC_MESSAGES/messages.mo
index 2d2ea00a..8d5cb3ab 100644
Binary files a/changedetectionio/translations/tr/LC_MESSAGES/messages.mo and b/changedetectionio/translations/tr/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/tr/LC_MESSAGES/messages.po b/changedetectionio/translations/tr/LC_MESSAGES/messages.po
index 4074745a..c6196867 100644
--- a/changedetectionio/translations/tr/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/tr/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} kayıt listeden {duration:.2f} 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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} kayıt Distill.io'dan {duration:.2f} 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,13 +197,13 @@ 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:.2f}s"
+msgstr "{count} kayıt Wachete .xlsx dosyasından {duration:.2f} 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:.2f}s"
+msgstr "{count} kayıt özel .xlsx dosyasından {duration:.2f} saniyede içe aktarıldı"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -320,8 +320,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
@@ -376,7 +376,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1104,7 +1104,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
@@ -1464,8 +1464,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
@@ -2715,18 +2715,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."
@@ -3428,8 +3428,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"
diff --git a/changedetectionio/translations/uk/LC_MESSAGES/messages.mo b/changedetectionio/translations/uk/LC_MESSAGES/messages.mo
index bea0be03..3a4d57d0 100644
Binary files a/changedetectionio/translations/uk/LC_MESSAGES/messages.mo and b/changedetectionio/translations/uk/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/uk/LC_MESSAGES/messages.po b/changedetectionio/translations/uk/LC_MESSAGES/messages.po
index 49d5203a..61fe7b17 100644
--- a/changedetectionio/translations/uk/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/uk/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Імпортовано зі списку за {duration:.2f}с, {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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} Імпортовано з Distill.io за {duration:.2f}с, {skipped_count} Пропущено."
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -191,13 +191,13 @@ 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:.2f}s"
+msgstr "{count} імпортовано з Wachete .xlsx за {duration:.2f}с"
#: 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:.2f}s"
+msgstr "{count} імпортовано з власного .xlsx за {duration:.2f}с"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -312,8 +312,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
@@ -368,7 +370,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1082,7 +1084,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
@@ -1443,8 +1445,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
@@ -2692,18 +2694,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."
@@ -3405,8 +3407,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"
diff --git a/changedetectionio/translations/zh/LC_MESSAGES/messages.mo b/changedetectionio/translations/zh/LC_MESSAGES/messages.mo
index c308e72a..c50133b9 100644
Binary files a/changedetectionio/translations/zh/LC_MESSAGES/messages.mo and b/changedetectionio/translations/zh/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/zh/LC_MESSAGES/messages.po b/changedetectionio/translations/zh/LC_MESSAGES/messages.po
index 549af80e..36aab44d 100644
--- a/changedetectionio/translations/zh/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/zh/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "从列表导入 {count} 条,用时 {duration:.2f} 秒,跳过 {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:.2f}s, {skipped_count} Skipped."
+msgstr "从 Distill.io 导入 {count} 条,用时 {duration:.2f} 秒,跳过 {skipped_count} 条。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,13 +192,13 @@ 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:.2f}s"
+msgstr "从 Wachete .xlsx 导入 {count} 条,用时 {duration:.2f} 秒"
#: 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:.2f}s"
+msgstr "从自定义 .xlsx 导入 {count} 条,用时 {duration:.2f} 秒"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -315,8 +315,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
@@ -371,7 +371,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1073,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
@@ -1429,8 +1429,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
@@ -2667,18 +2667,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."
@@ -3380,7 +3380,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
diff --git a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo
index eef6591f..5d7895a1 100644
Binary files a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo and b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo differ
diff --git a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po
index 3bb7be08..3208ab9e 100644
--- a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po
+++ b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po
@@ -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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} 已從清單匯入,耗時 {duration:.2f} 秒,跳過 {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:.2f}s, {skipped_count} Skipped."
+msgstr "{count} 已從 Distill.io 匯入,耗時 {duration:.2f} 秒,跳過 {skipped_count} 筆。"
#: changedetectionio/blueprint/imports/importer.py
msgid "Unable to read export XLSX file, something wrong with the file?"
@@ -192,13 +192,13 @@ 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:.2f}s"
+msgstr "{count} 已從 Wachete .xlsx 匯入,耗時 {duration:.2f} 秒"
#: 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:.2f}s"
+msgstr "{count} 已從自訂 .xlsx 匯入,耗時 {duration:.2f} 秒"
#: changedetectionio/blueprint/imports/templates/import.html
msgid "URL List"
@@ -314,8 +314,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,7 +370,7 @@ msgstr ""
#: changedetectionio/blueprint/settings/llm.py
#, python-format
-msgid "AI summary cache cleared (%(n)s file(s) removed)."
+msgid "AI summary cache cleared (%(count)s file(s) removed)."
msgstr ""
#: changedetectionio/blueprint/settings/templates/notification-log.html
@@ -1072,7 +1072,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
@@ -1428,8 +1428,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
@@ -2666,18 +2666,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."
@@ -3379,7 +3379,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