69 Commits

Author SHA1 Message Date
1e96d7e787 Version 4.2.1 Beta
For translators
2019-10-06 08:12:27 +02:00
612478bcc7 Add license to changelog 2019-10-06 08:12:00 +02:00
23f84fbde0 Use both .currentSrc and .src for image gathering
Works around some lazy-loader issues and make it at least as compatible as v3

Closes #145
2019-10-06 08:00:50 +02:00
b7b4c57034 Update de 2019-10-06 08:00:50 +02:00
872b058d4c Update et (#146) 2019-10-06 07:56:38 +02:00
93ad3e71db Update of lt locale (#144) 2019-10-05 22:39:52 +02:00
7d824bf61e Update Japanese translation 5th (#143) 2019-10-05 22:39:25 +02:00
06228d9ec9 Update messages.json (#141) 2019-10-03 17:04:27 +02:00
f9232ffd96 Update messages.json (#140) 2019-10-03 14:30:31 +02:00
ab3c335bf1 Polish pref window a bit 2019-10-03 09:04:00 +02:00
9142cc023f Add a basic editorconfig 2019-10-03 08:30:45 +02:00
3133a8d8ad Dark theme modals 2019-10-03 08:26:22 +02:00
312f39f7f6 Dark mode scrollbar colors 2019-10-02 22:09:04 +02:00
4ba7bb530d Close unhandled ports 2019-10-02 21:47:38 +02:00
9caad6b3a5 Detect browser theme on Firefox (#139) 2019-10-02 14:54:51 +02:00
5e323db2f0 Make theme configurable (#139) 2019-10-02 14:24:36 +02:00
18daa28cea Initial dark theme (#139) 2019-10-02 13:57:27 +02:00
65c358c01b Update Readme.md 2019-10-02 10:49:09 +02:00
2d14432efe Update TODO.md 2019-10-02 04:43:45 +02:00
19b1cc8856 Add Character batches
Closes #118
2019-10-02 04:37:19 +02:00
883f9a6f0b Add Changelog 2019-10-02 04:05:32 +02:00
e969ba237a Update packages 2019-10-02 04:04:39 +02:00
207248e706 Update ar translation (#90) 2019-10-02 01:55:26 +02:00
9925dec0f4 Use onDeterminingFilename when supported
Closes #132
2019-09-26 08:46:57 +02:00
09b2b4be10 4.1.2 2019-09-26 07:19:43 +02:00
f331de4134 Add Cmd+F shortcut to focus filter box 2019-09-26 07:08:26 +02:00
7760072e8e Avoid the filter box getting an outline in chrome 2019-09-26 07:02:12 +02:00
626bf592de List da locale in all.json 2019-09-26 06:38:49 +02:00
d550de0e27 Add Danish locale
Close #133
2019-09-26 06:37:49 +02:00
367efb4b53 Fix domain parsing in particular IPs
Closes #135
2019-09-26 06:34:23 +02:00
4a82c62958 Update zh_TW translation (#129) 2019-09-23 07:27:39 +02:00
891aa66bff Update zh_CN translation (#126) 2019-09-23 07:24:50 +02:00
2513b60c1b Update ko locale
Closes #127
2019-09-22 17:22:40 +02:00
31cca481f9 Update nl locale
Closes #128
2019-09-22 17:17:24 +02:00
31999bba9f Version 4.1.1 2019-09-21 09:48:56 +02:00
73d90662e3 Remove debug statement 2019-09-21 09:44:38 +02:00
5f5deb09f3 Add audios to DOM to avoid some playback errors 2019-09-21 09:41:40 +02:00
b68245f4f0 Do not treat CRASH as recoverable 2019-09-21 09:34:27 +02:00
34c8537cb5 Update locale list 2019-09-21 09:26:59 +02:00
6b7c9d461d Update ru translation 2019-09-21 09:26:01 +02:00
d2f09ca592 Added Bulgarian localization (#124) 2019-09-21 09:20:55 +02:00
919c6a8f10 more French strings (#120) 2019-09-19 01:52:30 +02:00
dcd7e7cd0e Update pl translation 2019-09-17 13:46:45 +02:00
c545bbab1d Update de locale 2019-09-17 13:46:45 +02:00
dc6e64e690 Add language specific donate URLs 2019-09-17 13:46:45 +02:00
578762db27 Update of lt locale (#117) 2019-09-17 13:39:41 +02:00
e996a2b41a Indonesia translation update (#115) 2019-09-17 03:43:56 +02:00
38496d9161 Hungarian translation update (#114) 2019-09-17 01:17:14 +02:00
4a0756aa26 Updated Spanish translation (#113) 2019-09-16 19:24:57 +02:00
63d0ff22fa Update Italian translation (#112)
Revised and updated translation, which contains work from me and @harbons
2019-09-16 18:31:17 +02:00
5390642978 Update Estonian translation (#111) 2019-09-16 18:20:11 +02:00
2e59dedda3 Japanese translation 4th (#110) 2019-09-16 18:19:33 +02:00
ee649717a2 Update Portuguese translation (#108) 2019-09-16 18:18:41 +02:00
078ce277ce Fix default subfolder suggestion.
Closes #109
2019-09-16 08:12:34 +02:00
7a3cad83b0 Japanese Translation 3rd (#107) 2019-09-15 19:12:53 +02:00
4d953c373f Basic import/export
Closes #64
2019-09-15 12:28:31 +02:00
da9832552f Update Greek translation
Closes #103
2019-09-15 09:51:14 +02:00
5909633a04 Updated Spanish translation (#101) 2019-09-15 09:45:19 +02:00
750fd987bd Update French translation
Closes #102
2019-09-15 09:43:01 +02:00
b87e0d6138 Japanese Translation 2nd (#100) 2019-09-14 21:33:40 +02:00
31cb23923a Add a subfolders dropdown
The dropdown will help users switch between folders easier than using the mask.
Also, the dropdown is more discoverable than masked folders.

See #2
2019-09-14 01:07:29 +02:00
71d98bc603 Use correct rows for tooltip ETA/status 2019-09-14 00:00:20 +02:00
4b09a0db67 Retries
Closes #95
2019-09-14 00:00:11 +02:00
da6c6bcf68 User Canceled error message 2019-09-13 23:09:44 +02:00
84fea3ba35 Allow to open Manager in a popup
Closes #47
2019-09-13 23:09:44 +02:00
33de1cbce9 Allow setting the referrer in select
Closes #78
2019-09-13 23:09:43 +02:00
04b8a981ef Allow to choose button action
Closes #51
2019-09-13 23:09:43 +02:00
58c7955c64 Add Delete Files action
Closes #92
2019-09-13 23:09:43 +02:00
dcf9603da8 Play done sound
Cloes #81
2019-09-13 23:09:43 +02:00
86 changed files with 12814 additions and 6035 deletions

View File

@ -1,3 +1,7 @@
![DownThemAll!](https://raw.githubusercontent.com/downthemall/downthemall/master/style/icon96.png)
# DownThemAll! WE # DownThemAll! WE
The DownThemAll! WebExtension. The DownThemAll! WebExtension.

11
TODO.md
View File

@ -1,16 +1,11 @@
TODO TODO
--- ---
aka a lot
P2 P2
=== ===
Planned for later. Planned for later.
* Soft errors and retry logic
* Big caveat: When the server still responds, like 50x errors which would be recoverable, we actually have no way of knowing it did in respond in such a way. See P4 - Handle Errors remarks.
* Delete files (well, as far as the browser allows)
* Inter-addon API (basic) * Inter-addon API (basic)
* Add downloads * Add downloads
* vtable perf: cache column widths * vtable perf: cache column widths
@ -29,11 +24,7 @@ Nice-to-haves.
* Manipulate downloads (e.g. rewrite URLs) * Manipulate downloads (e.g. rewrite URLs)
* Native context menus? * Native context menus?
* Would require massive reworks incl the need for new icon formats, but potentially feasible. * Would require massive reworks incl the need for new icon formats, but potentially feasible.
* Import/Export
* Download priorities (manual scheduling overrides) * Download priorities (manual scheduling overrides)
* Dark Theme support
* os/browser define be default
* overwritable
* Remove `any` types as possible, and generally improve typescript (new language to me) * Remove `any` types as possible, and generally improve typescript (new language to me)
P4 P4
@ -45,8 +36,6 @@ Stuff that probably cannot be implemented due to WeberEension limitations.
* Firefox helpfully keeps different lists of downloads. One for newly added downloads, and other ones for "previous" downloads. Turns out the WebExtension API only ever queries the "new" list. * Firefox helpfully keeps different lists of downloads. One for newly added downloads, and other ones for "previous" downloads. Turns out the WebExtension API only ever queries the "new" list.
* Segmented downloads * Segmented downloads
* Cannot be done with WebExtensions - downloads API has no support and manually downloading, storing in temporary add-on storage and reassmbling the downloaded parts later is not only efficient but does not reliabliy work due to storage limitations. * Cannot be done with WebExtensions - downloads API has no support and manually downloading, storing in temporary add-on storage and reassmbling the downloaded parts later is not only efficient but does not reliabliy work due to storage limitations.
* Handle errors, 404 and such
* The Firefox download manager is too stupid and webRequest does not see Downloads, so cannot be done right now.
* Conflicts: ask when a file exists * Conflicts: ask when a file exists
* Not supported by Firefox * Not supported by Firefox
* Speed limiter * Speed limiter

View File

@ -1,11 +1,13 @@
{ {
"ar": "العربية [ar]", "ar": "العربية [ar]",
"bg": "Български [bg]",
"cs": "Čeština (CZ) [cs]", "cs": "Čeština (CZ) [cs]",
"da": "Dansk [da]",
"de": "Deutsch [de]", "de": "Deutsch [de]",
"el": "Ελληνικά [el]", "el": "Ελληνικά [el]",
"en": "English (US) [en]", "en": "English (US) [en]",
"es": "Español (España) [es]", "es": "Español (España) [es]",
"et": "Eesti Keel [et]", "et": "Eesti keel [et]",
"fr": "Français [fr]", "fr": "Français [fr]",
"hu": "Magyar (HU) [hu]", "hu": "Magyar (HU) [hu]",
"id": "Bahasa Indonesia [id]", "id": "Bahasa Indonesia [id]",

View File

@ -191,6 +191,22 @@
"message": "احذف", "message": "احذف",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "احذف الملفات",
"description": "menu action"
},
"deletefiles_button": {
"message": "احذف",
"description": "button text"
},
"deletefiles_text": {
"message": "أتريد إزالة الملفات الآتية؟",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "حذف الملفات",
"description": "messagebox title"
},
"description": { "description": {
"message": "الوصف", "message": "الوصف",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "العنوان غير صالح", "message": "العنوان غير صالح",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "لا تدعم المتصفّحات أي مسار مُطلق للمجلدات الفرعية",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "لا تدعم المتصفّحات النقط (.) في المجلدات الفرعية",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "لم تحدّد عناصر", "message": "لم تحدّد عناصر",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "صدّر إلى ملف",
"description": "menu text"
},
"export_aria2": {
"message": "صدّر بنسق قائمة aria2",
"description": "menu text"
},
"export_metalink": {
"message": "صدّر بنسق Metalink",
"description": "menu text"
},
"export_text": {
"message": "صدّر كنصّ",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "أداة التنزيل لبحور من الروابط، داخل متصفحك", "message": "أداة التنزيل لبحور من الروابط، داخل متصفحك",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "يُجبر البدء", "message": "يُجبر البدء",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "استورِد من نصّ",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "معلومات", "message": "معلومات",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "أضفِ التنزيلات الجديدة ملبثة، بدل بدئها مباشرة عند إضافتها", "message": "أضفِ التنزيلات الجديدة ملبثة، بدل بدئها مباشرة عند إضافتها",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "زر ”نزّلها كلها!“:",
"description": "label"
},
"pref_button_type_dta": {
"message": "تحديد ”نزّلها كلها“",
"description": "label"
},
"pref_button_type_manager": {
"message": "يفتح المدير",
"description": "label"
},
"pref_button_type_popup": {
"message": "يعرض القائمة",
"description": "label"
},
"pref_button_type_turbo": {
"message": "ينفّذ ”بنقرة واحدة!“",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "التنزيلات المتزامنة", "message": "التنزيلات المتزامنة",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "اعرض إخطارًا حين ينتهي تنزيل طابور التنزيلات", "message": "اعرض إخطارًا حين ينتهي تنزيل طابور التنزيلات",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "ليكن زر المتصفح ”بنقرة واحدة!“",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "لا تعرض عناصر القائمة السياقية العامة", "message": "لا تعرض عناصر القائمة السياقية العامة",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "المدير", "message": "المدير",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "افتح المدير في نافذة منبثقة جديدة",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "اعرض التلميحات في ألسنة المدير", "message": "اعرض التلميحات في ألسنة المدير",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +637,22 @@
"message": "أزِل التنزيلات الناقصة بعد إعادة التشغيل", "message": "أزِل التنزيلات الناقصة بعد إعادة التشغيل",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "عدد مرات إعادة التنزيل في حال الأخطاء المؤقتة",
"description": "pref text"
},
"pref_retry_time": {
"message": "أعِد كل (بالدقيقة)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "اعرض العناوين بدل الأسماء", "message": "اعرض العناوين بدل الأسماء",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "شغّل الأصوات",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)", "message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "استأنف", "message": "استأنف",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "يُعيد",
"description": "Status text"
},
"retrying_error": {
"message": "يُعيد -$ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "يعمل", "message": "يعمل",
"description": "Status text" "description": "Status text"
@ -943,6 +1033,18 @@
"message": "اضبط قناع تغيير الاسم", "message": "اضبط قناع تغيير الاسم",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "اضبط قناع تغيير اسم جديد",
"description": "dialog text"
},
"set_referrer": {
"message": "اضبط المُعيد",
"description": "menu text"
},
"set_referrer_text": {
"message": "اضبط مُعيدًا جديدًا",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "الدفعات مدعومة، مثل:", "message": "الدفعات مدعومة، مثل:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1225,14 @@
"message": "لن تبدأ أي تنزيلات جديدة", "message": "لن تبدأ أي تنزيلات جديدة",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "المجلد الفرعي:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "ضَع الملفات في هذا المجلد الفرعي لدليل المجلدات في الجهاز",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "العنوان", "message": "العنوان",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "استعمله مرة واحدة", "message": "استعمله مرة واحدة",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "ألغاها المستخدم",
"description": "Error message"
} }
} }

1284
_locales/bg/messages.json Normal file

File diff suppressed because it is too large Load Diff

1284
_locales/da/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -191,6 +191,22 @@
"message": "Entfernen", "message": "Entfernen",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Dateien löschen",
"description": "menu action"
},
"deletefiles_button": {
"message": "Löschen",
"description": "button text"
},
"deletefiles_text": {
"message": "Wirklich die folgenden Dateien löschen?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Dateien Löschen",
"description": "messagebox title"
},
"description": { "description": {
"message": "Beschreibung", "message": "Beschreibung",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "Ungültige URL", "message": "Ungültige URL",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "Absolute Pfade für Unterverzeichnisse sind durch Browser nicht unterstützt",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Punkte (.) in Unterverzeichnissen sind durch Browser nicht unterstützt",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Nichts ausgewählt", "message": "Nichts ausgewählt",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "In Datei exportieren",
"description": "menu text"
},
"export_aria2": {
"message": "Als aria2 Liste exportieren",
"description": "menu text"
},
"export_metalink": {
"message": "Als Metalink exportieren",
"description": "menu text"
},
"export_text": {
"message": "Als Text exportieren",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "Der Massen-Downloader für Deinen Browser", "message": "Der Massen-Downloader für Deinen Browser",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "Start erzwingen", "message": "Start erzwingen",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Aus Datei importieren",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Information", "message": "Information",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -442,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "nagging_message": {
"message": "Du hast bisher $DOWNLOADS$ Downloads mit DownThemAll! hinzugefügt. Als regelmäßiger Benutzer können Sie eine Spende in Betracht ziehen um die Weiterentwicklung zu unterstützen. Danke!", "message": "Sie haben bisher $DOWNLOADS$ Downloads mit DownThemAll! hinzugefügt. Als regelmäßiger Benutzer können Sie eine Spende in Betracht ziehen um die Weiterentwicklung zu unterstützen. Danke!",
"description": "Donation nagging message; displayed as a notification bar in manager", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -529,6 +573,26 @@
"message": "Neue Downloads immer pausiert hinzufügen, anstatt sie direkt zu starten", "message": "Neue Downloads immer pausiert hinzufügen, anstatt sie direkt zu starten",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "DownThemAll! Button:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! Auswahl",
"description": "label"
},
"pref_button_type_manager": {
"message": "Manager öffnen",
"description": "label"
},
"pref_button_type_popup": {
"message": "Popup-Menü",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Gleichzeitige Downloads", "message": "Gleichzeitige Downloads",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "Benachrichtigung anzeigen, wenn die Warteschlange fertig heruntergeladen ist", "message": "Benachrichtigung anzeigen, wenn die Warteschlange fertig heruntergeladen ist",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Browser Button soll OneClick! sein",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Keine allgemeinen Menü-Eintrage anzeigen", "message": "Keine allgemeinen Menü-Eintrage anzeigen",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "Manager", "message": "Manager",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Manager in neuem Fenster öffnen",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Keine Tooltips im Manager-Tab anzeigen", "message": "Keine Tooltips im Manager-Tab anzeigen",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,14 +637,42 @@
"message": "Fehlende Downloads nach einem Neustart automatisch entfernen", "message": "Fehlende Downloads nach einem Neustart automatisch entfernen",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Anzahl der Neuversuche bei vorübergehenden Fehlern",
"description": "pref text"
},
"pref_retry_time": {
"message": "Neuversuch Alle (in Minuten)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "URLs anstelle von Namen anzeigen", "message": "URLs anstelle von Namen anzeigen",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Sounds abspielen",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Versuche Text-Links in Webseiten zu finden (langsamer)", "message": "Versuche Text-Links in Webseiten zu finden (langsamer)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Theme:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Dunkel",
"description": "option text"
},
"pref_theme_default": {
"message": "System/Browser",
"description": "option text"
},
"pref_theme_light": {
"message": "Hell",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Benutzeroberfläche", "message": "Benutzeroberfläche",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -895,6 +987,20 @@
"message": "Fortsetzen", "message": "Fortsetzen",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Neuversuch",
"description": "Status text"
},
"retrying_error": {
"message": "Neuversuch - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "Laufend", "message": "Laufend",
"description": "Status text" "description": "Status text"
@ -943,6 +1049,18 @@
"message": "Umbenennungsmaske setzen", "message": "Umbenennungsmaske setzen",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "Neue Umbenennungsmaske setzen",
"description": "dialog text"
},
"set_referrer": {
"message": "Referrer setzen",
"description": "menu text"
},
"set_referrer_text": {
"message": "Neuen Referrer setzen",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "Batches sind unterstützt, z.B.:", "message": "Batches sind unterstützt, z.B.:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1241,14 @@
"message": "Neue Downloads werden nicht gestartet", "message": "Neue Downloads werden nicht gestartet",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "Unterverzeichnis:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Dateien in diesem Unterverzeichnis im Download-Ordner speichern",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Titel", "message": "Titel",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1292,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Einmalig", "message": "Einmalig",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Benutzerabbruch",
"description": "Error message"
} }
} }

View File

@ -191,6 +191,22 @@
"message": "Διαγραφή", "message": "Διαγραφή",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Διαγραφή Αρχείων",
"description": "menu action"
},
"deletefiles_button": {
"message": "Διαγραφή",
"description": "button text"
},
"deletefiles_text": {
"message": "Θέλετε σίγουρα να διαγράψετε τα ακόλουθα αρχεία;",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Διαγραφή Αρχείων",
"description": "messagebox title"
},
"description": { "description": {
"message": "Περιγραφή", "message": "Περιγραφή",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,6 +291,14 @@
"message": "Μη έγκυρο URL", "message": "Μη έγκυρο URL",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "Οι πλήρεις διαδρομές υποφακέλων δεν υποστηρίζονται από τους φυλλομετρητές",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Οι τελείες (.) στους υποφακέλους δεν υποστηρίζονται από τους φυλλομετρητές",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Δεν επιλέχθηκαν αντικείμενα", "message": "Δεν επιλέχθηκαν αντικείμενα",
"description": "Error Message; select window" "description": "Error Message; select window"
@ -529,6 +553,26 @@
"message": "Προσθήκη νέων λήψεων σε παύση, αντί για άμεση εκκίνησή τους", "message": "Προσθήκη νέων λήψεων σε παύση, αντί για άμεση εκκίνησή τους",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "Κουμπί Λήψης Όλων",
"description": "label"
},
"pref_button_type_dta": {
"message": "Επιλογή Λήψης Όλων",
"description": "label"
},
"pref_button_type_manager": {
"message": "Άνοιγμα Διαχειριστή",
"description": "label"
},
"pref_button_type_popup": {
"message": "Αναδυόμενο μενού",
"description": "label"
},
"pref_button_type_turbo": {
"message": "ΜονόΚλικ!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Ταυτόχρονες λήψεις", "message": "Ταυτόχρονες λήψεις",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +581,6 @@
"message": "Προβολή ειδοποίησης με την ολοκλήρωση της ουράς λήψεων", "message": "Προβολή ειδοποίησης με την ολοκλήρωση της ουράς λήψεων",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Το κουμπί φυλλομετρητή πρέπει να είναι το ΜονόΚλικ!",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Απόκρυψη αντικειμένων μενού γενικού περιεχομένου", "message": "Απόκρυψη αντικειμένων μενού γενικού περιεχομένου",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +589,10 @@
"message": "Διαχειριστής", "message": "Διαχειριστής",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Άνοιγμα διαχειριστή σε νέο αναδυόμενο παράθυρο",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Προβολή επεξηγήσεων στις καρτέλες Διαχειριστή", "message": "Προβολή επεξηγήσεων στις καρτέλες Διαχειριστή",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +617,22 @@
"message": "Απομάκρυνση αγνοημένων λήψεων μετά την επανεκκίνηση", "message": "Απομάκρυνση αγνοημένων λήψεων μετά την επανεκκίνηση",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Αριθμός επαναλήψεων λήψεων με προσωρινά σφάλματα",
"description": "pref text"
},
"pref_retry_time": {
"message": "Επανάληψη κάθε (σε λεπτά)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "Προβολή URLs αντί για Ονόματα", "message": "Προβολή URLs αντί για Ονόματα",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Αναπαραγωγή ήχων",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Δοκιμή εύρεσης συνδέσμων στο κείμενο της ιστοσελίδας (αργό)", "message": "Δοκιμή εύρεσης συνδέσμων στο κείμενο της ιστοσελίδας (αργό)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +951,20 @@
"message": "Συνέχιση", "message": "Συνέχιση",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Επανάληψη",
"description": "Status text"
},
"retrying_error": {
"message": "Επανάληψη - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "Σε λειτουργία", "message": "Σε λειτουργία",
"description": "Status text" "description": "Status text"
@ -943,6 +1013,18 @@
"message": "Ορισμός Μάσκας Μετονομασίας", "message": "Ορισμός Μάσκας Μετονομασίας",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "Ορισμός μιας νέας μάσκας μετονομασίας",
"description": "dialog text"
},
"set_referrer": {
"message": "Ορισμός Αναφορέα",
"description": "menu text"
},
"set_referrer_text": {
"message": "Ορισμός νέου αναφορέα",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "Οι δέσμες υποστηρίζονται, π.χ.:", "message": "Οι δέσμες υποστηρίζονται, π.χ.:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1205,14 @@
"message": "Καμία νέα Λήψη δεν θα εκκινηθεί", "message": "Καμία νέα Λήψη δεν θα εκκινηθεί",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "Υποφάκελος:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Τοποθέτηση αρχείων σε αυτό τον υποφάκελο μέσα στον φάκελο λήψεών σας",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Τίτλος", "message": "Τίτλος",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1256,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Χρήση μόνο μια φορά", "message": "Χρήση μόνο μια φορά",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Ακύρωση του χρήστη",
"description": "Error message"
} }
} }

View File

@ -27,18 +27,90 @@
"description": "Error message", "description": "Error message",
"message": "Unauthorized" "message": "Unauthorized"
}, },
"USER_CANCELED": {
"description": "Error message",
"message": "User Canceled"
},
"add_download": {
"description": "Action for adding a download",
"message": "Add Download"
},
"add_new": {
"description": "Button text (adding filters, limits and such)",
"message": "Add New"
},
"add_paused_once": {
"description": "Checkbox label",
"message": "Only add paused this time"
},
"add_paused_question": {
"description": "Messagebox text",
"message": "Do you want to remember this decision and always add new downloads paused from now on?"
},
"add_paused_title": {
"description": "Title for the add-paused dialog",
"message": "Always add paused?"
},
"addpaused": { "addpaused": {
"description": "Action: Add paused", "description": "Action: Add paused",
"message": "Add paused" "message": "Add paused"
}, },
"ask_again_later": {
"description": "Button text",
"message": "Ask me again later"
},
"batch_batch": {
"description": "Button text",
"message": "Batch Download"
},
"batch_desc": {
"description": "",
"message": "The current URL seems to contain instructions for a batch download."
},
"batch_items": {
"description": "Messagebox info text for batch confirmations",
"message": "Number of items:"
},
"batch_preview": {
"description": "Messagebox info text for batch confirmations",
"message": "Preview:"
},
"batch_question": {
"description": "Messagebox info text for batch confirmations",
"message": "Do you want to add this as a batch or as a single download?"
},
"batch_single": {
"description": "Button text for batch confirmation",
"message": "Single Download"
},
"batch_title": {
"description": "Messagebox title for batch confirmations",
"message": "Batch Download"
},
"cancel": { "cancel": {
"description": "Button text: Cancel", "description": "Button text: Cancel",
"message": "Cancel" "message": "Cancel"
}, },
"cancel_download": {
"description": "Action to cancel downloads, e.g. from the context menu",
"message": "Cancel"
},
"canceled": { "canceled": {
"description": "Download status text", "description": "Download status text",
"message": "Canceled" "message": "Canceled"
}, },
"cannot_be_empty": {
"description": "Error message when an input field is empty but has to have a value",
"message": "This field cannot be empty"
},
"change_later_reminder": {
"description": "Checkbox label text for decision confirmations",
"message": "You can later change this decision in the Preferences"
},
"check_selected_items": {
"description": "Menu text",
"message": "Check Selected Items"
},
"colConnections": { "colConnections": {
"description": "Table column in prefs/network", "description": "Table column in prefs/network",
"message": "Concurrent Connections" "message": "Concurrent Connections"
@ -75,276 +147,6 @@
"description": "Table column in manager", "description": "Table column in manager",
"message": "Speed" "message": "Speed"
}, },
"delete": {
"description": "button text",
"message": "Delete"
},
"description": {
"description": "Description (keep it short); e.g. the description column in select",
"message": "Description"
},
"donate": {
"description": "Donate button",
"message": "Donate!"
},
"done": {
"description": "Status text",
"message": "Done"
},
"download": {
"description": "Download (noun); e.g. Download column in select",
"message": "Download"
},
"extensionDescription": {
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one",
"message": "The Mass Downloader for your browser"
},
"fastfiltering": {
"description": "Label for Fast Filtering input",
"message": "Fast Filtering"
},
"finishing": {
"description": "Status text",
"message": "Finishing"
},
"language": {
"description": "Lanuage Name in your language",
"message": "English (US)"
},
"language_code": {
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR",
"message": "en"
},
"links": {
"description": "Links tab label (short); select window",
"message": "Links"
},
"mask": {
"description": "Renaming mask (short); used in e.g. select",
"message": "Mask"
},
"media": {
"description": "Media label (short)",
"message": "Media"
},
"missing": {
"description": "Status text in manager",
"message": "Missing"
},
"ok": {
"description": "Button text; Used in message boxes",
"message": "OK"
},
"paused": {
"description": "Status text; manager",
"message": "Paused"
},
"queued": {
"description": "Status text",
"message": "Queued"
},
"referrer": {
"description": "Label for \"Referrer\"",
"message": "Referrer"
},
"remember": {
"description": "Checkbox text for confirmation, e.g. when removing a download in manager",
"message": "Remember this decision"
},
"rename": {
"description": "UI for renaming; currently unused",
"message": "Rename"
},
"renmask": {
"description": "Renaming mask (long)",
"message": "Renaming mask"
},
"reset": {
"description": "Button text; pref window",
"message": "Reset"
},
"running": {
"description": "Status text",
"message": "Running"
},
"save": {
"description": "Button text; e.g. prefs/Network",
"message": "Save"
},
"search": {
"description": "Placeholder text; manager status search field",
"message": "Search…"
},
"sizeB": {
"description": "Size formatting; bytes",
"message": "$S$B",
"placeholders": {
"s": {
"content": "$1",
"example": "100b"
}
}
},
"sizeGB": {
"description": "Size formatting; giga bytes",
"message": "$S$GB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.200GB"
}
}
},
"sizeKB": {
"description": "Size formatting; kilo bytes",
"message": "$S$KB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.2KB"
}
}
},
"sizeMB": {
"description": "Size formatting; mega bytes",
"message": "$S$MB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.22MB"
}
}
},
"sizePB": {
"description": "Size formatting; peta bytes (you never know)",
"message": "$S$PB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.212PB"
}
}
},
"sizeTB": {
"description": "Size formatting; tera bytes (you never know)",
"message": "$S$TB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.002TB"
}
}
},
"speedB": {
"description": "Speed formatting; bytes",
"message": "$SPEED$b/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100b/s"
}
}
},
"speedKB": {
"description": "Speed formatting; kilo bytes",
"message": "$SPEED$KB/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100.1KB/s"
}
}
},
"speedMB": {
"description": "Speed formatting; mega bytes",
"message": "$SPEED$MB/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100.20MB/s"
}
}
},
"title": {
"description": "Column text; Title label (short)",
"message": "Title"
},
"unlimited": {
"description": "Option text; Prefs/Network",
"message": "Unlimited"
},
"useonlyonce": {
"description": "Label for Use-Once checkboxes",
"message": "Use Once"
},
"add_download": {
"description": "Action for adding a download",
"message": "Add Download"
},
"add_new": {
"description": "Button text (adding filters, limits and such)",
"message": "Add New"
},
"add_paused_once": {
"description": "Checkbox label",
"message": "Only add paused this time"
},
"add_paused_question": {
"description": "Messagebox text",
"message": "Do you want to remember this decision and always add new downloads paused from now on?"
},
"add_paused_title": {
"description": "Title for the add-paused dialog",
"message": "Always add paused?"
},
"ask_again_later": {
"description": "Button text",
"message": "Ask me again later"
},
"batch_batch": {
"description": "Button text",
"message": "Batch Download"
},
"batch_desc": {
"description": "",
"message": "The current URL seems to contain instructions for a batch download."
},
"batch_items": {
"description": "Messagebox info text for batch confirmations",
"message": "Number of items:"
},
"batch_preview": {
"description": "Messagebox info text for batch confirmations",
"message": "Preview:"
},
"batch_question": {
"description": "Messagebox info text for batch confirmations",
"message": "Do you want to add this as a batch or as a single download?"
},
"batch_single": {
"description": "Button text for batch confirmation",
"message": "Single Download"
},
"batch_title": {
"description": "Messagebox title for batch confirmations",
"message": "Batch Download"
},
"cancel_download": {
"description": "Action to cancel downloads, e.g. from the context menu",
"message": "Cancel"
},
"cannot_be_empty": {
"description": "Error message when an input field is empty but has to have a value",
"message": "This field cannot be empty"
},
"change_later_reminder": {
"description": "Checkbox label text for decision confirmations",
"message": "You can later change this decision in the Preferences"
},
"check_selected_items": {
"description": "Menu text",
"message": "Check Selected Items"
},
"conflict_overwrite": { "conflict_overwrite": {
"description": "Option text; prefs/general", "description": "Option text; prefs/general",
"message": "Overwrite" "message": "Overwrite"
@ -405,26 +207,58 @@
"description": "Filter label for the Videos filter", "description": "Filter label for the Videos filter",
"message": "Videos (mp4, webm, mkv, …)" "message": "Videos (mp4, webm, mkv, …)"
}, },
"delete": {
"description": "button text",
"message": "Delete"
},
"deletefiles": {
"description": "menu action",
"message": "Delete Files"
},
"deletefiles_button": {
"description": "button text",
"message": "Delete"
},
"deletefiles_text": {
"description": "messagebox text",
"message": "Are you sure you want to delete the following files?"
},
"deletefiles_title": {
"description": "messagebox title",
"message": "Delete Files"
},
"description": {
"description": "Description (keep it short); e.g. the description column in select",
"message": "Description"
},
"disable_other_filters": { "disable_other_filters": {
"description": "Checkbox label. Keep it short", "description": "Checkbox label. Keep it short",
"message": "Disable others" "message": "Disable others"
}, },
"donate": {
"description": "Donate button",
"message": "Donate!"
},
"done": {
"description": "Status text",
"message": "Done"
},
"download": {
"description": "Download (noun); e.g. Download column in select",
"message": "Download"
},
"download_verb": { "download_verb": {
"description": "Download (verb/action); e.g. in single and select buttons", "description": "Download (verb/action); e.g. in single and select buttons",
"message": "Download" "message": "Download"
}, },
"dta_regular_all": {
"description": "Menu text",
"message": "DownThemAll! - All Tabs"
},
"dta_turbo_all": {
"description": "Menu text",
"message": "OneClick! - All Tabs"
},
"dta_regular": { "dta_regular": {
"description": "Regular dta action; Menu text", "description": "Regular dta action; Menu text",
"message": "DownThemAll!" "message": "DownThemAll!"
}, },
"dta_regular_all": {
"description": "Menu text",
"message": "DownThemAll! - All Tabs"
},
"dta_regular_image": { "dta_regular_image": {
"description": "Menu text", "description": "Menu text",
"message": "Save Image with DownThemAll!" "message": "Save Image with DownThemAll!"
@ -445,6 +279,10 @@
"description": "OneClick! action; Menu text", "description": "OneClick! action; Menu text",
"message": "OneClick!" "message": "OneClick!"
}, },
"dta_turbo_all": {
"description": "Menu text",
"message": "OneClick! - All Tabs"
},
"dta_turbo_image": { "dta_turbo_image": {
"description": "Menu text", "description": "Menu text",
"message": "Save Image with OneClick!" "message": "Save Image with OneClick!"
@ -477,10 +315,42 @@
"description": "Error Message; select window", "description": "Error Message; select window",
"message": "No items selected" "message": "No items selected"
}, },
"error_noabsolutepath": {
"description": "Error Message; select/single window",
"message": "Absolute paths for subfolders are not supported by browsers"
},
"error_nodotsinpath": {
"description": "Error Message; select/single window",
"message": "Dots (.) in subfolders are not supported by browsers"
},
"export": {
"description": "menu text",
"message": "Export To File"
},
"export_aria2": {
"description": "menu text",
"message": "Export As aria2 List"
},
"export_metalink": {
"description": "menu text",
"message": "Export As Metalink"
},
"export_text": {
"description": "menu text",
"message": "Export As Text"
},
"extensionDescription": {
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one",
"message": "The Mass Downloader for your browser"
},
"fastfilter_placeholder": { "fastfilter_placeholder": {
"description": "Placeholder for fastfilter inputs", "description": "Placeholder for fastfilter inputs",
"message": "Wildcard expression or regular expression" "message": "Wildcard expression or regular expression"
}, },
"fastfiltering": {
"description": "Label for Fast Filtering input",
"message": "Fast Filtering"
},
"filter_at_least_one": { "filter_at_least_one": {
"description": "Error message when no filter types are selected for a filter in the preferences UI", "description": "Error message when no filter types are selected for a filter in the preferences UI",
"message": "You must select at least one filter type!" "message": "You must select at least one filter type!"
@ -509,10 +379,18 @@
"description": "Message box label", "description": "Message box label",
"message": "Filter-Types" "message": "Filter-Types"
}, },
"finishing": {
"description": "Status text",
"message": "Finishing"
},
"force_start": { "force_start": {
"description": "Menu text", "description": "Menu text",
"message": "Force Start" "message": "Force Start"
}, },
"import": {
"description": "menu text",
"message": "Import From File"
},
"information_title": { "information_title": {
"description": "Used in message boxes", "description": "Used in message boxes",
"message": "Information" "message": "Information"
@ -553,10 +431,26 @@
"description": "Short for PageUp-key", "description": "Short for PageUp-key",
"message": "PageUp" "message": "PageUp"
}, },
"language": {
"description": "Lanuage Name in your language",
"message": "English (US)"
},
"language_code": {
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR",
"message": "en"
},
"limited_to": { "limited_to": {
"description": "Label text; used in prefs/network", "description": "Label text; used in prefs/network",
"message": "Limited to" "message": "Limited to"
}, },
"links": {
"description": "Links tab label (short); select window",
"message": "Links"
},
"manager_short": {
"description": "Menu text",
"message": "Manager"
},
"manager_status_items": { "manager_status_items": {
"description": "Status bar text; manager", "description": "Status bar text; manager",
"message": "Completed $COMPLETE$ of $TOTAL$ downloads ($SHOWING$ displayed), $RUNNING$ running", "message": "Completed $COMPLETE$ of $TOTAL$ downloads ($SHOWING$ displayed), $RUNNING$ running",
@ -579,18 +473,26 @@
} }
} }
}, },
"manager_short": {
"description": "Menu text",
"message": "Manager"
},
"manager_title": { "manager_title": {
"description": "Window/tab title", "description": "Window/tab title",
"message": "DownThemAll! Manager" "message": "DownThemAll! Manager"
}, },
"mask": {
"description": "Renaming mask (short); used in e.g. select",
"message": "Mask"
},
"mask_default": { "mask_default": {
"description": "Status text; Used in the mask column, select window", "description": "Status text; Used in the mask column, select window",
"message": "Default Mask" "message": "Default Mask"
}, },
"media": {
"description": "Media label (short)",
"message": "Media"
},
"missing": {
"description": "Status text in manager",
"message": "Missing"
},
"move_bottom": { "move_bottom": {
"description": "Action for moving a download to the bottom", "description": "Action for moving a download to the bottom",
"message": "Bottom" "message": "Bottom"
@ -639,6 +541,10 @@
} }
} }
}, },
"ok": {
"description": "Button text; Used in message boxes",
"message": "OK"
},
"open_directory": { "open_directory": {
"description": "Menu text; manager context", "description": "Menu text; manager context",
"message": "Open Directory" "message": "Open Directory"
@ -667,10 +573,34 @@
"description": "Action for pausing a download", "description": "Action for pausing a download",
"message": "Pause" "message": "Pause"
}, },
"paused": {
"description": "Status text; manager",
"message": "Paused"
},
"pref_add_paused": { "pref_add_paused": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Add new downloads paused, instead of starting them immediately" "message": "Add new downloads paused, instead of starting them immediately"
}, },
"pref_button_type": {
"description": "label",
"message": "DownThemAll! button:"
},
"pref_button_type_dta": {
"description": "label",
"message": "DownThemAll! selection"
},
"pref_button_type_manager": {
"description": "label",
"message": "Open Manager"
},
"pref_button_type_popup": {
"description": "label",
"message": "Popup menu"
},
"pref_button_type_turbo": {
"description": "label",
"message": "OneClick!"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"description": "Preferences/Network", "description": "Preferences/Network",
"message": "Concurrent downloads" "message": "Concurrent downloads"
@ -679,18 +609,26 @@
"description": "Preferences/General", "description": "Preferences/General",
"message": "Show a notification when the queue finishes downloading" "message": "Show a notification when the queue finishes downloading"
}, },
"pref_global_turbo": {
"description": "Preferences/General",
"message": "Browser button should be OneClick!"
},
"pref_hide_context": { "pref_hide_context": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Do not show general context menu items" "message": "Do not show general context menu items"
}, },
"pref_manager": {
"description": "Preferences/General; group text",
"message": "Manager"
},
"pref_manager_in_popup": {
"description": "checkbox text",
"message": "Open manager in a new popup window"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Show tooltips in Manager tabs" "message": "Show tooltips in Manager tabs"
}, },
"pref_netglobal": {
"description": "Preferences/General; group text",
"message": "Global Network Limits"
},
"pref_open_manager_on_queue": { "pref_open_manager_on_queue": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Open the Manager tab after queuing some downloads" "message": "Open the Manager tab after queuing some downloads"
@ -699,29 +637,49 @@
"description": "Preferences/General", "description": "Preferences/General",
"message": "Show a notification when queuing new downloads" "message": "Show a notification when queuing new downloads"
}, },
"pref_queueing": {
"description": "Preferences/General; group text",
"message": "Queuing Downloads"
},
"pref_remove_missing_on_init": { "pref_remove_missing_on_init": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Remove missing downloads after a restart" "message": "Remove missing downloads after a restart"
}, },
"pref_retries": {
"description": "pref text",
"message": "Number of retries of downloads on temporary errors"
},
"pref_retry_time": {
"description": "pref text",
"message": "Retry every (in minutes)"
},
"pref_show_urls": { "pref_show_urls": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Show URLs instead of Names" "message": "Show URLs instead of Names"
}, },
"pref_sounds": {
"description": "checkbox text",
"message": "Play sounds"
},
"pref_text_links": { "pref_text_links": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Try to find links in the website text (slower)" "message": "Try to find links in the website text (slower)"
}, },
"pref_manager": { "pref_theme": {
"description": "Preferences/General; group text", "description": "label text",
"message": "Manager" "message": "Theme:"
}, },
"pref_netglobal": { "pref_theme_dark": {
"description": "Preferences/General; group text", "description": "option text",
"message": "Global Network Limits" "message": "Dark"
}, },
"pref_queueing": { "pref_theme_default": {
"description": "Preferences/General; group text", "description": "option text",
"message": "Queuing Downloads" "message": "System/Browser"
},
"pref_theme_light": {
"description": "option text",
"message": "Light"
}, },
"pref_ui": { "pref_ui": {
"description": "Preferences/General; group text", "description": "Preferences/General; group text",
@ -743,6 +701,10 @@
"description": "Notification text", "description": "Notification text",
"message": "The download queue has finished" "message": "The download queue has finished"
}, },
"queued": {
"description": "Status text",
"message": "Queued"
},
"queued_download": { "queued_download": {
"description": "Notification text; single download", "description": "Notification text; single download",
"message": "Queued 1 download!" "message": "Queued 1 download!"
@ -757,6 +719,14 @@
} }
} }
}, },
"referrer": {
"description": "Label for \"Referrer\"",
"message": "Referrer"
},
"remember": {
"description": "Checkbox text for confirmation, e.g. when removing a download in manager",
"message": "Remember this decision"
},
"remove_all_complete_downloads": { "remove_all_complete_downloads": {
"description": "Menu text", "description": "Menu text",
"message": "Remove All Complete" "message": "Remove All Complete"
@ -889,6 +859,10 @@
"description": "Menu text", "description": "Menu text",
"message": "Remove Selected" "message": "Remove Selected"
}, },
"rename": {
"description": "UI for renaming; currently unused",
"message": "Rename"
},
"renamer_batch": { "renamer_batch": {
"description": "Mask text; see mask button", "description": "Mask text; see mask button",
"message": "Batch Number" "message": "Batch Number"
@ -1005,6 +979,14 @@
"description": "Mask text; see mask button", "description": "Mask text; see mask button",
"message": "Date Added - Year" "message": "Date Added - Year"
}, },
"renmask": {
"description": "Renaming mask (long)",
"message": "Renaming mask"
},
"reset": {
"description": "Button text; pref window",
"message": "Reset"
},
"reset_confirmations": { "reset_confirmations": {
"description": "Button text; pref/General", "description": "Button text; pref/General",
"message": "Reset remembered confirmations" "message": "Reset remembered confirmations"
@ -1025,6 +1007,32 @@
"description": "Action for resuming a download", "description": "Action for resuming a download",
"message": "Resume" "message": "Resume"
}, },
"retrying": {
"description": "Status text",
"message": "Retrying"
},
"retrying_error": {
"description": "status text",
"message": "Retrying - $ERROR$",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": {
"description": "Status text",
"message": "Running"
},
"save": {
"description": "Button text; e.g. prefs/Network",
"message": "Save"
},
"search": {
"description": "Placeholder text; manager status search field",
"message": "Search…"
},
"select_all": { "select_all": {
"description": "Menu text; e.g. select context", "description": "Menu text; e.g. select context",
"message": "Select All" "message": "Select All"
@ -1045,6 +1053,18 @@
"description": "Menu text; select window", "description": "Menu text; select window",
"message": "Set Renaming Mask" "message": "Set Renaming Mask"
}, },
"set_mask_text": {
"description": "dialog text",
"message": "Set a new renaming mask"
},
"set_referrer": {
"description": "menu text",
"message": "Set Referrer"
},
"set_referrer_text": {
"description": "dialog text",
"message": "Set a new referrer"
},
"single_batchexamples": { "single_batchexamples": {
"description": "Header text; single window", "description": "Header text; single window",
"message": "Batches are supported, e.g.:" "message": "Batches are supported, e.g.:"
@ -1057,6 +1077,66 @@
"description": "Title of single window", "description": "Title of single window",
"message": "DownThemAll! - Add a link" "message": "DownThemAll! - Add a link"
}, },
"sizeB": {
"description": "Size formatting; bytes",
"message": "$S$B",
"placeholders": {
"s": {
"content": "$1",
"example": "100b"
}
}
},
"sizeGB": {
"description": "Size formatting; giga bytes",
"message": "$S$GB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.200GB"
}
}
},
"sizeKB": {
"description": "Size formatting; kilo bytes",
"message": "$S$KB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.2KB"
}
}
},
"sizeMB": {
"description": "Size formatting; mega bytes",
"message": "$S$MB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.22MB"
}
}
},
"sizePB": {
"description": "Size formatting; peta bytes (you never know)",
"message": "$S$PB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.212PB"
}
}
},
"sizeTB": {
"description": "Size formatting; tera bytes (you never know)",
"message": "$S$TB",
"placeholders": {
"s": {
"content": "$1",
"example": "100.002TB"
}
}
},
"size_progress": { "size_progress": {
"description": "Status text; manager size column", "description": "Status text; manager size column",
"message": "$WRITTEN$ of $TOTAL$", "message": "$WRITTEN$ of $TOTAL$",
@ -1127,6 +1207,36 @@
} }
} }
}, },
"speedB": {
"description": "Speed formatting; bytes",
"message": "$SPEED$b/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100b/s"
}
}
},
"speedKB": {
"description": "Speed formatting; kilo bytes",
"message": "$SPEED$KB/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100.1KB/s"
}
}
},
"speedMB": {
"description": "Speed formatting; mega bytes",
"message": "$SPEED$MB/s",
"placeholders": {
"speed": {
"content": "$1",
"example": "100.20MB/s"
}
}
},
"statusNetwork_active_title": { "statusNetwork_active_title": {
"description": "Status bar tooltip; manager network icon", "description": "Status bar tooltip; manager network icon",
"message": "New Downloads will be started" "message": "New Downloads will be started"
@ -1135,6 +1245,18 @@
"description": "Status bar tooltip; manager network icon", "description": "Status bar tooltip; manager network icon",
"message": "No new Downloads will be started" "message": "No new Downloads will be started"
}, },
"subfolder": {
"description": "label text",
"message": "Subfolder:"
},
"subfolder_placeholder": {
"description": "placeholder text within an input box",
"message": "Place files in this subfolder within your downloads directory"
},
"title": {
"description": "Column text; Title label (short)",
"message": "Title"
},
"toggle_selected_items": { "toggle_selected_items": {
"description": "Menu text; select", "description": "Menu text; select",
"message": "Toggle Check for Selected Items" "message": "Toggle Check for Selected Items"
@ -1166,5 +1288,13 @@
"uncheck_selected_items": { "uncheck_selected_items": {
"description": "Menu text; select", "description": "Menu text; select",
"message": "Uncheck Selected Items" "message": "Uncheck Selected Items"
},
"unlimited": {
"description": "Option text; Prefs/Network",
"message": "Unlimited"
},
"useonlyonce": {
"description": "Label for Use-Once checkboxes",
"message": "Use Once"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -124,7 +124,7 @@
"description": "Table column in manager" "description": "Table column in manager"
}, },
"conflict_overwrite": { "conflict_overwrite": {
"message": "Felülírás", "message": "Írd felül",
"description": "Option text; prefs/general" "description": "Option text; prefs/general"
}, },
"conflict_prompt": { "conflict_prompt": {
@ -132,7 +132,7 @@
"description": "Option text; prefs/general" "description": "Option text; prefs/general"
}, },
"conflict_rename": { "conflict_rename": {
"message": "Átnevezés", "message": "Nevezd át",
"description": "Option text; prefs/general" "description": "Option text; prefs/general"
}, },
"CRASH": { "CRASH": {
@ -191,6 +191,22 @@
"message": "Törlés", "message": "Törlés",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Fájlok törlése",
"description": "menu action"
},
"deletefiles_button": {
"message": "Törlés",
"description": "button text"
},
"deletefiles_text": {
"message": "Biztos benne, hogy törli a következő fájlokat?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Fájlok törlése",
"description": "messagebox title"
},
"description": { "description": {
"message": "Leírás", "message": "Leírás",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "Érvénytelen URL", "message": "Érvénytelen URL",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "Abszolút útvonalak megadása az almappákhoz nem támogatott a böngészők által",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Pontok az almappákban nem támogatottak a böngészők által",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Nincs elem kiválasztva", "message": "Nincs elem kiválasztva",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "Exportálás fájlba",
"description": "menu text"
},
"export_aria2": {
"message": "Exportálás aria2 listaként",
"description": "menu text"
},
"export_metalink": {
"message": "Exportálás Metalink formátumba",
"description": "menu text"
},
"export_text": {
"message": "Exportálás szövegként",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "A tömeges letöltő a böngésződ számára", "message": "A tömeges letöltő a böngésződ számára",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "Erőltetett indítás", "message": "Erőltetett indítás",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Importálás fájlból",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Információ", "message": "Információ",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -384,7 +428,7 @@
"description": "Menu text" "description": "Menu text"
}, },
"manager_status_items": { "manager_status_items": {
"message": "Elkészült $COMPLETE$ a $TOTAL$ letöltésből ($SHOWING$ kijelezve), $RUNNING$ folyamatban", "message": "Elkészült $COMPLETE$ a(z) $TOTAL$ letöltésből ($SHOWING$ kijelezve), $RUNNING$ folyamatban",
"description": "Status bar text; manager", "description": "Status bar text; manager",
"placeholders": { "placeholders": {
"complete": { "complete": {
@ -529,18 +573,34 @@
"message": "Add hozzá az új letöltéseket szüneteltetve, ahelyett, hogy azonnal megkezdenéd a letöltésüket", "message": "Add hozzá az új letöltéseket szüneteltetve, ahelyett, hogy azonnal megkezdenéd a letöltésüket",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "DownThemAll gomb:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll választás",
"description": "label"
},
"pref_button_type_manager": {
"message": "Kezelő megnyitása",
"description": "label"
},
"pref_button_type_popup": {
"message": "Felugró menü",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Egyidejű letöltések", "message": "Egyidejű letöltések száma",
"description": "Preferences/Network" "description": "Preferences/Network"
}, },
"pref_finish_notification": { "pref_finish_notification": {
"message": "Értesíts, ha a letöltések befejeződtek", "message": "Értesíts, ha a letöltések befejeződtek",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "A böngésző gomb inkább OneClick! legyen",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Ne mutasd az általános menü elemeit", "message": "Ne mutasd az általános menü elemeit",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,8 +609,12 @@
"message": "Kezelő", "message": "Kezelő",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Kezelő megnyitása új felugró ablakban",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Mutass tooltipeket a Kezelő lapokon", "message": "Mutass tooltipeket a Kezelő lapjain",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_netglobal": { "pref_netglobal": {
@ -558,7 +622,7 @@
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_open_manager_on_queue": { "pref_open_manager_on_queue": {
"message": "Nyisd meg a Kezelő lapot a letöltések sorbaállítását követően", "message": "Nyisd meg a Kezelőt a letöltések sorbaállítását követően",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_queueing": { "pref_queueing": {
@ -573,10 +637,22 @@
"message": "Hiányzó letöltések eltávolítása újraindítást követően", "message": "Hiányzó letöltések eltávolítása újraindítást követően",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Ideiglenes hibák esetén az újrapróbálkozások száma",
"description": "pref text"
},
"pref_retry_time": {
"message": "Újrapróbálkozás ennyi percenként",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "Mutass URL-eket nevek helyett", "message": "Mutass URL-eket nevek helyett",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Hangok lejátszása",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Keress hivatkozásokat a honlap szövegében (lassabb)", "message": "Keress hivatkozásokat a honlap szövegében (lassabb)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "Folytatás", "message": "Folytatás",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Újrapróbálkozás",
"description": "Status text"
},
"retrying_error": {
"message": "Újrapróbálkozás - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "Folyamatban", "message": "Folyamatban",
"description": "Status text" "description": "Status text"
@ -943,12 +1033,24 @@
"message": "Átnevezési maszk beállítása", "message": "Átnevezési maszk beállítása",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "Új átnevezési maszk beállítása",
"description": "dialog text"
},
"set_referrer": {
"message": "Referrer beállítása",
"description": "menu text"
},
"set_referrer_text": {
"message": "Új referrer beállítása",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "Kötegek támogatva vannak, pl.:", "message": "Kötegelés támogatva van, pl.:",
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_header": { "single_header": {
"message": "Írj be egy letöltési URL-t (hivatkozást) és egyéb beállításokat", "message": "Írjon be egy letöltési URL-t (hivatkozást) és adjon meg egyéb beállításokat",
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
@ -1123,6 +1225,14 @@
"message": "Nem lesznek új letöltések elindítva", "message": "Nem lesznek új letöltések elindítva",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "Almappa:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Fájlok elhelyezése ebbe az almappába a letöltések mappáján belül",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Cím", "message": "Cím",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Egyszer használd", "message": "Egyszer használd",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Felhasználói megszakítás",
"description": "Error message"
} }
} }

View File

@ -7,18 +7,6 @@
"message": "id", "message": "id",
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR" "description": "Language code the locale will use, e.g. de or en-GB or pt-BR"
}, },
"renamer_tags": {
"message": "Penanda Mask Penamaan",
"description": "Mask text; see mask button"
},
"renmask": {
"message": "Mask penamaan",
"description": "Renaming mask (long)"
},
"set_mask": {
"message": "Set Mask Penamaan",
"description": "Menu text; select window"
},
"addpaused": { "addpaused": {
"message": "Tambahkan dalam kondisi terpause", "message": "Tambahkan dalam kondisi terpause",
"description": "Action: Add paused" "description": "Action: Add paused"
@ -36,7 +24,7 @@
"description": "Checkbox label" "description": "Checkbox label"
}, },
"add_paused_question": { "add_paused_question": {
"message": "Apa Anda ingin mengingat keputusan ini dan mulai sekarang tambahkan unduhan dalam kondisi terpause?", "message": "Ingat keputusan ini dan tambahkan unduhan dalam kondisi terpause mulai sekarang?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"add_paused_title": { "add_paused_title": {
@ -187,6 +175,22 @@
"message": "Hapus", "message": "Hapus",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Hapus Berkas",
"description": "menu action"
},
"deletefiles_button": {
"message": "Hapus",
"description": "button text"
},
"deletefiles_text": {
"message": "Hapus berkas-berkas berikut ini?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Hapus Berkas",
"description": "messagebox title"
},
"description": { "description": {
"message": "Keterangan", "message": "Keterangan",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -263,10 +267,34 @@
"message": "URL Tidak Benar", "message": "URL Tidak Benar",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "Path absolut untuk subfolder tidak didukung oleh peramban",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Titik (.) di subfolder tidak didukung oleh peramban",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Tidak ada item terpilih", "message": "Tidak ada item terpilih",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "Ekspor Ke Berkas",
"description": "menu text"
},
"export_aria2": {
"message": "Ekspor Sebagai Daftar aria2",
"description": "menu text"
},
"export_metalink": {
"message": "Ekspor Sebagai Metalink",
"description": "menu text"
},
"export_text": {
"message": "Ekspor Sebagai Teks",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "Pengunduh Masal untuk browser anda", "message": "Pengunduh Masal untuk browser anda",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -319,6 +347,10 @@
"message": "Paksa Mulai", "message": "Paksa Mulai",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Impor Dari Berkas",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Informasi", "message": "Informasi",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -473,6 +505,22 @@
"message": "Tambahkan unduhan terpause, alih-alih langsung memulai mengunduh", "message": "Tambahkan unduhan terpause, alih-alih langsung memulai mengunduh",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "Tombol DownThemAll!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Pilihan DownThemAll!",
"description": "label"
},
"pref_button_type_manager": {
"message": "Buka Pengelola",
"description": "label"
},
"pref_button_type_popup": {
"message": "Menu popup",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Unduhan Bersamaan", "message": "Unduhan Bersamaan",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -481,10 +529,6 @@
"message": "Tampilkan pemberitahuan ketika antrian unduhan selesai", "message": "Tampilkan pemberitahuan ketika antrian unduhan selesai",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Tombol peramban sebaiknya OneClick!",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Jangan perlihatkan item menu general context", "message": "Jangan perlihatkan item menu general context",
"description": "Preferences/General" "description": "Preferences/General"
@ -493,6 +537,10 @@
"message": "Pengelola", "message": "Pengelola",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Buka pengelola di jendela popup baru",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Tampilkan tooltip di tab Pengelola", "message": "Tampilkan tooltip di tab Pengelola",
"description": "Preferences/General" "description": "Preferences/General"
@ -517,10 +565,22 @@
"message": "Setelah restart, hapus unduhan yang tidak ada", "message": "Setelah restart, hapus unduhan yang tidak ada",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Jumlah percobaan ulang ketika gagal mengunduh",
"description": "pref text"
},
"pref_retry_time": {
"message": "Coba setiap (dalam menit)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "Tampilan URL alih-alih Nama", "message": "Tampilan URL alih-alih Nama",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Bunyikan suara",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Coba cari tautan di teks di situs web (lambat)", "message": "Coba cari tautan di teks di situs web (lambat)",
"description": "Preferences/General" "description": "Preferences/General"
@ -779,6 +839,10 @@
"message": "Tanggal Ditambahkan - Detik", "message": "Tanggal Ditambahkan - Detik",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_tags": {
"message": "Penanda Mask Penamaan",
"description": "Mask text; see mask button"
},
"renamer_text": { "renamer_text": {
"message": "Teks Deskripsi", "message": "Teks Deskripsi",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
@ -795,6 +859,10 @@
"message": "Tanggal Ditambahkan - Tahun", "message": "Tanggal Ditambahkan - Tahun",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renmask": {
"message": "Mask penamaan",
"description": "Renaming mask (long)"
},
"reset": { "reset": {
"message": "Atur Ulang", "message": "Atur Ulang",
"description": "Button text; pref window" "description": "Button text; pref window"
@ -819,6 +887,20 @@
"message": "Lanjutkan", "message": "Lanjutkan",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Mengulang",
"description": "Status text"
},
"retrying_error": {
"message": "Mengulang - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "Berjalan", "message": "Berjalan",
"description": "Status text" "description": "Status text"
@ -863,6 +945,22 @@
"message": "Tidak Diizinkan", "message": "Tidak Diizinkan",
"description": "Error message" "description": "Error message"
}, },
"set_mask": {
"message": "Set Mask Penamaan",
"description": "Menu text; select window"
},
"set_mask_text": {
"message": "Tentukan mask penamaan baru",
"description": "dialog text"
},
"set_referrer": {
"message": "Tentukan Referrer",
"description": "menu text"
},
"set_referrer_text": {
"message": "Tentukan referrer baru",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "Batch bisa digunakan, misalnya:", "message": "Batch bisa digunakan, misalnya:",
"description": "Header text; single window" "description": "Header text; single window"
@ -983,6 +1081,10 @@
"message": "Tidak ada Unduhan baru yang akan dimulai", "message": "Tidak ada Unduhan baru yang akan dimulai",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder_placeholder": {
"message": "Simpan berkas di subfolder berikut di dalam direktori unduhan Anda",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Judul", "message": "Judul",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1026,5 +1128,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Gunakan Sekali", "message": "Gunakan Sekali",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Dibatalkan Pengguna",
"description": "Error message"
} }
} }

View File

@ -1,4 +1,4 @@
{ {
"language": { "language": {
"message": "Italiano (IT)", "message": "Italiano (IT)",
"description": "Lanuage Name in your language" "description": "Lanuage Name in your language"
@ -7,26 +7,6 @@
"message": "it-IT", "message": "it-IT",
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR" "description": "Language code the locale will use, e.g. de or en-GB or pt-BR"
}, },
"renamer_batch": {
"message": "Numero gruppo",
"description": "Mask text; see mask button"
},
"renamer_idx": {
"message": "Numero elemento nel gruppo di download",
"description": "Mask text; see mask button"
},
"renamer_num": {
"message": "Alias per *batch*",
"description": "Mask text; see mask button"
},
"renamer_refqstring": {
"message": "Stringa Query Referrer",
"description": "Mask text; see mask button"
},
"single_batchexamples": {
"message": "I download raggruppati sono supportati, ad esempio:",
"description": "Header text; single window"
},
"addpaused": { "addpaused": {
"message": "Aggiungi in pausa", "message": "Aggiungi in pausa",
"description": "Action: Add paused" "description": "Action: Add paused"
@ -36,7 +16,7 @@
"description": "Action for adding a download" "description": "Action for adding a download"
}, },
"add_new": { "add_new": {
"message": "Aggiungi nuovo", "message": "Aggiungi Nuovo",
"description": "Button text (adding filters, limits and such)" "description": "Button text (adding filters, limits and such)"
}, },
"add_paused_once": { "add_paused_once": {
@ -44,11 +24,11 @@
"description": "Checkbox label" "description": "Checkbox label"
}, },
"add_paused_question": { "add_paused_question": {
"message": "Vuoi ricordare questa decisione e aggiungere sempre", "message": "Vuoi ricordare questa scelta e aggiungere sempre nuovi download in pausa da ora in poi?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"add_paused_title": { "add_paused_title": {
"message": "Vuoi sempre aggiungere in pausa?", "message": "Vuoi aggiungere sempre in pausa?",
"description": "Title for the add-paused dialog" "description": "Title for the add-paused dialog"
}, },
"ask_again_later": { "ask_again_later": {
@ -56,11 +36,11 @@
"description": "Button text" "description": "Button text"
}, },
"batch_batch": { "batch_batch": {
"message": "Download di gruppo", "message": "Download Multiplo",
"description": "Button text" "description": "Button text"
}, },
"batch_desc": { "batch_desc": {
"message": "L'indirizzo attuale sembra contenere istruzioni per un download di massa.", "message": "L'URL corrente sembra contenere istruzioni per un download multiplo.",
"description": "" "description": ""
}, },
"batch_items": { "batch_items": {
@ -72,15 +52,15 @@
"description": "Messagebox info text for batch confirmations" "description": "Messagebox info text for batch confirmations"
}, },
"batch_question": { "batch_question": {
"message": "Vuoi aggiungerlo come download di massa o singolo?", "message": "Vuoi aggiungere questo come download multiplo o singolo?",
"description": "Messagebox info text for batch confirmations" "description": "Messagebox info text for batch confirmations"
}, },
"batch_single": { "batch_single": {
"message": "Download singolo", "message": "Download Singolo",
"description": "Button text for batch confirmation" "description": "Button text for batch confirmation"
}, },
"batch_title": { "batch_title": {
"message": "Download di massa", "message": "Download Multiplo",
"description": "Messagebox title for batch confirmations" "description": "Messagebox title for batch confirmations"
}, },
"cancel": { "cancel": {
@ -100,7 +80,7 @@
"description": "Error message when an input field is empty but has to have a value" "description": "Error message when an input field is empty but has to have a value"
}, },
"change_later_reminder": { "change_later_reminder": {
"message": "Puoi cambiare la tua decisione nelle Impostazioni", "message": "Puoi modificare in seguito questa scelta nelle Preferenze",
"description": "Checkbox label text for decision confirmations" "description": "Checkbox label text for decision confirmations"
}, },
"check_selected_items": { "check_selected_items": {
@ -116,7 +96,7 @@
"description": "Table column in manager" "description": "Table column in manager"
}, },
"colETA": { "colETA": {
"message": "ETA", "message": "Tempo rimanente",
"description": "Table column in manager" "description": "Table column in manager"
}, },
"colNameURL": { "colNameURL": {
@ -164,7 +144,7 @@
"description": "Button text; Create filter dialog; prefs/filters" "description": "Button text; Create filter dialog; prefs/filters"
}, },
"custom_filename": { "custom_filename": {
"message": "Nome personalizzato", "message": "Nome file personalizzato",
"description": "Label text; single window" "description": "Label text; single window"
}, },
"deffilter_all": { "deffilter_all": {
@ -180,7 +160,7 @@
"description": "Filter label for the Audio filter" "description": "Filter label for the Audio filter"
}, },
"deffilter_bin": { "deffilter_bin": {
"message": "Software (exe, msi, …)", "message": "Programmi (exe, msi, …)",
"description": "Filter label for the Software filter" "description": "Filter label for the Software filter"
}, },
"deffilter_doc": { "deffilter_doc": {
@ -211,12 +191,28 @@
"message": "Elimina", "message": "Elimina",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Elimina File",
"description": "menu action"
},
"deletefiles_button": {
"message": "Elimina",
"description": "button text"
},
"deletefiles_text": {
"message": "Sei sicuro di voler eliminare i seguenti file?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Elimina File",
"description": "messagebox title"
},
"description": { "description": {
"message": "Descrizione", "message": "Descrizione",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
}, },
"disable_other_filters": { "disable_other_filters": {
"message": "Disabilita gli altri", "message": "Disabilita gli altri filtri",
"description": "Checkbox label. Keep it short" "description": "Checkbox label. Keep it short"
}, },
"donate": { "donate": {
@ -284,31 +280,55 @@
"description": "Menu text" "description": "Menu text"
}, },
"error_invalidMask": { "error_invalidMask": {
"message": "Maschera di rinominazione non valida", "message": "Maschera di rinomina non valida",
"description": "Error message; single/select window" "description": "Error message; single/select window"
}, },
"error_invalidReferrer": { "error_invalidReferrer": {
"message": "Referrer invalido", "message": "Referrer non valido",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_invalidURL": { "error_invalidURL": {
"message": "URL non valido", "message": "URL non valido",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "I percorsi assoluti per le sottocartelle non sono supportati dal browser",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "I punti (.) nelle sottocartelle non sono supportati dal browser",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Nessun elemento selezionato", "message": "Nessun elemento selezionato",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "Esporta in un File",
"description": "menu text"
},
"export_aria2": {
"message": "Esporta Lista come aria2",
"description": "menu text"
},
"export_metalink": {
"message": "Esporta come Metalink",
"description": "menu text"
},
"export_text": {
"message": "Esporta come Testo",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "Il download manager di massa per il tuo browser", "message": "Il download manager di massa per il tuo browser",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
}, },
"fastfiltering": { "fastfiltering": {
"message": "Filtraggio Rapido", "message": "Filtro Rapido",
"description": "Label for Fast Filtering input" "description": "Label for Fast Filtering input"
}, },
"fastfilter_placeholder": { "fastfilter_placeholder": {
"message": "Espressione con asterischi (*) oppure regolare", "message": "Espressione con parole chiave o espressione regolare",
"description": "Placeholder for fastfilter inputs" "description": "Placeholder for fastfilter inputs"
}, },
"FILE_FAILED": { "FILE_FAILED": {
@ -320,11 +340,11 @@
"description": "Error message when no filter types are selected for a filter in the preferences UI" "description": "Error message when no filter types are selected for a filter in the preferences UI"
}, },
"filter_create_title": { "filter_create_title": {
"message": "Crea nuovo filtro", "message": "Crea nuovo Filtro",
"description": "Message box title" "description": "Message box title"
}, },
"filter_expression": { "filter_expression": {
"message": "Valore Filtro", "message": "Espressione Filtro",
"description": "Message box label" "description": "Message box label"
}, },
"filter_label": { "filter_label": {
@ -351,6 +371,10 @@
"message": "Forza avvio", "message": "Forza avvio",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Importa da File",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Informazione", "message": "Informazione",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -364,7 +388,7 @@
"description": "Menu text" "description": "Menu text"
}, },
"key_alt": { "key_alt": {
"message": "Atl", "message": "Alt",
"description": "Short for Alt-Key" "description": "Short for Alt-Key"
}, },
"key_ctrl": { "key_ctrl": {
@ -384,11 +408,11 @@
"description": "Short for home key" "description": "Short for home key"
}, },
"key_pagedown": { "key_pagedown": {
"message": "PagGIU", "message": "PagGiu",
"description": "Short for pagedown-key" "description": "Short for pagedown-key"
}, },
"key_pageup": { "key_pageup": {
"message": "PagSU", "message": "PagSu",
"description": "Short for PageUp-key" "description": "Short for PageUp-key"
}, },
"limited_to": { "limited_to": {
@ -446,7 +470,7 @@
"description": "Status text in manager" "description": "Status text in manager"
}, },
"move_bottom": { "move_bottom": {
"message": "In basso", "message": "In fondo",
"description": "Action for moving a download to the bottom" "description": "Action for moving a download to the bottom"
}, },
"move_down": { "move_down": {
@ -454,7 +478,7 @@
"description": "Action for moving a download down" "description": "Action for moving a download down"
}, },
"move_top": { "move_top": {
"message": "In alto", "message": "In cima",
"description": "Action for moving a download to the top" "description": "Action for moving a download to the top"
}, },
"move_up": { "move_up": {
@ -462,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "nagging_message": {
"message": "Hai aggiunto $DOWNLOADS$ download a DownThemAll! Come utente abituale, potresti considerare una donazione per supportare lo sviluppo. Grazie!", "message": "Hai aggiunto $DOWNLOADS$ download a DownThemAll! Come utente abituale potresti considerare una donazione per supportare lo sviluppo. Grazie!",
"description": "Donation nagging message; displayed as a notification bar in manager", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -538,17 +562,37 @@
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"prefs_short": { "prefs_short": {
"message": "Impostazioni", "message": "Preferenze",
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "Impostazioni di DownThemAll!", "message": "Preferenze di DownThemAll!",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
"message": "Aggiungi nuovi download in pausa, invece di avviarli subito", "message": "Aggiungi nuovi download in pausa, invece di avviarli subito",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "Pulsante DownThemAll!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Selezione DownThemAll!",
"description": "label"
},
"pref_button_type_manager": {
"message": "Apri Manager",
"description": "label"
},
"pref_button_type_popup": {
"message": "Menu Popup",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Download contemporanei", "message": "Download contemporanei",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -557,18 +601,18 @@
"message": "Mostra una notifica quando la coda finisce di scaricare", "message": "Mostra una notifica quando la coda finisce di scaricare",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Il pulsante del browser diventa OneClick!",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Non mostrare menù contestuali ovunque", "message": "Non mostrare elementi nel menù contestuale",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_manager": { "pref_manager": {
"message": "Manager", "message": "Manager",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Apri Manager in una nuova finestra popup",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Mostra suggerimenti nelle schede del Manager", "message": "Mostra suggerimenti nelle schede del Manager",
"description": "Preferences/General" "description": "Preferences/General"
@ -578,11 +622,11 @@
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_open_manager_on_queue": { "pref_open_manager_on_queue": {
"message": "Apri la scheda del Manager dopo aver aggiunto nuovi download", "message": "Apri la scheda Manager dopo aver aggiunto nuovi download",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_queueing": { "pref_queueing": {
"message": "Coda dei Download", "message": "Coda di Download",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_queue_notification": { "pref_queue_notification": {
@ -593,16 +637,28 @@
"message": "Rimuovi i download mancanti dopo un riavvio", "message": "Rimuovi i download mancanti dopo un riavvio",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Numero di nuovi tentativi di download per errori temporanei",
"description": "pref text"
},
"pref_retry_time": {
"message": "Riprova ogni (in minuti)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "Mostra indirizzi invece dei nomi", "message": "Mostra URL invece dei Nomi",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Esegui suoni",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Cerca link nel testo del sito (più lento)", "message": "Cerca link nel testo della pagina (più lento)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_ui": { "pref_ui": {
"message": "Interfaccia utente", "message": "Interfaccia Utente",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"queued": { "queued": {
@ -610,11 +666,11 @@
"description": "Status text" "description": "Status text"
}, },
"queued_download": { "queued_download": {
"message": "1 download è stato messo in coda!", "message": "1 download in coda!",
"description": "Notification text; single download" "description": "Notification text; single download"
}, },
"queued_downloads": { "queued_downloads": {
"message": "$COUNT$ download sono stati messi in coda!", "message": "$COUNT$ download in coda!",
"description": "Notification text; multiple downloads", "description": "Notification text; multiple downloads",
"placeholders": { "placeholders": {
"count": { "count": {
@ -632,11 +688,11 @@
"description": "Label for \"Referrer\"" "description": "Label for \"Referrer\""
}, },
"remember": { "remember": {
"message": "Ricorda questa decisione", "message": "Ricorda questa scelta",
"description": "Checkbox text for confirmation, e.g. when removing a download in manager" "description": "Checkbox text for confirmation, e.g. when removing a download in manager"
}, },
"remove_all_complete_downloads": { "remove_all_complete_downloads": {
"message": "Rimuovi completati", "message": "Rimuovi tutti i completati",
"description": "Menu text" "description": "Menu text"
}, },
"remove_all_downloads": { "remove_all_downloads": {
@ -648,11 +704,11 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_batch_downloads": { "remove_batch_downloads": {
"message": "Rimuovi gruppo attuale", "message": "Rimuovi download multiplo corrente",
"description": "Menu text" "description": "Menu text"
}, },
"remove_batch_downloads_question": { "remove_batch_downloads_question": {
"message": "Vuoi rimuovere tutti i download dello stesso gruppo dal download attualmente selezionato?", "message": "Vuoi rimuovere tutti i download dello stesso gruppo del download (multiplo) attualmente selezionato?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_complete_downloads": { "remove_complete_downloads": {
@ -674,7 +730,7 @@
} }
}, },
"remove_complete_selection_downloads_question": { "remove_complete_selection_downloads_question": {
"message": "Vuoi rimuovere tutti i download completati nella selezione attuale?", "message": "Vuoi rimuovere tutti i download completati nella selezione corrente?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_domain_complete_downloads": { "remove_domain_complete_downloads": {
@ -692,7 +748,7 @@
} }
}, },
"remove_domain_downloads": { "remove_domain_downloads": {
"message": "Rimuovi dominio attuale", "message": "Rimuovi download dal dominio attuale",
"description": "Menu text" "description": "Menu text"
}, },
"remove_domain_downloads_question": { "remove_domain_downloads_question": {
@ -710,7 +766,7 @@
"description": "Action for removing a download, no matter what state" "description": "Action for removing a download, no matter what state"
}, },
"remove_downloads": { "remove_downloads": {
"message": "Rimuovi download", "message": "Rimuovi i download",
"description": "Menu text" "description": "Menu text"
}, },
"remove_downloads_title": { "remove_downloads_title": {
@ -722,7 +778,7 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_failed_downloads": { "remove_failed_downloads": {
"message": "Rimuovi falliti", "message": "Rimuovi i download falliti",
"description": "Menu text" "description": "Menu text"
}, },
"remove_failed_downloads_question": { "remove_failed_downloads_question": {
@ -740,7 +796,7 @@
} }
}, },
"remove_missing": { "remove_missing": {
"message": "Cancella download mancanti", "message": "Cancella i download mancanti",
"description": "Menu text" "description": "Menu text"
}, },
"remove_missing_downloads_question": { "remove_missing_downloads_question": {
@ -748,7 +804,7 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_paused_downloads": { "remove_paused_downloads": {
"message": "Rimuovi in pausa", "message": "Rimuovi i download in pausa",
"description": "Menu text" "description": "Menu text"
}, },
"remove_paused_downloads_question": { "remove_paused_downloads_question": {
@ -756,7 +812,7 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_selected_complete_downloads": { "remove_selected_complete_downloads": {
"message": "Rimuovi i completati nella selezione", "message": "Rimuovi i download completati nella selezione",
"description": "Menu text" "description": "Menu text"
}, },
"remove_selected_complete_downloads_question": { "remove_selected_complete_downloads_question": {
@ -764,13 +820,17 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_selected_downloads": { "remove_selected_downloads": {
"message": "Rimuovi selezionati", "message": "Rimuovi i download selezionati",
"description": "Menu text" "description": "Menu text"
}, },
"rename": { "rename": {
"message": "Rinomina", "message": "Rinomina",
"description": "UI for renaming; currently unused" "description": "UI for renaming; currently unused"
}, },
"renamer_batch": {
"message": "Numero gruppo",
"description": "Mask text; see mask button"
},
"renamer_d": { "renamer_d": {
"message": "Data aggiunta - Giorno", "message": "Data aggiunta - Giorno",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
@ -792,11 +852,15 @@
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_host": { "renamer_host": {
"message": "Hostname", "message": "Nome Host",
"description": "Mask text; see mask button"
},
"renamer_idx": {
"message": "Numero elemento nel gruppo di download",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_info": { "renamer_info": {
"message": "Aggiungendo 'flat', come *flatsubdirs* sostituirà tutti gli slash nel valore, quindi non verranno create cartelle", "message": "Aggiungendo 'flat', come ad es. *flatsubdirs* sostituirà tutti gli slash nel valore, quindi non verranno create cartelle",
"description": "Mask text; see mask button; do NOT translate any mentions of \"flat\"!" "description": "Mask text; see mask button; do NOT translate any mentions of \"flat\"!"
}, },
"renamer_m": { "renamer_m": {
@ -811,6 +875,10 @@
"message": "Nome file", "message": "Nome file",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_num": {
"message": "Alias per *batch*",
"description": "Mask text; see mask button"
},
"renamer_qstring": { "renamer_qstring": {
"message": "Stringa Querry", "message": "Stringa Querry",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
@ -835,6 +903,10 @@
"message": "Nome file Refferer", "message": "Nome file Refferer",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_refqstring": {
"message": "Stringa Query Referrer",
"description": "Mask text; see mask button"
},
"renamer_refsubdirs": { "renamer_refsubdirs": {
"message": "Percorso Referrer", "message": "Percorso Referrer",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
@ -844,7 +916,7 @@
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_ss": { "renamer_ss": {
"message": "Data aggiunta - Seconda", "message": "Data aggiunta - Secondi",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_subdirs": { "renamer_subdirs": {
@ -852,15 +924,15 @@
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_tags": { "renamer_tags": {
"message": "Tag per Maschera di rinominazione", "message": "Tag maschera di rinomina",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_text": { "renamer_text": {
"message": "Descrizione", "message": "Testo descrizione",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_title": { "renamer_title": {
"message": "Titolo", "message": "Testo titolo",
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renamer_url": { "renamer_url": {
@ -872,7 +944,7 @@
"description": "Mask text; see mask button" "description": "Mask text; see mask button"
}, },
"renmask": { "renmask": {
"message": "Maschera di Rinominazione", "message": "Maschera di rinomina",
"description": "Renaming mask (long)" "description": "Renaming mask (long)"
}, },
"reset": { "reset": {
@ -880,25 +952,39 @@
"description": "Button text; pref window" "description": "Button text; pref window"
}, },
"reset_confirmations": { "reset_confirmations": {
"message": "Ripristina conferme memorizzate", "message": "Ripristina scelte salvate",
"description": "Button text; pref/General" "description": "Button text; pref/General"
}, },
"reset_confirmations_done": { "reset_confirmations_done": {
"message": "Tutte le conferme precedentemente memorizzate sono state resettate!", "message": "Tutte le scelte precedentemente salvate sono state ripristinate!",
"description": "Messagebox text; pref/General" "description": "Messagebox text; pref/General"
}, },
"reset_layouts": { "reset_layouts": {
"message": "Ripristina personalizzazioni grafiche", "message": "Ripristina personalizzazioni interfaccia utente",
"description": "Button text; pref/General" "description": "Button text; pref/General"
}, },
"reset_layouts_done": { "reset_layouts_done": {
"message": "Tutte le personalizzazioni grafiche sono state ripristinate! Ricarica le finestre/schede per applicarle.", "message": "Tutte le personalizzazioni grafiche salvate sono state ripristinate! Potresti dover ricaricare le finestre/schede.",
"description": "Messagebox text; pref/General" "description": "Messagebox text; pref/General"
}, },
"resume_download": { "resume_download": {
"message": "Ripristina", "message": "Riprendi",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Nuovo tentativo",
"description": "Status text"
},
"retrying_error": {
"message": "Nuovo tentativo - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "In esecuzione", "message": "In esecuzione",
"description": "Status text" "description": "Status text"
@ -944,11 +1030,27 @@
"description": "Error message" "description": "Error message"
}, },
"set_mask": { "set_mask": {
"message": "Definisci Maschera di Rinominazione", "message": "Imposta maschera di rinomina",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "Imposta nuova maschera di rinomina",
"description": "dialog text"
},
"set_referrer": {
"message": "Imposta Referrer",
"description": "menu text"
},
"set_referrer_text": {
"message": "Imposta nuovo Referrer",
"description": "dialog text"
},
"single_batchexamples": {
"message": "I download multipli sono supportati, ad es.:",
"description": "Header text; single window"
},
"single_header": { "single_header": {
"message": "Inserisci un indirizzo di download (link) e altre opzioni", "message": "Inserisci un URL di download (link) e altre opzioni",
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
@ -1006,7 +1108,7 @@
} }
}, },
"sizes_huge": { "sizes_huge": {
"message": "Gigante (> $HIGH$)", "message": "Molto grande (> $HIGH$)",
"description": "Menu text; manager size column dropdown", "description": "Menu text; manager size column dropdown",
"placeholders": { "placeholders": {
"high": { "high": {
@ -1068,7 +1170,7 @@
} }
}, },
"size_progress": { "size_progress": {
"message": "$WRITTEN$ of $TOTAL$", "message": "$WRITTEN$ di $TOTAL$",
"description": "Status text; manager size column", "description": "Status text; manager size column",
"placeholders": { "placeholders": {
"total": { "total": {
@ -1120,15 +1222,23 @@
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"statusNetwork_inactive_title": { "statusNetwork_inactive_title": {
"message": "I nuovi download non verranno avviati", "message": "Nessun nuovo download verrà avviato",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "Sottocartella:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Inserisci file in questa sottocartella della tua cartella di download",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Titolo", "message": "Titolo",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
}, },
"toggle_selected_items": { "toggle_selected_items": {
"message": "Inverti selezione", "message": "Inverti contrassegno per gli elementi selezionati",
"description": "Menu text; select" "description": "Menu text; select"
}, },
"tooltip_date": { "tooltip_date": {
@ -1156,7 +1266,7 @@
"description": "Tooltip text; manager/downloads" "description": "Tooltip text; manager/downloads"
}, },
"uncheck_selected_items": { "uncheck_selected_items": {
"message": "Non contrassegnare elementi selezionati", "message": "Togli contrassegno agli elementi selezionati",
"description": "Menu text; select" "description": "Menu text; select"
}, },
"unlimited": { "unlimited": {
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Usa una volta", "message": "Usa una volta",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Annullato dall'utente",
"description": "Error message"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -191,6 +191,22 @@
"message": "삭제", "message": "삭제",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "파일 삭제",
"description": "menu action"
},
"deletefiles_button": {
"message": "삭제",
"description": "button text"
},
"deletefiles_text": {
"message": "정말 다음 파일(들)을 삭제하시겠습니까?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "파일 삭제",
"description": "messagebox title"
},
"description": { "description": {
"message": "설명", "message": "설명",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "잘못된 URL", "message": "잘못된 URL",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "하위 폴더의 절대 경로는 브라우저에서 지원되지 않습니다",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "하위 폴더의 점(.)은 브라우저에서 지원되지 않습니다",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "선택된 항목 없음", "message": "선택된 항목 없음",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "파일로 내보내기",
"description": "menu text"
},
"export_aria2": {
"message": "aria2 리스트로 내보내기",
"description": "menu text"
},
"export_metalink": {
"message": "메타링크로 내보내기",
"description": "menu text"
},
"export_text": {
"message": "텍스트로 내보내기",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "브라우저용 대량 다운로더", "message": "브라우저용 대량 다운로더",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "강제 시작", "message": "강제 시작",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "파일에서 가져오기",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "정보", "message": "정보",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "새 다운로드를 즉시 시작하는 대신 일시중지로 추가", "message": "새 다운로드를 즉시 시작하는 대신 일시중지로 추가",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "DownThemAll! 버튼:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 선택",
"description": "label"
},
"pref_button_type_manager": {
"message": "관리자 열기",
"description": "label"
},
"pref_button_type_popup": {
"message": "팝업 메뉴",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "동시 다운로드", "message": "동시 다운로드",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "다운로드 대기열이 끝나면 알림 표시", "message": "다운로드 대기열이 끝나면 알림 표시",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "브라우저 버튼을 OneClick!으로 작동",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "일반 컨텍스트 메뉴 항목 표시 안 함", "message": "일반 컨텍스트 메뉴 항목 표시 안 함",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "관리자", "message": "관리자",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "새 팝업 창에 관리자 열기",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "관리자 탭에서 툴팁 표시", "message": "관리자 탭에서 툴팁 표시",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +637,22 @@
"message": "다시 시작한 후 누락된 다운로드 제거", "message": "다시 시작한 후 누락된 다운로드 제거",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "일시적인 오류에 대한 다운로드 재시도 횟수",
"description": "pref text"
},
"pref_retry_time": {
"message": "재시도 간격 (분)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "이름 대신 URL 표시", "message": "이름 대신 URL 표시",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "소리 재생",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "웹 사이트 텍스트에서 링크를 찾도록 시도 (느림)", "message": "웹 사이트 텍스트에서 링크를 찾도록 시도 (느림)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "계속", "message": "계속",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "재시도중",
"description": "Status text"
},
"retrying_error": {
"message": "재시도중 - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "실행중", "message": "실행중",
"description": "Status text" "description": "Status text"
@ -943,6 +1033,18 @@
"message": "이름 바꾸기 마스크 설정", "message": "이름 바꾸기 마스크 설정",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "새 이름 바꾸기 마스크 설정",
"description": "dialog text"
},
"set_referrer": {
"message": "참조 페이지 설정",
"description": "menu text"
},
"set_referrer_text": {
"message": "새 참조 페이지 설정",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "일괄 처리가 지원됩니다, 예:", "message": "일괄 처리가 지원됩니다, 예:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1225,14 @@
"message": "새 다운로드가 시작되지 않습니다", "message": "새 다운로드가 시작되지 않습니다",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "하위 폴더",
"description": "label text"
},
"subfolder_placeholder": {
"message": "다운로드 디렉토리 내의 이 하위 폴더에 파일을 저장합니다",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "제목", "message": "제목",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "한번만", "message": "한번만",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "사용자 취소",
"description": "Error message"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

124
_locales/ru/messages.json Normal file → Executable file
View File

@ -12,7 +12,7 @@
"description": "Action: Add paused" "description": "Action: Add paused"
}, },
"add_download": { "add_download": {
"message": "Добавить закачку", "message": "добавить закачку",
"description": "Action for adding a download" "description": "Action for adding a download"
}, },
"add_new": { "add_new": {
@ -191,6 +191,22 @@
"message": "Удалить", "message": "Удалить",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "Удалить файлы",
"description": "menu action"
},
"deletefiles_button": {
"message": "Удалить",
"description": "button text"
},
"deletefiles_text": {
"message": "Точно удалить эти файлы?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Удаление файлов",
"description": "messagebox title"
},
"description": { "description": {
"message": "Описание", "message": "Описание",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "Неправильная ссылка", "message": "Неправильная ссылка",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "Полные пути к папкам не поддерживаются браузерами",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Точки (.) в названии папок не поддерживаются браузерами",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "Ничего не выбрано", "message": "Ничего не выбрано",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "Экспортировать в файл",
"description": "menu text"
},
"export_aria2": {
"message": "Экспортировать как список для aria2",
"description": "menu text"
},
"export_metalink": {
"message": "Экспортировать как Metalink",
"description": "menu text"
},
"export_text": {
"message": "Экспортировать как текст",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "Универсальная качалка для вашего браузера", "message": "Универсальная качалка для вашего браузера",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "Принудительный старт", "message": "Принудительный старт",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Импортировать из файла",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Информация", "message": "Информация",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "Добавлять закачки приостановленными, вместо того чтобы качать сразу", "message": "Добавлять закачки приостановленными, вместо того чтобы качать сразу",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "Кнопка DownThemAll!",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! выделенного",
"description": "label"
},
"pref_button_type_manager": {
"message": "Открыть менеджер",
"description": "label"
},
"pref_button_type_popup": {
"message": "Всплывающее меню",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "Настройки/Сеть", "message": "Настройки/Сеть",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "Показывать уведомление когда список закачек завешен", "message": "Показывать уведомление когда список закачек завешен",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Использовать OneClick! по умолчанию на кнопке в браузере",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Не добавлять пункты в общее контекстное меню", "message": "Не добавлять пункты в общее контекстное меню",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "Менеджер", "message": "Менеджер",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "Открывать менеджер в новом всплывающем окне",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "Показывать подсказки на вкладках менеджера", "message": "Показывать подсказки на вкладках менеджера",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +637,22 @@
"message": "Удалять неудавшиеся закачки после перезапуска", "message": "Удалять неудавшиеся закачки после перезапуска",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "Сколько раз пробовать перезапустить закачку при некритичных сбоях",
"description": "pref text"
},
"pref_retry_time": {
"message": "Как часто пробовать перезапустить закачку (в минутах)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "Показывать ссылки вместо имён", "message": "Показывать ссылки вместо имён",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Проигрывать звуки",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Пытаться обнаружить ссылки в тексте на сайте", "message": "Пытаться обнаружить ссылки в тексте на сайте",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "Продолжить", "message": "Продолжить",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "Перезапуск",
"description": "Status text"
},
"retrying_error": {
"message": "Перезапуск - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "В процессе", "message": "В процессе",
"description": "Status text" "description": "Status text"
@ -943,6 +1033,18 @@
"message": "Задать маску переименования", "message": "Задать маску переименования",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "Задать новую маску переименования",
"description": "dialog text"
},
"set_referrer": {
"message": "Задать реферера",
"description": "menu text"
},
"set_referrer_text": {
"message": "Задать нового реферера",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "Можно задать группы, к примеру:", "message": "Можно задать группы, к примеру:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1225,14 @@
"message": "Новые закачки запускаться не будут", "message": "Новые закачки запускаться не будут",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "Подпапка",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Размещать файлы в подпапке выбранного пути для закачек",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "Заголовок", "message": "Заголовок",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Только сейчас", "message": "Только сейчас",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Отменено пользователем",
"description": "Error message"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

475
changelog/index.html Normal file
View File

@ -0,0 +1,475 @@
<!doctype html>
<html lang="en">
<!-- License: Creative Commons Attribution-ShareAlike 4.0 International License -->
<head>
<meta charset="utf-8">
<title>DownThemAll! Changes</title>
<style>
@font-face {
font-family: "Reenie Beanie";
font-style: normal;
font-weight: 400;
font-display: block;
src: local("Reenie Beanie"), local("ReenieBeanie"),
url(res/ReenieBeanie-Regular.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
U+FEFF, U+FFFD;
}
:root {
--content-width: 1000px;
}
html,
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Ubuntu",
"Helvetica Neue", sans-serif;
font-size: 12pt;
color: rgb(20, 20, 20);
background: white;
width: 100%;
height: 100%;
}
body {
display: grid;
background: white repeat-x url(res/background-tile.png);
grid-template-columns: 1fr [content] auto 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
". header ."
". content ."
"footer footer footer";
}
a {
color: rgb(30, 30, 70);
}
li {
list-style-type: circle;
}
nav {
max-width: var(--content-width);
grid-area: header;
display: flex;
box-sizing: border-box;
padding-right: 120px;
padding-top: 1em;
padding-left: 32px;
align-content: center;
align-items: baseline;
background: no-repeat top right url(res/halo.svg);
background-size: 120px;
min-height: 100px;
text-shadow: rgba(255, 255, 255, 0.8) 1px 3px 0px;
font-family: "Reenie Beanie", cursive;
}
nav h1,
nav h2 {
margin: 0;
margin-right: 1ex;
display: inline-block;
}
nav h1 {
font-size: 400%;
}
nav h2 {
font-size: 250%;
}
article {
max-width: var(--content-width);
grid-area: content;
box-sizing: border-box;
padding: 1ex 32px;
background: white;
border-bottom: 0;
border-radius: 20px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
h3 em {
display: inline-block;
padding-left: 1em;
font-size: 80%;
}
#paypal {
margin: 1em;
display: grid;
grid-template-columns: auto auto auto auto auto;
grid-row-gap: 1em;
grid-column-gap: 1em;
justify-content: center;
justify-items: center;
}
footer {
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 2em;
padding: 2em 2em 1em 2em;
background: transparent center top repeat-x url(res/footerbg.png);
font-size: x-small;
color: gray;
grid-area: footer;
}
footer p {
margin: 0.3ex 0;
}
#logo {
width: 48px;
align-self: center;
opacity: 0.7;
filter: grayscale(90%);
}
@media only screen and (max-width: 750px) {
nav {
flex-direction: column;
margin-bottom: 1em;
padding-right: 120px;
}
nav h1 {
font-size: 275%;
}
nav h2 {
font-size: 220%;
}
#paypal {
grid-template-columns: auto auto;
}
#homepage {
display: none;
}
}
</style>
</head>
<body>
<nav>
<h1>DownThemAll!</h1>
<h2>Changes</h2>
</nav>
<article>
<h3>DownThemAll needs your support!</h3>
<section id="paypal">
<a href="https://www.paypal.me/NilsMaier/10" title="Donate €10" target="_blank">
<svg viewBox="0 0 300 72" width=110>
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="10">
<path
d="m173.05 47.333h7.9336v-22.517l-8.1436 1.6801v-6.1135l8.0969-1.6801h8.5403v28.631h7.9336v6.2069h-24.361z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/15" title="Donate €15" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" opacity=".75" stroke="#003087"
stroke-width="1px" aria-label="15">
<path
d="m173.05 47.333h7.9336v-22.517l-8.1436 1.6801v-6.1135l8.0969-1.6801h8.5403v28.631h7.9336v6.2069h-24.361z" />
<path
d="m208.75 18.702h22.331v6.6035h-15.167v5.3902q1.0267-0.28001 2.0534-0.42001 1.05-0.16334 2.1701-0.16334 6.3702 0 9.917 3.1968 3.5468 3.1734 3.5468 8.8669 0 5.6468-3.8734 8.8436-3.8501 3.1968-10.71 3.1968-2.9634 0-5.8802-0.58335-2.8934-0.56002-5.7635-1.7267v-7.0702q2.8468 1.6334 5.3902 2.4501 2.5667 0.81669 4.8302 0.81669 3.2668 0 5.1335-1.5867 1.89-1.61 1.89-4.3401 0-2.7534-1.89-4.3401-1.8667-1.5867-5.1335-1.5867-1.9367 0-4.1301 0.51335-2.1934 0.49002-4.7135 1.54z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/20" title="Donate €20" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="20">
<path
d="m181.22 46.936h15.33v6.6035h-25.317v-6.6035l12.717-11.224q1.7034-1.54 2.5201-3.0101 0.81669-1.47 0.81669-3.0568 0-2.4501-1.6567-3.9435-1.6334-1.4934-4.3635-1.4934-2.1001 0-4.5968 0.91003-2.4968 0.88669-5.3435 2.6601v-7.6536q3.0334-1.0034 5.9968-1.5167 2.9634-0.53668 5.8102-0.53668 6.2535 0 9.707 2.7534 3.4768 2.7534 3.4768 7.6769 0 2.8468-1.47 5.3202-1.47 2.4501-6.1835 6.5802z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/30" title="Donate €30" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="30">
<path
d="m189.71 34.756q3.5234 0.91003 5.3435 3.1734 1.8434 2.2401 1.8434 5.7168 0 5.1802-3.9668 7.8869-3.9668 2.6834-11.574 2.6834-2.6834 0-5.3902-0.44335-2.6834-0.42001-5.3202-1.2834v-6.9302q2.5201 1.26 4.9935 1.9134 2.4967 0.63002 4.9002 0.63002 3.5701 0 5.4602-1.2367 1.9134-1.2367 1.9134-3.5468 0-2.3801-1.9601-3.5934-1.9367-1.2367-5.7402-1.2367h-3.5934v-5.7868h3.7801q3.3834 0 5.0402-1.05 1.6567-1.0734 1.6567-3.2434 0-2.0067-1.61-3.1034t-4.5501-1.0967q-2.1701 0-4.3868 0.49002t-4.4101 1.4467v-6.5802q2.6601-0.74669 5.2735-1.12 2.6134-0.37334 5.1335-0.37334 6.7902 0 10.15 2.2401 3.3834 2.2167 3.3834 6.6969 0 3.0568-1.61 5.0168-1.61 1.9367-4.7601 2.7301z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a id="ppanother" href="https://www.paypal.me/NilsMaier" title="Donate another amount" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(19.23)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="translate(0 -.24886)" stroke-width="1.7342px">
<g transform="matrix(.57894 0 0 .57432 95.638 27.862)" fill="#009cde" stroke="#003087" aria-label="Amount">
<path
d="m62.511 47.193h-14.047l-2.2167 6.3469h-9.0303l12.904-34.838h10.71l12.904 34.838h-9.0303zm-11.807-6.4635h9.5436l-4.7601-13.86z" />
<path
d="m105.19 31.746q1.5867-2.4267 3.7568-3.6868 2.1934-1.2834 4.8068-1.2834 4.5035 0 6.8602 2.7768t2.3567 8.0736v15.914h-8.4002v-13.627q0.0233-0.30334 0.0233-0.63002 0.0233-0.32668 0.0233-0.93336 0-2.7768-0.8167-4.0135-0.81669-1.26-2.6367-1.26-2.3801 0-3.6868 1.9601-1.2834 1.9601-1.33 5.6702v12.834h-8.4002v-13.627q0-4.3401-0.74669-5.5768-0.74669-1.26-2.6601-1.26-2.4034 0-3.7101 1.9834-1.3067 1.9601-1.3067 5.6235v12.857h-8.4003v-26.134h8.4003v3.8268q1.54-2.2167 3.5234-3.3368 2.0067-1.12 4.4101-1.12 2.7067 0 4.7835 1.3067 2.0767 1.3067 3.1501 3.6634z" />
<path
d="m146.26 32.749q-2.7768 0-4.2468 2.0067-1.4467 1.9834-1.4467 5.7402t1.4467 5.7635q1.47 1.9834 4.2468 1.9834 2.7301 0 4.1768-1.9834 1.4467-2.0067 1.4467-5.7635t-1.4467-5.7402q-1.4467-2.0067-4.1768-2.0067zm0-5.9735q6.7435 0 10.524 3.6401 3.8034 3.6401 3.8034 10.08 0 6.4402-3.8034 10.08-3.7801 3.6401-10.524 3.6401-6.7669 0-10.594-3.6401-3.8034-3.6401-3.8034-10.08 0-6.4402 3.8034-10.08 3.8268-3.6401 10.594-3.6401z" />
<path
d="m169.41 43.366v-15.96h8.4002v2.6134q0 2.1234-0.0233 5.3435-0.0233 3.1968-0.0233 4.2701 0 3.1501 0.16334 4.5501 0.16334 1.3767 0.56002 2.0067 0.51335 0.81669 1.33 1.26 0.84002 0.44335 1.9134 0.44335 2.6134 0 4.1068-2.0067t1.4934-5.5768v-12.904h8.3536v26.134h-8.3536v-3.7801q-1.8901 2.2867-4.0134 3.3834-2.1001 1.0734-4.6435 1.0734-4.5268 0-6.9069-2.7768-2.3567-2.7768-2.3567-8.0736z" />
<path
d="m233.04 37.626v15.914h-8.4003v-12.18q0-3.3834-0.16333-4.6668-0.14001-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84003-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-26.134h8.3536v3.8268q1.8901-2.2867 4.0135-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m252.97 19.986v7.4202h8.6103v5.9735h-8.6103v11.084q0 1.8201 0.72335 2.4734 0.72336 0.63002 2.8701 0.63002h4.2935v5.9735h-7.1636q-4.9468 0-7.0236-2.0534-2.0534-2.0767-2.0534-7.0235v-11.084h-4.1535v-5.9735h4.1535v-7.4202z" />
</g>
<g transform="matrix(.57894 0 0 .57432 95.638 23.862)" fill="#003087" aria-label="Another">
<path
d="m57.459 11.049h-14.047l-2.2167 6.3469h-9.0303l12.904-34.838h10.71l12.904 34.838h-9.0303zm-11.807-6.4635h9.5436l-4.7601-13.86z" />
<path
d="m102.19 1.4817v15.914h-8.4003v-12.18q0-3.3834-0.16334-4.6668-0.14-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84002-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-26.134h8.3536v3.8268q1.8901-2.2867 4.0135-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m125.43-3.3951q-2.7768 0-4.2468 2.0067-1.4467 1.9834-1.4467 5.7402t1.4467 5.7635q1.47 1.9834 4.2468 1.9834 2.7301 0 4.1768-1.9834 1.4467-2.0067 1.4467-5.7635t-1.4467-5.7402q-1.4467-2.0067-4.1768-2.0067zm0-5.9735q6.7435 0 10.524 3.6401 3.8034 3.6401 3.8034 10.08 0 6.4402-3.8034 10.08-3.7801 3.6401-10.524 3.6401-6.7669 0-10.594-3.6401-3.8034-3.6401-3.8034-10.08 0-6.4402 3.8034-10.08 3.8268-3.6401 10.594-3.6401z" />
<path
d="m157.99-16.159v7.4202h8.6103v5.9735h-8.6103v11.084q0 1.8201 0.72336 2.4734 0.72336 0.63002 2.8701 0.63002h4.2935v5.9735h-7.1636q-4.9468 0-7.0236-2.0534-2.0534-2.0767-2.0534-7.0235v-11.084h-4.1535v-5.9735h4.1535v-7.4202z" />
<path
d="m201.02 1.4817v15.914h-8.4002v-12.134q0-3.4301-0.16334-4.7135-0.14001-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84003-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-36.308h8.3536v14q1.89-2.2867 4.0134-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m237.91 4.2585v2.3801h-19.531q0.30334 2.9401 2.1234 4.4101 1.8201 1.47 5.0868 1.47 2.6367 0 5.3902-0.77002 2.7768-0.79336 5.6935-2.3801v6.4402q-2.9634 1.12-5.9268 1.6801-2.9634 0.58335-5.9268 0.58335-7.0936 0-11.037-3.5934-3.9201-3.6168-3.9201-10.127 0-6.3935 3.8501-10.057 3.8734-3.6634 10.64-3.6634 6.1602 0 9.847 3.7101 3.7101 3.7101 3.7101 9.917zm-8.5869-2.7768q0-2.3801-1.4-3.8268-1.3767-1.47-3.6168-1.47-2.4267 0-3.9434 1.3767-1.5167 1.3534-1.8901 3.9201z" />
<path
d="m266.64-1.6217q-1.0967-0.51335-2.1934-0.74669-1.0734-0.25667-2.1701-0.25667-3.2201 0-4.9702 2.0767-1.7267 2.0534-1.7267 5.9035v12.04h-8.3536v-26.134h8.3536v4.2935q1.61-2.5667 3.6868-3.7334 2.1001-1.19 5.0168-1.19 0.42001 0 0.91002 0.046668 0.49002 0.023334 1.4234 0.14z" />
</g>
</g>
</svg>
</a>
</section>
<p>It requires <strong>a lot of time and some money</strong> to create the extension, keep up with browser
changes, read and answer emails, bug reports and feature requests, and actually publish the final versions.
<em>Any contribution is appreciated. Thank you!</em></p>
<h2>Major version changes</h2>
<h3>Version 4.2 <em>Grune 42, Year of the Sneezing Panda</em></h3>
<ul>
<li>Vastly improved name handling in Chrome. (<a
href="https://bugzilla.mozilla.org/show_bug.cgi?id=1245652">Missing in Firefox</a>)</li>
<li>Support <code>[a:z]</code> character batches</li>
<li>Dark theme support</li>
<li>Improved the gathering of images in websites</li>
</ul>
<h3>Version 4.1 <em>September 21, 2019</em></h3>
<ul>
<li>Subfolder dropdown. While it was previously possible to use masks for subfolders already, based on user
feedback having a dedicated subfolder selection dropdown is more convenient and easier to discover.</li>
<li>You can configure the browser button to more different actions now</li>
<li>Play sounds: When the queue finishes, play a sound (can be enabled/disabled in the preferences)</li>
<li>Delete files from within the manager</li>
<li>Manager can now configured to be opened in a popup window instead of a tab</li>
<li>Automatic retries (This feature relies on Firefox reporting errors correctly to extensions, which it
only started doing in Firefox 71, which is currently available as Nightly).</li>
</ul>
<h3>Version 4.0 <em>August 31, 2019</em></h3>
<p>DownThemAll! reborn, as a WebExtension</p>
</article>
<footer>
<svg id="logo" viewBox="0 0 16 16">
<defs>
<linearGradient id="b">
<stop stop-color="#116597" offset="0" />
<stop stop-color="#062638" offset="1" />
</linearGradient>
<linearGradient id="a">
<stop stop-color="#fffe99" offset="0" />
<stop stop-color="#e49218" offset=".2" />
<stop stop-color="#116597" offset="1" />
</linearGradient>
<radialGradient id="c" xlink:href="#a" gradientUnits="userSpaceOnUse" cy="17.413" cx="11.75"
gradientTransform="matrix(.41233 0 0 1.1548 3.24 -8.74)" r="10.752" />
<linearGradient id="h" y2="-.242" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(2.495 -6.342) scale(.6787)" y1="4.218" x1="8.101" />
<linearGradient id="i" y2="-.242" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(2.495 -1.882) scale(.6787)" y1="4.218" x1="8.101" />
<linearGradient id="g" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(7.08 4.18) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="f" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(7.657 1.298) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="e" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(1.851 4.18) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="d" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(1.851 1.298) scale(.43866)" y1="4.218" x1="8.101" />
</defs>
<g stroke="#072739">
<g stroke-width=".646">
<path
d="M4.561 7.134v1.515H1.996v.262l2.949 3.333 2.666 3.05h.99l2.686-3.05 2.848-3.252V8.65h-2.727V7.134H4.561z"
fill="url(#c)" />
<g stroke-linecap="round" stroke-dashoffset="10" fill-rule="evenodd">
<path fill="url(#d)" d="M4.562 1.346h1.649v1.649H4.562z" />
<path fill="url(#e)" d="M4.562 4.228h1.649v1.649H4.562z" />
<path fill="url(#f)" d="M10.368 1.346h1.649v1.649h-1.649z" />
<path fill="url(#g)" d="M9.792 4.228h1.649v1.649H9.792z" />
</g>
</g>
<g fill-rule="evenodd" stroke-linecap="round" stroke-dashoffset="10">
<path fill="url(#h)" d="M6.689-6.268H9.24v2.551H6.689z" transform="translate(2.874 4.614) scale(.64633)" />
<path fill="url(#i)" d="M6.689-1.808H9.24V.743H6.689z" transform="translate(2.874 4.614) scale(.64633)" />
</g>
</g>
</svg>
<section>
<p>Copyright © 2007-2018 Nils Maier, Stefano Verna, Federico Parodi</p>
<p>Copyright © 2007-2019 Nils Maier</p>
<p>The information on this website is licensed under the
<a href="https://creativecommons.org/licenses/by-sa/4.0/">
Creative Commons Attribution-ShareAlike 4.0 International License</a>.</p>
</section>
<a id="homepage" href="https://downthemall.org/">
<svg viewBox="0 0 250 32" height="20" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.1174 0 0 1.122 -217.76 -441.22)">
<path
d="m277.86 402.4c-2.106 0.594-3.9921 1.3387-5.0625 3.0371-1.8782 2.9802-1.8825 0.50072-5.0625 1.0117-0.075 4.312-1.6927 7.0814-1.0117 12.148 0.251 1.099-0.2614 1.8228 2.0234 2.0254 5.078-2.0169 2.6252-12.605 9.1113-13.162 0.661 5.076 1.325 12.532 3.0371 14.174h2.0254c2.0004 0 2.4284-0.24992 2.0254-4.0449-0.157-1.478-1.5594-2.1928-2.0234-4.0508-0.436-1.744-0.20767-2.7525-1.0137-5.0625 0.20397-2.5435-3.0757-5.9543-4.0488-6.0762z" />
<path
d="m205.98 396.32c0.71583-0.71583 3.037 0 3.037 0 3.312 2.743 2.107 7.979 3.037 12.148 0.97 4.354 2.863 8.229 3.037 12.149-3.865 0.827-3.919-2.155-5.062-4.05-3.517 0.195-3.843 3.58-7.086 4.05 0 0-3.0927 1.1003-6.074 0-2.2496-1.309-2.6451-6.2394-0.9158-9.8255 1.7293-3.5861 5.5833-5.828 10.027-5.3615 0 0-2.1472-6.9628 0-9.11zm-7.087 21.261c5.626-0.111 9.345-2.129 9.111-8.1-5.62-4-11.843 3.748-9.111 8.1z" />
<path
d="m262.67 400.37c3.124 1.378 4.2238 9.6188 3.037 14.174-0.21875 0.83965-3.6 4.9793-4.049 5.062-5.6104 1.0329-9.589-0.535-13.161-2.024-3.76 0.627-4.631 4.142-10.124 3.037-2.976-2.578-3.758-15.21 2.025-15.187 0.646 5.261-2.233 8.114 0 12.149 7.523 0.437 4.919-9.254 9.111-12.149 4.209 1.404 0.0379 4.9881 2.024 8.1 0.7405 1.1602 0.55971 3.037 2.025 3.037h5.062c2.561-0.813 3.5092-3.7334 4.049-6.074 1.0218-4.4307-3.744-7.344 1e-3 -10.125z" />
<path
d="m229.26 404.42c4.2274 1.6428 6.429 7.195 4.049 13.161-6.917 2.7019-16.888 6.2299-17.211-1.012-0.35916-8.0617 4.062-15.685 13.162-12.149zm-9.111 11.136c2.075 3.041 7.753 2.154 10.124 0 2.323-10.366-12.448-10.366-10.124 0z" />
<path
d="m415.54 393.28c1.635-0.285 1.742 0.957 3.037 1.012 0.117 7.88 0.244 15.768-6.074 17.211 0.518-6.569 1.518-12.656 3.037-18.223z" />
<path
d="m397.32 396.32c0.901 0.449 1.811 0.89 2.024 2.025 1.436 2.366 1.224 7.424 1.013 12.148-0.182 4.063 1.111 10.063-3.037 10.124-1.656-5.939-1.656-18.356 0-24.297z" />
<path
d="m405.42 396.32c0.901 0.449 1.811 0.89 2.024 2.025 1.436 2.366 1.225 7.424 1.013 12.148-0.182 4.063 1.112 10.063-3.037 10.124-1.656-5.939-1.656-18.356 0-24.297z" />
<path
d="m386.18 405.43c1.879 2.172 2.706 5.394 3.037 9.112 0.405 2.632 3.021 3.053 3.037 6.074-3.694 0.657-5.392-0.683-7.086-2.025-1.896 2.882-11.656 3.4133-12.148 0-1.2181-8.4422 3.734-13.813 13.16-13.161zm-10.123 11.136c5.229 3.119 8.32-1.521 8.123-7.087-3.941-4.338-8.175 1.277-8.123 7.087z" />
<path d="m412.5 414.54c2.928 0.446 4.614 2.134 5.062 5.062-3.131 3.21-8.628-1.578-5.062-5.062z" />
<g fill="#069">
<path
d="m344.67 399.36c-3.462 3.288-12.431 1.068-14.174 6.074-0.212 4.938 5.378 4.072 10.124 4.05-0.763 3.287-5.684 2.415-8.099 4.05 0.194 6.297 7.9627 1.1977 12.148 3.037 2.1858 0.96059-2.6665 2.6983-4.05 3.037-0.92 0.229-7.2519 3.9961-10.124 1.013-4.022-4.1774-6.0966-12.401-2.0268-19.74 2.1561-3.8884 7.9908-2.3919 12.151-3.5449 2.1724-1.0195 4.0825-0.57137 4.051 2.024z" />
<path
d="m368.97 398.35c0.91935 1.2579 1.638 4.258 2.024 7.086 0.632 4.615 1.344 11.963-3.037 12.149 0.605-6.006-1.776-9.022-1.012-15.187-2.943 2.12-2.8572 7.4034-6.074 9.112-5.4038 2.8702-7.236-2.214-10.124-4.05-0.162 4.899 0.612 10.735-4.05 11.136-0.788-6.862 1.383-10.766 1.013-17.21 6.881-1.144 5.642 5.832 10.124 7.086 2.854-2.881 4.6308-6.3006 7.086-10.123 0.7296-1.1359 3.2534-1.0889 4.05 1e-3z" />
<path
d="m299.12 404.42c2.5659-0.14763 2.6804 4.5418 3.037 7.087 0.319 2.835 0.61 6.509-1.012 8.099-3.139 1.088-1.619-3.049-2.025-5.062-0.701-3.477-2.194-6.897 0-10.124z" />
<path
d="m324 395.29c-4.1284 0.12154 0.92333 9.4224-3.6191 9.1289-3.094-0.731-3.6892 1.0347-6.0742 1.0117-5.024-0.414 3.2846-5.0625 3.2846-5.0625-1.3331-0.17112-4.8554 0.83219-4.9679-2.0635-1.1226-0.18087-1.4286 0.17857-3.0288 0.0563-0.30668 3.1413-2.5989 3.3131-5.6576 3.0448-6.3424-0.5564-15.93 1.6227-20.001 5.0366-0.88745 0.20112-1.9712 0.15704-2.4673-0.0332l0.44194 2.0606c8.225-2.236 14.819-5.3086 26.322-5.0625 0.802 5.947-2.2449 15.743 3.0371 17.211 4.327-0.057 0.29512-5.5363 2.0234-9.0879 1.899-3.9024 2.4597-3.319 5.0625-4.0723 5.9836-1.7317 0.3075 9.815 5.0625 10.123 3.109 0.858 1.9194-3.3815 2.0234-5.0625 0.3-4.805 0.0473-13.108-1.0117-17.211-0.15291-0.0158-0.29651-0.0215-0.42969-0.0176z" />
</g>
</g>
</svg>
</a>
</footer>
</body>
</html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
changelog/res/footerbg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

55
changelog/res/halo.svg Normal file
View File

@ -0,0 +1,55 @@
<svg version="1.1" viewBox="0 0 200 180" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient id="d" cx="161.46" cy="-144.02" r="160.02" gradientTransform="matrix(1 0 0 .99838 0 -.23281)" gradientUnits="userSpaceOnUse">
<stop stop-color="#febb00" offset="0"/>
<stop stop-color="#ffd571" stop-opacity=".49804" offset=".64286"/>
<stop stop-color="#ffe5a7" stop-opacity="0" offset=".95153"/>
<stop stop-color="#ffe5a7" stop-opacity="0" offset="1"/>
</radialGradient>
<filter id="e" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.32807532"/>
</filter>
<radialGradient id="c" cx="161.46" cy="-144.02" r="160.02" gradientTransform="matrix(1 0 0 .99838 0 -.23281)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffd14e" offset="0"/>
<stop stop-color="#ffeeb5" stop-opacity=".49804" offset=".71429"/>
<stop stop-color="#ffeeb5" stop-opacity=".49804" offset="1"/>
</radialGradient>
<radialGradient id="b" cx="12.389" cy="11.882" r="8.199" gradientUnits="userSpaceOnUse">
<stop stop-color="#e69412" offset="0"/>
<stop stop-color="#f4c478" stop-opacity="0" offset="1"/>
</radialGradient>
<radialGradient id="a" cx="11.75" cy="17.413" r="10.752" gradientTransform="matrix(3.3776 0 0 9.4595 121.98 -293.39)" gradientUnits="userSpaceOnUse">
<stop stop-color="#fffe99" offset="0"/>
<stop stop-color="#f69706" offset=".2"/>
<stop stop-color="#136fa7" offset="1"/>
</radialGradient>
</defs>
<g transform="translate(-61.457 224.02)">
<g transform="matrix(.62494 0 0 .62494 60.557 -51.015)" fill="url(#d)" fill-rule="evenodd">
<path d="m161.46-144.02 72.75 144.62-46.61 15.146z"/>
<path d="m161.46-144.02 143.86 74.228-28.81 39.653z"/>
<path d="m161.46-144.02 160.02-24.507v49.014z"/>
<path d="m161.46-144.02 115.05-113.88 28.81 39.653z"/>
<path d="m161.46-144.02 26.14-159.76 46.615 15.146z"/>
<path d="m161.46-144.02-72.755-144.61 46.615-15.146z"/>
<path d="m161.46-144.02-143.86-74.228 28.81-39.653z"/>
<path d="m161.46-144.02-160.02 24.507-2.7e-6 -49.014z"/>
<path d="m161.46-144.02-115.05 113.89-28.81-39.653z"/>
<path d="m161.46-144.02-26.14 159.76-46.618-15.146z"/>
</g>
<g transform="matrix(.59435 -.19312 .19312 .59435 93.307 -24.24)" fill="url(#c)" fill-rule="evenodd" opacity=".88">
<path d="m161.46-144.02 72.75 144.62-46.61 15.146z"/>
<path d="m161.46-144.02 143.86 74.228-28.81 39.653z"/>
<path d="m161.46-144.02 160.02-24.507v49.014z"/>
<path d="m161.46-144.02 115.05-113.88 28.81 39.653z"/>
<path d="m161.46-144.02 26.14-159.76 46.615 15.146z"/>
<path d="m161.46-144.02-72.755-144.61 46.615-15.146z"/>
<path d="m161.46-144.02-143.86-74.228 28.81-39.653z"/>
<path d="m161.46-144.02-160.02 24.507-2.7e-6 -49.014z"/>
<path d="m161.46-144.02-115.05 113.89-28.81-39.653z"/>
<path d="m161.46-144.02-26.14 159.76-46.618-15.146z"/>
</g>
<path transform="matrix(7.0729 0 0 7.4575 73.647 -229.61)" d="m20.588 11.882a8.199 8.199 0 1 1-16.398 0 8.199 8.199 0 1 1 16.398 0z" fill="url(#b)" filter="url(#e)"/>
<path d="m133.31-207.91v55.137h-17.218c-6.602-0.97334-3.1317 2.1508-3.1317 2.1508l23.494 26.472 18.653 21.422c1.9951 2.9976 3.1147 2.8985 6.486 2.8985 3.5137 0.43957 4.2275-0.28033 6.4176-2.757l19.07-21.564 22.666-25.81c3.6888-3.9672-2.8847-2.8126-2.8847-2.8126h-18.954v-54.904c0.65539-9.337-1.0536-9.0538-8.6714-8.7929h-37.608c-7.6308-0.26075-8.3181 0.1211-8.3181 8.5607z" fill="url(#a)" stroke="#0a3b56" stroke-width="5.1532"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -1,8 +1,10 @@
{ {
"global-turbo": false, "button-type": "popup",
"manager-in-popup": false,
"concurrent": 4, "concurrent": 4,
"queue-notification": true, "queue-notification": true,
"finish-notification": true, "finish-notification": true,
"sounds": true,
"open-manager-on-queue": true, "open-manager-on-queue": true,
"text-links": true, "text-links": true,
"add-paused": false, "add-paused": false,
@ -13,6 +15,9 @@
"tooltip": true, "tooltip": true,
"show-urls": false, "show-urls": false,
"remove-missing-on-init": false, "remove-missing-on-init": false,
"retries": 5,
"retry-time": 10,
"theme": "default",
"limits": [ "limits": [
{ {
"domain": "*", "domain": "*",

View File

@ -11,7 +11,7 @@ import { getManager } from "./manager/man";
import { select } from "./select"; import { select } from "./select";
import { single } from "./single"; import { single } from "./single";
import { Notification } from "./notifications"; import { Notification } from "./notifications";
import { MASK, FASTFILTER } from "./recentlist"; import { MASK, FASTFILTER, SUBFOLDER } from "./recentlist";
import { openManager } from "./windowutils"; import { openManager } from "./windowutils";
import { _ } from "./i18n"; import { _ } from "./i18n";
@ -19,6 +19,7 @@ const MAX_BATCH = 10000;
export interface QueueOptions { export interface QueueOptions {
mask?: string; mask?: string;
subfolder?: string;
paused?: boolean; paused?: boolean;
} }
@ -28,8 +29,9 @@ export const API = new class APIImpl {
} }
async queue(items: BaseItem[], options: QueueOptions) { async queue(items: BaseItem[], options: QueueOptions) {
await MASK.init(); await Promise.all([MASK.init(), SUBFOLDER.init()]);
const {mask = MASK.current} = options; const {mask = MASK.current} = options;
const {subfolder = SUBFOLDER.current} = options;
const {paused = false} = options; const {paused = false} = options;
const defaults: any = { const defaults: any = {
@ -46,6 +48,7 @@ export const API = new class APIImpl {
private: false, private: false,
postData: null, postData: null,
mask, mask,
subfolder,
date: Date.now(), date: Date.now(),
paused paused
}; };
@ -117,6 +120,10 @@ export const API = new class APIImpl {
await FASTFILTER.init(); await FASTFILTER.init();
await FASTFILTER.push(options.fast); await FASTFILTER.push(options.fast);
} }
if (typeof options.subfolder === "string" && !options.subfolderOnce) {
await SUBFOLDER.init();
await SUBFOLDER.push(options.subfolder);
}
if (typeof options.type === "string") { if (typeof options.type === "string") {
await Prefs.set("last-type", options.type); await Prefs.set("last-type", options.type);
} }

View File

@ -22,6 +22,8 @@ import {
runtime, runtime,
history, history,
sessions, sessions,
// eslint-disable-next-line no-unused-vars
OnInstalled,
} from "./browser"; } from "./browser";
import { Bus } from "./bus"; import { Bus } from "./bus";
import { filterInSitu } from "./util"; import { filterInSitu } from "./util";
@ -135,36 +137,29 @@ class Handler {
} }
} }
function getMajor(version?: string) {
if (!version) {
return "";
}
const match = version.match(/^\d+\.\d+/);
if (!match) {
return "";
}
return match[0];
}
runtime.onInstalled.addListener(({reason, previousVersion}: OnInstalled) => {
const {version} = runtime.getManifest();
const major = getMajor(version);
const prevMajor = getMajor(previousVersion);
if (reason === "install" || (reason === "update" && major !== prevMajor)) {
tabs.create({
url: `https://about.downthemall.org/changelog/?cur=${major}&prev=${prevMajor}`,
});
}
});
locale.then(() => { locale.then(() => {
new class Action extends Handler {
constructor() {
super();
this.onClicked = this.onClicked.bind(this);
action.onClicked.addListener(this.onClicked);
}
async onClicked(tab: {id: number}) {
if (!tab.id) {
return;
}
try {
await this.processResults(
true,
await runContentJob(
tab, "/bundles/content-gather.js", {
type: "DTA:gather",
selectionOnly: false,
textLinks: await Prefs.get("text-links", true),
schemes: Array.from(ALLOWED_SCHEMES.values()),
transferable: TRANSFERABLE_PROPERTIES,
}));
}
catch (ex) {
console.error(ex);
}
}
}();
const menuHandler = new class Menus extends Handler { const menuHandler = new class Menus extends Handler {
constructor() { constructor() {
super(); super();
@ -421,7 +416,7 @@ locale.then(() => {
} }
} }
async enumulate(action: string) { async emulate(action: string) {
const tab = await tabs.query({ const tab = await tabs.query({
active: true, active: true,
currentWindow: true, currentWindow: true,
@ -543,34 +538,88 @@ locale.then(() => {
} }
}(); }();
Bus.on("do-regular", () => menuHandler.enumulate("DTARegular")); new class Action extends Handler {
Bus.on("do-regular-all", () => menuHandler.enumulate("DTARegularAll")); constructor() {
Bus.on("do-turbo", () => menuHandler.enumulate("DTATurbo")); super();
Bus.on("do-turbo-all", () => menuHandler.enumulate("DTATurboAll")); this.onClicked = this.onClicked.bind(this);
action.onClicked.addListener(this.onClicked);
Prefs.get("button-type", false).then(v => this.adjust(v));
Prefs.on("button-type", (prefs, key, value) => {
this.adjust(value);
});
}
adjust(type: string) {
action.setPopup({
popup: type !== "popup" ? "" : "/windows/popup.html"
});
let icons;
switch (type) {
case "popup":
icons = {
16: "/style/icon16.png",
32: "/style/icon32.png",
48: "/style/icon48.png",
64: "/style/icon64.png",
96: "/style/icon96.png",
128: "/style/icon128.png",
256: "/style/icon256.png"
};
break;
case "dta":
icons = {
16: "/style/button-regular.png",
32: "/style/button-regular@2x.png",
};
break;
case "turbo":
icons = {
16: "/style/button-turbo.png",
32: "/style/button-turbo@2x.png",
};
break;
case "manager":
icons = {
16: "/style/button-manager.png",
32: "/style/button-manager@2x.png",
};
break;
}
action.setIcon({path: icons});
}
async onClicked() {
switch (await Prefs.get("button-type")) {
case "popup":
break;
case "dta":
menuHandler.emulate("DTARegular");
break;
case "turbo":
menuHandler.emulate("DTATurbo");
break;
case "manager":
menuHandler.emulate("DTAManager");
break;
}
}
}();
Bus.on("do-regular", () => menuHandler.emulate("DTARegular"));
Bus.on("do-regular-all", () => menuHandler.emulate("DTARegularAll"));
Bus.on("do-turbo", () => menuHandler.emulate("DTATurbo"));
Bus.on("do-turbo-all", () => menuHandler.emulate("DTATurboAll"));
Bus.on("do-single", () => API.singleRegular(null)); Bus.on("do-single", () => API.singleRegular(null));
Bus.on("open-manager", () => openManager(true)); Bus.on("open-manager", () => openManager(true));
Bus.on("open-prefs", () => openPrefs()); Bus.on("open-prefs", () => openPrefs());
function adjustAction(globalTurbo: boolean) {
action.setPopup({
popup: globalTurbo ? "" : "/windows/popup.html"
});
action.setIcon({
path: globalTurbo ? {
16: "/style/button-turbo.png",
32: "/style/button-turbo@2x.png",
} : {
16: "/style/icon16.png",
32: "/style/icon32.png",
48: "/style/icon48.png",
64: "/style/icon64.png",
96: "/style/icon96.png",
128: "/style/icon128.png",
256: "/style/icon256.png"
}
});
}
(async function init() { (async function init() {
const urlBase = runtime.getURL(""); const urlBase = runtime.getURL("");
history.onVisited.addListener(({url}: {url: string}) => { history.onVisited.addListener(({url}: {url: string}) => {
@ -610,10 +659,6 @@ locale.then(() => {
} }
await Prefs.set("last-run", new Date()); await Prefs.set("last-run", new Date());
Prefs.get("global-turbo", false).then(v => adjustAction(v));
Prefs.on("global-turbo", (prefs, key, value) => {
adjustAction(value);
});
await filters(); await filters();
await getManager(); await getManager();
})().catch(ex => { })().catch(ex => {

View File

@ -73,7 +73,7 @@ class Numeral implements Generator {
this.digits = dir ? rawpieces[0].length : rawpieces[1].length; this.digits = dir ? rawpieces[0].length : rawpieces[1].length;
this.length = Math.floor( this.length = Math.floor(
(this.stop - this.start + (dir ? 1 : -1)) / this.step); (this.stop - this.start + (dir ? 1 : -1)) / this.step);
this.preview = this[Symbol.iterator]().next().value; this.preview = this[Symbol.iterator]().next().value as string;
Object.freeze(this); Object.freeze(this);
} }
@ -93,6 +93,60 @@ class Numeral implements Generator {
} }
} }
class Character implements Generator {
public readonly start: number;
public readonly stop: number;
public readonly step: number;
public readonly length: number;
public readonly preview: string;
constructor(str: string) {
const rawpieces = str.split(":").map(e => e.trim());
const pieces = rawpieces.map((e, i) => {
if (i === 2) {
return reallyParseInt(e);
}
if (e.length > 1) {
throw new Error("Malformed Character sequence");
}
return e.charCodeAt(0);
});
if (pieces.length < 2) {
throw new Error("Invalid input");
}
const [start, stop, step] = pieces;
if (step === 0) {
throw new Error("Invalid step");
}
this.step = !step ? 1 : step;
const dir = this.step > 0;
if (dir && start > stop) {
throw new Error("Invalid sequence");
}
else if (!dir && start < stop) {
throw new Error("Invalid sequence");
}
this.start = start;
this.stop = stop;
this.length = Math.floor(
(this.stop - this.start + (dir ? 1 : -1)) / this.step);
this.preview = this[Symbol.iterator]().next().value as string;
Object.freeze(this);
}
*[Symbol.iterator]() {
const {start, stop, step} = this;
const dir = step > 0;
for (let i = start; (dir ? i <= stop : i >= stop); i += step) {
yield String.fromCharCode(i);
}
}
}
export class BatchGenerator implements Generator { export class BatchGenerator implements Generator {
private readonly gens: Generator[]; private readonly gens: Generator[];
@ -120,9 +174,14 @@ export class BatchGenerator implements Generator {
try { try {
this.gens.push(new Numeral(tok)); this.gens.push(new Numeral(tok));
} }
catch (ex) { catch {
this.gens.push(new Literal(`[${tok}]`)); try {
this.hasInvalid = true; this.gens.push(new Character(tok));
}
catch {
this.gens.push(new Literal(`[${tok}]`));
this.hasInvalid = true;
}
} }
} }
if (str) { if (str) {

View File

@ -9,33 +9,33 @@ interface ExtensionListener {
} }
export interface MessageSender { export interface MessageSender {
tab?: Tab; readonly tab?: Tab;
frameId?: number; readonly frameId?: number;
id?: number; readonly id?: number;
url?: string; readonly url?: string;
tlsChannelId?: string; readonly tlsChannelId?: string;
} }
export interface Tab { export interface Tab {
id?: number; readonly id?: number;
incognito?: boolean; readonly incognito?: boolean;
} }
export interface MenuClickInfo { export interface MenuClickInfo {
menuItemId: string | number; readonly menuItemId: string | number;
button?: number; readonly button?: number;
linkUrl?: string; readonly linkUrl?: string;
srcUrl?: string; readonly srcUrl?: string;
} }
export interface RawPort { export interface RawPort {
error: any; readonly error: any;
name: string; readonly name: string;
onDisconnect: ExtensionListener; readonly sender?: MessageSender;
onMessage: ExtensionListener; readonly onDisconnect: ExtensionListener;
sender?: MessageSender; readonly onMessage: ExtensionListener;
disconnect: () => void; disconnect: () => void;
postMessage: (message: any) => void; postMessage: (message: any) => void;
} }
@ -57,7 +57,7 @@ type Header = {name: string; value: string};
export interface DownloadOptions { export interface DownloadOptions {
conflictAction: string; conflictAction: string;
filename: string; filename?: string;
saveAs: boolean; saveAs: boolean;
url: string; url: string;
method?: string; method?: string;
@ -81,15 +81,23 @@ interface Downloads {
search(query: DownloadsQuery): Promise<any[]>; search(query: DownloadsQuery): Promise<any[]>;
getFileIcon(id: number, options?: any): Promise<string>; getFileIcon(id: number, options?: any): Promise<string>;
setShelfEnabled(state: boolean): void; setShelfEnabled(state: boolean): void;
onCreated: ExtensionListener; removeFile(manId: number): Promise<void>;
onChanged: ExtensionListener; readonly onCreated: ExtensionListener;
onErased: ExtensionListener; readonly onChanged: ExtensionListener;
readonly onErased: ExtensionListener;
readonly onDeterminingFilename?: ExtensionListener;
} }
interface WebRequest { interface WebRequest {
onBeforeSendHeaders: WebRequestListener; readonly onBeforeSendHeaders: WebRequestListener;
onSendHeaders: WebRequestListener; readonly onSendHeaders: WebRequestListener;
onHeadersReceived: WebRequestListener; readonly onHeadersReceived: WebRequestListener;
}
export interface OnInstalled {
readonly reason: string;
readonly previousVersion?: string;
readonly temporary: boolean;
} }
export const {browserAction} = polyfill; export const {browserAction} = polyfill;
@ -106,5 +114,6 @@ export const {tabs} = polyfill;
export const {webNavigation} = polyfill; export const {webNavigation} = polyfill;
export const {webRequest}: {webRequest: WebRequest} = polyfill; export const {webRequest}: {webRequest: WebRequest} = polyfill;
export const {windows} = polyfill; export const {windows} = polyfill;
export const {theme} = polyfill;
export const CHROME = navigator.appVersion.includes("Chrome/"); export const CHROME = navigator.appVersion.includes("Chrome/");

View File

@ -8,32 +8,35 @@ import {runtime, tabs, RawPort, MessageSender} from "./browser";
export class Port extends EventEmitter { export class Port extends EventEmitter {
private port: RawPort | null; private port: RawPort | null;
private disconnected = false;
constructor(port: RawPort) { constructor(port: RawPort) {
super(); super();
this.port = port; this.port = port;
let disconnected = false;
const disconnect = () => {
if (disconnected) {
return;
}
disconnected = true;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
};
// Nasty firefox bug, thus listen for tab removal explicitly // Nasty firefox bug, thus listen for tab removal explicitly
if (port.sender && port.sender.tab && port.sender.tab.id) { if (port.sender && port.sender.tab && port.sender.tab.id) {
const otherTabId = port.sender.tab.id; const otherTabId = port.sender.tab.id;
const tabListener = function(tabId: number) { const tabListener = (tabId: number) => {
if (tabId !== otherTabId) { if (tabId !== otherTabId) {
return; return;
} }
disconnect(); this.disconnect();
}; };
tabs.onRemoved.addListener(tabListener); tabs.onRemoved.addListener(tabListener);
} }
port.onMessage.addListener(this.onMessage.bind(this)); port.onMessage.addListener(this.onMessage.bind(this));
port.onDisconnect.addListener(disconnect); port.onDisconnect.addListener(this.disconnect.bind(this));
}
disconnect() {
if (this.disconnected) {
return;
}
this.disconnected = true;
const {port} = this;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
} }
get name() { get name() {
@ -120,6 +123,9 @@ export const Bus = new class extends EventEmitter {
port.disconnect(); port.disconnect();
return; return;
} }
this.ports.emit(port.name, new Port(port)); const wrapped = new Port(port);
if (!this.ports.emit(port.name, wrapped)) {
wrapped.disconnect();
}
} }
}(); }();

View File

@ -2,6 +2,9 @@
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item"; import { BaseItem } from "./item";
// eslint-disable-next-line no-unused-vars
import { Download } from "./manager/download";
import { RUNNING, QUEUED, RETRYING } from "./manager/state";
// License: MIT // License: MIT
@ -69,7 +72,7 @@ export const DB = new class DB {
return await new Promise(this.getAllInternal); return await new Promise(this.getAllInternal);
} }
saveItemsInternal(items: any[], resolve: Function, reject: Function) { saveItemsInternal(items: Download[], resolve: Function, reject: Function) {
if (!items || !items.length || !this.db) { if (!items || !items.length || !this.db) {
resolve(); resolve();
return; return;
@ -83,9 +86,13 @@ export const DB = new class DB {
if (item.private) { if (item.private) {
continue; continue;
} }
const req = store.put(item.toJSON()); const json = item.toJSON();
if (item.state === RUNNING || item.state === RETRYING) {
json.state = QUEUED;
}
const req = store.put(json);
if (!("dbId" in item) || item.dbId < 0) { if (!("dbId" in item) || item.dbId < 0) {
req.onsuccess = () => item.dbId = req.result; req.onsuccess = () => item.dbId = req.result as number;
} }
} }
} }
@ -94,7 +101,7 @@ export const DB = new class DB {
} }
} }
async saveItems(items: any[]) { async saveItems(items: Download[]) {
await this.init(); await this.init();
return await new Promise(this.saveItemsInternal.bind(this, items)); return await new Promise(this.saveItemsInternal.bind(this, items));
} }

247
lib/imex.ts Normal file
View File

@ -0,0 +1,247 @@
"use strict";
// License: MIT
import { getTextLinks } from "./textlinks";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item";
import { ALLOWED_SCHEMES } from "./constants";
export const NS_METALINK_RFC5854 = "urn:ietf:params:xml:ns:metalink";
export const NS_DTA = "http://www.downthemall.net/properties#";
function parseNum(
file: Element,
attr: string,
defaultValue: number,
ns = NS_METALINK_RFC5854) {
const val = file.getAttributeNS(ns, attr);
if (!val) {
return defaultValue + 1;
}
const num = parseInt(val, 10);
if (isFinite(num)) {
return num;
}
return defaultValue + 1;
}
function importMeta4(data: string) {
const parser = new DOMParser();
const document = parser.parseFromString(data, "text/xml");
const {documentElement} = document;
const items: BaseItem[] = [];
let batch = 0;
for (const file of documentElement.querySelectorAll("file")) {
try {
const url = Array.from(file.querySelectorAll("url")).map(u => {
try {
const {textContent} = u;
if (!textContent) {
return null;
}
const url = new URL(textContent);
if (!ALLOWED_SCHEMES.has(url.protocol)) {
return null;
}
const prio = parseNum(u, "priority", 0);
return {
url,
prio
};
}
catch {
return null;
}
}).filter(u => !!u).reduce((p, c) => {
if (!c) {
return null;
}
if (!p || p.prio < c.prio) {
return c;
}
return p;
});
if (!url) {
continue;
}
batch = parseNum(file, "num", batch, NS_DTA);
const idx = parseNum(file, "idx", 0, NS_DTA);
const item: BaseItem = {
url: url.url.toString(),
usable: decodeURIComponent(url.url.toString()),
batch,
idx
};
const ref = file.getAttributeNS(NS_DTA, "referrer");
if (ref) {
item.referrer = ref;
item.usableReferrer = decodeURIComponent(ref);
}
const mask = file.getAttributeNS(NS_DTA, "mask");
if (mask) {
item.mask = mask;
}
items.push(item);
}
catch (ex) {
console.error("Failed to import file", ex);
}
}
return items;
}
function parseKV(current: BaseItem, line: string) {
const [k, v] = line.split("=", 2);
switch (k.toLocaleLowerCase().trim()) {
case "referer": {
const rurls = getTextLinks(v);
if (rurls && rurls.length) {
current.referrer = rurls.pop();
current.usableReferrer = decodeURIComponent(current.referrer || "");
}
break;
}
}
}
export function importText(data: string) {
if (data.includes(NS_METALINK_RFC5854)) {
return importMeta4(data);
}
const splitter = /(.+)\n|(.+)$/g;
const spacer = /^\s+/;
let match;
let current: BaseItem | undefined = undefined;
let idx = 0;
const items = [];
while ((match = splitter.exec(data)) !== null) {
try {
const line = match[0].trimRight();
if (!line) {
continue;
}
if (spacer.test(line)) {
if (!current) {
continue;
}
parseKV(current, line);
continue;
}
const urls = getTextLinks(line);
if (!urls || !urls.length) {
continue;
}
current = {
url: urls[0],
usable: decodeURIComponent(urls[0]),
idx: ++idx
};
items.push(current);
}
catch (ex) {
current = undefined;
console.error("Failed to import", ex);
}
}
return items;
}
export interface Exporter {
fileName: string;
getText(items: BaseItem[]): string;
}
class TextExporter {
readonly fileName: string;
constructor() {
this.fileName = "links.txt";
}
getText(items: BaseItem[]) {
const lines = [];
for (const item of items) {
lines.push(item.url);
}
return lines.join("\n");
}
}
class Aria2Exporter {
readonly fileName: string;
constructor() {
this.fileName = "links.aria2.txt";
}
getText(items: BaseItem[]) {
const lines = [];
for (const item of items) {
lines.push(item.url);
if (item.referrer) {
lines.push(` referer=${item.referrer}`);
}
}
return lines.join("\n");
}
}
class MetalinkExporter {
readonly fileName: string;
constructor() {
this.fileName = "links.meta4";
}
getText(items: BaseItem[]) {
const document = window.document.implementation.
createDocument(NS_METALINK_RFC5854, "metalink", null);
const root = document.documentElement;
root.setAttributeNS(NS_DTA, "generator", "DownThemAll!");
root.appendChild(document.createComment(
"metalink as exported by DownThemAll!",
));
for (const item of items) {
const aitem = item as any;
const f = document.createElementNS(NS_METALINK_RFC5854, "file");
f.setAttribute("name", aitem.currentName);
if (item.batch) {
f.setAttributeNS(NS_DTA, "num", item.batch.toString());
}
if (item.idx) {
f.setAttributeNS(NS_DTA, "idx", item.idx.toString());
}
if (item.referrer) {
f.setAttributeNS(NS_DTA, "referrer", item.referrer);
}
if (item.mask) {
f.setAttributeNS(NS_DTA, "mask", item.mask);
}
if (item.description) {
const n = document.createElementNS(NS_METALINK_RFC5854, "description");
n.textContent = item.description;
f.appendChild(n);
}
const u = document.createElementNS(NS_METALINK_RFC5854, "url");
u.textContent = item.url;
f.appendChild(u);
if (aitem.totalSize > 0) {
const s = document.createElementNS(NS_METALINK_RFC5854, "size");
s.textContent = aitem.totalSize.toString();
f.appendChild(s);
}
root.appendChild(f);
}
let xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
xml += root.outerHTML;
return xml;
}
}
export const textExporter = new TextExporter();
export const aria2Exporter = new Aria2Exporter();
export const metalinkExporter = new MetalinkExporter();

4
lib/ipreg.ts Normal file
View File

@ -0,0 +1,4 @@
"use strict";
// License: MIT
export const IPReg = /^(?:(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$|^(?:(?:(?:[0-9a-fA-F]{1,4}):){7}(?:(?:[0-9a-fA-F]{1,4})|:)|(?:(?:[0-9a-fA-F]{1,4}):){6}(?:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|:(?:[0-9a-fA-F]{1,4})|:)|(?:(?:[0-9a-fA-F]{1,4}):){5}(?::((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,2}|:)|(?:(?:[0-9a-fA-F]{1,4}):){4}(?:(:(?:[0-9a-fA-F]{1,4})){0,1}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,3}|:)|(?:(?:[0-9a-fA-F]{1,4}):){3}(?:(:(?:[0-9a-fA-F]{1,4})){0,2}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,4}|:)|(?:(?:[0-9a-fA-F]{1,4}):){2}(?:(:(?:[0-9a-fA-F]{1,4})){0,3}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,5}|:)|(?:(?:[0-9a-fA-F]{1,4}):){1}(?:(:(?:[0-9a-fA-F]{1,4})){0,4}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,6}|:)|(?::((?::(?:[0-9a-fA-F]{1,4})){0,5}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(?::(?:[0-9a-fA-F]{1,4})){1,7}|:)))(%[0-9a-zA-Z]{1,})?$/;

View File

@ -15,6 +15,7 @@ export interface BaseItem {
batch?: number; batch?: number;
idx: number; idx: number;
mask?: string; mask?: string;
subfolder?: string;
startDate?: number; startDate?: number;
private?: boolean; private?: boolean;
postData?: string; postData?: string;
@ -27,6 +28,7 @@ const OPTIONPROPS = Object.freeze([
"fileName", "fileName",
"batch", "idx", "batch", "idx",
"mask", "mask",
"subfolder",
"startDate", "startDate",
"private", "private",
"postData", "postData",

View File

@ -5,6 +5,8 @@
import { parsePath, URLd } from "../util"; import { parsePath, URLd } from "../util";
import { QUEUED, RUNNING, PAUSED } from "./state"; import { QUEUED, RUNNING, PAUSED } from "./state";
import Renamer from "./renamer"; import Renamer from "./renamer";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "../item";
const SAVEDPROPS = [ const SAVEDPROPS = [
"state", "state",
@ -14,6 +16,7 @@ const SAVEDPROPS = [
"usableReferrer", "usableReferrer",
"fileName", "fileName",
"mask", "mask",
"subfolder",
"date", "date",
// batches // batches
"batch", "batch",
@ -48,7 +51,9 @@ const DEFAULTS = {
written: 0, written: 0,
manId: 0, manId: 0,
mime: "", mime: "",
prerolled: false prerolled: false,
retries: 0,
deadline: 0
}; };
let sessionId = 0; let sessionId = 0;
@ -103,9 +108,13 @@ export class BaseDownload {
public mask: string; public mask: string;
public subfolder: string;
public prerolled: boolean; public prerolled: boolean;
constructor(options: any) { public retries: number;
constructor(options: BaseItem) {
Object.assign(this, DEFAULTS); Object.assign(this, DEFAULTS);
this.assign(options); this.assign(options);
if (this.state === RUNNING) { if (this.state === RUNNING) {
@ -113,14 +122,16 @@ export class BaseDownload {
} }
this.sessionId = ++sessionId; this.sessionId = ++sessionId;
this.renamer = new Renamer(this); this.renamer = new Renamer(this);
this.retries = 0;
} }
assign(options: any) { assign(options: BaseItem) {
// eslint-disable-next-line @typescript-eslint/no-this-alias // eslint-disable-next-line @typescript-eslint/no-this-alias
const self: any = this; const self: any = this;
const other: any = options;
for (const prop of SAVEDPROPS) { for (const prop of SAVEDPROPS) {
if (prop in options) { if (prop in options) {
self[prop] = options[prop]; self[prop] = other[prop];
} }
} }
this.uURL = new URL(this.url) as URLd; this.uURL = new URL(this.url) as URLd;
@ -182,6 +193,7 @@ export class BaseDownload {
rv.currentName = this.browserName || rv.destName || rv.finalName; rv.currentName = this.browserName || rv.destName || rv.finalName;
rv.error = this.error; rv.error = this.error;
rv.ext = this.renamer.p_ext; rv.ext = this.renamer.p_ext;
rv.retries = this.retries;
return rv; return rv;
} }
} }

View File

@ -3,7 +3,7 @@
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { CHROME, downloads, DownloadOptions } from "../browser"; import { CHROME, downloads, DownloadOptions } from "../browser";
import { Prefs } from "../prefs"; import { Prefs, PrefWatcher } from "../prefs";
import { PromiseSerializer } from "../pserializer"; import { PromiseSerializer } from "../pserializer";
import { filterInSitu, parsePath } from "../util"; import { filterInSitu, parsePath } from "../util";
import { BaseDownload } from "./basedownload"; import { BaseDownload } from "./basedownload";
@ -19,9 +19,24 @@ import {
PAUSABLE, PAUSABLE,
PAUSED, PAUSED,
QUEUED, QUEUED,
RUNNING RUNNING,
RETRYING
} from "./state"; } from "./state";
import { Preroller } from "./preroller"; // eslint-disable-next-line no-unused-vars
import { Preroller, PrerollResults } from "./preroller";
function isRecoverable(error: string) {
switch (error) {
case "SERVER_FAILED":
return true;
default:
return error.startsWith("NETWORK_");
}
}
const RETRIES = new PrefWatcher("retries", 5);
const RETRY_TIME = new PrefWatcher("retry-time", 5);
export class Download extends BaseDownload { export class Download extends BaseDownload {
public manager: Manager; public manager: Manager;
@ -34,6 +49,10 @@ export class Download extends BaseDownload {
public error: string; public error: string;
public dbId: number;
public deadline: number;
constructor(manager: Manager, options: any) { constructor(manager: Manager, options: any) {
super(options); super(options);
this.manager = manager; this.manager = manager;
@ -86,6 +105,7 @@ export class Download extends BaseDownload {
return; return;
} }
catch (ex) { catch (ex) {
console.error("cannot resume", ex);
this.manager.removeManId(this.manId); this.manager.removeManId(this.manId);
this.removeFromBrowser(); this.removeFromBrowser();
} }
@ -111,11 +131,13 @@ export class Download extends BaseDownload {
} }
const options: DownloadOptions = { const options: DownloadOptions = {
conflictAction: await Prefs.get("conflict-action"), conflictAction: await Prefs.get("conflict-action"),
filename: this.dest.full,
saveAs: false, saveAs: false,
url: this.url, url: this.url,
headers: [], headers: [],
}; };
if (!CHROME) {
options.filename = this.dest.full;
}
if (!CHROME && this.private) { if (!CHROME && this.private) {
options.incognito = true; options.incognito = true;
} }
@ -175,16 +197,7 @@ export class Download extends BaseDownload {
if (!res) { if (!res) {
return; return;
} }
if (res.mime) { this.adoptPrerollResults(res);
this.mime = res.mime;
}
if (res.name) {
this.serverName = res.name;
}
if (res.error) {
this.cancel();
this.error = res.error;
}
} }
catch (ex) { catch (ex) {
console.error("Failed to preroll", this, ex.toString(), ex.stack, ex); console.error("Failed to preroll", this, ex.toString(), ex.stack, ex);
@ -197,6 +210,18 @@ export class Download extends BaseDownload {
} }
} }
adoptPrerollResults(res: PrerollResults) {
if (res.mime) {
this.mime = res.mime;
}
if (res.name) {
this.serverName = res.name;
}
if (res.error) {
this.cancelAccordingToError(res.error);
}
}
resume(forced = false) { resume(forced = false) {
if (!(FORCABLE & this.state)) { if (!(FORCABLE & this.state)) {
return; return;
@ -209,20 +234,32 @@ export class Download extends BaseDownload {
} }
} }
async pause() { async pause(retry?: boolean) {
if (!(PAUSABLE & this.state)) { if (!(PAUSABLE & this.state)) {
return; return;
} }
if (!retry) {
this.retries = 0;
this.deadline = 0;
}
else {
// eslint-disable-next-line no-magic-numbers
this.deadline = Date.now() + RETRY_TIME.value * 60 * 1000;
}
if (this.state === RUNNING && this.manId) { if (this.state === RUNNING && this.manId) {
try { try {
await downloads.pause(this.manId); await downloads.pause(this.manId);
} }
catch (ex) { catch (ex) {
console.error("pause", ex.toString(), ex); console.error("pause", ex.toString(), ex);
this.cancel();
return; return;
} }
} }
this.changeState(PAUSED);
this.changeState(retry ? RETRYING : PAUSED);
} }
reset() { reset() {
@ -230,6 +267,8 @@ export class Download extends BaseDownload {
this.manId = 0; this.manId = 0;
this.written = this.totalSize = 0; this.written = this.totalSize = 0;
this.mime = this.serverName = this.browserName = ""; this.mime = this.serverName = this.browserName = "";
this.retries = 0;
this.deadline = 0;
} }
async removeFromBrowser() { async removeFromBrowser() {
@ -262,6 +301,17 @@ export class Download extends BaseDownload {
this.changeState(CANCELED); this.changeState(CANCELED);
} }
async cancelAccordingToError(error: string) {
if (!isRecoverable(error) || ++this.retries > RETRIES.value) {
this.cancel();
this.error = error;
return;
}
await this.pause(true);
this.error = error;
}
setMissing() { setMissing() {
if (this.manId) { if (this.manId) {
this.manager.removeManId(this.manId); this.manager.removeManId(this.manId);
@ -318,8 +368,7 @@ export class Download extends BaseDownload {
this.changeState(PAUSED); this.changeState(PAUSED);
} }
else if (error) { else if (error) {
this.cancel(); this.cancelAccordingToError(error);
this.error = error;
} }
else { else {
this.changeState(RUNNING); this.changeState(RUNNING);
@ -330,6 +379,9 @@ export class Download extends BaseDownload {
if (state.paused) { if (state.paused) {
this.changeState(PAUSED); this.changeState(PAUSED);
} }
else if (error) {
this.cancelAccordingToError(error);
}
else { else {
this.cancel(); this.cancel();
this.error = error || ""; this.error = error || "";
@ -346,4 +398,27 @@ export class Download extends BaseDownload {
this.setMissing(); this.setMissing();
} }
} }
updatefromSuggestion(state: any) {
const res: PrerollResults = {};
if (state.mime) {
res.mime = state.mime;
}
if (state.filename) {
res.name = state.filename;
}
if (state.finalUrl) {
res.finalURL = state.finalUrl;
const detected = Preroller.maybeFindNameFromSearchParams(this, res);
if (detected) {
res.name = detected;
}
}
try {
this.adoptPrerollResults(res);
}
finally {
this.markDirty();
}
}
} }

View File

@ -4,11 +4,11 @@
import { EventEmitter } from "../events"; import { EventEmitter } from "../events";
import { Notification } from "../notifications"; import { Notification } from "../notifications";
import { DB } from "../db"; import { DB } from "../db";
import { QUEUED, CANCELED, RUNNING } from "./state"; import { QUEUED, CANCELED, RUNNING, RETRYING } from "./state";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { Bus, Port } from "../bus"; import { Bus, Port } from "../bus";
import { sort } from "../sorting"; import { sort } from "../sorting";
import { Prefs } from "../prefs"; import { Prefs, PrefWatcher } from "../prefs";
import { _ } from "../i18n"; import { _ } from "../i18n";
import { CoalescedUpdate, mapFilterInSitu, filterInSitu } from "../util"; import { CoalescedUpdate, mapFilterInSitu, filterInSitu } from "../util";
import { PromiseSerializer } from "../pserializer"; import { PromiseSerializer } from "../pserializer";
@ -30,6 +30,9 @@ const setShelfEnabled = downloads.setShelfEnabled || function() {
// ignored // ignored
}; };
const FINISH_NOTIFICATION = new PrefWatcher("finish-notification", true);
const SOUNDS = new PrefWatcher("sounds", false);
export class Manager extends EventEmitter { export class Manager extends EventEmitter {
private items: Download[]; private items: Download[];
@ -49,10 +52,14 @@ export class Manager extends EventEmitter {
private readonly running: Set<Download>; private readonly running: Set<Download>;
private readonly retrying: Set<Download>;
private scheduler: Scheduler | null; private scheduler: Scheduler | null;
private shouldReload: boolean; private shouldReload: boolean;
private deadlineTimer: number;
constructor() { constructor() {
super(); super();
this.active = true; this.active = true;
@ -63,16 +70,22 @@ export class Manager extends EventEmitter {
AUTOSAVE_TIMEOUT, this.save.bind(this)); AUTOSAVE_TIMEOUT, this.save.bind(this));
this.dirty = new CoalescedUpdate( this.dirty = new CoalescedUpdate(
DIRTY_TIMEOUT, this.processDirty.bind(this)); DIRTY_TIMEOUT, this.processDirty.bind(this));
this.processDeadlines = this.processDeadlines.bind(this);
this.sids = new Map(); this.sids = new Map();
this.manIds = new Map(); this.manIds = new Map();
this.ports = new Set(); this.ports = new Set();
this.scheduler = null; this.scheduler = null;
this.running = new Set(); this.running = new Set();
this.retrying = new Set();
this.startNext = PromiseSerializer.wrapNew(1, this, this.startNext); this.startNext = PromiseSerializer.wrapNew(1, this, this.startNext);
downloads.onChanged.addListener(this.onChanged.bind(this)); downloads.onChanged.addListener(this.onChanged.bind(this));
downloads.onErased.addListener(this.onErased.bind(this)); downloads.onErased.addListener(this.onErased.bind(this));
if (CHROME && downloads.onDeterminingFilename) {
downloads.onDeterminingFilename.addListener(
this.onDeterminingFilename.bind(this));
}
Bus.onPort("manager", (port: Port) => { Bus.onPort("manager", (port: Port) => {
const mport = new ManagerPort(this, port); const mport = new ManagerPort(this, port);
@ -80,6 +93,7 @@ export class Manager extends EventEmitter {
this.ports.delete(mport); this.ports.delete(mport);
}); });
this.ports.add(mport); this.ports.add(mport);
return true;
}); });
Limits.on("changed", () => { Limits.on("changed", () => {
this.resetScheduler(); this.resetScheduler();
@ -148,6 +162,20 @@ export class Manager extends EventEmitter {
this.manIds.delete(downloadId); this.manIds.delete(downloadId);
} }
onDeterminingFilename(state: any, suggest: Function) {
const download = this.manIds.get(state.id);
if (!download) {
return;
}
try {
download.updatefromSuggestion(state);
}
finally {
const suggestion = {filename: download.dest.full};
suggest(suggestion);
}
}
async resetScheduler() { async resetScheduler() {
this.scheduler = null; this.scheduler = null;
await this.startNext(); await this.startNext();
@ -188,14 +216,11 @@ export class Manager extends EventEmitter {
this.notifiedFinished = false; this.notifiedFinished = false;
} }
async maybeRunFinishActions() { maybeRunFinishActions() {
if (this.running.size) {
return;
}
await this.maybeNotifyFinished();
if (this.running.size) { if (this.running.size) {
return; return;
} }
this.maybeNotifyFinished();
if (this.shouldReload) { if (this.shouldReload) {
this.saveQueue.trigger(); this.saveQueue.trigger();
setTimeout(() => { setTimeout(() => {
@ -208,15 +233,21 @@ export class Manager extends EventEmitter {
setShelfEnabled(true); setShelfEnabled(true);
} }
async maybeNotifyFinished() { maybeNotifyFinished() {
if (!(await Prefs.get("finish-notification"))) { if (this.notifiedFinished || this.running.size || this.retrying.size) {
return; return;
} }
if (this.notifiedFinished || this.running.size) { if (SOUNDS.value) {
return; const audio = new Audio(runtime.getURL("/style/done.opus"));
audio.addEventListener("canplaythrough", () => audio.play());
audio.addEventListener("ended", () => document.body.removeChild(audio));
audio.addEventListener("error", () => document.body.removeChild(audio));
document.body.appendChild(audio);
}
if (FINISH_NOTIFICATION.value) {
new Notification(null, _("queue-finished"));
} }
this.notifiedFinished = true; this.notifiedFinished = true;
new Notification(null, _("queue-finished"));
} }
addManId(id: number, download: Download) { addManId(id: number, download: Download) {
@ -315,6 +346,10 @@ export class Manager extends EventEmitter {
if (oldState === RUNNING) { if (oldState === RUNNING) {
this.running.delete(download); this.running.delete(download);
} }
else if (oldState === RETRYING) {
this.retrying.delete(download);
this.findDeadline();
}
if (newState === QUEUED) { if (newState === QUEUED) {
this.resetScheduler(); this.resetScheduler();
this.startNext().catch(console.error); this.startNext().catch(console.error);
@ -326,10 +361,56 @@ export class Manager extends EventEmitter {
this.running.add(download); this.running.add(download);
} }
else { else {
if (newState === RETRYING) {
this.addRetry(download);
}
this.startNext().catch(console.error); this.startNext().catch(console.error);
} }
} }
addRetry(download: Download) {
this.retrying.add(download);
this.findDeadline();
}
private findDeadline() {
let deadline = Array.from(this.retrying).
reduce<number>((deadline, item) => {
if (deadline) {
return item.deadline ? Math.min(deadline, item.deadline) : deadline;
}
return item.deadline;
}, 0);
if (deadline <= 0) {
return;
}
deadline -= Date.now();
if (deadline <= 0) {
return;
}
if (this.deadlineTimer) {
window.clearTimeout(this.deadlineTimer);
}
this.deadlineTimer = window.setTimeout(this.processDeadlines, deadline);
}
private processDeadlines() {
this.deadlineTimer = 0;
try {
const now = Date.now();
this.items.forEach(item => {
if (item.deadline && Math.abs(item.deadline - now) < 1000) {
this.retrying.delete(item);
item.resume(false);
}
});
}
finally {
this.findDeadline();
}
}
sorted(sids: number[]) { sorted(sids: number[]) {
try { try {
// Construct new items // Construct new items

View File

@ -54,6 +54,9 @@ export class Preroller {
} }
get shouldPreroll() { get shouldPreroll() {
if (CHROME) {
return false;
}
const {uURL, renamer} = this.download; const {uURL, renamer} = this.download;
const {pathname, search, host} = uURL; const {pathname, search, host} = uURL;
if (PREROLL_NOPE.has(host)) { if (PREROLL_NOPE.has(host)) {
@ -167,39 +170,15 @@ export class Preroller {
rv.mime = type.essence; rv.mime = type.essence;
} }
const {p_ext: ext} = this.download.renamer;
const dispHeader = headers.get("content-disposition"); const dispHeader = headers.get("content-disposition");
if (dispHeader) { if (dispHeader) {
const file = CDPARSER.parse(dispHeader); const file = CDPARSER.parse(dispHeader);
// Sanitize // Sanitize
rv.name = sanitizePath(file.replace(/[/\\]+/g, "-")); rv.name = sanitizePath(file.replace(/[/\\]+/g, "-"));
} }
else if (!ext || PREROLL_SEARCHEXTS.has(ext.toLocaleLowerCase())) { else {
const {searchParams} = this.download.uURL; const detected = Preroller.maybeFindNameFromSearchParams(
let detected = ""; this.download, rv);
for (const [, value] of searchParams) {
if (!NAME_TESTER.test(value)) {
continue;
}
const p = parsePath(value);
if (!p.base || !p.ext) {
continue;
}
if (!MimeDB.hasExtension(p.ext)) {
continue;
}
if (rv.mime) {
const mime = MimeDB.getMime(rv.mime);
if (mime && !mime.extensions.has(p.ext.toLowerCase())) {
continue;
}
}
const sanitized = sanitizePath(p.name);
if (sanitized.length <= detected.length) {
continue;
}
detected = sanitized;
}
if (detected) { if (detected) {
rv.name = detected; rv.name = detected;
} }
@ -231,4 +210,43 @@ export class Preroller {
return rv; return rv;
} }
static maybeFindNameFromSearchParams(
download: Download, res: PrerollResults) {
const {p_ext: ext} = download.renamer;
if (ext && !PREROLL_SEARCHEXTS.has(ext.toLocaleLowerCase())) {
return undefined;
}
return Preroller.findNameFromSearchParams(download.uURL, res.mime);
}
static findNameFromSearchParams(url: URL, mimetype?: string) {
const {searchParams} = url;
let detected = "";
for (const [, value] of searchParams) {
if (!NAME_TESTER.test(value)) {
continue;
}
const p = parsePath(value);
if (!p.base || !p.ext) {
continue;
}
if (!MimeDB.hasExtension(p.ext)) {
continue;
}
if (mimetype) {
const mime = MimeDB.getMime(mimetype);
if (mime && !mime.extensions.has(p.ext.toLowerCase())) {
continue;
}
}
const sanitized = sanitizePath(p.name);
if (sanitized.length <= detected.length) {
continue;
}
detected = sanitized;
}
return detected;
}
} }

View File

@ -193,24 +193,24 @@ export default class Renamer {
} }
toString() { toString() {
const {mask} = this.d; const {mask, subfolder} = this.d;
// eslint-disable-next-line @typescript-eslint/no-this-alias // eslint-disable-next-line @typescript-eslint/no-this-alias
const self: any = this; const self: any = this;
// XXX flat const baseMask = subfolder ? `${subfolder}/${mask}` : mask;
return sanitizePath(mask.replace(REPLACE_EXPR, function(type: string) { return sanitizePath(baseMask.replace(REPLACE_EXPR, function(type: string) {
let prop = type.substr(1, type.length - 2); let prop = type.substr(1, type.length - 2);
const flat = prop.startsWith("flat"); const flat = prop.startsWith("flat");
if (flat) { if (flat) {
prop = prop.substr(4); prop = prop.substr(4);
} }
prop = `p_${prop}`; prop = `p_${prop}`;
const rv = (prop in self) ? let rv = (prop in self) ?
(self[prop] || "").trim() : (self[prop] || "").trim() :
type; type;
if (flat) { if (flat) {
return rv.replace(/[/\\]+/g, "-"); rv = rv.replace(/[/\\]+/g, "-");
} }
return rv; return rv.replace(/\/{2,}/g, "/");
})); }));
} }
} }

View File

@ -8,8 +8,9 @@ export const PAUSED = 1 << 3;
export const DONE = 1 << 4; export const DONE = 1 << 4;
export const CANCELED = 1 << 5; export const CANCELED = 1 << 5;
export const MISSING = 1 << 6; export const MISSING = 1 << 6;
export const RETRYING = 1 << 7;
export const RESUMABLE = PAUSED | CANCELED; export const RESUMABLE = PAUSED | CANCELED | RETRYING;
export const FORCABLE = PAUSED | QUEUED | CANCELED; export const FORCABLE = PAUSED | QUEUED | CANCELED | RETRYING;
export const PAUSABLE = QUEUED | CANCELED | RUNNING; export const PAUSABLE = QUEUED | CANCELED | RUNNING | RETRYING;
export const CANCELABLE = QUEUED | RUNNING | PAUSED | DONE | MISSING; export const CANCELABLE = QUEUED | RUNNING | PAUSED | DONE | MISSING | RETRYING;

View File

@ -116,3 +116,9 @@ export const FASTFILTER = new RecentList("fastfilter", [
"*.z??, *.css, *.html" "*.z??, *.css, *.html"
]); ]);
FASTFILTER.init().catch(console.error); FASTFILTER.init().catch(console.error);
export const SUBFOLDER = new RecentList("subfolder", [
"",
"downthemall",
]);
SUBFOLDER.init().catch(console.error);

View File

@ -28,7 +28,7 @@ function computeSelection(
items: BaseMatchedItem[], items: BaseMatchedItem[],
onlyFast: boolean): ItemDelta[] { onlyFast: boolean): ItemDelta[] {
let ws = items.map((item, idx: number) => { let ws = items.map((item, idx: number) => {
item.idx = idx; item.idx = item.idx || idx;
const {matched = null} = item; const {matched = null} = item;
item.prevMatched = matched; item.prevMatched = matched;
item.matched = null; item.matched = null;
@ -101,7 +101,10 @@ export async function select(links: BaseItem[], media: BaseItem[]) {
tracker.track(window.id, null); tracker.track(window.id, null);
try { try {
const port = await Promise.race<Port>([ const port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("select", resolve)), new Promise<Port>(resolve => Bus.oncePort("select", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]); timeout<Port>(5 * 1000)]);
if (!port.isSelf) { if (!port.isSelf) {
throw Error("Invalid sender connected"); throw Error("Invalid sender connected");

View File

@ -24,7 +24,10 @@ export async function single(item: BaseItem | null) {
tracker.track(window.id, null); tracker.track(window.id, null);
try { try {
const port: Port = await Promise.race<Port>([ const port: Port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("single", resolve)), new Promise<Port>(resolve => Bus.oncePort("single", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]); timeout<Port>(5 * 1000)]);
if (!port.isSelf) { if (!port.isSelf) {
throw Error("Invalid sender connected"); throw Error("Invalid sender connected");

View File

@ -3,6 +3,7 @@
import * as psl from "psl"; import * as psl from "psl";
import { identity, memoize } from "./memoize"; import { identity, memoize } from "./memoize";
import { IPReg } from "./ipreg";
export { debounce } from "../uikit/lib/util"; export { debounce } from "../uikit/lib/util";
export class Promised { export class Promised {
@ -237,7 +238,10 @@ export interface URLd extends URL {
Object.defineProperty(URL.prototype, "domain", { Object.defineProperty(URL.prototype, "domain", {
get() { get() {
try { try {
return hostToDomain(this.host) || this.host; const {hostname} = this;
return IPReg.test(hostname) ?
hostname :
hostToDomain(hostname) || hostname;
} }
catch (ex) { catch (ex) {
console.error(ex); console.error(ex);
@ -357,3 +361,20 @@ export function mapFilterInSitu<TRes, T>(
export function randint(min: number, max: number) { export function randint(min: number, max: number) {
return Math.floor(Math.random() * (max - min)) + min; return Math.floor(Math.random() * (max - min)) + min;
} }
export function validateSubFolder(folder: string) {
if (!folder) {
return;
}
folder = folder.replace(/[/\\]+/g, "/");
if (folder.startsWith("/")) {
throw new Error("error.noabsolutepath");
}
if (/^[a-z]:\//i.test(folder)) {
throw new Error("error.noabsolutepath");
}
if (/^\.+\/|\/\.+\/|\/\.+$/g.test(folder)) {
throw new Error("error.nodotsinpath");
}
}

View File

@ -2,10 +2,15 @@
// License: MIT // License: MIT
import { windows, tabs, runtime } from "../lib/browser"; import { windows, tabs, runtime } from "../lib/browser";
import {getManager} from "./manager/man"; import { getManager } from "./manager/man";
import DEFAULT_ICONS from "../data/icons.json"; import DEFAULT_ICONS from "../data/icons.json";
import { Prefs } from "./prefs";
import { _ } from "./i18n";
const DONATE_URL = "https://www.downthemall.org/howto/donate/"; const DONATE_URL = "https://www.downthemall.org/howto/donate/";
const DONATE_LANG_URLS = Object.freeze(new Map([
["de", "https://www.downthemall.org/howto/donate/spenden/"],
]));
const MANAGER_URL = "/windows/manager.html"; const MANAGER_URL = "/windows/manager.html";
export async function mostRecentBrowser(incognito: boolean): Promise<any> { export async function mostRecentBrowser(incognito: boolean): Promise<any> {
@ -79,7 +84,8 @@ export async function maybeOpenInTab(url: string, incognito: boolean) {
} }
export async function donate() { export async function donate() {
await openInTab(DONATE_URL, false); const url = DONATE_LANG_URLS.get(_("language_code")) || DONATE_URL;
await openInTab(url, false);
} }
export async function openPrefs() { export async function openPrefs() {
@ -93,11 +99,33 @@ export async function openManager(focus = true) {
catch (ex) { catch (ex) {
console.error(ex.toString(), ex); console.error(ex.toString(), ex);
} }
const url = runtime.getURL(MANAGER_URL);
const openInPopup = await Prefs.get("manager-in-popup");
if (openInPopup) {
const etabs = await tabs.query({
url
});
if (etabs.length) {
if (!focus) {
return;
}
const tab = etabs.pop();
await tabs.update(tab.id, {active: true});
await windows.update(tab.windowId, {focused: true});
return;
}
const windowOptions = {
url,
type: "popup",
};
await windows.create(windowOptions);
return;
}
if (focus) { if (focus) {
await openInTabOrFocus(await runtime.getURL(MANAGER_URL), false); await openInTabOrFocus(runtime.getURL(MANAGER_URL), false);
} }
else { else {
await maybeOpenInTab(await runtime.getURL(MANAGER_URL), false); await maybeOpenInTab(runtime.getURL(MANAGER_URL), false);
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "DownThemAll!", "name": "DownThemAll!",
"version": "4.0.12", "version": "4.2.1",
"description": "__MSG_extensionDescription__", "description": "__MSG_extensionDescription__",
"homepage_url": "https://downthemall.org/", "homepage_url": "https://downthemall.org/",
@ -33,6 +33,7 @@
"sessions", "sessions",
"storage", "storage",
"tabs", "tabs",
"theme",
"webNavigation", "webNavigation",
"webRequest", "webRequest",
"webRequestBlocking" "webRequestBlocking"

View File

@ -18,24 +18,24 @@
"author": "Nils Maier", "author": "Nils Maier",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/node": "^12.7.2", "@types/node": "^12.7.8",
"@typescript-eslint/eslint-plugin": "^2.0.0", "@typescript-eslint/eslint-plugin": "^2.3.2",
"@typescript-eslint/parser": "^2.0.0", "@typescript-eslint/parser": "^2.3.2",
"chai": "^4.1.2", "chai": "^4.1.2",
"eslint": "^6.2.2", "eslint": "^6.5.1",
"mocha": "^6.2.0", "mocha": "^6.2.1",
"ts-loader": "^6.0.4", "ts-loader": "^6.2.0",
"ts-node": "^8.3.0", "ts-node": "^8.4.1",
"typescript": "^3.5.3", "typescript": "^3.6.3",
"webpack": "^4.39.3", "webpack": "^4.41.0",
"webpack-cli": "^3.3.7", "webpack-cli": "^3.3.9",
"xregexp": "^4.2.4" "xregexp": "^4.2.4"
}, },
"dependencies": { "dependencies": {
"@types/psl": "^1.1.0", "@types/psl": "^1.1.0",
"@types/whatwg-mimetype": "^2.1.0", "@types/whatwg-mimetype": "^2.1.0",
"psl": "^1.3.0", "psl": "^1.4.0",
"webextension-polyfill": "^0.4.0", "webextension-polyfill": "^0.5.0",
"whatwg-mimetype": "^2.3.0" "whatwg-mimetype": "^2.3.0"
} }
} }

View File

@ -121,30 +121,43 @@ class Gatherer {
*collectImageInternal(img: HTMLImageElement) { *collectImageInternal(img: HTMLImageElement) {
try { try {
const src = img.currentSrc || img.src; {
const item = this.makeItem(src, img); const {src} = img;
if (item) { const item = this.makeItem(src, img);
item.fileName = "";
item.description = item.title;
yield item;
}
const {srcset} = img;
if (!srcset) {
return;
}
const imgs = srcset.split(",").flatMap(e => {
const idx = e.lastIndexOf(" ");
return (idx > 0 ? e.slice(0, idx) : e).trim();
});
for (const i of imgs) {
const item = this.makeItem(i, img);
if (item) { if (item) {
item.fileName = ""; item.fileName = "";
item.description = item.title; item.description = item.title;
yield item; yield item;
} }
} }
{
const {currentSrc} = img;
const item = this.makeItem(currentSrc, img);
if (item) {
item.fileName = "";
item.description = item.title;
yield item;
}
}
{
const {srcset} = img;
if (!srcset) {
return;
}
const imgs = srcset.split(",").flatMap(e => {
const idx = e.lastIndexOf(" ");
return (idx > 0 ? e.slice(0, idx) : e).trim();
});
for (const i of imgs) {
const item = this.makeItem(i, img);
if (item) {
item.fileName = "";
item.description = item.title;
yield item;
}
}
}
} }
catch (ex) { catch (ex) {
console.error("oops image", ex.toString(), ex.stack, ex); console.error("oops image", ex.toString(), ex.stack, ex);

BIN
sounds/done.wav Normal file

Binary file not shown.

BIN
sounds/error.wav Normal file

Binary file not shown.

View File

@ -2,14 +2,29 @@
/* License: gpl-v2 */ /* License: gpl-v2 */
:root { :root {
--general-color: #2a2a2e;
--general-bgcolor: rgb(249, 249, 250);
--general-border-color: lightgray;
--general-input-color: black;
--general-input-bgcolor: white;
--general-button-color: black;
--general-button-bgcolor: rgb(246, 246, 246);
--general-button-bgcolor-hover: white;
--general-button-shadow: 0px 0px 5px 1px rgba(128, 128, 128, 0.5);
--menu-bgcolor: white;
--menu-bgcolor-hover: #2283fb;
--table-bgcolor: white;
--table-head-bgcolor: white;
--toolbar-bg-color: rgb(248, 134, 6); --toolbar-bg-color: rgb(248, 134, 6);
--toolbar-active-border-color: #478de7; --toolbar-active-border-color: #478de7;
--toolbar-hover-border-color: red; --toolbar-hover-border-color: red;
--toolbar-hover-background: rgb(247, 149, 37); --toolbar-hover-background: rgb(247, 149, 37);
--toolbar-border-width: 2px; --toolbar-border-width: 2px;
--toolbar-border: 1px solid rgba(255, 255, 255, 0.5);
--add-color: navy; --add-color: navy;
--queue-color: gray; --queue-color: gray;
--pause-color: #ffa318; --pause-color: #ffa318;
--retry-color: rgb(0, 112, 204);
--error-color: rgb(160, 13, 42); --error-color: rgb(160, 13, 42);
--running-color: #aae061; --running-color: #aae061;
--finishing-color: #57cc12; --finishing-color: #57cc12;
@ -19,24 +34,76 @@
--maskbutton-color: rgb(236, 185, 16); --maskbutton-color: rgb(236, 185, 16);
--missing-color: rgb(0, 82, 204); --missing-color: rgb(0, 82, 204);
--open-color: rgba(236, 185, 16, 0.8); --open-color: rgba(236, 185, 16, 0.8);
--status-icon-color: #363636;
--status-icon-color-hover: #6e6d6d;
--tile-url: url(tile.png);
--file-icon-image-color: rgb(17, 107, 163);
--popup-bgcolor: #fff;
--popup-color: #0c0c0d;
--modal-color: black;
--modal-bgcolor: white;
}
html.dark {
--add-color: lightblue;
--general-bgcolor: #2a2a2e;
--general-border-color: rgb(85, 85, 85);
--general-button-bgcolor-hover: black;
--general-button-bgcolor: rgb(36, 36, 36);
--general-button-color: white;
--general-color: rgb(249, 249, 250);
--menu-bgcolor: black;
--menu-bgcolor-hover: #1a6bce;
--table-bgcolor: #1a1a1e;
--table-head-bgcolor: #3a3a3e;
--toolbar-bg-color: rgb(202, 108, 0);
--status-icon-color: #b9b9b9;
--status-icon-color-hover: #e2e2e2;
--tile-url: url(tile-dark.png?3);
--toolbar-border: 1px solid rgba(30, 30, 30, 0.5);
--file-icon-image-color: rgb(21, 130, 197);
--popup-bgcolor: #4a4a4f;
--popup-color: rgb(249, 249, 250);
--general-button-shadow: 0px 0px 7px 1px rgba(128, 128, 128, 0.8);
--modal-color: white;
--modal-bgcolor: #333;
scrollbar-color: rgba(249, 249, 250, 0.4) rgba(20, 20, 25, 0.3);
}
html.dark a {
color: lightblue;
}
html.dark ::-webkit-scrollbar {
background: rgba(20, 20, 25, 0.3);
}
html.dark ::-webkit-scrollbar-thumb {
background: rgba(249, 249, 250, 0.4);
}
html.dark ::-webkit-scrollbar-corner {
background: #000;
} }
html[data-platform="mac"] { html[data-platform="mac"] {
--folder-color: rgb(4, 102, 214); --folder-color: rgb(4, 102, 214);
} }
html, body { html,
body {
font-size: 10pt !important; font-size: 10pt !important;
} }
@font-face { @font-face {
font-family: 'downthemall'; font-family: "downthemall";
src: url('downthemall.woff2?75791791') format('woff2'); src: url("downthemall.woff2?75791791") format("woff2");
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
[class^="icon-"]:before, [class*=" icon-"]:before { [class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: "downthemall"; font-family: "downthemall";
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
@ -53,70 +120,187 @@ html, body {
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-add:before { content: '\e800'; } /* '' */ .icon-add:before {
.icon-addsegment:before { content: '\e801'; } /* '' */ content: "\e800";
.icon-bottom:before { content: '\e802'; } /* '' */ } /* '' */
.icon-picture:before { content: '\e803'; } /* '' */ .icon-addsegment:before {
.icon-circle:before { content: '\e804'; } /* '' */ content: "\e801";
.icon-delete:before { content: '\e805'; } /* '' */ } /* '' */
.icon-done:before { content: '\e806'; } /* '' */ .icon-bottom:before {
.icon-down:before { content: '\e807'; } /* '' */ content: "\e802";
.icon-download:before { content: '\e808'; } /* '' */ } /* '' */
.icon-dupe:before { content: '\e809'; } /* '' */ .icon-picture:before {
.icon-error:before { content: '\e80a'; } /* '' */ content: "\e803";
.icon-failed:before { content: '\e80b'; } /* '' */ } /* '' */
.icon-file:before { content: '\e80c'; } /* '' */ .icon-circle:before {
.icon-find:before { content: '\e80d'; } /* '' */ content: "\e804";
.icon-folder:before { content: '\e80e'; } /* '' */ } /* '' */
.icon-force:before { content: '\e80f'; } /* '' */ .icon-delete:before {
.icon-go:before { content: '\e810'; } /* '' */ content: "\e805";
.icon-import:before { content: '\e811'; } /* '' */ } /* '' */
.icon-info:before { content: '\e812'; } /* '' */ .icon-done:before {
.icon-launch:before { content: '\e813'; } /* '' */ content: "\e806";
.icon-missing:before { content: '\e814'; } /* '' */ } /* '' */
.icon-network-off:before { content: '\e815'; } /* '' */ .icon-down:before {
.icon-network-on:before { content: '\e816'; } /* '' */ content: "\e807";
.icon-pause:before { content: '\e817'; } /* '' */ } /* '' */
.icon-remsegment:before { content: '\e818'; } /* '' */ .icon-download:before {
.icon-rename:before { content: '\e819'; } /* '' */ content: "\e808";
.icon-save:before { content: '\e81a'; } /* '' */ } /* '' */
.icon-settings:before { content: '\e81b'; } /* '' */ .icon-dupe:before {
.icon-top:before { content: '\e81c'; } /* '' */ content: "\e809";
.icon-unchecked:before { content: '\e81d'; } /* '' */ } /* '' */
.icon-unlimited:before { content: '\e81e'; } /* '' */ .icon-error:before {
.icon-link:before { content: '\e81f'; } /* '' */ content: "\e80a";
.icon-up:before { content: '\e820'; } /* '' */ } /* '' */
.icon-privacy:before { content: '\e821'; } /* '' */ .icon-failed:before {
.icon-tags:before { content: '\e822'; } /* '' */ content: "\e80b";
.icon-attention:before { content: '\e823'; } /* '' */ } /* '' */
.icon-notification:before { content: '\e824'; } /* '' */ .icon-file:before {
.icon-file-video:before { content: '\e825'; } /* '' */ content: "\e80c";
.icon-file-generic:before { content: '\e826'; } /* '' */ } /* '' */
.icon-question-dark:before { content: '\e827'; } /* '' */ .icon-find:before {
.icon-filter:before { content: '\f0b0'; } /* '' */ content: "\e80d";
.icon-donate:before { content: '\f0d6'; } /* '' */ } /* '' */
.icon-file-doc:before { content: '\f0f6'; } /* '' */ .icon-folder:before {
.icon-interface:before { content: '\f108'; } /* '' */ content: "\e80e";
.icon-folder-1:before { content: '\f115'; } /* '' */ } /* '' */
.icon-sort-asc:before { content: '\f15d'; } /* '' */ .icon-force:before {
.icon-sort-desc:before { content: '\f15e'; } /* '' */ content: "\e80f";
.icon-file-pdf:before { content: '\f1c1'; } /* '' */ } /* '' */
.icon-file-word:before { content: '\f1c2'; } /* '' */ .icon-go:before {
.icon-file-image:before { content: '\f1c5'; } /* '' */ content: "\e810";
.icon-file-archive:before { content: '\f1c6'; } /* '' */ } /* '' */
.icon-file-audio:before { content: '\f1c7'; } /* '' */ .icon-import:before {
.icon-toggle:before { content: '\f205'; } /* '' */ content: "\e811";
.icon-server:before { content: '\f233'; } /* '' */ } /* '' */
.icon-question-light:before { content: '\f29c'; } /* '' */ .icon-info:before {
content: "\e812";
} /* '' */
.icon-launch:before {
content: "\e813";
} /* '' */
.icon-missing:before {
content: "\e814";
} /* '' */
.icon-network-off:before {
content: "\e815";
} /* '' */
.icon-network-on:before {
content: "\e816";
} /* '' */
.icon-pause:before {
content: "\e817";
} /* '' */
.icon-remsegment:before {
content: "\e818";
} /* '' */
.icon-rename:before {
content: "\e819";
} /* '' */
.icon-save:before {
content: "\e81a";
} /* '' */
.icon-settings:before {
content: "\e81b";
} /* '' */
.icon-top:before {
content: "\e81c";
} /* '' */
.icon-unchecked:before {
content: "\e81d";
} /* '' */
.icon-unlimited:before {
content: "\e81e";
} /* '' */
.icon-link:before {
content: "\e81f";
} /* '' */
.icon-up:before {
content: "\e820";
} /* '' */
.icon-privacy:before {
content: "\e821";
} /* '' */
.icon-tags:before {
content: "\e822";
} /* '' */
.icon-attention:before {
content: "\e823";
} /* '' */
.icon-notification:before {
content: "\e824";
} /* '' */
.icon-file-video:before {
content: "\e825";
} /* '' */
.icon-file-generic:before {
content: "\e826";
} /* '' */
.icon-question-dark:before {
content: "\e827";
} /* '' */
.icon-forward:before {
content: "\e828";
} /* '' */
.icon-filter:before {
content: "\f0b0";
} /* '' */
.icon-donate:before {
content: "\f0d6";
} /* '' */
.icon-file-doc:before {
content: "\f0f6";
} /* '' */
.icon-interface:before {
content: "\f108";
} /* '' */
.icon-folder-1:before {
content: "\f115";
} /* '' */
.icon-sort-asc:before {
content: "\f15d";
} /* '' */
.icon-sort-desc:before {
content: "\f15e";
} /* '' */
.icon-file-pdf:before {
content: "\f1c1";
} /* '' */
.icon-file-word:before {
content: "\f1c2";
} /* '' */
.icon-file-image:before {
content: "\f1c5";
} /* '' */
.icon-file-archive:before {
content: "\f1c6";
} /* '' */
.icon-file-audio:before {
content: "\f1c7";
} /* '' */
.icon-toggle-off:before {
content: "\f204";
} /* '' */
.icon-toggle-on:before {
content: "\f205";
} /* '' */
.icon-server:before {
content: "\f233";
} /* '' */
.icon-question-light:before {
content: "\f29c";
} /* '' */
@media (min-resolution: 144dpi) { @media (min-resolution: 144dpi) {
[class^="icon-file-"]:before, [class*=" icon-file-"]:before { [class^="icon-file-"]:before,
[class*=" icon-file-"]:before {
font-weight: bold !important; font-weight: bold !important;
} }
} }
.icon-file-image { .icon-file-image {
color: rgb(17, 107, 163); color: var(--file-icon-image-color);
} }
.icon-file-pdf, .icon-file-pdf,
@ -137,18 +321,29 @@ html, body {
color: rgb(202, 81, 198); color: rgb(202, 81, 198);
} }
body, html { body,
background: #F6F6F8; html {
color: #0C0C0D;
font: message-box; font: message-box;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Ubuntu",
"Helvetica Neue", sans-serif;
height: 100%; height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 100%; width: 100%;
color: var(--general-color);
background: var(--general-bgcolor);
} }
h1, h2, h3, h4 { html#popup,
html#popup > body {
color: var(--popup-color);
background: var(--popup-bgcolor);
}
h1,
h2,
h3,
h4 {
font: caption; font: caption;
font-weight: bold; font-weight: bold;
} }
@ -188,7 +383,11 @@ section {
} }
.virtualtable-column:active { .virtualtable-column:active {
background-image: linear-gradient(to top, rgba(0,0,0,0.03), rgba(128,128,128,0.1)); background-image: linear-gradient(
to top,
rgba(0, 0, 0, 0.03),
rgba(128, 128, 128, 0.1)
);
} }
th.virtualtable { th.virtualtable {
@ -215,8 +414,12 @@ td.virtualtable {
font-size: 12px; font-size: 12px;
align-items: stretch; align-items: stretch;
justify-items: center; justify-items: center;
background: linear-gradient(to bottom, rgba(128,128,128,0.1) 0%,rgba(0,0,0,0) 100%); background: linear-gradient(
border-top: 1px solid rgba(128,128,128,0.6); to bottom,
rgba(128, 128, 128, 0.1) 0%,
rgba(0, 0, 0, 0) 100%
);
border-top: 1px solid rgba(128, 128, 128, 0.6);
display: flex; display: flex;
margin-bottom: 1ex; margin-bottom: 1ex;
overflow: auto; overflow: auto;
@ -243,15 +446,15 @@ td.virtualtable {
flex-grow: 3; flex-grow: 3;
margin-right: 2ex; margin-right: 2ex;
padding-right: 1ex; padding-right: 1ex;
border-right: 1px dotted rgba(128,128,128,0.6); border-right: 1px dotted rgba(128, 128, 128, 0.6);
} }
#statusPrefs { #statusPrefs {
cursor: pointer; cursor: pointer;
color: #363636; color: var(--status-icon-color);
} }
#statusPrefs:hover { #statusPrefs:hover {
color: #6e6d6d; color: var(--status-icon-color-hover);
} }
.dropdown { .dropdown {
@ -269,13 +472,14 @@ td.virtualtable {
outline: none; outline: none;
position: absolute; position: absolute;
top: 0; top: 0;
width:100%; width: 100%;
} }
.dropdown input { .dropdown input {
-moz-appearance: none; -moz-appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
appearance: none; appearance: none;
color: black;
background: white; background: white;
border: none; border: none;
bottom: 2px; bottom: 2px;
@ -298,7 +502,6 @@ td.virtualtable {
padding-bottom: 1ex; padding-bottom: 1ex;
} }
@supports (not (-moz-appearance: none)) { @supports (not (-moz-appearance: none)) {
.dropdown select { .dropdown select {
background: white; background: white;
@ -368,3 +571,49 @@ td.virtualtable {
#maskButton { #maskButton {
color: var(--maskbutton-color); color: var(--maskbutton-color);
} }
table.virtualtable,
.virtualtable-body {
color: var(--general-color);
background: var(--table-bgcolor);
}
.virtualtable-head,
.virtualtable-head > table {
background: var(--table-head-bgcolor) !important;
}
.virtualtable-column {
border-right: 1px solid var(--general-border-color);
}
.virtualtable-cell {
border-right: 1px dotted var(--general-border-color);
}
.virtualtable-head,
.virtualtable-body {
border-bottom: 1px solid var(--general-border-color);
}
ul.context-menu,
ul.context-menu ul {
color: var(--general-color);
background: var(--menu-bgcolor);
}
.context-menu-item:hover:not(.context-menu-seperator),
.context-menu-item:hover:not(.context-menu-seperator) > * {
background: var(--menu-bgcolor-hover);
}
input {
color: var(--general-input-color);
background: var(--general-input-bgcolor);
border: inherit;
padding: 2px;
}
.modal-dialog {
color: var(--modal-color);
background: var(--modal-bgcolor);
}

BIN
style/done.opus Normal file

Binary file not shown.

BIN
style/downthemall.woff2 Normal file → Executable file

Binary file not shown.

BIN
style/error.opus Normal file

Binary file not shown.

View File

@ -16,7 +16,7 @@ body > * {
#toolbar { #toolbar {
display: flex; display: flex;
margin: 0; margin: 0;
background: var(--toolbar-bg-color) url(tile.png) repeat-x; background: var(--toolbar-bg-color) var(--tile-url) repeat-x;
} }
#toolbar .spacer { #toolbar .spacer {
@ -42,9 +42,9 @@ body > * {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
box-shadow: 0px 0px 5px 1px rgba(128,128,128,0.5); box-shadow: var(--general-button-shadow);
background: rgb(246,246,246); background: var(--general-button-bgcolor);
color: black; color: var(--general-button-color);
transition: box-shadow 0.5s, background 1s; transition: box-shadow 0.5s, background 1s;
font-size: 24px; font-size: 24px;
line-height: 24px; line-height: 24px;
@ -60,7 +60,7 @@ body > * {
} }
#toolbar > .button:hover:not(.disabled) { #toolbar > .button:hover:not(.disabled) {
background: white; background: var(--general-button-bgcolor-hover);
box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75); box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75);
} }
@ -88,14 +88,14 @@ body > * {
flex: 1 1 auto; flex: 1 1 auto;
overflow: hidden; overflow: hidden;
display: grid; display: grid;
background: white; background: var(--general-bgcolor);
} }
#loading { #loading {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
background: rgba(255,255,255,0.9); background: var(--general-button-bgcolor);
font-weight: bolder; font-weight: bolder;
font-size: 200%; font-size: 200%;
z-index: 10; z-index: 10;
@ -202,6 +202,23 @@ body > * {
); );
} }
.retrying .virtualtable-column-2 .virtualtable-icon {
color: var(--retry-color);
}
.retrying .virtualtable-column-2 .virtualtable-progress-bar {
background: var(--retry-color);
}
.retrying .virtualtable-column-2 .virtualtable-progress-undetermined {
background: repeating-linear-gradient(
45deg,
var(--retry-color),
var(--retry-color) 6px,
transparent 6px,
transparent 12px
);
}
.missing .virtualtable-column-2 .virtualtable-icon, .missing .virtualtable-column-2 .virtualtable-icon,
.canceled .virtualtable-column-2 .virtualtable-icon { .canceled .virtualtable-column-2 .virtualtable-icon {
color: var(--error-color); color: var(--error-color);
@ -294,7 +311,7 @@ body > * {
color: crimson; color: crimson;
} }
#statusNetwork.icon-network-on { #statusNetwork.icon-network-on {
color: navy; color: var(--add-color);
} }
#statusFilter { #statusFilter {
@ -327,6 +344,7 @@ body > * {
height: 16px; height: 16px;
-moz-appearance: none; -moz-appearance: none;
border: 0; border: 0;
outline: 0;
background: transparent; background: transparent;
width: calc(100% - 28px); width: calc(100% - 28px);
} }
@ -386,7 +404,7 @@ body > * {
font-size: 10pt !important; font-size: 10pt !important;
} }
#nagging { #nagging {
border-top: 1px solid lightgray; border-top: 1px solid var(--general-border-color);
display: grid; display: grid;
grid-template-columns: 1fr auto auto auto; grid-template-columns: 1fr auto auto auto;
align-content: center; align-content: center;
@ -512,3 +530,23 @@ body > * {
width: 100%; width: 100%;
background: var(--done-color); background: var(--done-color);
} }
#tooltip-eta.single {
font-weight: bold;
grid-column-end: span 2;
}
.deletefiles-list {
padding-left: 1ex;
padding-right: 1.5ex;
border: 1px solid lightgray;
border-radius: 6px;
background-color: rgba(128,128,128,0.1);
max-height: 8em;
overflow-y: auto;
}
.deletefiles-list > li {
list-style-type: none;
padding: 0;
margin: 0;
}

View File

@ -1,8 +1,8 @@
/* License: gpl-v2 */ /* License: gpl-v2 */
@import 'common.css'; @import "common.css";
html, body { html,
background: transparent !important; body {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
@ -19,9 +19,10 @@ article {
#tabs { #tabs {
display: flex; display: flex;
background: url(icon64.png) 1em 50%/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon64.png) 1em 50%/32px 32px no-repeat,
var(--tile-url) repeat-x, var(--toolbar-bg-color);
padding-left: calc(2em + 32px); padding-left: calc(2em + 32px);
color: white; color: var(--general-bgcolor);
} }
input.tab { input.tab {
@ -54,9 +55,10 @@ input.tab {
#tabsel-general:checked ~ #tabs #tabel-general, #tabsel-general:checked ~ #tabs #tabel-general,
#tabsel-filters:checked ~ #tabs #tabel-filters, #tabsel-filters:checked ~ #tabs #tabel-filters,
#tabsel-network:checked ~ #tabs #tabel-network { #tabsel-network:checked ~ #tabs #tabel-network {
color: black !important; color: var(--general-color) !important;
background: white; background: var(--general-bgcolor);
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color); border-top: var(--toolbar-border-width) solid
var(--toolbar-active-border-color);
} }
#tabs > label { #tabs > label {
@ -64,13 +66,14 @@ input.tab {
border-top: var(--toolbar-border-width) solid transparent; border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid transparent; border-left: 1px solid transparent;
border-right: 1px solid transparent; border-right: 1px solid transparent;
border-left: 1px solid rgba(255, 255, 255, 0.5); border-left: var(--toolbar-border);
border-right: 1px solid rgba(255, 255, 255, 0.5); border-right: var(--toolbar-border);
background: var(--toolbar-bg-color); background: var(--toolbar-bg-color);
} }
#tabs > label:hover:not(:checked) { #tabs > label:hover:not(:checked) {
border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color); border-top: var(--toolbar-border-width) solid
var(--toolbar-hover-border-color);
background: var(--toolbar-hover-background); background: var(--toolbar-hover-background);
} }
@ -102,7 +105,7 @@ input.tab {
text-align: center; text-align: center;
} }
.buttons > button{ .buttons > button {
margin: 0 2em; margin: 0 2em;
} }
@ -113,15 +116,27 @@ input.tab {
fieldset { fieldset {
display: flex; display: flex;
margin-bottom: 1em; margin-bottom: 1em;
border: 1px solid lightgray; border: 1px solid var(--general-border-color);
border-radius: 6px; border-radius: 6px;
box-shadow: 1px 1px 6px lightgray; box-shadow: 1px 1px 6px var(--general-border-color);
background: rgba(128, 128, 128, 0.05); background: rgba(128, 128, 128, 0.05);
flex-direction: column; flex-direction: column;
max-width: 60em; max-width: 60em;
padding: 1.2em; padding: 1.2em;
} }
.optiongroups,
fieldset > label {
display: flex;
align-items: center;
}
fieldset > label > input,
fieldset > label > select {
margin-left: 1ex;
margin-right: 1ex;
}
legend { legend {
font-weight: bold; font-weight: bold;
font-size: 120%; font-size: 120%;
@ -134,8 +149,36 @@ legend {
} }
.virtualtable-container { .virtualtable-container {
border: 1px solid lightgray; border: 1px solid var(--general-border-color);
border-radius: 6px; border-radius: 6px;
background: rgba(128, 128, 128, 0.05); background: rgba(128, 128, 128, 0.05);
box-shadow: 1px 1px 6px lightgray; box-shadow: 1px 1px 6px var(--general-border-color);
}
#network-general {
display: grid;
grid-template-columns: auto 1fr;
grid-column-gap: 1em;
grid-row-gap: 1ex;
}
.optiongroups {
display: grid;
grid-template-columns: auto 1fr;
grid-column-gap: 1em;
grid-row-gap: 1ex;
}
.optiongroups > div,
.optiongroups > div > label {
display: flex;
align-items: center;
}
.optiongroups input {
margin-left: 1em;
margin-right: 0.7ex;
}
hr {
width: 100%;
} }

View File

@ -107,7 +107,7 @@ body > * {
padding: 0; padding: 0;
padding-left: calc(2em + 32px); padding-left: calc(2em + 32px);
color: black; color: black;
background: url(icon32.png) 1em 0/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon32.png) 1em 0/32px 32px no-repeat, var(--tile-url) repeat-x, var(--toolbar-bg-color);
font: caption; font: caption;
font-size: 150%; font-size: 150%;
font-weight: bold; font-weight: bold;
@ -117,7 +117,7 @@ body > * {
} }
@media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 124.8dpi) { @media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 124.8dpi) {
#tabs { #tabs {
background: url(icon64.png) 1em 50%/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon64.png) 1em 50%/32px 32px no-repeat, var(--tile-url) repeat-x, var(--toolbar-bg-color);
} }
} }
@ -145,27 +145,27 @@ body > * {
-webkit-user-select: none; -webkit-user-select: none;
user-select: none; user-select: none;
background: var(--toolbar-bg-color); background: var(--toolbar-bg-color);
color: white; color: var(--general-color);
min-width: 10em; min-width: 10em;
padding: 1ex; padding: 1ex;
padding-left: 1em; padding-left: 1em;
cursor: pointer; cursor: pointer;
border: 0; border: 0;
border-top: var(--toolbar-border-width) solid transparent; border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid rgba(255,255,255,0.3); border-left: var(--toolbar-border);
border-right: 1px solid rgba(255,255,255,0.3); border-right: var(--toolbar-border);
transition: border 1s; transition: border 1s;
} }
.tab:not(.active):not(.disabled):hover { .tab:not(.active):not(.disabled):hover {
border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color); border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color);
color: rgb(255, 226, 167); color: var(--general-color);
background: var(--toolbar-hover-background); background: var(--toolbar-hover-background);
} }
.tab.active { .tab.active {
color: black; color: var(--general-color);
background: white; background: var(--table-head-bgcolor);
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color); border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color);
border-left: 1px solid transparent; border-left: 1px solid transparent;
border-right: 1px solid transparent; border-right: 1px solid transparent;

View File

@ -63,6 +63,7 @@ p.example {
align-items: center; align-items: center;
} }
#options > #subfolderOptions,
#options > #maskOptions { #options > #maskOptions {
display: grid; display: grid;
grid-template-columns: 2fr auto auto; grid-template-columns: 2fr auto auto;

BIN
style/tile-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

10
tests/.editorconfig Normal file
View File

@ -0,0 +1,10 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
tab_width = 2
trim_trailing_whitespace = true

View File

@ -113,4 +113,29 @@ describe("BatchGenerator", function() {
expect(items[0]).to.equal(gen.preview); expect(items[0]).to.equal(gen.preview);
expect(gen.hasInvalid).to.be.true; expect(gen.hasInvalid).to.be.true;
}); });
it("characters", function() {
const gen = new BatchGenerator("abc[a:c].lol[1].b");
const items = Array.from(gen);
expect(items).to.deep.equal([
"abca.lol[1].b",
"abcb.lol[1].b",
"abcc.lol[1].b",
]);
expect(items.length).to.equal(gen.length);
expect(items[0]).to.equal(gen.preview);
});
it("characters two", function() {
const gen = new BatchGenerator("abc[D:G].lol[1].b");
const items = Array.from(gen);
expect(items).to.deep.equal([
"abcD.lol[1].b",
"abcE.lol[1].b",
"abcF.lol[1].b",
"abcG.lol[1].b",
]);
expect(items.length).to.equal(gen.length);
expect(items[0]).to.equal(gen.preview);
});
}); });

43
tests/test_urld.js Normal file
View File

@ -0,0 +1,43 @@
/* eslint-env node */
/* eslint-disable @typescript-eslint/no-var-requires */
"use strict";
// License: CC0 1.0
require("../lib/util");
describe("URLd", function() {
it("basic domain", function() {
let u = new URL("https://www.google.de");
expect(u.domain).to.equal("google.de");
u = new URL("https://www.google.de:8443");
expect(u.domain).to.equal("google.de");
});
it("plain basic domain", function() {
const u = new URL("https://google.de");
expect(u.domain).to.equal("google.de");
});
it("special domain", function() {
let u = new URL("https://www.google.co.uk");
expect(u.domain).to.equal("google.co.uk");
u = new URL("https://google.co.uk");
expect(u.domain).to.equal("google.co.uk");
u = new URL("https://www.google.co.uk:8443");
expect(u.domain).to.equal("google.co.uk");
});
it("ipv4", function() {
let u = new URL("https://127.0.0.1:8443");
expect(u.domain).to.equal("127.0.0.1");
u = new URL("https://0.0.0.0:8443");
expect(u.domain).to.equal("0.0.0.0");
});
it("ipv6", function() {
let u = new URL("https://[::1]:8443");
expect(u.domain).to.equal("[::1]");
u = new URL("https://[2a00:1450:4005:800::2003]:8443");
expect(u.domain).to.equal("[2a00:1450:4005:800::2003]");
});
});

View File

@ -27,7 +27,7 @@ LICENSED = set((".css", ".html", ".js", "*.ts"))
IGNORED = set((".DS_Store", "Thumbs.db")) IGNORED = set((".DS_Store", "Thumbs.db"))
PERM_IGNORED_FX = set(("downloads.shelf", "webRequest", "webRequestBlocking")) PERM_IGNORED_FX = set(("downloads.shelf", "webRequest", "webRequestBlocking"))
PERM_IGNORED_CHROME = set(("menus", "sessions")) PERM_IGNORED_CHROME = set(("menus", "sessions", "theme"))
SCRIPTS = [ SCRIPTS = [
"yarn build:regexps", "yarn build:regexps",

View File

@ -22,6 +22,9 @@ export class Dropdown extends EventEmitter {
this.container = document.createElement("div"); this.container = document.createElement("div");
this.container.classList.add("dropdown"); this.container.classList.add("dropdown");
if (input.id) {
this.container.id = `${input.id}-dropdown`;
}
input = input.parentElement.replaceChild(this.container, input); input = input.parentElement.replaceChild(this.container, input);
this.input = input as HTMLInputElement; this.input = input as HTMLInputElement;

View File

@ -75,6 +75,7 @@
<ul id="table-context" class="table-context"> <ul id="table-context" class="table-context">
<li id="ctx-open-file" data-key="Enter" data-i18n="open-file" data-icon="icon-file">Open File</li> <li id="ctx-open-file" data-key="Enter" data-i18n="open-file" data-icon="icon-file">Open File</li>
<li id="ctx-open-directory" data-key="ACCEL-Enter" data-i18n="open-directory" data-icon="icon-folder">Open Directory</li> <li id="ctx-open-directory" data-key="ACCEL-Enter" data-i18n="open-directory" data-icon="icon-folder">Open Directory</li>
<li id="ctx-delete-files" data-key="ACCEL-Delete" data-i18n="deletefiles" data-icon="icon-delete"></li>
<li>-</li> <li>-</li>
<li id="ctx-resume" data-key="ACCEL-KeyR" data-i18n="resume-download" data-icon="icon-go">Resume</li> <li id="ctx-resume" data-key="ACCEL-KeyR" data-i18n="resume-download" data-icon="icon-go">Resume</li>
<li id="ctx-pause" data-key="ACCEL-KeyP" data-i18n="pause-download" data-icon="icon-pause">Pause</li> <li id="ctx-pause" data-key="ACCEL-KeyP" data-i18n="pause-download" data-icon="icon-pause">Pause</li>
@ -109,6 +110,15 @@
<li id="ctx-select-all" data-key="ACCEL-KeyA" data-i18n="select-all">Select All</li> <li id="ctx-select-all" data-key="ACCEL-KeyA" data-i18n="select-all">Select All</li>
<li id="ctx-select-invert" data-key="ACCEL-KeyI" data-i18n="invert-selection">Invert Selection</li> <li id="ctx-select-invert" data-key="ACCEL-KeyI" data-i18n="invert-selection">Invert Selection</li>
<li>-</li> <li>-</li>
<li id="ctx-import" data-icon="icon-import" data-i18n="import"></li>
<li id="ctx-export" data-icon="icon-download" data-i18n="export">
<ul class="table-context">
<li id="ctx-export-text" data-i18n="export-text"></li>
<li id="ctx-export-aria2" data-i18n="export-aria2"></li>
<li id="ctx-export-metalink" data-i18n="export-metalink"></li>
</ul>
</li>
<li>-</li>
<li id="ctx-move-top" data-key="ALT-Home" data-i18n="move-top" data-icon="icon-top">Top</li> <li id="ctx-move-top" data-key="ALT-Home" data-i18n="move-top" data-icon="icon-top">Top</li>
<li id="ctx-move-up" data-key="ALT-PageUp" data-i18n="move-up" data-icon="icon-up">Up</li> <li id="ctx-move-up" data-key="ALT-PageUp" data-i18n="move-up" data-icon="icon-up">Up</li>
<li id="ctx-move-down" data-key="ALT-PageDown" data-i18n="move-down" data-icon="icon-down">down</li> <li id="ctx-move-down" data-key="ALT-PageDown" data-i18n="move-down" data-icon="icon-down">down</li>
@ -125,6 +135,12 @@
</p> </p>
</template> </template>
<template id="deletefiles-template">
<h1 class="deletefiles-title" data-i18n="deletefiles_title"></h1>
<p class="deletefiles-text" data-i18n="deletefiles_text"></p>
<ul class="deletefiles-list"></ul>
</template>
<template id="menufilter-template"> <template id="menufilter-template">
<ul> <ul>
<li id="ctx-menufilter-seperator">-</li> <li id="ctx-menufilter-seperator">-</li>

View File

@ -8,6 +8,8 @@ import PORT from "./manager/port";
import { runtime } from "../lib/browser"; import { runtime } from "../lib/browser";
import { Promised } from "../lib/util"; import { Promised } from "../lib/util";
import { PromiseSerializer } from "../lib/pserializer"; import { PromiseSerializer } from "../lib/pserializer";
import { Keys } from "./keys";
import "./theme";
const $ = document.querySelector.bind(document); const $ = document.querySelector.bind(document);
@ -120,6 +122,11 @@ addEventListener("DOMContentLoaded", function dom() {
statusNetwork.setAttribute("title", _("statusNetwork-inactive.title")); statusNetwork.setAttribute("title", _("statusNetwork-inactive.title"));
} }
}); });
Keys.on("ACCEL-KeyF", () => {
$("#filter").focus();
return true;
});
}); });
addEventListener("contextmenu", event => { addEventListener("contextmenu", event => {

View File

@ -7,7 +7,7 @@ import { Prefs } from "../../lib/prefs";
import { Keys } from "../keys"; import { Keys } from "../keys";
import { $ } from "../winutil"; import { $ } from "../winutil";
export default class RemovalModalDialog extends ModalDialog { export class RemovalModalDialog extends ModalDialog {
private readonly text: string; private readonly text: string;
private readonly pref: string; private readonly pref: string;
@ -68,3 +68,57 @@ export default class RemovalModalDialog extends ModalDialog {
this.focusDefault(); this.focusDefault();
} }
} }
export class DeleteFilesDialog extends ModalDialog {
private readonly paths: string[];
constructor(paths: string[]) {
super();
this.paths = paths;
}
async getContent() {
const content = $<HTMLTemplateElement>("#deletefiles-template").
content.cloneNode(true) as DocumentFragment;
await localize(content);
const list = $(".deletefiles-list", content);
for (const path of this.paths) {
const li = document.createElement("li");
li.textContent = path;
list.appendChild(li);
}
return content;
}
get buttons() {
return [
{
title: _("deletefiles_button"),
value: "ok",
default: true,
dismiss: false,
},
{
title: _("cancel"),
value: "cancel",
default: false,
dismiss: true,
}
];
}
async show() {
Keys.suppressed = true;
try {
return await super.show();
}
finally {
Keys.suppressed = false;
}
}
shown() {
this.focusDefault();
}
}

View File

@ -10,6 +10,7 @@ export const StateTexts = locale.then(() => Object.freeze(new Map([
[DownloadState.QUEUED, _("queued")], [DownloadState.QUEUED, _("queued")],
[DownloadState.RUNNING, _("running")], [DownloadState.RUNNING, _("running")],
[DownloadState.FINISHING, _("finishing")], [DownloadState.FINISHING, _("finishing")],
[DownloadState.RETRYING, _("paused")],
[DownloadState.PAUSED, _("paused")], [DownloadState.PAUSED, _("paused")],
[DownloadState.DONE, _("done")], [DownloadState.DONE, _("done")],
[DownloadState.CANCELED, _("canceled")], [DownloadState.CANCELED, _("canceled")],
@ -21,6 +22,7 @@ export const StateClasses = Object.freeze(new Map([
[DownloadState.RUNNING, "running"], [DownloadState.RUNNING, "running"],
[DownloadState.FINISHING, "finishing"], [DownloadState.FINISHING, "finishing"],
[DownloadState.PAUSED, "paused"], [DownloadState.PAUSED, "paused"],
[DownloadState.RETRYING, "retrying"],
[DownloadState.DONE, "done"], [DownloadState.DONE, "done"],
[DownloadState.CANCELED, "canceled"], [DownloadState.CANCELED, "canceled"],
[DownloadState.MISSING, "missing"], [DownloadState.MISSING, "missing"],
@ -31,6 +33,7 @@ export const StateIcons = Object.freeze(new Map([
[DownloadState.RUNNING, "icon-go"], [DownloadState.RUNNING, "icon-go"],
[DownloadState.FINISHING, "icon-go"], [DownloadState.FINISHING, "icon-go"],
[DownloadState.PAUSED, "icon-pause"], [DownloadState.PAUSED, "icon-pause"],
[DownloadState.RETRYING, "icon-pause"],
[DownloadState.DONE, "icon-done"], [DownloadState.DONE, "icon-done"],
[DownloadState.CANCELED, "icon-error"], [DownloadState.CANCELED, "icon-error"],
[DownloadState.MISSING, "icon-failed"], [DownloadState.MISSING, "icon-failed"],

View File

@ -26,7 +26,7 @@ import {
MenuFilter MenuFilter
} from "./itemfilters"; } from "./itemfilters";
import { FilteredCollection } from "./itemfilters"; import { FilteredCollection } from "./itemfilters";
import RemovalModalDialog from "./removaldlg"; import { RemovalModalDialog, DeleteFilesDialog } from "./removaldlg";
import { Stats } from "./stats"; import { Stats } from "./stats";
import PORT from "./port"; import PORT from "./port";
import { DownloadState, StateTexts, StateClasses, StateIcons } from "./state"; import { DownloadState, StateTexts, StateClasses, StateIcons } from "./state";
@ -38,6 +38,10 @@ import { $ } from "../winutil";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { TableConfig } from "../../uikit/lib/config"; import { TableConfig } from "../../uikit/lib/config";
import { IconCache } from "../../lib/iconcache"; import { IconCache } from "../../lib/iconcache";
import * as imex from "../../lib/imex";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "../../lib/item";
import { API } from "../../lib/api";
const TREE_CONFIG_VERSION = 2; const TREE_CONFIG_VERSION = 2;
const RUNNING_TIMEOUT = 1000; const RUNNING_TIMEOUT = 1000;
@ -146,6 +150,8 @@ export class DownloadItem extends EventEmitter {
public opening: boolean; public opening: boolean;
public retries: number;
constructor(owner: DownloadTable, raw: any, stats?: Stats) { constructor(owner: DownloadTable, raw: any, stats?: Stats) {
super(); super();
Object.assign(this, raw); Object.assign(this, raw);
@ -247,6 +253,12 @@ export class DownloadItem extends EventEmitter {
if (this.state === DownloadState.RUNNING) { if (this.state === DownloadState.RUNNING) {
return this.eta; return this.eta;
} }
if (this.state === DownloadState.RETRYING) {
if (this.error) {
return _("retrying_error", _(this.error) || this.error);
}
return _("retrying");
}
if (this.error) { if (this.error) {
return _(this.error) || this.error; return _(this.error) || this.error;
} }
@ -404,6 +416,8 @@ export class DownloadTable extends VirtualTable {
private readonly openDirectoryAction: Broadcaster; private readonly openDirectoryAction: Broadcaster;
private readonly deleteFilesAction: Broadcaster;
private readonly moveTopAction: Broadcaster; private readonly moveTopAction: Broadcaster;
private readonly moveUpAction: Broadcaster; private readonly moveUpAction: Broadcaster;
@ -546,6 +560,12 @@ export class DownloadTable extends VirtualTable {
ctx.on("ctx-remove-paused", () => this.removePausedDownloads()); ctx.on("ctx-remove-paused", () => this.removePausedDownloads());
ctx.on("ctx-remove-batch", () => this.removeBatchDownloads()); ctx.on("ctx-remove-batch", () => this.removeBatchDownloads());
ctx.on("ctx-import", () => this.importDownloads());
ctx.on("ctx-export-text", () => this.exportDownloads(imex.textExporter));
ctx.on("ctx-export-aria2", () => this.exportDownloads(imex.aria2Exporter));
ctx.on("ctx-export-metalink",
() => this.exportDownloads(imex.metalinkExporter));
ctx.on("dismissed", () => this.table.focus()); ctx.on("dismissed", () => this.table.focus());
this.on("contextmenu", (tree, event) => { this.on("contextmenu", (tree, event) => {
@ -579,6 +599,9 @@ export class DownloadTable extends VirtualTable {
this.openDirectoryAction = new Broadcaster("ctx-open-directory"); this.openDirectoryAction = new Broadcaster("ctx-open-directory");
this.openDirectoryAction.onaction = this.openDirectory.bind(this); this.openDirectoryAction.onaction = this.openDirectory.bind(this);
this.deleteFilesAction = new Broadcaster("ctx-delete-files");
this.deleteFilesAction.onaction = this.deleteFiles.bind(this);
const moveAction = (method: string) => { const moveAction = (method: string) => {
if (this.selection.empty) { if (this.selection.empty) {
return; return;
@ -610,6 +633,7 @@ export class DownloadTable extends VirtualTable {
this.moveBottomAction, this.moveBottomAction,
this.openFileAction, this.openFileAction,
this.openDirectoryAction, this.openDirectoryAction,
this.deleteFilesAction,
]); ]);
this.on( this.on(
@ -782,6 +806,10 @@ export class DownloadTable extends VirtualTable {
this.cancelAction.disabled = true; this.cancelAction.disabled = true;
} }
if (!(states & DownloadState.DONE)) {
this.deleteFilesAction.disabled = true;
}
const item = this.focusRow >= 0 ? const item = this.focusRow >= 0 ?
this.downloads.filtered[this.focusRow] : this.downloads.filtered[this.focusRow] :
null; null;
@ -860,6 +888,33 @@ export class DownloadTable extends VirtualTable {
} }
} }
async deleteFiles() {
const items = [];
for (const rowid of this.selection) {
const item = this.downloads.filtered[rowid];
if (item.state === DownloadState.DONE && item.manId) {
items.push(item);
}
}
if (!items.length) {
return;
}
const sids = items.map(i => i.sessionId);
const paths = items.map(i => i.destFull);
await new DeleteFilesDialog(paths).show();
await Promise.all(items.map(async item => {
try {
if (item.manId && item.state === DownloadState.DONE) {
await downloads.removeFile(item.manId);
}
}
catch {
// ignored
}
}));
this.removeDownloadsInternal(sids);
}
removeDownloadsInternal(sids?: number[]) { removeDownloadsInternal(sids?: number[]) {
if (!sids) { if (!sids) {
sids = []; sids = [];
@ -1132,6 +1187,49 @@ export class DownloadTable extends VirtualTable {
this.selection.toggle(0, this.rowCount - 1); this.selection.toggle(0, this.rowCount - 1);
} }
importDownloads() {
const picker = document.createElement("input");
picker.setAttribute("type", "file");
picker.setAttribute("accept", "text/*,.txt,.lst,.metalink,.meta4");
picker.onchange = () => {
if (!picker.files || !picker.files.length) {
return;
}
const reader = new FileReader();
reader.onload = () => {
if (!reader.result) {
return;
}
const items = imex.importText(reader.result as string);
if (!items || !items.length) {
return;
}
API.regular(items, []);
};
reader.readAsText(picker.files[0], "utf-8");
};
picker.click();
}
exportDownloads(exporter: imex.Exporter) {
const items = this.getSelectedItems();
if (!items.length) {
return;
}
const text = exporter.getText(items as unknown as BaseItem[]);
const enc = new TextEncoder();
const data = enc.encode(text);
const url = URL.createObjectURL(new Blob([data], {type: "text/plain"}));
const link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute("download", exporter.fileName);
link.style.display = "none";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
getRowClasses(rowid: number) { getRowClasses(rowid: number) {
const item = this.downloads.filtered[rowid]; const item = this.downloads.filtered[rowid];
if (!item) { if (!item) {

View File

@ -192,7 +192,7 @@ export class Tooltip {
const hidden = this.speedbox.classList.contains("hidden"); const hidden = this.speedbox.classList.contains("hidden");
if (!running && !hidden) { if (!running && !hidden) {
this.eta.style.fontWeight = "bold"; this.eta.classList.add("single");
this.etalabel.classList.add("hidden"); this.etalabel.classList.add("hidden");
this.speedbox.classList.add("hidden"); this.speedbox.classList.add("hidden");
this.progressbar.classList.add("hidden"); this.progressbar.classList.add("hidden");
@ -202,7 +202,7 @@ export class Tooltip {
return; return;
} }
if (hidden) { if (hidden) {
this.eta.style.fontWeight = "auto"; this.eta.classList.remove("single");
this.etalabel.classList.remove("hidden"); this.etalabel.classList.remove("hidden");
this.speedbox.classList.remove("hidden"); this.speedbox.classList.remove("hidden");
this.progressbar.classList.remove("hidden"); this.progressbar.classList.remove("hidden");

View File

@ -1,4 +1,6 @@
<!doctype html> <!doctype html>
<html id="popup">
<head> <head>
<!-- License: GPL-v2 --> <!-- License: GPL-v2 -->
<meta charset="utf-8"> <meta charset="utf-8">
@ -11,6 +13,8 @@
height: auto !important; height: auto !important;
-webkit-user-select: none; -webkit-user-select: none;
user-select: none; user-select: none;
margin: 0;
padding: 0;
} }
ul { ul {
@ -106,3 +110,5 @@
</li> </li>
</ul> </ul>
</body> </body>
</html>

View File

@ -2,6 +2,7 @@
// License: MIT // License: MIT
import { localize } from "../lib/i18n"; import { localize } from "../lib/i18n";
import "./theme";
declare let browser: any; declare let browser: any;
declare let chrome: any; declare let chrome: any;

View File

@ -43,8 +43,25 @@
<article id="tab-general" class="tab"> <article id="tab-general" class="tab">
<fieldset> <fieldset>
<legend data-i18n="pref.ui">UI</legend> <legend data-i18n="pref.ui">UI</legend>
<label><input type="checkbox" id="pref-global-turbo"> <span data-i18n="pref-global-turbo">Global turbo</span></label> <div class="optiongroups">
<label data-i18n="pref-button-type"></label>
<div id="pref-button-type">
<label><input type="radio" name="pref-button-type" value="popup"> <span data-i18n="pref-button-type-popup"></span></label>
<label><input type="radio" name="pref-button-type" value="dta"> <span data-i18n="pref-button-type-dta"></span></label>
<label><input type="radio" name="pref-button-type" value="turbo"> <span data-i18n="pref-button-type-turbo"></span></label>
<label><input type="radio" name="pref-button-type" value="manager"> <span data-i18n="pref-button-type-manager"></span></label>
</div>
<label data-i18n="pref-theme"></label>
<div id="pref-theme">
<label><input type="radio" name="pref-theme" value="default"> <span data-i18n="pref-theme-default"></span></label>
<label><input type="radio" name="pref-theme" value="light"> <span data-i18n="pref-theme-light"></span></label>
<label><input type="radio" name="pref-theme" value="dark"> <span data-i18n="pref-theme-dark"></span></label>
</div>
</div>
<hr>
<label><input type="checkbox" id="pref-manager-in-popup"> <span data-i18n="pref-manager-in-popup"></span></label>
<label><input type="checkbox" id="pref-finish-notification"> <span data-i18n="pref-finish-notification"></span></label> <label><input type="checkbox" id="pref-finish-notification"> <span data-i18n="pref-finish-notification"></span></label>
<label><input type="checkbox" id="pref-sounds"> <span data-i18n="pref-sounds"></span></label>
<label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label> <label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label>
<div style="margin-top: 1em;"> <div style="margin-top: 1em;">
<button id="reset-confirmations" data-i18n="reset-confirmations"></button> <button id="reset-confirmations" data-i18n="reset-confirmations"></button>
@ -72,7 +89,8 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Translations</legend> <legend>Translations</legend>
<label>Language: <label>
<span>Language:</span>
<select id="languages"> <select id="languages">
<option value="default">Browser default</option> <option value="default">Browser default</option>
</select> </select>
@ -116,7 +134,14 @@
<article id="tab-network" class="tab"> <article id="tab-network" class="tab">
<fieldset> <fieldset>
<legend data-i18n="pref.netglobal"></legend> <legend data-i18n="pref.netglobal"></legend>
<label><span data-i18n="pref-concurrent-downloads">Concurrent downloads</span> <input id="pref-concurrent-downloads" type="number" min="1" max="10"></label> <div id="network-general">
<label data-i18n="pref-concurrent-downloads">Concurrent downloads</label>
<input id="pref-concurrent-downloads" type="number" min="1" max="10">
<label data-i18n="pref-retries"></label>
<input id="pref-retries" type="number" min="0" max="100">
<label data-i18n="pref-retry-time"></label>
<input id="pref-retry-time" type="number" min="1" max="600">
</div>
</fieldset> </fieldset>
<table id="limits" data-singleselect="true"> <table id="limits" data-singleselect="true">
<tr> <tr>

View File

@ -20,6 +20,7 @@ import { VirtualTable } from "../uikit/lib/table";
import { Icons } from "./icons"; import { Icons } from "./icons";
import { $ } from "./winutil"; import { $ } from "./winutil";
import { runtime, storage } from "../lib/browser"; import { runtime, storage } from "../lib/browser";
import "./theme";
const ICON_BASE_SIZE = 16; const ICON_BASE_SIZE = 16;
@ -554,9 +555,10 @@ addEventListener("DOMContentLoaded", async () => {
await localize(document.documentElement); await localize(document.documentElement);
// General // General
new BoolPref("pref-global-turbo", "global-turbo"); new BoolPref("pref-manager-in-popup", "manager-in-popup");
new BoolPref("pref-queue-notification", "queue-notification"); new BoolPref("pref-queue-notification", "queue-notification");
new BoolPref("pref-finish-notification", "finish-notification"); new BoolPref("pref-finish-notification", "finish-notification");
new BoolPref("pref-sounds", "sounds");
new BoolPref("pref-hide-context", "hide-context"); new BoolPref("pref-hide-context", "hide-context");
new BoolPref("pref-tooltip", "tooltip"); new BoolPref("pref-tooltip", "tooltip");
new BoolPref("pref-open-manager-on-queue", "open-manager-on-queue"); new BoolPref("pref-open-manager-on-queue", "open-manager-on-queue");
@ -564,6 +566,8 @@ addEventListener("DOMContentLoaded", async () => {
new BoolPref("pref-add-paused", "add-paused"); new BoolPref("pref-add-paused", "add-paused");
new BoolPref("pref-show-urls", "show-urls"); new BoolPref("pref-show-urls", "show-urls");
new BoolPref("pref-remove-missing-on-init", "remove-missing-on-init"); new BoolPref("pref-remove-missing-on-init", "remove-missing-on-init");
new OptionPref("pref-button-type", "button-type");
new OptionPref("pref-theme", "theme");
new OptionPref("pref-conflict-action", "conflict-action"); new OptionPref("pref-conflict-action", "conflict-action");
$("#reset-confirmations").addEventListener("click", async () => { $("#reset-confirmations").addEventListener("click", async () => {
@ -621,6 +625,8 @@ addEventListener("DOMContentLoaded", async () => {
// Network // Network
new IntPref("pref-concurrent-downloads", "concurrent"); new IntPref("pref-concurrent-downloads", "concurrent");
new IntPref("pref-retries", "retries");
new IntPref("pref-retry-time", "retry-time");
visible("#limits").then(() => new LimitsUI()); visible("#limits").then(() => new LimitsUI());

View File

@ -39,7 +39,7 @@
<th id="colTitle" data-i18n="title">Title</th> <th id="colTitle" data-i18n="title">Title</th>
<th id="colDescription" data-i18n="description">Description</th> <th id="colDescription" data-i18n="description">Description</th>
<th id="colMask" data-i18n="mask">Mask</th> <th id="colMask" data-i18n="mask">Mask</th>
<!--<th id="colReferrer" data-i18n="referrer">Referrer</th>--> <th id="colReferrer" data-i18n="referrer">Referrer</th>
</tr> </tr>
</table> </table>
</div> </div>
@ -59,6 +59,15 @@
<input type="checkbox" id="fastOnceCheck"> <input type="checkbox" id="fastOnceCheck">
<span data-i18n="useonlyonce">Use only once</span> <span data-i18n="useonlyonce">Use only once</span>
</label> </label>
<h2 data-i18n="subfolder"></h2>
<input id="subfolder" data-i18n="placeholder=subfolder.placeholder">
<span></span>
<label>
<input type="checkbox" id="subfolderOnceCheck">
<span data-i18n="useonlyonce">Use only once</span>
</label>
<h2 data-i18n="mask">Mask</h2> <h2 data-i18n="mask">Mask</h2>
<input id="mask"> <input id="mask">
<button id="maskButton" class="icon-tags"></button> <button id="maskButton" class="icon-tags"></button>
@ -84,6 +93,7 @@
<li id="ctx-toggle-selected" data-icon="icon-unchecked" data-i18n="toggle-selected-items">Toggle Check for Selected Items</li> <li id="ctx-toggle-selected" data-icon="icon-unchecked" data-i18n="toggle-selected-items">Toggle Check for Selected Items</li>
<li>-</li> <li>-</li>
<li id="ctx-mask" data-icon="icon-tags" data-i18n="set-mask">Mask</li> <li id="ctx-mask" data-icon="icon-tags" data-i18n="set-mask">Mask</li>
<li id="ctx-referrer" data-icon="icon-forward" data-i18n="set-referrer">Referrer</li>
<li>-</li> <li>-</li>
<li id="ctx-select-all" data-key="ACCEL-KeyA" data-i18n="select-all">Select All</li> <li id="ctx-select-all" data-key="ACCEL-KeyA" data-i18n="select-all">Select All</li>
<li id="ctx-select-filtered" data-key="ACCEL-KeyF" data-i18n="select-checked">Select Checked</li> <li id="ctx-select-filtered" data-key="ACCEL-KeyF" data-i18n="select-checked">Select Checked</li>

View File

@ -7,7 +7,7 @@ import { ContextMenu } from "./contextmenu";
import { iconForPath } from "../lib/windowutils"; import { iconForPath } from "../lib/windowutils";
import { _, localize } from "../lib/i18n"; import { _, localize } from "../lib/i18n";
import { Prefs } from "../lib/prefs"; import { Prefs } from "../lib/prefs";
import { MASK, FASTFILTER } from "../lib/recentlist"; import { MASK, FASTFILTER, SUBFOLDER } from "../lib/recentlist";
import { WindowState } from "./windowstate"; import { WindowState } from "./windowstate";
import { Dropdown } from "./dropdown"; import { Dropdown } from "./dropdown";
import { Keys } from "./keys"; import { Keys } from "./keys";
@ -24,6 +24,8 @@ import { BaseItem } from "../lib/item";
import { ItemDelta } from "../lib/select"; import { ItemDelta } from "../lib/select";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { TableConfig } from "../uikit/lib/config"; import { TableConfig } from "../uikit/lib/config";
import { validateSubFolder as validateSubfolder } from "../lib/util";
import "./theme";
const PORT: RawPort = runtime.connect(null, { name: "select" }); const PORT: RawPort = runtime.connect(null, { name: "select" });
@ -42,6 +44,7 @@ const NUM_FILTER_CLASSES = 8;
let Table: SelectionTable; let Table: SelectionTable;
let Mask: Dropdown; let Mask: Dropdown;
let FastFilter: Dropdown; let FastFilter: Dropdown;
let Subfolder: Dropdown;
type DELTAS = {deltaLinks: ItemDelta[]; deltaMedia: ItemDelta[]}; type DELTAS = {deltaLinks: ItemDelta[]; deltaMedia: ItemDelta[]};
@ -51,7 +54,7 @@ interface BaseMatchedItem extends BaseItem {
rowid: number; rowid: number;
} }
function cleaErrors() { function clearErrors() {
const not = $("#notification"); const not = $("#notification");
not.textContent = ""; not.textContent = "";
not.style.display = "none"; not.style.display = "none";
@ -117,7 +120,9 @@ class CheckClasser extends Map<string, string> {
let result = super.get(key); let result = super.get(key);
if (typeof result !== "string") { if (typeof result !== "string") {
result = this.gen.next().value; result = this.gen.next().value;
super.set(key, result); if (result) {
super.set(key, result);
}
} }
return result; return result;
} }
@ -352,7 +357,7 @@ class SelectionTable extends VirtualTable {
try { try {
Keys.suppressed = true; Keys.suppressed = true;
const newmask = await ModalDialog.prompt( const newmask = await ModalDialog.prompt(
"Renaming mask", "Set new renaming mask", oldmask); _("set_mask"), _("set_mask_text"), oldmask);
for (const r of this.selection) { for (const r of this.selection) {
this.items.at(r).mask = newmask; this.items.at(r).mask = newmask;
this.invalidateRow(r); this.invalidateRow(r);
@ -366,6 +371,57 @@ class SelectionTable extends VirtualTable {
} }
}); });
this.contextMenu.on("ctx-referrer", async() => {
if (this.selection.empty) {
return;
}
let oldref = "";
for (const r of this.selection) {
const m = this.items.at(r).usableReferrer;
if (oldref && m !== oldref) {
oldref = "";
break;
}
oldref = m || oldref;
}
try {
Keys.suppressed = true;
const newref = await ModalDialog.prompt(
_("set_referrer"), _("set_referrer_text"), oldref);
try {
let ref;
if (!newref) {
ref = {
referrer: undefined,
usableReferrer: undefined,
};
}
else {
const u = new URL(newref);
u.hash = "";
ref = {
referrer: u.toString(),
usableReferrer: decodeURIComponent(u.toString()),
};
}
for (const r of this.selection) {
Object.assign(this.items.at(r), ref);
this.invalidateRow(r);
}
}
catch {
// ignored
}
}
catch (ex) {
console.warn("mask dismissed", ex);
}
finally {
Keys.suppressed = false;
}
});
this.contextMenu.on("dismissed", () => this.table.focus()); this.contextMenu.on("dismissed", () => this.table.focus());
this.on("contextmenu", (tree, event) => { this.on("contextmenu", (tree, event) => {
@ -519,7 +575,7 @@ class SelectionTable extends VirtualTable {
else { else {
this.status.textContent = _("numitems.label", [selected]); this.status.textContent = _("numitems.label", [selected]);
} }
cleaErrors(); clearErrors();
} }
getRowClasses(rowid: number) { getRowClasses(rowid: number) {
@ -527,7 +583,11 @@ class SelectionTable extends VirtualTable {
if (!item || !matched(item) || !item.matched) { if (!item || !matched(item) || !item.matched) {
return null; return null;
} }
return ["filtered", this.checkClasser.get(item.matched)]; const m = this.checkClasser.get(item.matched);
if (!m) {
return null;
}
return ["filtered", m];
} }
getCellIcon(rowid: number, colid: number) { getCellIcon(rowid: number, colid: number) {
@ -616,6 +676,9 @@ async function download(paused = false) {
if (!mask) { if (!mask) {
throw new Error("error.invalidMask"); throw new Error("error.invalidMask");
} }
const subfolder = Subfolder.value;
validateSubfolder(subfolder);
const items = Table.items.checkedIndexes; const items = Table.items.checkedIndexes;
if (!items.length) { if (!items.length) {
throw new Error("error.noItemsSelected"); throw new Error("error.noItemsSelected");
@ -649,6 +712,8 @@ async function download(paused = false) {
maskOnce: $<HTMLInputElement>("#maskOnceCheck").checked, maskOnce: $<HTMLInputElement>("#maskOnceCheck").checked,
fast: FastFilter.value, fast: FastFilter.value,
fastOnce: $<HTMLInputElement>("#fastOnceCheck").checked, fastOnce: $<HTMLInputElement>("#fastOnceCheck").checked,
subfolder,
subfolderOnce: $<HTMLInputElement>("#subfolderOnceCheck").checked,
} }
}); });
} }
@ -724,9 +789,9 @@ function cancel() {
} }
async function init() { async function init() {
await Promise.all([MASK.init(), FASTFILTER.init()]); await Promise.all([MASK.init(), FASTFILTER.init(), SUBFOLDER.init()]);
Mask = new Dropdown("#mask", MASK.values); Mask = new Dropdown("#mask", MASK.values);
Mask.on("changed", cleaErrors); Mask.on("changed", clearErrors);
FastFilter = new Dropdown("#fast", FASTFILTER.values); FastFilter = new Dropdown("#fast", FASTFILTER.values);
FastFilter.on("changed", () => { FastFilter.on("changed", () => {
PORT.postMessage({ PORT.postMessage({
@ -734,6 +799,8 @@ async function init() {
fastFilter: FastFilter.value fastFilter: FastFilter.value
}); });
}); });
Subfolder = new Dropdown("#subfolder", SUBFOLDER.values);
Subfolder.on("changed", clearErrors);
} }
const LOADED = new Promise(resolve => { const LOADED = new Promise(resolve => {

View File

@ -47,6 +47,15 @@
<span data-i18n="useonlyonce">Use only once</span> <span data-i18n="useonlyonce">Use only once</span>
</label> </label>
</div> </div>
<h3 data-i18n="subfolder"></h3>
<div id="subfolderOptions">
<input type="text" id="subfolder" data-i18n="placeholder=subfolder.placeholder">
<span></span>
<label id="subfolderOnce">
<input type="checkbox" id="subfolderOnceCheck">
<span data-i18n="useonlyonce">Use only once</span>
</label>
</div>
</section> </section>
<section id="notification"></section> <section id="notification"></section>
<section id="buttons"> <section id="buttons">

View File

@ -6,7 +6,7 @@ import ModalDialog from "../uikit/lib/modal";
import { _, localize } from "../lib/i18n"; import { _, localize } from "../lib/i18n";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { Item, BaseItem } from "../lib/item"; import { Item, BaseItem } from "../lib/item";
import { MASK } from "../lib/recentlist"; import { MASK, SUBFOLDER } from "../lib/recentlist";
import { BatchGenerator } from "../lib/batches"; import { BatchGenerator } from "../lib/batches";
import { WindowState } from "./windowstate"; import { WindowState } from "./windowstate";
import { Dropdown } from "./dropdown"; import { Dropdown } from "./dropdown";
@ -14,11 +14,14 @@ import { Keys } from "./keys";
import { hookButton } from "../lib/manager/renamer"; import { hookButton } from "../lib/manager/renamer";
import { runtime } from "../lib/browser"; import { runtime } from "../lib/browser";
import { $ } from "./winutil"; import { $ } from "./winutil";
import { validateSubFolder } from "../lib/util";
import "./theme";
const PORT = runtime.connect(null, { name: "single" }); const PORT = runtime.connect(null, { name: "single" });
let ITEM: BaseItem; let ITEM: BaseItem;
let Mask: Dropdown; let Mask: Dropdown;
let Subfolder: Dropdown;
class BatchModalDialog extends ModalDialog { class BatchModalDialog extends ModalDialog {
private readonly gen: BatchGenerator; private readonly gen: BatchGenerator;
@ -71,7 +74,8 @@ function setItem(item: BaseItem) {
title = "", title = "",
description = "", description = "",
usableReferrer = "", usableReferrer = "",
mask = "" mask = "",
subfolder = "",
} = item; } = item;
$<HTMLInputElement>("#URL").value = usable; $<HTMLInputElement>("#URL").value = usable;
$<HTMLInputElement>("#filename").value = fileName; $<HTMLInputElement>("#filename").value = fileName;
@ -81,6 +85,9 @@ function setItem(item: BaseItem) {
if (mask) { if (mask) {
Mask.value = mask; Mask.value = mask;
} }
if (subfolder) {
Subfolder.value = subfolder;
}
} }
function displayError(err: string) { function displayError(err: string) {
@ -124,6 +131,9 @@ async function downloadInternal(paused: boolean) {
return displayError("error.invalidMask"); return displayError("error.invalidMask");
} }
const subfolder = Subfolder.value.trim();
validateSubFolder(subfolder);
const items = []; const items = [];
if (!ITEM) { if (!ITEM) {
@ -136,6 +146,7 @@ async function downloadInternal(paused: boolean) {
title, title,
description, description,
mask, mask,
subfolder
}); });
} }
else { else {
@ -143,6 +154,7 @@ async function downloadInternal(paused: boolean) {
ITEM.title = title; ITEM.title = title;
ITEM.description = description; ITEM.description = description;
ITEM.mask = mask; ITEM.mask = mask;
ITEM.subfolder = subfolder;
if (usableReferrer !== ITEM.usableReferrer) { if (usableReferrer !== ITEM.usableReferrer) {
ITEM.referrer = referrer; ITEM.referrer = referrer;
ITEM.usableReferrer = usableReferrer; ITEM.usableReferrer = usableReferrer;
@ -185,6 +197,8 @@ async function downloadInternal(paused: boolean) {
paused, paused,
mask, mask,
maskOnce: $<HTMLInputElement>("#maskOnceCheck").checked, maskOnce: $<HTMLInputElement>("#maskOnceCheck").checked,
subfolder,
subfolderOnce: $<HTMLInputElement>("#subfolderOnceCheck").checked,
} }
}); });
return null; return null;
@ -201,8 +215,9 @@ function cancel() {
async function init() { async function init() {
await localize(document.documentElement); await localize(document.documentElement);
await Promise.all([MASK.init()]); await Promise.all([MASK.init(), SUBFOLDER.init()]);
Mask = new Dropdown("#mask", MASK.values); Mask = new Dropdown("#mask", MASK.values);
Subfolder = new Dropdown("#subfolder", SUBFOLDER.values);
} }
addEventListener("DOMContentLoaded", async function dom() { addEventListener("DOMContentLoaded", async function dom() {

112
windows/theme.ts Normal file
View File

@ -0,0 +1,112 @@
/* eslint-disable no-magic-numbers */
"use strict";
// License: MIT
import { PrefWatcher } from "../lib/prefs";
import { theme } from "../lib/browser";
import { memoize } from "../lib/memoize";
const resolveColor = memoize(function(color) {
try {
const el = document.createElement("div");
el.style.backgroundColor = color;
el.style.display = "none";
document.body.appendChild(el);
try {
const resolved = window.getComputedStyle(el, null).backgroundColor;
return resolved;
}
finally {
document.body.removeChild(el);
}
}
catch {
return undefined;
}
}, 10, 1);
export const THEME = new class Theme extends PrefWatcher {
public systemDark: boolean;
public themeDark?: boolean;
constructor() {
super("theme", "default");
if (theme && theme.onUpdated) {
theme.onUpdated.addListener(this.onThemeUpdated.bind(this));
theme.getCurrent().then((theme: any) => this.onThemeUpdated({theme}));
}
this.themeDark = undefined;
const query = window.matchMedia("(prefers-color-scheme: dark)");
this.systemDark = query.matches;
query.addListener(e => {
this.systemDark = e.matches;
this.recalculate();
});
this.recalculate();
}
get dark() {
if (this.value === "dark") {
return true;
}
if (this.value === "light") {
return false;
}
if (typeof this.themeDark === "undefined") {
return this.systemDark;
}
return this.themeDark;
}
changed(prefs: any, key: string, value: any) {
const rv = super.changed(prefs, key, value);
this.recalculate();
return rv;
}
onThemeUpdated({theme}: {theme: any}) {
try {
if (!theme) {
this.themeDark = undefined;
return;
}
const {colors} = theme;
if (!colors) {
this.themeDark = undefined;
return;
}
const color = resolveColor(
colors.toolbar || colors.popup || colors.ntp_background);
if (!color) {
this.themeDark = undefined;
return;
}
const pieces = color.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/);
if (!pieces) {
this.themeDark = undefined;
return;
}
const r = parseInt(pieces[1], 10);
const g = parseInt(pieces[2], 10);
const b = parseInt(pieces[3], 10);
// HSP (Highly Sensitive Poo) equation from
// http://alienryderflex.com/hsp.html
const hsp = Math.sqrt(
0.299 * (r * r) +
0.587 * (g * g) +
0.114 * (b * b)
);
this.themeDark = hsp < 128;
}
finally {
this.recalculate();
}
}
recalculate() {
document.documentElement.classList[this.dark ? "add" : "remove"]("dark");
}
}();

250
yarn.lock
View File

@ -36,10 +36,10 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
"@types/node@^12.7.2": "@types/node@^12.7.8":
version "12.7.2" version "12.7.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708"
integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==
"@types/psl@^1.1.0": "@types/psl@^1.1.0":
version "1.1.0" version "1.1.0"
@ -51,43 +51,45 @@
resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f981bbdf1813a75820a6ec3a7fdfa0d452552cc7" resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f981bbdf1813a75820a6ec3a7fdfa0d452552cc7"
integrity sha512-bJ/bZ+pA69lm+Ll8JJRoAD9saH7unIMfxPQQpl7bxa00qNqvUXSyk3xvoRMea1uCpAOxweI7CzjWx48ysX6yug== integrity sha512-bJ/bZ+pA69lm+Ll8JJRoAD9saH7unIMfxPQQpl7bxa00qNqvUXSyk3xvoRMea1uCpAOxweI7CzjWx48ysX6yug==
"@typescript-eslint/eslint-plugin@^2.0.0": "@typescript-eslint/eslint-plugin@^2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz#609a5d7b00ce21a6f94d7ef282eba9da57ca1e42" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.3.2.tgz#7e112ca0bb29044d915baf10163a8199a20f7c69"
integrity sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA== integrity sha512-tcnpksq1bXzcIRbYLeXkgp6l+ggEMXXUcl1wsSvL807fRtmvVQKygElwEUf4hBA76dNag3VAK1q2m3vd7qJaZA==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "2.0.0" "@typescript-eslint/experimental-utils" "2.3.2"
eslint-utils "^1.4.0" eslint-utils "^1.4.2"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
regexpp "^2.0.1" regexpp "^2.0.1"
tsutils "^3.14.0" tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.0.0": "@typescript-eslint/experimental-utils@2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz#f3d298bb411357f35c4184e24280b256b6321949" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.2.tgz#e50f31264507e6fec7b33840bb6af260c24f4ea8"
integrity sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg== integrity sha512-t+JGdTT6dRbmvKDlhlVkEueoZa0fhJNfG6z2cpnRPLwm3VwYr2BjR//acJGC1Yza0I9ZNcDfRY7ubQEvvfG6Jg==
dependencies: dependencies:
"@types/json-schema" "^7.0.3" "@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.0.0" "@typescript-eslint/typescript-estree" "2.3.2"
eslint-scope "^4.0.0" eslint-scope "^5.0.0"
"@typescript-eslint/parser@^2.0.0": "@typescript-eslint/parser@^2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.0.0.tgz#4273bb19d03489daf8372cdaccbc8042e098178f" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.3.2.tgz#e9b742e191cd1209930da469cde379591ad0af5b"
integrity sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA== integrity sha512-nq1UQeNGdKdqdgF6Ww+Ov2OidWgiL96+JYdXXZ2rkP/OWyc6KMNSbs6MpRCpI8q+PmDa7hBnHNQIo7w/drYccA==
dependencies: dependencies:
"@types/eslint-visitor-keys" "^1.0.0" "@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.0.0" "@typescript-eslint/experimental-utils" "2.3.2"
"@typescript-eslint/typescript-estree" "2.0.0" "@typescript-eslint/typescript-estree" "2.3.2"
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.0.0": "@typescript-eslint/typescript-estree@2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz#c9f6c0efd1b11475540d6a55dc973cc5b9a67e77" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.2.tgz#107414aa04e689fe6f7251eb63fb500217f2b7f4"
integrity sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w== integrity sha512-eZNEAai16nwyhIVIEaWQlaUgAU3S9CkQ58qvK0+3IuSdLJD3W1PNuehQFMIhW/mTP1oFR9GNoTcLg7gtXz6lzA==
dependencies: dependencies:
glob "^7.1.4"
is-glob "^4.0.1"
lodash.unescape "4.0.1" lodash.unescape "4.0.1"
semver "^6.2.0" semver "^6.3.0"
"@webassemblyjs/ast@1.8.5": "@webassemblyjs/ast@1.8.5":
version "1.8.5" version "1.8.5"
@ -717,15 +719,6 @@ cli-width@^2.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
dependencies:
string-width "^2.1.1"
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
cliui@^5.0.0: cliui@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@ -1116,7 +1109,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
eslint-scope@^4.0.0, eslint-scope@^4.0.3: eslint-scope@^4.0.3:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@ -1132,7 +1125,7 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0" esrecurse "^4.1.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-utils@^1.4.0, eslint-utils@^1.4.2: eslint-utils@^1.4.2:
version "1.4.2" version "1.4.2"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
@ -1144,10 +1137,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.2.2: eslint@^6.5.1:
version "6.2.2" version "6.5.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.2.tgz#03298280e7750d81fcd31431f3d333e43d93f24f" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6"
integrity sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw== integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "^7.0.0"
ajv "^6.10.0" ajv "^6.10.0"
@ -1489,11 +1482,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1" strip-ansi "^3.0.1"
wide-align "^1.1.0" wide-align "^1.1.0"
get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
get-caller-file@^2.0.1: get-caller-file@^2.0.1:
version "2.0.5" version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
@ -2105,7 +2093,7 @@ lodash.unescape@4.0.1:
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14: lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15:
version "4.17.15" version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -2305,10 +2293,10 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies: dependencies:
minimist "0.0.8" minimist "0.0.8"
mocha@^6.2.0: mocha@^6.2.1:
version "6.2.0" version "6.2.1"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.1.tgz#da941c99437da9bac412097859ff99543969f94c"
integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== integrity sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==
dependencies: dependencies:
ansi-colors "3.2.3" ansi-colors "3.2.3"
browser-stdout "1.3.1" browser-stdout "1.3.1"
@ -2330,9 +2318,9 @@ mocha@^6.2.0:
supports-color "6.0.0" supports-color "6.0.0"
which "1.3.1" which "1.3.1"
wide-align "1.1.3" wide-align "1.1.3"
yargs "13.2.2" yargs "13.3.0"
yargs-parser "13.0.0" yargs-parser "13.1.1"
yargs-unparser "1.5.0" yargs-unparser "1.6.0"
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
@ -2607,7 +2595,7 @@ os-homedir@^1.0.0:
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^3.0.0, os-locale@^3.1.0: os-locale@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
@ -2799,10 +2787,10 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
psl@^1.3.0: psl@^1.4.0:
version "1.3.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
public-encrypt@^4.0.0: public-encrypt@^4.0.0:
version "4.0.3" version "4.0.3"
@ -2951,11 +2939,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
require-main-filename@^2.0.0: require-main-filename@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@ -3088,7 +3071,7 @@ semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: semver@^6.0.0, semver@^6.1.2, semver@^6.3.0:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -3289,7 +3272,7 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0" is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: "string-width@^1.0.2 || 2", string-width@^2.1.0:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@ -3498,10 +3481,10 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2" regex-not "^1.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
ts-loader@^6.0.4: ts-loader@^6.2.0:
version "6.0.4" version "6.2.0"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.0.tgz#52d3993ecbc5474c1513242388e1049da0fce880"
integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== integrity sha512-Da8h3fD+HiZ9GvZJydqzk3mTC9nuOKYlJcpuk+Zv6Y1DPaMvBL+56GRzZFypx2cWrZFMsQr869+Ua2slGoLxvQ==
dependencies: dependencies:
chalk "^2.3.0" chalk "^2.3.0"
enhanced-resolve "^4.0.0" enhanced-resolve "^4.0.0"
@ -3509,10 +3492,10 @@ ts-loader@^6.0.4:
micromatch "^4.0.0" micromatch "^4.0.0"
semver "^6.0.0" semver "^6.0.0"
ts-node@^8.3.0: ts-node@^8.4.1:
version "8.3.0" version "8.4.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.4.1.tgz#270b0dba16e8723c9fa4f9b4775d3810fd994b4f"
integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== integrity sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==
dependencies: dependencies:
arg "^4.1.0" arg "^4.1.0"
diff "^4.0.1" diff "^4.0.1"
@ -3525,7 +3508,7 @@ tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
tsutils@^3.14.0: tsutils@^3.17.1:
version "3.17.1" version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
@ -3554,10 +3537,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^3.5.3: typescript@^3.6.3:
version "3.5.3" version "3.6.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da"
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==
union-value@^1.0.0: union-value@^1.0.0:
version "1.0.1" version "1.0.1"
@ -3664,15 +3647,15 @@ watchpack@^1.6.0:
graceful-fs "^4.1.2" graceful-fs "^4.1.2"
neo-async "^2.5.0" neo-async "^2.5.0"
webextension-polyfill@^0.4.0: webextension-polyfill@^0.5.0:
version "0.4.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz#9cc5a60f0f2bf907a6b349fdd7e61701f54956f9" resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.5.0.tgz#795e0bf6a2b8eadcdb6edaecd169e9228c747519"
integrity sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag== integrity sha512-aFrl38x43t1bTboX/paCT8I97+idzX/TY0+fuM52hrIkCpYfROEF9kSn0BXuEIi3J9LTYt2ZZKkhx9NB1qF3nA==
webpack-cli@^3.3.7: webpack-cli@^3.3.9:
version "3.3.7" version "3.3.9"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.7.tgz#77c8580dd8e92f69d635e0238eaf9d9c15759a91" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a"
integrity sha512-OhTUCttAsr+IZSMVwGROGRHvT+QAs8H6/mHIl4SvhAwYywjiylYjpwybGx7WQ9Hkb45FhjtsymkwiRRbGJ1SZQ== integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==
dependencies: dependencies:
chalk "2.4.2" chalk "2.4.2"
cross-spawn "6.0.5" cross-spawn "6.0.5"
@ -3694,10 +3677,10 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1:
source-list-map "^2.0.0" source-list-map "^2.0.0"
source-map "~0.6.1" source-map "~0.6.1"
webpack@^4.39.3: webpack@^4.41.0:
version "4.39.3" version "4.41.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.3.tgz#a02179d1032156b713b6ec2da7e0df9d037def50" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b"
integrity sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ== integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5"
@ -3759,14 +3742,6 @@ worker-farm@^1.7.0:
dependencies: dependencies:
errno "~0.1.7" errno "~0.1.7"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi@^5.1.0: wrap-ansi@^5.1.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@ -3800,7 +3775,7 @@ xtend@^4.0.0, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: y18n@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
@ -3810,23 +3785,7 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
yargs-parser@13.0.0: yargs-parser@13.1.1, yargs-parser@^13.1.0, yargs-parser@^13.1.1:
version "13.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b"
integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.0.0, yargs-parser@^13.1.0:
version "13.1.1" version "13.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
@ -3834,31 +3793,14 @@ yargs-parser@^13.0.0, yargs-parser@^13.1.0:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs-unparser@1.5.0: yargs-unparser@1.6.0:
version "1.5.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
dependencies: dependencies:
flat "^4.1.0" flat "^4.1.0"
lodash "^4.17.11" lodash "^4.17.15"
yargs "^12.0.5" yargs "^13.3.0"
yargs@13.2.2:
version "13.2.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993"
integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==
dependencies:
cliui "^4.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
os-locale "^3.1.0"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.0.0"
yargs@13.2.4: yargs@13.2.4:
version "13.2.4" version "13.2.4"
@ -3877,23 +3819,21 @@ yargs@13.2.4:
y18n "^4.0.0" y18n "^4.0.0"
yargs-parser "^13.1.0" yargs-parser "^13.1.0"
yargs@^12.0.5: yargs@13.3.0, yargs@^13.3.0:
version "12.0.5" version "13.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
dependencies: dependencies:
cliui "^4.0.0" cliui "^5.0.0"
decamelize "^1.2.0"
find-up "^3.0.0" find-up "^3.0.0"
get-caller-file "^1.0.1" get-caller-file "^2.0.1"
os-locale "^3.0.0"
require-directory "^2.1.1" require-directory "^2.1.1"
require-main-filename "^1.0.1" require-main-filename "^2.0.0"
set-blocking "^2.0.0" set-blocking "^2.0.0"
string-width "^2.0.0" string-width "^3.0.0"
which-module "^2.0.0" which-module "^2.0.0"
y18n "^3.2.1 || ^4.0.0" y18n "^4.0.0"
yargs-parser "^11.1.1" yargs-parser "^13.1.1"
yn@^3.0.0: yn@^3.0.0:
version "3.1.1" version "3.1.1"