From fd5ec55d0186bb94eade348700cb160a86b34448 Mon Sep 17 00:00:00 2001 From: Dharmesh Date: Sun, 21 Sep 2025 11:56:51 +0530 Subject: [PATCH 1/4] feat: Add user script management and URL change trigger functionality - Introduced user script removal confirmation messages in multiple languages. - Added configuration options for triggering actions on URL changes, enhancing support for single-page applications (SPAs). - Updated configuration modal to include a switch for enabling/disabling URL change triggers. - Enhanced documentation to explain the new URL change trigger feature, including usage scenarios and best practices. - Updated localization files for various languages to reflect new features and messages. --- apps/acf-extension/src/background/index.ts | 1 + .../src/content_scripts/index.ts | 2 +- apps/acf-i18n/src/locales/ar/web.json | 25 ++++++++- apps/acf-i18n/src/locales/de/web.json | 25 ++++++++- apps/acf-i18n/src/locales/en/web.json | 13 ++--- apps/acf-i18n/src/locales/es/web.json | 25 ++++++++- apps/acf-i18n/src/locales/fi/web.json | 25 ++++++++- apps/acf-i18n/src/locales/fr/web.json | 25 ++++++++- apps/acf-i18n/src/locales/id/web.json | 25 ++++++++- apps/acf-i18n/src/locales/it/web.json | 25 ++++++++- apps/acf-i18n/src/locales/ja/web.json | 25 ++++++++- apps/acf-i18n/src/locales/ko/web.json | 25 ++++++++- apps/acf-i18n/src/locales/nl/web.json | 25 ++++++++- apps/acf-i18n/src/locales/pt/web.json | 25 ++++++++- apps/acf-i18n/src/locales/ru/web.json | 25 ++++++++- apps/acf-i18n/src/locales/sv/web.json | 25 ++++++++- apps/acf-i18n/src/locales/vi/web.json | 25 ++++++++- apps/acf-i18n/src/locales/zh_CN/web.json | 25 ++++++++- apps/acf-i18n/src/locales/zh_TW/web.json | 25 ++++++++- .../src/modal/config-settings.modal.tsx | 13 +++++ .../common/src/lib/model/IConfiguration.ts | 2 + .../docs/configuration/config-settings.mdx | 54 +++++++++++++++++++ 22 files changed, 458 insertions(+), 27 deletions(-) diff --git a/apps/acf-extension/src/background/index.ts b/apps/acf-extension/src/background/index.ts index e1a38070..34462059 100644 --- a/apps/acf-extension/src/background/index.ts +++ b/apps/acf-extension/src/background/index.ts @@ -24,6 +24,7 @@ import registerContextMenus from './context-menu'; import { auth } from './firebase'; import { googleAnalytics } from './google-analytics'; import { TabsMessenger } from './tab'; +import './watch-url-change'; self['XMLHttpRequest'] = XMLHttpRequest; diff --git a/apps/acf-extension/src/content_scripts/index.ts b/apps/acf-extension/src/content_scripts/index.ts index d7cd3d94..228a7ff0 100644 --- a/apps/acf-extension/src/content_scripts/index.ts +++ b/apps/acf-extension/src/content_scripts/index.ts @@ -26,7 +26,7 @@ async function loadConfig(loadType: ELoadTypes) { try { new ConfigStorage().getConfig().then(async ({ autoConfig, manualConfigs }: GetConfigResult) => { if (autoConfig) { - if (autoConfig.loadType === loadType || loadType === ELoadTypes.URL_CHANGE) { + if (autoConfig.loadType === loadType || (autoConfig.triggerUrlChange === true && loadType === ELoadTypes.URL_CHANGE)) { const { host } = document.location; Logger.color(chrome.runtime.getManifest().name, LoggerColor.PRIMARY, 'debug', host, loadType); await ConfigProcessor.checkStartType(manualConfigs, autoConfig); diff --git a/apps/acf-i18n/src/locales/ar/web.json b/apps/acf-i18n/src/locales/ar/web.json index 9b4f71de..1f033e23 100644 --- a/apps/acf-i18n/src/locales/ar/web.json +++ b/apps/acf-i18n/src/locales/ar/web.json @@ -92,6 +92,12 @@ "title": "إزالة الإجراء", "message": "هل أنت متأكد من إزالة الإجراء [{{name}}]؟" } + }, + "userscript": { + "remove": { + "title": "إزالة نص المستخدم", + "message": "هل أنت متأكد من إزالة نص المستخدم [{{name}}]؟" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "وثيقة", "hotkey": "مفتاح الاختصار", "documentHint": "يقوم متصفح المستندات بتحميل الامتداد قبل تحميل البرامج النصية والصور (أسرع) (غير آمن)", + "triggerUrlChange": "تشغيل عند تغيير عنوان URL", + "triggerUrlChangeHint": "سيؤدي تغيير عنوان URL إلى تشغيل التكوين إذا تم تغيير عنوان URL دون إعادة تحميل الصفحة (كما هو الحال في SPA)", "urlMatch": "مطابقة عنوان URL", "regex": "التعبير العادي", "exact": "بالضبط" @@ -218,6 +226,13 @@ "refresh": "ينعش", "goto": "الانتقال إلى الإجراء" } + }, + "schedule": { + "title": "جدول", + "info": "تكوين الجدول الزمني لتاريخ ووقت محددين", + "date": "تاريخ", + "time": "وقت", + "repeat": "يكرر" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "تمت إزالة الإجراء بنجاح!", "actionAddon": "تم حفظ الملحق بنجاح!", "actionStatement": "تم حفظ حالة الإجراء بنجاح!", - "actionSettings": "تم حفظ إعدادات الإجراء بنجاح!" + "actionSettings": "تم حفظ إعدادات الإجراء بنجاح!", + "schedule": "تم حفظ الجدول بنجاح!" }, "configuration": { "title": "إعدادات", @@ -263,6 +279,9 @@ "interval": "يُسمح فقط بالأرقام الصحيحة", "url": "عنوان URL مطلوب", "initWait": "يُسمح فقط بالأرقام الصحيحة", + "scheduleDate": "يجب أن يتطابق تاريخ الجدول الزمني مع تنسيق YYYY-MM-DD (2025-12-01)", + "scheduleTime": "يجب أن يتطابق وقت الجدول الزمني مع تنسيق HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "يجب أن يكون تكرار الجدول رقمًا فقط", "startTime": "يجب أن يتطابق وقت البدء مع تنسيق HH:mm:ss:fff (12:12:12:000)", "json": "Json المحدد غير صالح", "hotKey": "الحرف المفرد بدون Ctrl/Command غير صالح", @@ -288,6 +307,9 @@ "repeat": "يكرر", "repeatInterval": "الفاصل الزمني R" }, + "userscript": { + "add": "إضافة نص المستخدم" + }, "popover": { "valueExtractor": { "title": "أمثلة" @@ -311,6 +333,7 @@ "download": "تحميل", "disabled": "عاجز", "sec": "ثانية", + "min": "دقيقة", "no": "لا", "yes": "نعم", "local": "محلي", diff --git a/apps/acf-i18n/src/locales/de/web.json b/apps/acf-i18n/src/locales/de/web.json index 9be035fe..8b4a64d8 100644 --- a/apps/acf-i18n/src/locales/de/web.json +++ b/apps/acf-i18n/src/locales/de/web.json @@ -92,6 +92,12 @@ "title": "Aktion entfernen", "message": "Möchten Sie die Aktion [{{name}}] wirklich entfernen?" } + }, + "userscript": { + "remove": { + "title": "Benutzerskript entfernen", + "message": "Möchten Sie das Benutzerskript [{{name}}] wirklich entfernen?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Dokumentieren", "hotkey": "Tastenkombination", "documentHint": "Der Dokumentenbrowser lädt die Erweiterung, bevor Skripte und Bilder geladen werden (schneller) (unsicher)", + "triggerUrlChange": "Auslöser bei URL-Änderung", + "triggerUrlChangeHint": "„URL-Änderung auslösen“ löst die Konfiguration aus, wenn die URL ohne Neuladen der Seite geändert wird (wie in SPA).", "urlMatch": "URL-Übereinstimmung", "regex": "Regulärer Ausdruck", "exact": "Genau" @@ -218,6 +226,13 @@ "refresh": "Aktualisierung", "goto": "Gehe zu Aktion" } + }, + "schedule": { + "title": "Zeitplan", + "info": "Zeitplankonfiguration für bestimmtes Datum und Uhrzeit", + "date": "Datum", + "time": "Zeit", + "repeat": "Wiederholen" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Aktion erfolgreich entfernt!", "actionAddon": "Add-on erfolgreich gespeichert!", "actionStatement": "Aktionsbedingung erfolgreich gespeichert!", - "actionSettings": "Aktionseinstellungen erfolgreich gespeichert!" + "actionSettings": "Aktionseinstellungen erfolgreich gespeichert!", + "schedule": "Zeitplan erfolgreich gespeichert!" }, "configuration": { "title": "Aufbau", @@ -263,6 +279,9 @@ "interval": "Es sind nur gültige Nummern zulässig.", "url": "URL ist erforderlich", "initWait": "Es sind nur gültige Nummern zulässig.", + "scheduleDate": "Das geplante Datum muss dem Format JJJJ-MM-TT (01.12.2025) entsprechen.", + "scheduleTime": "Die geplante Zeit muss dem Format HH:mm:ss.sss (23:59:59.000) entsprechen", + "scheduleRepeat": "Die Wiederholung des Zeitplans sollte nur eine Zahl sein", "startTime": "Die Startzeit muss dem Format HH:mm:ss:fff (12:12:12:000) entsprechen.", "json": "Das ausgewählte JSON ist ungültig", "hotKey": "Ein einzelner Buchstabe ohne Strg/Befehl ist ungültig", @@ -288,6 +307,9 @@ "repeat": "Wiederholen", "repeatInterval": "R-Intervall" }, + "userscript": { + "add": "Benutzerskript hinzufügen" + }, "popover": { "valueExtractor": { "title": "Beispiele" @@ -311,6 +333,7 @@ "download": "Herunterladen", "disabled": "Deaktiviert", "sec": "Sek", + "min": "Min", "no": "NEIN", "yes": "Ja", "local": "LOKAL", diff --git a/apps/acf-i18n/src/locales/en/web.json b/apps/acf-i18n/src/locales/en/web.json index 3c57d4c8..03270de0 100644 --- a/apps/acf-i18n/src/locales/en/web.json +++ b/apps/acf-i18n/src/locales/en/web.json @@ -166,6 +166,8 @@ "document": "Document", "hotkey": "Hotkey", "documentHint": "Document browser loads extension before scripts and images are loaded (faster)(unsafe)", + "triggerUrlChange": "Trigger on URL Change", + "triggerUrlChangeHint": "Trigger URL Change will trigger configuration if URL is changed without page reload (like in SPA)", "urlMatch": "URL Match", "regex": "Regex", "exact": "Exact" @@ -306,16 +308,7 @@ "repeatInterval": "R-Interval" }, "userscript": { - "title": "User Script", - "add": "Add User Script", - "addBefore": "Add User Script Above", - "addAfter": "Add User Script Below", - "remove": "Remove User Script", - "disable": "Disable User Script", - "enable": "Enable User Script", - "name": "Name", - "value": "Value", - "script": "Script" + "add": "Add User Script" }, "popover": { "valueExtractor": { diff --git a/apps/acf-i18n/src/locales/es/web.json b/apps/acf-i18n/src/locales/es/web.json index 9999b2b8..8473a2c5 100644 --- a/apps/acf-i18n/src/locales/es/web.json +++ b/apps/acf-i18n/src/locales/es/web.json @@ -92,6 +92,12 @@ "title": "Eliminar acción", "message": "¿Estás seguro de eliminar la acción [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Eliminar script de usuario", + "message": "¿Estás seguro de eliminar el script de usuario [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Documento", "hotkey": "tecla de acceso rápido", "documentHint": "El navegador de documentos carga la extensión antes de que se carguen los scripts y las imágenes (más rápido) (inseguro)", + "triggerUrlChange": "Disparador al cambiar la URL", + "triggerUrlChangeHint": "El cambio de URL activará la configuración si se cambia la URL sin recargar la página (como en SPA)", "urlMatch": "Coincidencia de URL", "regex": "expresión regular", "exact": "Exacto" @@ -218,6 +226,13 @@ "refresh": "Actualizar", "goto": "Ir a acción" } + }, + "schedule": { + "title": "Cronograma", + "info": "Configuración de programación para fecha y hora específicas", + "date": "Fecha", + "time": "Tiempo", + "repeat": "Repetir" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "¡La acción se eliminó correctamente!", "actionAddon": "¡Complemento guardado exitosamente!", "actionStatement": "¡Condición de acción guardada exitosamente!", - "actionSettings": "¡La configuración de acción se guardó correctamente!" + "actionSettings": "¡La configuración de acción se guardó correctamente!", + "schedule": "¡Horario guardado exitosamente!" }, "configuration": { "title": "Configuración", @@ -263,6 +279,9 @@ "interval": "Sólo se permiten números válidos", "url": "La URL es obligatoria", "initWait": "Sólo se permiten números válidos", + "scheduleDate": "La fecha programada debe coincidir con el formato AAAA-MM-DD (01/12/2025)", + "scheduleTime": "La hora programada debe coincidir con el formato HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "La repetición del programa debe ser solo numérica", "startTime": "La hora de inicio debe coincidir con el formato HH:mm:ss:fff (12:12:12:000)", "json": "El Json seleccionado no es válido", "hotKey": "Una sola letra sin Ctrl/Comando no es válida", @@ -288,6 +307,9 @@ "repeat": "Repetir", "repeatInterval": "Intervalo R" }, + "userscript": { + "add": "Agregar script de usuario" + }, "popover": { "valueExtractor": { "title": "Ejemplos" @@ -311,6 +333,7 @@ "download": "Descargar", "disabled": "Desactivado", "sec": "segundo", + "min": "mín.", "no": "No", "yes": "Sí", "local": "LOCAL", diff --git a/apps/acf-i18n/src/locales/fi/web.json b/apps/acf-i18n/src/locales/fi/web.json index c3cef83a..14dc5603 100644 --- a/apps/acf-i18n/src/locales/fi/web.json +++ b/apps/acf-i18n/src/locales/fi/web.json @@ -92,6 +92,12 @@ "title": "Poista toiminto", "message": "Haluatko varmasti poistaa toiminnon [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Poista käyttäjäskripti", + "message": "Haluatko varmasti poistaa [{{name}}] käyttäjäskriptin?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Asiakirja", "hotkey": "Pikanäppäin", "documentHint": "Asiakirjaselain lataa laajennuksen ennen skriptien ja kuvien lataamista (nopeammin) (vaarallinen)", + "triggerUrlChange": "URL-osoitteen muutoksen laukaisema", + "triggerUrlChangeHint": "URL-osoitteen muutoksen laukaiseva toiminto laukaisee määritykset, jos URL-osoitetta muutetaan ilman sivun uudelleenlatausta (kuten SPA:ssa)", "urlMatch": "URL-osuma", "regex": "Regex", "exact": "Tarkka" @@ -218,6 +226,13 @@ "refresh": "virkistää", "goto": "Siirry toimintoon" } + }, + "schedule": { + "title": "Ajoittaa", + "info": "Aikatauluta määritys tietylle päivämäärälle ja kellonajalle", + "date": "Päivämäärä", + "time": "Aika", + "repeat": "Toistaa" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Toiminto poistettu onnistuneesti!", "actionAddon": "Lisäys tallennettu onnistuneesti!", "actionStatement": "Toimintoehto tallennettu onnistuneesti!", - "actionSettings": "Toimintoasetukset tallennettu onnistuneesti!" + "actionSettings": "Toimintoasetukset tallennettu onnistuneesti!", + "schedule": "Aikataulu tallennettu onnistuneesti!" }, "configuration": { "title": "Kokoonpano", @@ -263,6 +279,9 @@ "interval": "Vain kelvolliset numerot ovat sallittuja", "url": "URL-osoite vaaditaan", "initWait": "Vain kelvolliset numerot ovat sallittuja", + "scheduleDate": "Aikataulun päivämäärän tulee olla muodossa VVVV-KK-PP (2025-12-01)", + "scheduleTime": "Aikataulun ajan tulee olla muodossa HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "Aikataulun toiston tulisi olla vain numero", "startTime": "Aloitusajan tulee vastata muotoa HH:mm:ss:fff (12:12:12:000)", "json": "Valittu Json ei kelpaa", "hotKey": "Yksittäinen kirjain ilman Ctrl/komentoa ei kelpaa", @@ -288,6 +307,9 @@ "repeat": "Toistaa", "repeatInterval": "R-väli" }, + "userscript": { + "add": "Lisää käyttäjäskripti" + }, "popover": { "valueExtractor": { "title": "Esimerkkejä" @@ -311,6 +333,7 @@ "download": "ladata", "disabled": "Liikuntarajoitteinen", "sec": "sek", + "min": "min", "no": "Ei", "yes": "Joo", "local": "PAIKALLINEN", diff --git a/apps/acf-i18n/src/locales/fr/web.json b/apps/acf-i18n/src/locales/fr/web.json index 4185aac3..f7ebb175 100644 --- a/apps/acf-i18n/src/locales/fr/web.json +++ b/apps/acf-i18n/src/locales/fr/web.json @@ -92,6 +92,12 @@ "title": "Supprimer Action", "message": "Êtes-vous sûr de supprimer [{{name}}] Action?" } + }, + "userscript": { + "remove": { + "title": "Supprimer le script utilisateur", + "message": "Êtes-vous sûr de vouloir supprimer le script utilisateur [{{name}}] ?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Document", "hotkey": "Gamper", "documentHint": "Document Le navigateur charge l'extension avant que les scripts et les images soient chargés (plus rapides) (dangereux)", + "triggerUrlChange": "Déclencheur lors du changement d'URL", + "triggerUrlChangeHint": "Le changement d'URL de déclenchement déclenchera la configuration si l'URL est modifiée sans rechargement de la page (comme dans SPA)", "urlMatch": "Correspondance d'URL", "regex": "Expression régulière", "exact": "Exact" @@ -218,6 +226,13 @@ "refresh": "Rafraîchir", "goto": "Passer à l'action" } + }, + "schedule": { + "title": "Calendrier", + "info": "Configuration de la planification pour une date et une heure spécifiques", + "date": "Date", + "time": "Temps", + "repeat": "Répéter" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Action supprimée avec succès!", "actionAddon": "Addon enregistré avec succès !", "actionStatement": "Instruction d'action enregistrée avec succès!", - "actionSettings": "Paramètres d'action enregistrés avec succès!" + "actionSettings": "Paramètres d'action enregistrés avec succès!", + "schedule": "L'horaire a été enregistré avec succès !" }, "configuration": { "title": "Configuration", @@ -263,6 +279,9 @@ "interval": "Seuls les nombres valides sont autorisés", "url": "URL est requis", "initWait": "Seuls les nombres valides sont autorisés", + "scheduleDate": "La date prévue doit correspondre au format AAAA-MM-JJ (2025-12-01)", + "scheduleTime": "L'heure programmée doit correspondre au format HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "La répétition programmée ne doit être que numérique", "startTime": "Le temps de début devrait correspondre à HH: MM: SS: FFF (12: 12: 12: 12: 000)", "json": "JSON sélectionné n'est pas valide", "hotKey": "Une seule lettre sans Ctrl/Command n'est pas valide", @@ -288,6 +307,9 @@ "repeat": "Répéter", "repeatInterval": "R-intervalle" }, + "userscript": { + "add": "Ajouter un script utilisateur" + }, "popover": { "valueExtractor": { "title": "Exemples" @@ -311,6 +333,7 @@ "download": "Télécharger", "disabled": "Désactivé", "sec": "seconde", + "min": "min", "no": "Non", "yes": "Oui", "local": "LOCALE", diff --git a/apps/acf-i18n/src/locales/id/web.json b/apps/acf-i18n/src/locales/id/web.json index eff71ea2..0210efe1 100644 --- a/apps/acf-i18n/src/locales/id/web.json +++ b/apps/acf-i18n/src/locales/id/web.json @@ -92,6 +92,12 @@ "title": "Hapus Tindakan", "message": "Apakah Anda yakin akan menghapus Tindakan [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Hapus Skrip Pengguna", + "message": "Apakah Anda yakin untuk menghapus Skrip Pengguna [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Dokumen", "hotkey": "Tombol pintas", "documentHint": "Browser dokumen memuat ekstensi sebelum skrip dan gambar dimuat (lebih cepat) (tidak aman)", + "triggerUrlChange": "Pemicu pada Perubahan URL", + "triggerUrlChangeHint": "Pemicu Perubahan URL akan memicu konfigurasi jika URL diubah tanpa memuat ulang halaman (seperti di SPA)", "urlMatch": "Pencocokan URL", "regex": "Regex", "exact": "Akurat" @@ -218,6 +226,13 @@ "refresh": "Menyegarkan", "goto": "Aksi Goto" } + }, + "schedule": { + "title": "Jadwal", + "info": "Konfigurasi jadwal untuk tanggal dan waktu tertentu", + "date": "Tanggal", + "time": "Waktu", + "repeat": "Mengulang" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Tindakan berhasil dihapus!", "actionAddon": "Addon berhasil disimpan!", "actionStatement": "Kondisi Tindakan berhasil disimpan!", - "actionSettings": "Pengaturan Tindakan berhasil disimpan!" + "actionSettings": "Pengaturan Tindakan berhasil disimpan!", + "schedule": "Jadwal berhasil disimpan!" }, "configuration": { "title": "Konfigurasi", @@ -263,6 +279,9 @@ "interval": "Hanya nomor valid yang diperbolehkan", "url": "URL diperlukan", "initWait": "Hanya nomor valid yang diperbolehkan", + "scheduleDate": "Tanggal jadwal harus sesuai dengan format YYYY-MM-DD (2025-12-01)", + "scheduleTime": "Jadwal waktu harus sesuai dengan format HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "Pengulangan jadwal sebaiknya hanya berupa angka", "startTime": "Waktu mulai harus sesuai dengan format HH:mm:ss:fff (12:12:12:000)", "json": "Json yang dipilih tidak valid", "hotKey": "Satu huruf tanpa Ctrl/Command tidak valid", @@ -288,6 +307,9 @@ "repeat": "Mengulang", "repeatInterval": "R-Interval" }, + "userscript": { + "add": "Tambahkan Skrip Pengguna" + }, "popover": { "valueExtractor": { "title": "Contoh" @@ -311,6 +333,7 @@ "download": "Unduh", "disabled": "Dengan disabilitas", "sec": "detik", + "min": "menit", "no": "TIDAK", "yes": "Ya", "local": "LOKAL", diff --git a/apps/acf-i18n/src/locales/it/web.json b/apps/acf-i18n/src/locales/it/web.json index 67e894ca..2ea514c4 100644 --- a/apps/acf-i18n/src/locales/it/web.json +++ b/apps/acf-i18n/src/locales/it/web.json @@ -92,6 +92,12 @@ "title": "Rimuovi azione", "message": "Sei sicuro di rimuovere l'azione [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Rimuovi script utente", + "message": "Vuoi rimuovere lo script utente [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Documento", "hotkey": "Tasto di scelta rapida", "documentHint": "Il browser dei documenti carica l'estensione prima che gli script e le immagini vengano caricati (più veloce) (non sicuro)", + "triggerUrlChange": "Attivazione al cambio URL", + "triggerUrlChangeHint": "Trigger URL Change attiverà la configurazione se l'URL viene modificato senza ricaricare la pagina (come in SPA)", "urlMatch": "Corrispondenza URL", "regex": "Regex", "exact": "Esatto" @@ -218,6 +226,13 @@ "refresh": "ricaricare", "goto": "Vai a Azione" } + }, + "schedule": { + "title": "Programma", + "info": "Configurazione della pianificazione per data e ora specifiche", + "date": "Data", + "time": "Tempo", + "repeat": "Ripetere" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Azione rimossa con successo!", "actionAddon": "Componente aggiuntivo salvato con successo!", "actionStatement": "Condizione dell'azione salvata con successo!", - "actionSettings": "Impostazioni azione salvate con successo!" + "actionSettings": "Impostazioni azione salvate con successo!", + "schedule": "Programma salvato con successo!" }, "configuration": { "title": "Configurazione", @@ -263,6 +279,9 @@ "interval": "Sono ammessi solo numeri validi", "url": "L'URL è obbligatorio", "initWait": "Sono ammessi solo numeri validi", + "scheduleDate": "La data della pianificazione deve corrispondere al formato AAAA-MM-GG (2025-12-01)", + "scheduleTime": "L'orario di pianificazione deve corrispondere al formato HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "La ripetizione della pianificazione dovrebbe essere solo numerica", "startTime": "L'ora di inizio deve corrispondere al formato HH:mm:ss:fff (12:12:12:000)", "json": "Json selezionato non è valido", "hotKey": "La singola lettera senza Ctrl/Comando non è valida", @@ -288,6 +307,9 @@ "repeat": "Ripetere", "repeatInterval": "Intervallo R" }, + "userscript": { + "add": "Aggiungi script utente" + }, "popover": { "valueExtractor": { "title": "Esempi" @@ -311,6 +333,7 @@ "download": "Scaricamento", "disabled": "Disabilitato", "sec": "sez", + "min": "minimo", "no": "NO", "yes": "SÌ", "local": "LOCALE", diff --git a/apps/acf-i18n/src/locales/ja/web.json b/apps/acf-i18n/src/locales/ja/web.json index d58dbd25..c7f42312 100644 --- a/apps/acf-i18n/src/locales/ja/web.json +++ b/apps/acf-i18n/src/locales/ja/web.json @@ -92,6 +92,12 @@ "title": "アクションの削除", "message": "[{{name}}] アクションを削除してもよろしいですか?" } + }, + "userscript": { + "remove": { + "title": "ユーザースクリプトの削除", + "message": "[{{name}}] ユーザースクリプトを削除してもよろしいですか?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "書類", "hotkey": "ホットキー", "documentHint": "ドキュメントブラウザはスクリプトと画像が読み込まれる前に拡張機能を読み込みます (高速) (安全ではありません)", + "triggerUrlChange": "URL変更時にトリガー", + "triggerUrlChangeHint": "URL 変更をトリガーすると、ページのリロードなしで URL が変更された場合 (SPA など)、構成がトリガーされます。", "urlMatch": "URL一致", "regex": "正規表現", "exact": "ちょうど" @@ -218,6 +226,13 @@ "refresh": "リフレッシュ", "goto": "アクションへ進む" } + }, + "schedule": { + "title": "スケジュール", + "info": "特定の日時のスケジュール設定", + "date": "日付", + "time": "時間", + "repeat": "繰り返す" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "アクションが正常に削除されました。", "actionAddon": "アドオンが正常に保存されました!", "actionStatement": "アクション条件が正常に保存されました。", - "actionSettings": "アクション設定が正常に保存されました。" + "actionSettings": "アクション設定が正常に保存されました。", + "schedule": "スケジュールが正常に保存されました。" }, "configuration": { "title": "構成", @@ -263,6 +279,9 @@ "interval": "有効な数字のみが許可されます", "url": "URLは必須です", "initWait": "有効な数字のみが許可されます", + "scheduleDate": "スケジュールの日付はYYYY-MM-DD(2025-12-01)形式と一致する必要があります", + "scheduleTime": "スケジュール時間はHH:mm:ss.sss (23:59:59.000)形式と一致する必要があります", + "scheduleRepeat": "スケジュールの繰り返しは数字のみで指定してください", "startTime": "開始時間は HH:mm:ss:fff (12:12:12:000) 形式に一致する必要があります。", "json": "選択されたJSONは無効です", "hotKey": "Ctrl/Commandなしの単一文字は無効です", @@ -288,6 +307,9 @@ "repeat": "繰り返す", "repeatInterval": "R間隔" }, + "userscript": { + "add": "ユーザースクリプトの追加" + }, "popover": { "valueExtractor": { "title": "例" @@ -311,6 +333,7 @@ "download": "ダウンロード", "disabled": "無効", "sec": "秒", + "min": "分", "no": "いいえ", "yes": "はい", "local": "地元", diff --git a/apps/acf-i18n/src/locales/ko/web.json b/apps/acf-i18n/src/locales/ko/web.json index 34236a60..70fd7705 100644 --- a/apps/acf-i18n/src/locales/ko/web.json +++ b/apps/acf-i18n/src/locales/ko/web.json @@ -92,6 +92,12 @@ "title": "조치를 제거하십시오", "message": "당신은 확실히 제거 할 것입니다 [{{name}}] 동작?" } + }, + "userscript": { + "remove": { + "title": "사용자 스크립트 제거", + "message": "[{{name}}] 사용자 스크립트를 제거하시겠습니까?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "문서", "hotkey": "핫키", "documentHint": "문서 브라우저는 스크립트와 이미지가로드되기 전에 확장자를로드합니다 (더 빠르지 않음) (안전하지 않음)", + "triggerUrlChange": "URL 변경 시 트리거", + "triggerUrlChangeHint": "URL 변경 트리거는 페이지를 다시 로드하지 않고 URL이 변경되면 구성을 트리거합니다(SPA의 경우와 같음).", "urlMatch": "URL 일치", "regex": "정규식", "exact": "정확한" @@ -218,6 +226,13 @@ "refresh": "새로 고치다", "goto": "액션으로 이동" } + }, + "schedule": { + "title": "일정", + "info": "특정 날짜 및 시간에 대한 일정 구성", + "date": "날짜", + "time": "시간", + "repeat": "반복하다" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "행동이 성공적으로 제거되었습니다!", "actionAddon": "Addon 저장 완료!", "actionStatement": "작업 조건이 성공적으로 저장되었습니다!", - "actionSettings": "Action 환경 저장 완료!" + "actionSettings": "Action 환경 저장 완료!", + "schedule": "일정이 성공적으로 저장되었습니다!" }, "configuration": { "title": "구성", @@ -263,6 +279,9 @@ "interval": "유효한 숫자 만 허용됩니다", "url": "URL이 필요합니다", "initWait": "유효한 숫자 만 허용됩니다", + "scheduleDate": "일정 날짜는 YYYY-MM-DD(2025-12-01) 형식과 일치해야 합니다.", + "scheduleTime": "일정 시간은 HH:mm:ss.sss(23:59:59.000) 형식과 일치해야 합니다.", + "scheduleRepeat": "일정 반복은 숫자만 입력해야 합니다.", "startTime": "시작 시간은 hh : mm : ss : fff (12 : 12 : 12 : 000) 형식", "json": "선택한 JSON이 유효하지 않습니다", "hotKey": "한 편지가없는 Ctrl/Command 유효하지 않습니다", @@ -288,6 +307,9 @@ "repeat": "반복하다", "repeatInterval": "R 간격" }, + "userscript": { + "add": "사용자 스크립트 추가" + }, "popover": { "valueExtractor": { "title": "예" @@ -311,6 +333,7 @@ "download": "다운로드", "disabled": "장애가있는", "sec": "비서", + "min": "분", "no": "아니요", "yes": "예", "local": "현지의", diff --git a/apps/acf-i18n/src/locales/nl/web.json b/apps/acf-i18n/src/locales/nl/web.json index c53938d1..48c8b490 100644 --- a/apps/acf-i18n/src/locales/nl/web.json +++ b/apps/acf-i18n/src/locales/nl/web.json @@ -92,6 +92,12 @@ "title": "Actie verwijderen", "message": "Weet u zeker dat u [{{name}}] actie wilt verwijderen?" } + }, + "userscript": { + "remove": { + "title": "Gebruikersscript verwijderen", + "message": "Weet u zeker dat u het gebruikersscript [{{name}}] wilt verwijderen?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Document", "hotkey": "Sneltoets", "documentHint": "Documentbrowser laadt extensie voordat scripts en afbeeldingen worden geladen (sneller) (onveilig)", + "triggerUrlChange": "Trigger bij URL-wijziging", + "triggerUrlChangeHint": "Trigger URL-wijziging activeert de configuratie als de URL wordt gewijzigd zonder dat de pagina opnieuw wordt geladen (zoals in SPA)", "urlMatch": "URL-overeenkomst", "regex": "Regex", "exact": "Exact" @@ -218,6 +226,13 @@ "refresh": "Vernieuwen", "goto": "Ga naar Actie" } + }, + "schedule": { + "title": "Schema", + "info": "Planningconfiguratie voor specifieke datum en tijd", + "date": "Datum", + "time": "Tijd", + "repeat": "Herhalen" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Actie succesvol verwijderd!", "actionAddon": "Add-on succesvol opgeslagen!", "actionStatement": "Actie Conditie succesvol opgeslagen!", - "actionSettings": "Actie-instellingen succesvol opgeslagen!" + "actionSettings": "Actie-instellingen succesvol opgeslagen!", + "schedule": "Schema succesvol opgeslagen!" }, "configuration": { "title": "Configuratie", @@ -263,6 +279,9 @@ "interval": "Alleen geldige nummers zijn toegestaan", "url": "URL is vereist", "initWait": "Alleen geldige nummers zijn toegestaan", + "scheduleDate": "De geplande datum moet overeenkomen met het formaat JJJJ-MM-DD (2025-12-01)", + "scheduleTime": "De geplande tijd moet overeenkomen met het formaat HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "Herhaling van het schema mag alleen een nummer zijn", "startTime": "De starttijd moet overeenkomen met de notatie HH:mm:ss:fff (12:12:12:000)", "json": "Geselecteerde JSON is niet geldig", "hotKey": "Eén letter zonder Ctrl/Command is niet geldig", @@ -288,6 +307,9 @@ "repeat": "Herhalen", "repeatInterval": "R-interval" }, + "userscript": { + "add": "Gebruikersscript toevoegen" + }, "popover": { "valueExtractor": { "title": "Voorbeelden" @@ -311,6 +333,7 @@ "download": "Downloaden", "disabled": "Gehandicapt", "sec": "sec", + "min": "mijn", "no": "Nee", "yes": "Ja", "local": "LOKAAL", diff --git a/apps/acf-i18n/src/locales/pt/web.json b/apps/acf-i18n/src/locales/pt/web.json index 33256aa9..16319cbb 100644 --- a/apps/acf-i18n/src/locales/pt/web.json +++ b/apps/acf-i18n/src/locales/pt/web.json @@ -92,6 +92,12 @@ "title": "Remover ação", "message": "Tem certeza de que deseja remover a ação [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Remover script do usuário", + "message": "Tem certeza de que deseja remover o script de usuário [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Documento", "hotkey": "Tecla de atalho", "documentHint": "O navegador de documentos carrega a extensão antes que os scripts e imagens sejam carregados (mais rápido) (inseguro)", + "triggerUrlChange": "Acionar na alteração de URL", + "triggerUrlChangeHint": "A alteração do URL do gatilho acionará a configuração se o URL for alterado sem recarregar a página (como no SPA)", "urlMatch": "Correspondência de URL", "regex": "Regex", "exact": "Exato" @@ -218,6 +226,13 @@ "refresh": "Atualizar", "goto": "Ir para ação" } + }, + "schedule": { + "title": "Agendar", + "info": "Configuração de agendamento para data e hora específicas", + "date": "Data", + "time": "Tempo", + "repeat": "Repita" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Ação removida com sucesso!", "actionAddon": "Addon salvo com sucesso!", "actionStatement": "Ação Condição salva com sucesso!", - "actionSettings": "Configurações de ação salvas com sucesso!" + "actionSettings": "Configurações de ação salvas com sucesso!", + "schedule": "Agenda salva com sucesso!" }, "configuration": { "title": "Configuração", @@ -263,6 +279,9 @@ "interval": "Somente números válidos são permitidos", "url": "O URL é obrigatório", "initWait": "Somente números válidos são permitidos", + "scheduleDate": "A data do agendamento deve corresponder ao formato AAAA-MM-DD (2025-12-01)", + "scheduleTime": "O horário agendado deve corresponder ao formato HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "A repetição do agendamento deve ser apenas numérica", "startTime": "A hora de início deve corresponder ao formato HH:mm:ss:fff (12:12:12:000)", "json": "Json selecionado não é válido", "hotKey": "Uma única letra sem Ctrl/Command não é válida", @@ -288,6 +307,9 @@ "repeat": "Repita", "repeatInterval": "Intervalo R" }, + "userscript": { + "add": "Adicionar script de usuário" + }, "popover": { "valueExtractor": { "title": "Exemplos" @@ -311,6 +333,7 @@ "download": "Download", "disabled": "Desabilitado", "sec": "segundo", + "min": "min", "no": "Não", "yes": "Sim", "local": "LOCAL", diff --git a/apps/acf-i18n/src/locales/ru/web.json b/apps/acf-i18n/src/locales/ru/web.json index 85e3a330..e22774f1 100644 --- a/apps/acf-i18n/src/locales/ru/web.json +++ b/apps/acf-i18n/src/locales/ru/web.json @@ -92,6 +92,12 @@ "title": "Удалить действие", "message": "Вы уверены, что хотите удалить действие [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Удалить пользовательский скрипт", + "message": "Вы уверены, что хотите удалить пользовательский скрипт [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Документ", "hotkey": "Горячая клавиша", "documentHint": "Браузер документов загружает расширение до загрузки скриптов и изображений (быстрее) (небезопасно)", + "triggerUrlChange": "Триггер при изменении URL", + "triggerUrlChangeHint": "Изменение URL-адреса триггера активирует конфигурацию, если URL-адрес изменяется без перезагрузки страницы (как в SPA)", "urlMatch": "URL-адрес совпадения", "regex": "регулярное выражение", "exact": "Точный" @@ -218,6 +226,13 @@ "refresh": "Обновить", "goto": "Перейти к действию" } + }, + "schedule": { + "title": "Расписание", + "info": "Конфигурация расписания на определенную дату и время", + "date": "Дата", + "time": "Время", + "repeat": "Повторить" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Действие успешно удалено!", "actionAddon": "Аддон успешно сохранен!", "actionStatement": "Условие действия успешно сохранено!", - "actionSettings": "Настройки действий успешно сохранены!" + "actionSettings": "Настройки действий успешно сохранены!", + "schedule": "Расписание успешно сохранено!" }, "configuration": { "title": "Конфигурация", @@ -263,6 +279,9 @@ "interval": "Разрешены только действительные номера", "url": "URL-адрес необязателен.", "initWait": "Разрешены только действительные номера", + "scheduleDate": "Дата расписания должна соответствовать формату ГГГГ-ММ-ДД (2025-12-01).", + "scheduleTime": "Время в расписании должно соответствовать формату ЧЧ:мм:сс.сс (23:59:59.000).", + "scheduleRepeat": "Повторение расписания должно содержать только номер.", "startTime": "Время начала должно соответствовать формату ЧЧ:мм:сс:фф (12:12:12:000).", "json": "Выбранный Json недействителен.", "hotKey": "Одна буква без Ctrl/Command недопустима.", @@ -288,6 +307,9 @@ "repeat": "Повторить", "repeatInterval": "R-интервал" }, + "userscript": { + "add": "Добавить пользовательский скрипт" + }, "popover": { "valueExtractor": { "title": "Примеры" @@ -311,6 +333,7 @@ "download": "Скачать", "disabled": "Неполноценный", "sec": "сек", + "min": "мин", "no": "Нет", "yes": "Да", "local": "МЕСТНЫЙ", diff --git a/apps/acf-i18n/src/locales/sv/web.json b/apps/acf-i18n/src/locales/sv/web.json index 29aa3893..e5bef42e 100644 --- a/apps/acf-i18n/src/locales/sv/web.json +++ b/apps/acf-i18n/src/locales/sv/web.json @@ -92,6 +92,12 @@ "title": "Ta bort åtgärd", "message": "Är du säker på att ta bort åtgärden [{{name}}]?" } + }, + "userscript": { + "remove": { + "title": "Ta bort användarskript", + "message": "Är du säker på att du vill ta bort användarskriptet [{{name}}]?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Dokumentera", "hotkey": "Snabbtangent", "documentHint": "Dokumentwebbläsaren laddar tillägget innan skript och bilder laddas (snabbare) (osäkert)", + "triggerUrlChange": "Utlösare vid URL-ändring", + "triggerUrlChangeHint": "Utlösande URL-ändring utlöser konfigurationen om URL:en ändras utan att sidan laddas om (som i SPA).", "urlMatch": "URL Match", "regex": "Regex", "exact": "Exakt" @@ -218,6 +226,13 @@ "refresh": "Uppdatera", "goto": "Gå till Action" } + }, + "schedule": { + "title": "Schema", + "info": "Schemaläggningskonfiguration för specifikt datum och tid", + "date": "Datum", + "time": "Tid", + "repeat": "Upprepa" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Åtgärden har tagits bort!", "actionAddon": "Tillägget har sparats!", "actionStatement": "Åtgärdsvillkoret har sparats!", - "actionSettings": "Åtgärdsinställningarna har sparats!" + "actionSettings": "Åtgärdsinställningarna har sparats!", + "schedule": "Schemat sparat!" }, "configuration": { "title": "Konfiguration", @@ -263,6 +279,9 @@ "interval": "Endast giltiga nummer är tillåtna", "url": "URL krävs", "initWait": "Endast giltiga nummer är tillåtna", + "scheduleDate": "Schemaläggningsdatumet ska matcha formatet ÅÅÅÅ-MM-DD (2025-12-01)", + "scheduleTime": "Schemalagd tid ska matcha formatet HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "Schemalagd upprepning ska endast vara nummer", "startTime": "Starttiden bör matcha formatet HH:mm:ss:fff (12:12:12:000)", "json": "Vald Json är inte giltig", "hotKey": "En bokstav utan Ctrl/Command är inte giltig", @@ -288,6 +307,9 @@ "repeat": "Upprepa", "repeatInterval": "R-intervall" }, + "userscript": { + "add": "Lägg till användarskript" + }, "popover": { "valueExtractor": { "title": "Exempel" @@ -311,6 +333,7 @@ "download": "Ladda ner", "disabled": "Inaktiverad", "sec": "sek", + "min": "min", "no": "Nej", "yes": "Ja", "local": "LOKAL", diff --git a/apps/acf-i18n/src/locales/vi/web.json b/apps/acf-i18n/src/locales/vi/web.json index 91c06ba6..0e945620 100644 --- a/apps/acf-i18n/src/locales/vi/web.json +++ b/apps/acf-i18n/src/locales/vi/web.json @@ -92,6 +92,12 @@ "title": "Xóa hành động", "message": "Bạn có chắc chắn xóa hành động [{{name}}] không?" } + }, + "userscript": { + "remove": { + "title": "Xóa tập lệnh người dùng", + "message": "Bạn có chắc chắn muốn xóa [{{name}}] User Script không?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "Tài liệu", "hotkey": "Phím nóng", "documentHint": "Trình duyệt tài liệu tải tiện ích mở rộng trước khi tải tập lệnh và hình ảnh (nhanh hơn) (không an toàn)", + "triggerUrlChange": "Kích hoạt khi thay đổi URL", + "triggerUrlChangeHint": "Kích hoạt thay đổi URL sẽ kích hoạt cấu hình nếu URL được thay đổi mà không tải lại trang (như trong SPA)", "urlMatch": "Kết hợp URL", "regex": "Biểu thức chính quy", "exact": "Chính xác" @@ -218,6 +226,13 @@ "refresh": "Làm cho khỏe lại", "goto": "Đi đến hành động" } + }, + "schedule": { + "title": "Lịch trình", + "info": "Cấu hình lịch trình cho ngày và giờ cụ thể", + "date": "Ngày", + "time": "Thời gian", + "repeat": "Lặp lại" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "Đã xóa hành động thành công!", "actionAddon": "Addon đã được lưu thành công!", "actionStatement": "Điều kiện hành động đã được lưu thành công!", - "actionSettings": "Cài đặt hành động đã được lưu thành công!" + "actionSettings": "Cài đặt hành động đã được lưu thành công!", + "schedule": "Lịch trình đã được lưu thành công!" }, "configuration": { "title": "Cấu hình", @@ -263,6 +279,9 @@ "interval": "Chỉ cho phép số hợp lệ", "url": "URL là bắt buộc", "initWait": "Chỉ cho phép số hợp lệ", + "scheduleDate": "Ngày lịch trình phải theo định dạng YYYY-MM-DD (2025-12-01)", + "scheduleTime": "Thời gian lịch trình phải phù hợp với định dạng HH:mm:ss.sss (23:59:59.000)", + "scheduleRepeat": "Lịch trình lặp lại chỉ nên là số", "startTime": "Thời gian bắt đầu phải khớp với định dạng HH:mm:ss:fff (12:12:12:000)", "json": "Json đã chọn không hợp lệ", "hotKey": "Một chữ cái không có Ctrl/Command là không hợp lệ", @@ -288,6 +307,9 @@ "repeat": "Lặp lại", "repeatInterval": "Khoảng R" }, + "userscript": { + "add": "Thêm tập lệnh người dùng" + }, "popover": { "valueExtractor": { "title": "Ví dụ" @@ -311,6 +333,7 @@ "download": "Tải xuống", "disabled": "Tàn tật", "sec": "giây", + "min": "phút", "no": "KHÔNG", "yes": "Đúng", "local": "ĐỊA PHƯƠNG", diff --git a/apps/acf-i18n/src/locales/zh_CN/web.json b/apps/acf-i18n/src/locales/zh_CN/web.json index ef2e2e81..9c314f23 100644 --- a/apps/acf-i18n/src/locales/zh_CN/web.json +++ b/apps/acf-i18n/src/locales/zh_CN/web.json @@ -92,6 +92,12 @@ "title": "移除动作", "message": "确定移除 [{{name}}] 动作吗?" } + }, + "userscript": { + "remove": { + "title": "删除用户脚本", + "message": "您确定要删除 [{{name}}] 用户脚本吗?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "文档", "hotkey": "快捷键", "documentHint": "文档浏览器在加载脚本和图片之前加载扩展(更快)(不安全)", + "triggerUrlChange": "URL 更改时触发", + "triggerUrlChangeHint": "如果 URL 在没有重新加载页面的情况下发生更改(如在 SPA 中),则触发 URL 更改将触发配置", "urlMatch": "URL 匹配", "regex": "正则表达式", "exact": "精确的" @@ -218,6 +226,13 @@ "refresh": "刷新", "goto": "转到操作" } + }, + "schedule": { + "title": "日程", + "info": "特定日期和时间的计划配置", + "date": "日期", + "time": "时间", + "repeat": "重复" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "操作删除成功!", "actionAddon": "附加组件保存成功!", "actionStatement": "动作条件保存成功!", - "actionSettings": "动作设置保存成功!" + "actionSettings": "动作设置保存成功!", + "schedule": "日程保存成功!" }, "configuration": { "title": "配置", @@ -263,6 +279,9 @@ "interval": "只允许有效数字", "url": "需要 URL", "initWait": "只允许有效数字", + "scheduleDate": "计划日期应符合 YYYY-MM-DD (2025-12-01) 格式", + "scheduleTime": "计划时间应符合 HH:mm:ss.sss (23:59:59.000) 格式", + "scheduleRepeat": "计划重复应该仅是数字", "startTime": "开始时间应符合 HH:mm:ss:fff (12:12:12:000) 格式", "json": "所选 Json 无效", "hotKey": "单个字母加无 Ctrl/Command 无效", @@ -288,6 +307,9 @@ "repeat": "重复", "repeatInterval": "重复间隔" }, + "userscript": { + "add": "添加用户脚本" + }, "popover": { "valueExtractor": { "title": "例子" @@ -311,6 +333,7 @@ "download": "下载", "disabled": "已禁用", "sec": "秒", + "min": "分钟", "no": "否", "yes": "是", "local": "本地", diff --git a/apps/acf-i18n/src/locales/zh_TW/web.json b/apps/acf-i18n/src/locales/zh_TW/web.json index a72a594b..504032d1 100644 --- a/apps/acf-i18n/src/locales/zh_TW/web.json +++ b/apps/acf-i18n/src/locales/zh_TW/web.json @@ -92,6 +92,12 @@ "title": "移除動作", "message": "確定移除 [{{name}}] 動作嗎?" } + }, + "userscript": { + "remove": { + "title": "刪除使用者腳本", + "message": "您確定要刪除 [{{name}}] 使用者腳本嗎?" + } } }, "modal": { @@ -160,6 +166,8 @@ "document": "文件", "hotkey": "快速鍵", "documentHint": "文件瀏覽器在載入指令碼和圖片之前載入擴充功能(更快)(不安全)", + "triggerUrlChange": "URL 更改時觸發", + "triggerUrlChangeHint": "如果 URL 在沒有重新載入頁面的情況下發生變更(如在 SPA 中),則觸發 URL 變更將觸發配置", "urlMatch": "URL 匹配", "regex": "正則表達式", "exact": "精確的" @@ -218,6 +226,13 @@ "refresh": "重新整理", "goto": "轉到操作" } + }, + "schedule": { + "title": "行程", + "info": "特定日期和時間的計劃配置", + "date": "日期", + "time": "時間", + "repeat": "重複" } }, "message": { @@ -229,7 +244,8 @@ "removeAction": "操作刪除成功!", "actionAddon": "附加元件儲存成功!", "actionStatement": "動作條件儲存成功!", - "actionSettings": "動作設定儲存成功!" + "actionSettings": "動作設定儲存成功!", + "schedule": "日程保存成功!" }, "configuration": { "title": "設定", @@ -263,6 +279,9 @@ "interval": "只允許有效數字", "url": "需要 URL", "initWait": "只允許有效數字", + "scheduleDate": "計劃日期應符合 YYYY-MM-DD (2025-12-01) 格式", + "scheduleTime": "計劃時間應符合 HH:mm:ss.sss (23:59:59.000) 格式", + "scheduleRepeat": "計劃重複應該只是數字", "startTime": "開始時間應符合 HH:mm:ss:fff (12:12:12:000) 格式", "json": "所選 Json 無效", "hotKey": "單個字母未搭配 Ctrl/Command 是無效的", @@ -288,6 +307,9 @@ "repeat": "重複", "repeatInterval": "重複間隔" }, + "userscript": { + "add": "新增使用者腳本" + }, "popover": { "valueExtractor": { "title": "例子" @@ -311,6 +333,7 @@ "download": "下載", "disabled": "已停用", "sec": "秒", + "min": "分分鐘", "no": "否", "yes": "是", "local": "本地", diff --git a/apps/acf-options-page/src/modal/config-settings.modal.tsx b/apps/acf-options-page/src/modal/config-settings.modal.tsx index 9cc9d04b..e726845f 100644 --- a/apps/acf-options-page/src/modal/config-settings.modal.tsx +++ b/apps/acf-options-page/src/modal/config-settings.modal.tsx @@ -151,6 +151,16 @@ const ConfigSettingsModal = () => { name='loadType' label={t('modal.configSettings.document')} /> + +
  • @@ -159,6 +169,9 @@ const ConfigSettingsModal = () => {
  • }} />
  • +
  • + }} /> +
diff --git a/packages/acf/common/src/lib/model/IConfiguration.ts b/packages/acf/common/src/lib/model/IConfiguration.ts index 97a398e6..567b29f2 100644 --- a/packages/acf/common/src/lib/model/IConfiguration.ts +++ b/packages/acf/common/src/lib/model/IConfiguration.ts @@ -52,6 +52,7 @@ export interface IConfiguration { enable: boolean; startType: EStartTypes; loadType: ELoadTypes; + triggerUrlChange?: boolean; actions: Array; id: TRandomUUID; configId?: number; @@ -78,5 +79,6 @@ export const getDefaultConfig = (source?: EConfigSource, actions?: Array +## Trigger on URL change + +Automatically run this configuration again when the page’s address (URL) changes, without needing a full page reload. This is common on modern websites and apps that update the screen while staying on the same page (often called “single‑page applications” or SPAs). + +### When to use + +- The website changes the URL as you click through steps, tabs, or sections (e.g., /checkout?step=shipping → /checkout?step=payment). +- You want the configuration to run again whenever the address changes on the same page. + +### How to enable + +1. Open the configuration’s Settings. +2. In the Extension Load section, turn on “Trigger on URL change”. +3. This option appears only when Start is set to Auto. + +### What counts as a URL change? + +Any change to the page address, such as the path (…/profile → …/profile/edit) or the query (…?tab=info → …?tab=security). Some sites also change the part after # (called a “hash”). + +### Examples + +- Exact page example (safe): + - URL match: Exact → https://shop.example.com/checkout + - Result: Triggers when the site updates the URL within the checkout flow. Keeps scope limited to the checkout page. + +- Regex for a section (safe but broad): + - URL match: Regex → ^https://shop\.example\.com/checkout/.\*$ + - Result: Triggers for any sub‑page under /checkout/ (e.g., /shipping, /payment). Good for multi‑step flows. + +- Too broad (avoid): + - URL match: Regex → ^https://example\.com/.\*$ + - Result: Will trigger for almost every URL change across the entire site, which can cause repeated runs on SPAs. + +### Important: best practices and consequences + + + +If you enable “Trigger on URL change” with a very broad URL (like the site’s home page or a wildcard pattern), the configuration can keep triggering repeatedly as the app navigates within a single page. This can lead to duplicate actions. + + + + + +- Create separate configurations per subdomain or per section/route (for example, one for app.example.com and another for help.example.com, or separate ones for /cart and /checkout). +- Prefer Exact match when possible; if using Regex, make it as specific as you can. +- If you don’t need repeated runs during navigation, leave this switch off. + + + ## Hotkey Set a hotkey to start the extension. Use one of the following combinations: From 451f5d9ab0193fc92fdfa305673b79091c136d37 Mon Sep 17 00:00:00 2001 From: Dharmesh Date: Sun, 21 Sep 2025 11:56:56 +0530 Subject: [PATCH 2/4] fix(locales): correct translation for "min" in Italian and Dutch --- apps/acf-extension/src/content_scripts/index.ts | 2 +- apps/acf-i18n/src/locales/it/web.json | 2 +- apps/acf-i18n/src/locales/nl/web.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/acf-extension/src/content_scripts/index.ts b/apps/acf-extension/src/content_scripts/index.ts index 228a7ff0..1c1fee28 100644 --- a/apps/acf-extension/src/content_scripts/index.ts +++ b/apps/acf-extension/src/content_scripts/index.ts @@ -26,7 +26,7 @@ async function loadConfig(loadType: ELoadTypes) { try { new ConfigStorage().getConfig().then(async ({ autoConfig, manualConfigs }: GetConfigResult) => { if (autoConfig) { - if (autoConfig.loadType === loadType || (autoConfig.triggerUrlChange === true && loadType === ELoadTypes.URL_CHANGE)) { + if (autoConfig.loadType === loadType || (autoConfig.triggerUrlChange && loadType === ELoadTypes.URL_CHANGE)) { const { host } = document.location; Logger.color(chrome.runtime.getManifest().name, LoggerColor.PRIMARY, 'debug', host, loadType); await ConfigProcessor.checkStartType(manualConfigs, autoConfig); diff --git a/apps/acf-i18n/src/locales/it/web.json b/apps/acf-i18n/src/locales/it/web.json index 2ea514c4..c248e4b9 100644 --- a/apps/acf-i18n/src/locales/it/web.json +++ b/apps/acf-i18n/src/locales/it/web.json @@ -333,7 +333,7 @@ "download": "Scaricamento", "disabled": "Disabilitato", "sec": "sez", - "min": "minimo", + "min": "min", "no": "NO", "yes": "SÌ", "local": "LOCALE", diff --git a/apps/acf-i18n/src/locales/nl/web.json b/apps/acf-i18n/src/locales/nl/web.json index 48c8b490..207349e2 100644 --- a/apps/acf-i18n/src/locales/nl/web.json +++ b/apps/acf-i18n/src/locales/nl/web.json @@ -333,7 +333,7 @@ "download": "Downloaden", "disabled": "Gehandicapt", "sec": "sec", - "min": "mijn", + "min": "min", "no": "Nee", "yes": "Ja", "local": "LOKAAL", From 8cf9f2b22f3643173bc9a01d6faabc62e1d0e14b Mon Sep 17 00:00:00 2001 From: Dharmesh Date: Sun, 21 Sep 2025 12:08:17 +0530 Subject: [PATCH 3/4] Update apps/acf-i18n/src/locales/zh_TW/web.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Dharmesh --- apps/acf-i18n/src/locales/zh_TW/web.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/acf-i18n/src/locales/zh_TW/web.json b/apps/acf-i18n/src/locales/zh_TW/web.json index 504032d1..7d54cf02 100644 --- a/apps/acf-i18n/src/locales/zh_TW/web.json +++ b/apps/acf-i18n/src/locales/zh_TW/web.json @@ -333,7 +333,7 @@ "download": "下載", "disabled": "已停用", "sec": "秒", - "min": "分分鐘", + "min": "分鐘", "no": "否", "yes": "是", "local": "本地", From 22e84c99f8828334207f76ff2ab2ffd6e50fc543 Mon Sep 17 00:00:00 2001 From: Dharmesh Date: Sun, 21 Sep 2025 12:08:27 +0530 Subject: [PATCH 4/4] Update apps/acf-i18n/src/locales/ko/web.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Dharmesh --- apps/acf-i18n/src/locales/ko/web.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/acf-i18n/src/locales/ko/web.json b/apps/acf-i18n/src/locales/ko/web.json index 70fd7705..ea8b4de9 100644 --- a/apps/acf-i18n/src/locales/ko/web.json +++ b/apps/acf-i18n/src/locales/ko/web.json @@ -332,7 +332,7 @@ "close": "닫다", "download": "다운로드", "disabled": "장애가있는", - "sec": "비서", + "sec": "초", "min": "분", "no": "아니요", "yes": "예",