87 Commits

Author SHA1 Message Date
3deac4cda0 First commit of tdl
Initial round of re-branding, I temporarily am using the dta icon just
rotated 180, waiting for a permanent icon to use
Removed the initial create tab for dta but left any download links as is
Added webextension-polyfill-ts to enable retrieval of cookies
Removed all access and preferences to the download manager as it is not
relevant in this fork
2021-03-27 21:26:37 -07:00
49a589cb87 Add title and description to metalinks
Fixes #250
2020-08-30 00:29:26 +02:00
3c644e615d Random typos etc 2020-08-29 23:49:48 +02:00
c540c1fc29 Harden locale loader 2020-08-29 23:49:02 +02:00
3e31cb326b Provide additional extension storage db backend
Related #159
2020-08-29 22:58:08 +02:00
add5b65ff2 Code cleanups 2020-08-29 22:56:08 +02:00
6282f54ac0 Use localforage to work around private browsing issues
Related #159
2020-08-29 22:55:32 +02:00
1af01856e1 Provide MemoryDB fallback
Related to #159
2020-08-29 21:47:26 +02:00
3f650be613 Allow right clicks on menu items 2020-08-29 20:56:58 +02:00
0fa7738031 Update dependencies 2020-08-29 20:54:26 +02:00
ebd1581742 Make audio filter to apply to both, links and media 2020-08-29 19:59:57 +02:00
db1b50bc90 Update locales 2020-08-29 19:56:05 +02:00
8ad4d7a59d Update de locale (#225) 2020-08-29 19:23:38 +02:00
5c6cd47485 Create tr.json (#201) 2020-08-29 19:20:44 +02:00
dbd596e8ea New language: Swedish (#226) 2020-08-29 19:18:04 +02:00
0362eaf6e3 Update Czech locale (#236) 2020-08-29 19:15:59 +02:00
4538066e9d update typo messages.json of zh-CN (#260) 2020-08-29 19:15:15 +02:00
0da87398b4 Fix typo in windows.getLastFocused (#277) 2020-08-29 19:14:42 +02:00
82e7361567 Version 4.2.6 2019-11-26 13:13:09 +01:00
5c84493a0f build: cleanup stale bundles 2019-11-26 13:05:16 +01:00
83cb8e32f1 Update Readme.md 2019-11-25 19:14:51 +01:00
c49af54532 Remove compresslevel from build.py
Makes python3.6 choke
2019-11-25 19:08:33 +01:00
eee8c4ea1a Version 4.2.5 2019-11-21 15:07:36 +01:00
858b8f277e Update dev dependencies 2019-11-21 13:25:20 +01:00
6841fdcfc8 New icon 2019-11-21 13:25:20 +01:00
1e8e7ad6ec Use correct grouping 2019-11-21 13:21:02 +01:00
6ed84b9560 Move landing pages into own repo 2019-11-21 12:03:29 +01:00
f739cb789c Adjust some darkmode colors 2019-11-21 11:40:39 +01:00
0d470a7ce0 Handle CRLF in imports
Closes #186
2019-11-21 11:40:39 +01:00
9ec1d46787 Update of Danish translation (#185) 2019-11-21 11:21:47 +01:00
ba283e9221 Version 4.2.4 2019-10-28 11:28:16 +01:00
e549886532 Do not mess up queue when sorting in select
Closes #181
2019-10-28 11:13:19 +01:00
d3b7032229 Version 4.2.3 2019-10-13 13:44:38 +02:00
5586bcb671 Update changelog 2019-10-13 13:44:05 +02:00
bd72c417d2 Remove sounds on Opera
See #125
2019-10-13 13:44:05 +02:00
52643e0bec Update feature_request.md 2019-10-11 17:38:14 +02:00
af59fb60ff Improve bug report template. 2019-10-11 17:37:04 +02:00
ac2bc8cdfd Add privacy notice 2019-10-11 17:26:17 +02:00
c5309a8923 Always import links in the right context
Closes #163
2019-10-11 15:47:16 +02:00
1370723e6d Push raw indexes 2019-10-11 15:47:16 +02:00
4ba827fc15 Make sure we're on background 2019-10-11 15:47:16 +02:00
b2e20b9875 Update zh_CN translation (#161) 2019-10-11 13:39:36 +02:00
ef9cff003d Update ru translation
Closes #160
2019-10-11 13:37:21 +02:00
74b3ce7eb1 Dark mode: improve display of disabled menu items 2019-10-11 13:28:41 +02:00
6528e2118e Show context when no selection
Closes #162
2019-10-11 13:28:18 +02:00
c901438216 Link landing from changelog 2019-10-09 20:56:02 +02:00
7a0718d9cc Version 4.2.2 2019-10-09 19:13:13 +02:00
a7cc3c7fff Fix landing title 2019-10-09 18:59:45 +02:00
9d313f319d Use the correct full path in tooltips 2019-10-09 18:32:22 +02:00
856044c88c Open landing page on installs 2019-10-09 18:26:36 +02:00
de1b13a50f Add landing page 2019-10-09 18:10:40 +02:00
a981b7b8c7 Update nl locale
Closes #157
2019-10-08 22:24:32 +02:00
abe9d82d03 Always notify all observers 2019-10-08 22:24:32 +02:00
49a3f08a9a Update Arabic translation (#158) 2019-10-08 15:12:38 +02:00
afaa75fcdc Update Bulgarian localization (#156) 2019-10-08 15:12:14 +02:00
a5c749412a Work around Firefox window.create({left, top}) issues 2019-10-07 14:55:01 +02:00
e64da40355 Track window state of manager windows
Closes #154
2019-10-07 14:55:00 +02:00
05e7283f9f Update messages.json (#155) 2019-10-07 14:27:19 +02:00
bea8e230fb Update pl translation
Closes #151
2019-10-06 23:04:53 +02:00
23c1ece807 4 more French strings (#152) 2019-10-06 23:02:11 +02:00
539d340f1a Make prefwatcher not stop event chain
See #148
2019-10-06 22:33:23 +02:00
876486bbf5 Update hungarian translation (#149) 2019-10-06 19:34:58 +02:00
9179851c85 Update zh_TW translation (#147) 2019-10-06 08:44:31 +02:00
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
101 changed files with 5911 additions and 1973 deletions

View File

@ -1,6 +1,6 @@
---
name: Bug report
about: Create a report to help us improve
about: Create a report to help us improve DownThemAll!
title: ''
labels: ''
assignees: ''
@ -8,9 +8,9 @@ assignees: ''
---
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
- OS: [e.g. Windows 10, macOS, Linux (distribution, desktop environment)]
- Browser and version: [e.g. Firefox 42, Chrome 70, Opera 15, Seamonkey 2.16]
- DownThemAll! version: [e.g. 4.2, 3.0, latest]
**Describe the bug**
A clear and concise description of what the bug is.

View File

@ -1,6 +1,6 @@
---
name: Feature request
about: Suggest an idea for this project
about: Suggest a feature or an idea for DownThemAll!
title: ''
labels: ''
assignees: ''

View File

@ -1,3 +1,7 @@
![DownThemAll!](https://raw.githubusercontent.com/downthemall/downthemall/master/style/icon128.png)
# DownThemAll! WE
The DownThemAll! WebExtension.
@ -27,28 +31,59 @@ If you would like to help out translating DTA, please see our [translation guide
## Development
### Requirements
You will want to `yarn` the development dependencies such as webpack first.
- [node](https://nodejs.org/en/)
- [yarn](https://yarnpkg.com/)
- [python3](https://www.python.org/) >= 3.6 (to build zips)
- [web-ext](https://www.npmjs.com/package/web-ext) (for development ease)
Afterwards, you will want to run`yarn watch`.
### Setup
You will want to run `yarn` to install the development dependencies such as webpack first.
### Making changes
Just use your favorite text editor to edit the files.
You will want to run`yarn watch`.
This will run the webpack bundler in watch mode, transpiling the TypeScript to Javascript and updating bundles as you change the source.
Please note: You have to run `yarn watch` (at least once) as it builds the actual script bundles.
Please note: You have to run `yarn watch` or `yarn build` (at least once) as it builds the actual script bundles.
### Firefox
### Running in Firefox
I recommend you install the [`web-ext`](https://www.npmjs.com/package/web-ext) tools from mozilla. It is not listed as a dependency by design at it causes problems with dependency resolution in yarn right now if installed in the same location as the rest of the dependencies.
If you did, then running `yarn webext` (additionally to `yarn watch`) will run the WebExtension in a development profile. This will use the directory `../dtalite.p` to keep a development profile. You might need to create this directory before you use this command. Furthermore `yarn webext` will watch for changes to the sources and automatically reload the extension.
Alternative, you can also `yarn build`, which then builds an *unsigned* zip that you can then install permanently in a browser that does not enforce signing (i.e. Nightly or the Unbranded Firefox with the right about:config preferences).
Alternatively, you can also `yarn build`, which then builds an *unsigned* zip that you can then install permanently in a browser that does not enforce signing (i.e. Nightly or the Unbranded Firefox with the right about:config preferences).
### Chrome
### Running in Chrome/Chromium/etc
You have to build the bundles first, of course.
Then put your Chrome into Developement Mode on the Extensions page, and Load Unpacked the directory of your downthemall clone.
### Making release zips
To get a basic unofficial set of zips for Firefox and chrome, run `yarn build`.
If you want to generate release builds like the ones that are eventually released in the extension stores, use `python3 util/build.py --mode=release`.
The output is located in `web-ext-artifacts`.
- `-fx.zip` are Firefox builds
- `-crx.zip` are Chrome/Chromium builds
- `-opr.zip` are Opera builds (essentially like the Chrome one, but without sounds)
### The AMO Editors tl;dr guide
1. Install the requirements.
2. `yarn && python3 build/util.py --mode=release`
3. Have a look in `web-ext-artifacts/dta-*-fx.zip`
### Patches
Before submitting patches, please make sure you run eslint (if this isn't done automatically in your text editor/IDE), and eslint does not report any open issues. Code contributions should favor typescript code over javascript code. External dependencies that would ship with the final product (including all npm/yarn packages) should be kept to a bare minimum and need justification.

View File

@ -1,8 +1,6 @@
TODO
---
aka a lot
P2
===
@ -26,11 +24,7 @@ Nice-to-haves.
* Manipulate downloads (e.g. rewrite URLs)
* Native context menus?
* Would require massive reworks incl the need for new icon formats, but potentially feasible.
* Import/Export
* 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)
P4

View File

@ -19,6 +19,8 @@
"pl": "Polski [pl]",
"pt": "Português (Brasil) [pt]",
"ru": "Русский [ru]",
"zh_CN": "简体中文 [zh_CN]",
"zh_TW": "正體中文 [zh_TW]"
"sv": "Svenska (SV) [sv]",
"tr": "Türkçe TR) [tr]",
"zh_CN": "中文(简体) [zh_CN]",
"zh_TW": "正體中文 (TW) [zh_TW]"
}

View File

@ -191,6 +191,22 @@
"message": "احذف",
"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": {
"message": "الوصف",
"description": "Description (keep it short); e.g. the description column in select"
@ -275,13 +291,37 @@
"message": "العنوان غير صالح",
"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": {
"message": "لم تحدّد عناصر",
"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": {
"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": "TraitorousDownloading! 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": {
"message": "ترشيح سريع",
@ -331,6 +371,10 @@
"message": "يُجبر البدء",
"description": "Menu text"
},
"import": {
"message": "استورِد من نصّ",
"description": "menu text"
},
"information_title": {
"message": "معلومات",
"description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "أضفِ التنزيلات الجديدة ملبثة، بدل بدئها مباشرة عند إضافتها",
"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": {
"message": "التنزيلات المتزامنة",
"description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "اعرض إخطارًا حين ينتهي تنزيل طابور التنزيلات",
"description": "Preferences/General"
},
"pref_global_turbo": {
"message": "ليكن زر المتصفح ”بنقرة واحدة!“",
"description": "Preferences/General"
},
"pref_hide_context": {
"message": "لا تعرض عناصر القائمة السياقية العامة",
"description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "المدير",
"description": "Preferences/General; group text"
},
"pref_manager_in_popup": {
"message": "افتح المدير في نافذة منبثقة جديدة",
"description": "checkbox text"
},
"pref_manager_tooltip": {
"message": "اعرض التلميحات في ألسنة المدير",
"description": "Preferences/General"
@ -573,14 +637,42 @@
"message": "أزِل التنزيلات الناقصة بعد إعادة التشغيل",
"description": "Preferences/General"
},
"pref_retries": {
"message": "عدد مرات إعادة التنزيل في حال الأخطاء المؤقتة",
"description": "pref text"
},
"pref_retry_time": {
"message": "أعِد كل (بالدقيقة)",
"description": "pref text"
},
"pref_show_urls": {
"message": "اعرض العناوين بدل الأسماء",
"description": "Preferences/General"
},
"pref_sounds": {
"message": "شغّل الأصوات",
"description": "checkbox text"
},
"pref_text_links": {
"message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "السمة:",
"description": "label text"
},
"pref_theme_dark": {
"message": "داكنة",
"description": "option text"
},
"pref_theme_default": {
"message": "النظام/المتصفح",
"description": "option text"
},
"pref_theme_light": {
"message": "فاتحة",
"description": "option text"
},
"pref_ui": {
"message": "واجهة المستخدم",
"description": "Preferences/General; group text"
@ -895,6 +987,20 @@
"message": "استأنف",
"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": {
"message": "يعمل",
"description": "Status text"
@ -943,6 +1049,18 @@
"message": "اضبط قناع تغيير الاسم",
"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": {
"message": "الدفعات مدعومة، مثل:",
"description": "Header text; single window"
@ -1123,6 +1241,14 @@
"message": "لن تبدأ أي تنزيلات جديدة",
"description": "Status bar tooltip; manager network icon"
},
"subfolder": {
"message": "المجلد الفرعي:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "ضَع الملفات في هذا المجلد الفرعي لدليل المجلدات في الجهاز",
"description": "placeholder text within an input box"
},
"title": {
"message": "العنوان",
"description": "Column text; Title label (short)"
@ -1166,5 +1292,9 @@
"useonlyonce": {
"message": "استعمله مرة واحدة",
"description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "ألغاها المستخدم",
"description": "Error message"
}
}

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! всички раздели",
"message": "TraitorousDownloading! всички раздели",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Запазване на изображението с DownThemAll!",
"message": "Запазване на изображението с TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Запазване на връзката с DownThemAll!",
"message": "Запазване на връзката с TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Запазване на медията с DownThemAll!",
"message": "Запазване на медията с TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Запазване на избраното с DownThemAll!",
"message": "Запазване на избраното с TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Бързо филтриране",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Диспечер",
"message": "TraitorousDownloading! Диспечер",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "До момента са добавени $DOWNLOADS$ изтегляния с DownThemAll! Като редовен потребител може да искате да обмислите дарение за подпомагане на по-нататъшното развитие. Благодаря!",
"message": "До момента са добавени $DOWNLOADS$ изтегляния с TraitorousDownloading! Като редовен потребител може да искате да обмислите дарение за подпомагане на по-нататъшното развитие. Благодаря!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! Предпочитания",
"message": "TraitorousDownloading! Предпочитания",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! бутон:",
"message": "TraitorousDownloading! бутон:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! избор",
"message": "TraitorousDownloading! избор",
"description": "label"
},
"pref_button_type_manager": {
@ -642,7 +642,7 @@
"description": "pref text"
},
"pref_retry_time": {
"message": "Опит на всеки (в минути)",
"message": "Нов опит на всеки (в минути)",
"description": "pref text"
},
"pref_show_urls": {
@ -657,6 +657,22 @@
"message": "Опит за намиране на връзки в текста на уебсайта (по-бавно)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Тема:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Тъмна",
"description": "option text"
},
"pref_theme_default": {
"message": "Системна/Браузър",
"description": "option text"
},
"pref_theme_light": {
"message": "Светла",
"description": "option text"
},
"pref_ui": {
"message": "Потребителски интерфейс",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! Избиране на изтегляния",
"message": "TraitorousDownloading! Избиране на изтегляния",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! добавяне на връзка",
"message": "TraitorousDownloading! добавяне на връзка",
"description": "Title of single window"
},
"sizeB": {

View File

@ -191,6 +191,22 @@
"message": "Smazat",
"description": "button text"
},
"deletefiles": {
"message": "Odstranit soubory",
"description": "menu action"
},
"deletefiles_button": {
"message": "Odstranit",
"description": "button text"
},
"deletefiles_text": {
"message": "Opravdu chcete odstranit následující soubory?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "Odstranit soubory",
"description": "messagebox title"
},
"description": {
"message": "Popis",
"description": "Description (keep it short); e.g. the description column in select"
@ -216,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Všechny záložky",
"message": "TraitorousDownloading! - Všechny záložky",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Stáhnout obrázek pomocí DownThemAll!",
"message": "Stáhnout obrázek pomocí TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Stáhnout odkaz pomocí DownThemAll!",
"message": "Stáhnout odkaz pomocí TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Stáhnout média pomocí DownThemAll!",
"message": "Stáhnout média pomocí TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Stáhnout vybrané pomocí DownThemAll!",
"message": "Stáhnout vybrané pomocí TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -275,13 +291,37 @@
"message": "Neplatná URL adresa",
"description": "Error message; single window"
},
"error_noabsolutepath": {
"message": "Absolutní formát cest pro podsložky není prohlížečem podporovaný",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "Tečky (.) v podsložkách nejsou prohlížečem podporované",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": {
"message": "Nic není vybráno",
"description": "Error Message; select window"
},
"export": {
"message": "Exportovat do souboru",
"description": "menu text"
},
"export_aria2": {
"message": "Exportovat jako seznam aria2",
"description": "menu text"
},
"export_metalink": {
"message": "Exportovat jako metalink",
"description": "menu text"
},
"export_text": {
"message": "Exportovat jako text",
"description": "menu text"
},
"extensionDescription": {
"message": "Správce stahování pro Váš prohlížeč",
"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": "TraitorousDownloading! 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": {
"message": "Rychlé filtrování",
@ -331,6 +371,10 @@
"message": "Vynutit spuštění",
"description": "Menu text"
},
"import": {
"message": "Importovat ze souboru",
"description": "menu text"
},
"information_title": {
"message": "Informace",
"description": "Used in message boxes"
@ -406,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Manažer",
"message": "TraitorousDownloading! Manažer",
"description": "Window/tab title"
},
"mask": {
@ -442,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Již bylo stáhnuto $DOWNLOADS$ souborů pomocí DownThemAll! Jako častý uživatel byste mohl/a podpořit další vývoj darem. Děkujeme!",
"message": "Již bylo stáhnuto $DOWNLOADS$ souborů pomocí TraitorousDownloading! Jako častý uživatel byste mohl/a podpořit další vývoj darem. Děkujeme!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -522,13 +566,33 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Nastavení DownThemAll!",
"message": "Nastavení TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
"message": "Přidávat nová stahování pozastavená",
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Tlačítko TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "TraitorousDownloading! selektor",
"description": "label"
},
"pref_button_type_manager": {
"message": "Otevřít Manažera",
"description": "label"
},
"pref_button_type_popup": {
"message": "Nabídka",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": {
"message": "Souběžná stahování",
"description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "Zobrazit oznámení po dokončení fronty stahování",
"description": "Preferences/General"
},
"pref_global_turbo": {
"message": "Tlačítho na liště je OneClick!",
"description": "Preferences/General"
},
"pref_hide_context": {
"message": "Nezobrazovat v kontextové nabídce",
"description": "Preferences/General"
@ -549,8 +609,12 @@
"message": "Manažer",
"description": "Preferences/General; group text"
},
"pref_manager_in_popup": {
"message": "Otevřít Manažera v novém vyskakovacím okně",
"description": "checkbox text"
},
"pref_manager_tooltip": {
"message": "Zobrazovat popisky v záložkách Manažeru",
"message": "Zobrazovat popisky v záložkách Manažera",
"description": "Preferences/General"
},
"pref_netglobal": {
@ -558,7 +622,7 @@
"description": "Preferences/General; group text"
},
"pref_open_manager_on_queue": {
"message": "Otevřít záložku Manažeru po zařazení stahování do fronty",
"message": "Otevřít záložku Manažera po zařazení stahování do fronty",
"description": "Preferences/General"
},
"pref_queueing": {
@ -573,14 +637,42 @@
"message": "Odebrat chybějící stahování po restartu",
"description": "Preferences/General"
},
"pref_retries": {
"message": "Počet pokusů o stažení při dočasných chybách",
"description": "pref text"
},
"pref_retry_time": {
"message": "Interval opakování (v minutách)",
"description": "pref text"
},
"pref_show_urls": {
"message": "Zobrazit URL adresy místo názvů souborů",
"description": "Preferences/General"
},
"pref_sounds": {
"message": "Přehrát zvuky",
"description": "checkbox text"
},
"pref_text_links": {
"message": "Vyhledat odkazy v textu stránky (pomalejší)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Motiv:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Tmavý",
"description": "option text"
},
"pref_theme_default": {
"message": "Systémový/Výchozí",
"description": "option text"
},
"pref_theme_light": {
"message": "Světlý",
"description": "option text"
},
"pref_ui": {
"message": "Uživatelské rozhraní",
"description": "Preferences/General; group text"
@ -895,6 +987,20 @@
"message": "Pokračovat",
"description": "Action for resuming a download"
},
"retrying": {
"message": "Opakuji",
"description": "Status text"
},
"retrying_error": {
"message": "Opakuji - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": {
"message": "Probíhá",
"description": "Status text"
@ -920,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Vyberte soubory ke stažení",
"message": "TraitorousDownloading! - Vyberte soubory ke stažení",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -943,6 +1049,18 @@
"message": "Nastavit masku přejmenování",
"description": "Menu text; select window"
},
"set_mask_text": {
"message": "Nastavte novou masku přejmenování",
"description": "dialog text"
},
"set_referrer": {
"message": "Nastavit odkázání",
"description": "menu text"
},
"set_referrer_text": {
"message": "Nastavit novou odkazující stránku",
"description": "dialog text"
},
"single_batchexamples": {
"message": "Jsou podporována dávková stahování, například:",
"description": "Header text; single window"
@ -952,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Přidat odkaz",
"message": "TraitorousDownloading! - Přidat odkaz",
"description": "Title of single window"
},
"sizeB": {
@ -1123,6 +1241,14 @@
"message": "Nová stahování nebudou spuštěna",
"description": "Status bar tooltip; manager network icon"
},
"subfolder": {
"message": "Podsložka:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "Umístí soubory v této podložce uvnitř vaší složky stahování",
"description": "placeholder text within an input box"
},
"title": {
"message": "Popisek",
"description": "Column text; Title label (short)"
@ -1166,5 +1292,9 @@
"useonlyonce": {
"message": "Použít pouze jednou",
"description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "Zrušeno uživatelem",
"description": "Error message"
}
}

View File

@ -80,7 +80,7 @@
"description": "Error message when an input field is empty but has to have a value"
},
"change_later_reminder": {
"message": "Du kan ændre denne indstillinger under Indstillinger senere",
"message": "Du kan altid ændre dette valg under indstillinger",
"description": "Checkbox label text for decision confirmations"
},
"check_selected_items": {
@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - alle faner",
"message": "TraitorousDownloading! - alle faner",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Gem billede med DownThemAll!",
"message": "Gem billede med TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Gem link med DownThemAll!",
"message": "Gem link med TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Gem medie med DownThemAll!",
"message": "Gem medie med TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Gem valgte med DownThemAll!",
"message": "Gem valgte med TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "\"The Mass Downloader\" til din 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": "TraitorousDownloading! 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": {
"message": "Hurtigfilter",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Manager",
"message": "TraitorousDownloading! Manager",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Du har tilføjet $DOWNLOADS$ downloads med DownThemAll! indtil videre! Som fast bruger kunne du evt. overveje en donation for at holde udviklingen kørende. Tak!",
"message": "Du har tilføjet $DOWNLOADS$ downloads med TraitorousDownloading! indtil videre! Som fast bruger kunne du evt. overveje en donation for at holde udviklingen kørende. Tak!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! indstillinger",
"message": "TraitorousDownloading! indstillinger",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! knap:",
"message": "TraitorousDownloading! knap:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! markering",
"message": "TraitorousDownloading! markering",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Forsøg at finde links via hjemmesidens tekstindhold (langsommere)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Tema",
"description": "label text"
},
"pref_theme_dark": {
"message": "Mørkt",
"description": "option text"
},
"pref_theme_default": {
"message": "System/browser",
"description": "option text"
},
"pref_theme_light": {
"message": "Lyst",
"description": "option text"
},
"pref_ui": {
"message": "Brugergrænseflade",
"description": "Preferences/General; group text"
@ -716,7 +732,7 @@
"description": "Action for removing complete downloads"
},
"remove_complete_downloads_question": {
"message": "Vil du rydde alle færdiggjorte downloads?",
"message": "Vil du rydde op i alle færdiggjorte downloads?",
"description": "Messagebox text"
},
"remove_complete_filter_downloads_question": {
@ -770,7 +786,7 @@
"description": "Menu text"
},
"remove_downloads_title": {
"message": "Er du sikker på, du vil rydde downloads?",
"message": "Er du sikker på, du vil rydde op i downloads?",
"description": "Messagebox title; manager"
},
"remove_download_question": {
@ -800,7 +816,7 @@
"description": "Menu text"
},
"remove_missing_downloads_question": {
"message": "Vil du rydde alle manglende downloads?",
"message": "Vil du rydde op i alle manglende downloads?",
"description": "Messagebox text"
},
"remove_paused_downloads": {
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - vælg dine downloads",
"message": "TraitorousDownloading! - vælg dine downloads",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - tilføj et link",
"message": "TraitorousDownloading! - tilføj et link",
"description": "Title of single window"
},
"sizeB": {

View File

@ -1,7 +1,7 @@
{
"language": {
"message": "Deutsch",
"description": "Lanuage Name in your language"
"description": "Language Name in your language"
},
"language_code": {
"message": "de",
@ -24,7 +24,7 @@
"description": "Checkbox label"
},
"add_paused_question": {
"message": "Soll sich diese Entscheidung gemerkt werden und neue Downloads von jetzt an immer pausiert hinzugefügt werden?",
"message": "Diese Entscheidung speichern und neue Downloads von jetzt an immer pausiert hinzufügen?",
"description": "Messagebox text"
},
"add_paused_title": {
@ -52,15 +52,15 @@
"description": "Messagebox info text for batch confirmations"
},
"batch_question": {
"message": "Als Batch oder einfachen Download hinzufügen?",
"message": "Als Batch oder als einfachen Download hinzufügen?",
"description": "Messagebox info text for batch confirmations"
},
"batch_single": {
"message": "Einfacher Download",
"message": "Einzelner Download",
"description": "Button text for batch confirmation"
},
"batch_title": {
"message": "Batch Download",
"message": "Batch",
"description": "Messagebox title for batch confirmations"
},
"cancel": {
@ -84,7 +84,7 @@
"description": "Checkbox label text for decision confirmations"
},
"check_selected_items": {
"message": "Ausgewählte Einträge markieren",
"message": "markierte Einträge auswählen",
"description": "Menu text"
},
"colConnections": {
@ -228,31 +228,31 @@
"description": "Download (noun); e.g. Download column in select"
},
"download_verb": {
"message": "Download",
"message": "Herunterladen",
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Alle Tabs",
"message": "TraitorousDownloading! - Alle Tabs",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Bild mit DownThemAll! speichern",
"message": "Bild mit TraitorousDownloading! speichern",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Link mit DownThemAll! speichern",
"message": "Link mit TraitorousDownloading! speichern",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Medium mit DownThemAll! speichern",
"message": "Medium mit TraitorousDownloading! speichern",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Auswahl mit DownThemAll! speichern",
"message": "Auswahl mit TraitorousDownloading! speichern",
"description": "Menu text"
},
"dta_turbo": {
@ -321,14 +321,14 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Schnelles Filtern",
"description": "Label for Fast Filtering input"
},
"fastfilter_placeholder": {
"message": "Platzhalter-Ausdruck oder Regular Expression",
"message": "Platzhalter-Ausdruck oder regulärer Ausdruck",
"description": "Placeholder for fastfilter inputs"
},
"FILE_FAILED": {
@ -348,11 +348,11 @@
"description": "Message box label"
},
"filter_label": {
"message": "Filter-Titel",
"message": "Filter-Bezeichnung",
"description": "Message box label"
},
"filter_types": {
"message": "Filter Typen",
"message": "Filter-Typen",
"description": "Message box label"
},
"filter_type_link": {
@ -360,11 +360,11 @@
"description": "Message box checkbox label"
},
"filter_type_media": {
"message": "Medien Filter",
"message": "Medien-Filter",
"description": "Message box checkbox label"
},
"finishing": {
"message": "Beenden",
"message": "Beende",
"description": "Status text"
},
"force_start": {
@ -416,7 +416,7 @@
"description": "Short for PageUp-key"
},
"limited_to": {
"message": "Begrenzt auf",
"message": "Begrenzen auf",
"description": "Label text; used in prefs/network"
},
"links": {
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Manager",
"message": "TraitorousDownloading! Manager",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"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!",
"message": "Sie haben bisher $DOWNLOADS$ Downloads mit TraitorousDownloading! 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",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! Einstellungen",
"message": "TraitorousDownloading! Einstellungen",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! Button:",
"message": "TraitorousDownloading! Button:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! Auswahl",
"message": "TraitorousDownloading! Auswahl",
"description": "label"
},
"pref_button_type_manager": {
@ -614,7 +614,7 @@
"description": "checkbox text"
},
"pref_manager_tooltip": {
"message": "Keine Tooltips im Manager-Tab anzeigen",
"message": "Tooltips im Manager-Tab anzeigen",
"description": "Preferences/General"
},
"pref_netglobal": {
@ -622,7 +622,7 @@
"description": "Preferences/General; group text"
},
"pref_open_manager_on_queue": {
"message": "Den Manager öffnen nachdem neue Downloads zur Warteschlange hinzugefügt wurden",
"message": "Den Manager öffnen, nachdem neue Downloads zur Warteschlange hinzugefügt wurden",
"description": "Preferences/General"
},
"pref_queueing": {
@ -642,7 +642,7 @@
"description": "pref text"
},
"pref_retry_time": {
"message": "Neuversuch Alle (in Minuten)",
"message": "Erneut versuchen alle (in Minuten)",
"description": "pref text"
},
"pref_show_urls": {
@ -650,13 +650,29 @@
"description": "Preferences/General"
},
"pref_sounds": {
"message": "Sounds abspielen",
"message": "Töne abspielen",
"description": "checkbox text"
},
"pref_text_links": {
"message": "Versuche Text-Links in Webseiten zu finden (langsamer)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Farbschema:",
"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": {
"message": "Benutzeroberfläche",
"description": "Preferences/General; group text"
@ -708,7 +724,7 @@
"description": "Menu text"
},
"remove_batch_downloads_question": {
"message": "Wirklich alle Downloads vom aktuellen Batch entfernen?",
"message": "Wirklich alle Downloads des aktuellen Batch entfernen?",
"description": "Messagebox text"
},
"remove_complete_downloads": {
@ -738,7 +754,7 @@
"description": "Menu text"
},
"remove_domain_complete_downloads_question": {
"message": "Wirklich alle fertigen Downloads mit Domain \"$DOMAIN$\" entfernen?",
"message": "Wirklich alle fertigen Downloads der Domain \"$DOMAIN$\" entfernen?",
"description": "Messagebox text",
"placeholders": {
"domain": {
@ -752,7 +768,7 @@
"description": "Menu text"
},
"remove_domain_downloads_question": {
"message": "Wirklich alle Downloads mit Domain \"$DOMAIN$\" entfernen?",
"message": "Wirklich alle Downloads der Domain \"$DOMAIN$\" entfernen?",
"description": "Messagebox text",
"placeholders": {
"domain": {
@ -796,11 +812,11 @@
}
},
"remove_missing": {
"message": "Fehlende Downloads entfernen",
"message": "Nicht vorhandene Downloads entfernen",
"description": "Menu text"
},
"remove_missing_downloads_question": {
"message": "Wirklich alle fehlenden Downloads entfernen?",
"message": "Wirklich alle nicht vorhandene Downloads entfernen?",
"description": "Messagebox text"
},
"remove_paused_downloads": {
@ -828,15 +844,15 @@
"description": "UI for renaming; currently unused"
},
"renamer_batch": {
"message": "Batch Nummer",
"message": "Batch-Nummer",
"description": "Mask text; see mask button"
},
"renamer_d": {
"message": "Datum hinzugefügt - Tag",
"message": "Datum: hinzugefügt - Tag",
"description": "Mask text; see mask button"
},
"renamer_date": {
"message": "Datum hinzugefügt",
"message": "Datum: hinzugefügt",
"description": "Mask text; see mask button"
},
"renamer_domain": {
@ -848,7 +864,7 @@
"description": "Mask text; see mask button"
},
"renamer_hh": {
"message": "Datum hinzugefügt - Stunde",
"message": "Datum: hinzugefügt - Stunde",
"description": "Mask text; see mask button"
},
"renamer_host": {
@ -856,7 +872,7 @@
"description": "Mask text; see mask button"
},
"renamer_idx": {
"message": "Fortlaufende Nummer im Batch",
"message": "Fortlaufende Nummer des Batch",
"description": "Mask text; see mask button"
},
"renamer_info": {
@ -864,11 +880,11 @@
"description": "Mask text; see mask button; do NOT translate any mentions of \"flat\"!"
},
"renamer_m": {
"message": "Datum hinzugefügt - Monat",
"message": "Datum: hinzugefügt - Monat",
"description": "Mask text; see mask button"
},
"renamer_mm": {
"message": "Datum hinzugefügt - Minute",
"message": "Datum: hinzugefügt - Minute",
"description": "Mask text; see mask button"
},
"renamer_name": {
@ -876,7 +892,7 @@
"description": "Mask text; see mask button"
},
"renamer_num": {
"message": "Alias für \"batch\"",
"message": "Alias für \"Batch\"",
"description": "Mask text; see mask button"
},
"renamer_qstring": {
@ -916,7 +932,7 @@
"description": "Mask text; see mask button"
},
"renamer_ss": {
"message": "Datum hinzugefügt - Sekunde",
"message": "Datum: hinzugefügt - Sekunde",
"description": "Mask text; see mask button"
},
"renamer_subdirs": {
@ -940,7 +956,7 @@
"description": "Mask text; see mask button"
},
"renamer_y": {
"message": "Datum hinzugefügt - Jahr",
"message": "Datum: hinzugefügt - Jahr",
"description": "Mask text; see mask button"
},
"renmask": {
@ -960,11 +976,11 @@
"description": "Messagebox text; pref/General"
},
"reset_layouts": {
"message": "Benutzeroberflächenanpassungen zurücksetzen",
"message": "Änderungen der Benutzeroberfläche zurücksetzen",
"description": "Button text; pref/General"
},
"reset_layouts_done": {
"message": "Alle gemerkten Benutzeroberflächenanpassungen zurückgesetzt! Tabs/Fenster müssen neu geladen werden.",
"message": "Alle gemerkten Anpassungen der Benutzeroberfläche zurückgesetzt! Tabs/Fenster müssen neu geladen werden.",
"description": "Messagebox text; pref/General"
},
"resume_download": {
@ -972,7 +988,7 @@
"description": "Action for resuming a download"
},
"retrying": {
"message": "Neuversuch",
"message": "neuer Versuch",
"description": "Status text"
},
"retrying_error": {
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Downloads auswählen",
"message": "TraitorousDownloading! - Downloads auswählen",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1030,23 +1046,23 @@
"description": "Error message"
},
"set_mask": {
"message": "Umbenennungsmaske setzen",
"message": "Umbenennungsmaske festlegen",
"description": "Menu text; select window"
},
"set_mask_text": {
"message": "Neue Umbenennungsmaske setzen",
"message": "Neue Umbenennungsmaske festlegen",
"description": "dialog text"
},
"set_referrer": {
"message": "Referrer setzen",
"message": "Referrer festlegen",
"description": "menu text"
},
"set_referrer_text": {
"message": "Neuen Referrer setzen",
"message": "Neuen Referrer festlegen",
"description": "dialog text"
},
"single_batchexamples": {
"message": "Batches sind unterstützt, z.B.:",
"message": "Stapelverarbeitung (Batch) wird unterstützt, z.B.:",
"description": "Header text; single window"
},
"single_header": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Link hinzufügen",
"message": "TraitorousDownloading! - Link hinzufügen",
"description": "Title of single window"
},
"sizeB": {

View File

@ -305,7 +305,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Γρήγορο Φιλτράρισμα",

View File

@ -253,27 +253,27 @@
},
"dta_regular": {
"description": "Regular dta action; Menu text",
"message": "DownThemAll!"
"message": "TraitorousDownloading!"
},
"dta_regular_all": {
"description": "Menu text",
"message": "DownThemAll! - All Tabs"
"message": "TraitorousDownloading! - All Tabs"
},
"dta_regular_image": {
"description": "Menu text",
"message": "Save Image with DownThemAll!"
"message": "Save Image with TraitorousDownloading!"
},
"dta_regular_link": {
"description": "Menu text",
"message": "Save Link with DownThemAll!"
"message": "Save Link with TraitorousDownloading!"
},
"dta_regular_media": {
"description": "Menu text",
"message": "Save Media with DownThemAll!"
"message": "Save Media with TraitorousDownloading!"
},
"dta_regular_selection": {
"description": "Menu text",
"message": "Save Selection with DownThemAll!"
"message": "Save Selection with TraitorousDownloading!"
},
"dta_turbo": {
"description": "OneClick! action; Menu text",
@ -303,6 +303,10 @@
"description": "Error message; single/select window",
"message": "Invalid Renaming Mask"
},
"error_invalidServer": {
"description": "Error message; single/select window",
"message": "Invalid server URL"
},
"error_invalidReferrer": {
"description": "Error message; single window",
"message": "Invalid Referrer"
@ -340,7 +344,7 @@
"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",
"description": "TraitorousDownloading! 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": {
@ -475,7 +479,7 @@
},
"manager_title": {
"description": "Window/tab title",
"message": "DownThemAll! Manager"
"message": "TraitorousDownloading! Manager"
},
"mask": {
"description": "Renaming mask (short); used in e.g. select",
@ -511,7 +515,7 @@
},
"nagging_message": {
"description": "Donation nagging message; displayed as a notification bar in manager",
"message": "You've added $DOWNLOADS$ downloads with DownThemAll! so far! As a regular user you might want to consider a donation to support further development. Thanks!",
"message": "You've added $DOWNLOADS$ downloads with TraitorousDownloading! so far! As a regular user you might want to consider a donation to support further development. Thanks!",
"placeholders": {
"downloads": {
"content": "$1",
@ -583,11 +587,11 @@
},
"pref_button_type": {
"description": "label",
"message": "DownThemAll! button:"
"message": "TraitorousDownloading! button:"
},
"pref_button_type_dta": {
"description": "label",
"message": "DownThemAll! selection"
"message": "TraitorousDownloading! selection"
},
"pref_button_type_manager": {
"description": "label",
@ -633,6 +637,10 @@
"description": "Preferences/General",
"message": "Open the Manager tab after queuing some downloads"
},
"pref_cookies": {
"description": "Preferences/General",
"message": "Send cookies to the download server"
},
"pref_queue_notification": {
"description": "Preferences/General",
"message": "Show a notification when queuing new downloads"
@ -665,6 +673,22 @@
"description": "Preferences/General",
"message": "Try to find links in the website text (slower)"
},
"pref_theme": {
"description": "label text",
"message": "Theme:"
},
"pref_theme_dark": {
"description": "option text",
"message": "Dark"
},
"pref_theme_default": {
"description": "option text",
"message": "System/Browser"
},
"pref_theme_light": {
"description": "option text",
"message": "Light"
},
"pref_ui": {
"description": "Preferences/General; group text",
"message": "User Interface"
@ -679,7 +703,7 @@
},
"prefs_title": {
"description": "Window/tab title; Preferences",
"message": "DownThemAll! Preferences"
"message": "TraitorousDownloading! Preferences"
},
"queue_finished": {
"description": "Notification text",
@ -705,7 +729,7 @@
},
"referrer": {
"description": "Label for \"Referrer\"",
"message": "Referrer"
"message": "Referrer (Not implemented)"
},
"remember": {
"description": "Checkbox text for confirmation, e.g. when removing a download in manager",
@ -905,7 +929,7 @@
},
"renamer_ref": {
"description": "Mask text; see mask button",
"message": "Referrer"
"message": "Referrer (Not implemented)"
},
"renamer_refdomain": {
"description": "Mask text; see mask button",
@ -1031,7 +1055,11 @@
},
"select_title": {
"description": "Title of the select window",
"message": "DownThemAll! - Select your Downloads"
"message": "TraitorousDownloading! - Select your Downloads"
},
"server": {
"description": "Downloader Server",
"message": "Server"
},
"set_mask": {
"description": "Menu text; select window",
@ -1059,7 +1087,7 @@
},
"single_title": {
"description": "Title of single window",
"message": "DownThemAll! - Add a link"
"message": "TraitorousDownloading! - Add a link"
},
"sizeB": {
"description": "Size formatting; bytes",
@ -1280,5 +1308,9 @@
"useonlyonce": {
"description": "Label for Use-Once checkboxes",
"message": "Use Once"
},
"cookies": {
"description": "Label for cookie checkboxes",
"message": "Send cookies to server"
}
}

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Todas las pestañas",
"message": "TraitorousDownloading! - Todas las pestañas",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Guardar imagen con DownThemAll!",
"message": "Guardar imagen con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Guardar enlace con DownThemAll!",
"message": "Guardar enlace con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Guardar multimedia con DownThemAll!",
"message": "Guardar multimedia con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Guardar selección con DownThemAll!",
"message": "Guardar selección con TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "El programa de descargas masivas para su navegador",
"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": "TraitorousDownloading! 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": {
"message": "Filtro rápido",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "Gestor DownThemAll!",
"message": "Gestor TraitorousDownloading!",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "¡Ha añadido $DOWNLOADS$ descargas con DownThemAll! hasta el momento! Al ser un usuario habitual quizás podría plantearse hacer una donación para apoyar el futuro desarrollo del proyecto. ¡Gracias!",
"message": "¡Ha añadido $DOWNLOADS$ descargas con TraitorousDownloading! hasta el momento! Al ser un usuario habitual quizás podría plantearse hacer una donación para apoyar el futuro desarrollo del proyecto. ¡Gracias!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferencias de DownThemAll!",
"message": "Preferencias de TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Botón DownThemAll!:",
"message": "Botón TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Selección DownThemAll!",
"message": "Selección TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Intentar buscar enlaces en el texto del sitio web (más lento)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Oscuro",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistema/Navegador",
"description": "option text"
},
"pref_theme_light": {
"message": "Claro",
"description": "option text"
},
"pref_ui": {
"message": "Interfaz de usuario",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Seleccionar sus descargas",
"message": "TraitorousDownloading! - Seleccionar sus descargas",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Añadir un enlace",
"message": "TraitorousDownloading! - Añadir un enlace",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Kõik kaardid",
"message": "TraitorousDownloading! - Kõik kaardid",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Salvesta pilt DownThemAll!-iga",
"message": "Salvesta pilt TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Salvesta link DownThemAll!-iga",
"message": "Salvesta link TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Salvesta meedia DownThemAll!-iga",
"message": "Salvesta meedia TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Salvesta valik DownThemAll!-iga",
"message": "Salvesta valik TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Massallalaadija sinu veebilehitsejale",
"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": "TraitorousDownloading! 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": {
"message": "Kiirfiltreerimine",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! haldur",
"message": "TraitorousDownloading! haldur",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Sa oled praeguseks DownThemAll!-iga lisanud $DOWNLOADS$ allalaadimist! Tavakasutajana võiksid edasise arendamise toetamiseks kaaluda annetamist. Täname!",
"message": "Sa oled praeguseks TraitorousDownloading!-iga lisanud $DOWNLOADS$ allalaadimist! Tavakasutajana võiksid edasise arendamise toetamiseks kaaluda annetamist. Täname!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! eelistused",
"message": "TraitorousDownloading! eelistused",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! nupp:",
"message": "TraitorousDownloading! nupp:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! valik",
"message": "TraitorousDownloading! valik",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Ürita leida linke veebisaidi tekstist (aeglasem)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Teema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Tume",
"description": "option text"
},
"pref_theme_default": {
"message": "Süsteem/Veebilehitseja",
"description": "option text"
},
"pref_theme_light": {
"message": "Hele",
"description": "option text"
},
"pref_ui": {
"message": "Kasutajaliides",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Vali oma allalaadimised",
"message": "TraitorousDownloading! - Vali oma allalaadimised",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Lingi lisamine",
"message": "TraitorousDownloading! - Lingi lisamine",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Tous les onglets",
"message": "TraitorousDownloading! - Tous les onglets",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Enregistrer l'image avec DownThemAll!",
"message": "Enregistrer l'image avec TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Enregistrer le lien avec DownThemAll!",
"message": "Enregistrer le lien avec TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Enregistrer le média avec DownThemAll!",
"message": "Enregistrer le média avec TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Enregistrer la sélection avec DownThemAll!",
"message": "Enregistrer la sélection avec TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Le gestionnaire de téléchargements pour votre navigateur",
"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": "TraitorousDownloading! 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": {
"message": "Filtrage rapide",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Gestionnaire",
"message": "TraitorousDownloading! Gestionnaire",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Vous avez utilisé DownThemAll! pour $DOWNLOADS$ téléchargements jusqu'à présent! En tant qu'utilisateur régulier, peut-être voudriez-vous faire un don pour supporter les versions futures. Merci!",
"message": "Vous avez utilisé TraitorousDownloading! pour $DOWNLOADS$ téléchargements jusqu'à présent! En tant qu'utilisateur régulier, peut-être voudriez-vous faire un don pour supporter les versions futures. Merci!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Paramètres DownThemAll!",
"message": "Paramètres TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Bouton DownThemAll!",
"message": "Bouton TraitorousDownloading!",
"description": "label"
},
"pref_button_type_dta": {
"message": "Sélection DownthemAll!",
"message": "Sélection TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Tenter de trouver des liens dans le texte du site (lent)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Thème:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Sombre",
"description": "option text"
},
"pref_theme_default": {
"message": "Système/Navigateur",
"description": "option text"
},
"pref_theme_light": {
"message": "Clair",
"description": "option text"
},
"pref_ui": {
"message": "Interface utilisateur",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Selectionner vos téléchargements",
"message": "TraitorousDownloading! - Selectionner vos téléchargements",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Ajouter un lien",
"message": "TraitorousDownloading! - Ajouter un lien",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Összes lap",
"message": "TraitorousDownloading! - Összes lap",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Kép mentése a DownThemAll-al!",
"message": "Kép mentése a TraitorousDownloading-al!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Hivatkozás mentése DownThemAll-al",
"message": "Hivatkozás mentése TraitorousDownloading-al",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Média mentése DownThemAll-al",
"message": "Média mentése TraitorousDownloading-al",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Kiválasztás mentése DownThemAll-al",
"message": "Kiválasztás mentése TraitorousDownloading-al",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Gyors szűrés",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! kezelő",
"message": "TraitorousDownloading! kezelő",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Eddig $DOWNLOADS$ letöltést adtál hozzá a DownThemAll!-hoz! Gyakori felhasználóként megfontolhatnád a további fejlesztés támogatását. Köszönöm!",
"message": "Eddig $DOWNLOADS$ letöltést adtál hozzá a TraitorousDownloading!-hoz! Gyakori felhasználóként megfontolhatnád a további fejlesztés támogatását. Köszönöm!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! beállításai",
"message": "TraitorousDownloading! beállításai",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll gomb:",
"message": "TraitorousDownloading gomb:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll választás",
"message": "TraitorousDownloading választás",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Keress hivatkozásokat a honlap szövegében (lassabb)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Téma:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Sötét",
"description": "option text"
},
"pref_theme_default": {
"message": "Rendszer/Böngésző",
"description": "option text"
},
"pref_theme_light": {
"message": "Világos",
"description": "option text"
},
"pref_ui": {
"message": "Felhasználói felület",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Válaszd ki a letöltéseidet",
"message": "TraitorousDownloading! - Válaszd ki a letöltéseidet",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Adj hozzá egy hivatkozást",
"message": "TraitorousDownloading! - Adj hozzá egy hivatkozást",
"description": "Title of single window"
},
"sizeB": {

View File

@ -216,23 +216,23 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular_all": {
"message": "DownThemAll - Semua Tab",
"message": "TraitorousDownloading - Semua Tab",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Simpan Gambar menggunakan DownThemAll!",
"message": "Simpan Gambar menggunakan TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Simpan Tautan menggunakan DownThemAll!",
"message": "Simpan Tautan menggunakan TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Simpan Media menggunakan DownThemAll!",
"message": "Simpan Media menggunakan TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Simpan Pilihan menggunakan DownThemAll!",
"message": "Simpan Pilihan menggunakan TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo_all": {
@ -297,7 +297,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Penyaringan Cepat",
@ -398,7 +398,7 @@
}
},
"manager_title": {
"message": "Pengelola DownThemAll!",
"message": "Pengelola TraitorousDownloading!",
"description": "Window/tab title"
},
"mask_default": {
@ -426,7 +426,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Sejauh ini Anda telah menambahkan $DOWNLOADS$ unduhan menggunakan DownThemAll! Sebagai penggunan setia, silakan berdonasi untuk mendukung pengembangan lebih lanjut. Terima Kasih!",
"message": "Sejauh ini Anda telah menambahkan $DOWNLOADS$ unduhan menggunakan TraitorousDownloading! Sebagai penggunan setia, silakan berdonasi untuk mendukung pengembangan lebih lanjut. Terima Kasih!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -498,7 +498,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferensi DownThemAll!",
"message": "Preferensi TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -506,11 +506,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Tombol DownThemAll!:",
"message": "Tombol TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Pilihan DownThemAll!",
"message": "Pilihan TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -926,7 +926,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Pilih Unduhan Anda",
"message": "TraitorousDownloading! - Pilih Unduhan Anda",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -970,7 +970,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Tambah tautan",
"message": "TraitorousDownloading! - Tambah tautan",
"description": "Title of single window"
},
"sizes_huge": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Tutte le schede",
"message": "TraitorousDownloading! - Tutte le schede",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Salva immagine con DownThemAll!",
"message": "Salva immagine con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Salva link con DownThemAll!",
"message": "Salva link con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Salva media con DownThemAll!",
"message": "Salva media con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Salva selezione con DownThemAll!",
"message": "Salva selezione con TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Filtro Rapido",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Manager",
"message": "TraitorousDownloading! Manager",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"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 TraitorousDownloading! Come utente abituale potresti considerare una donazione per supportare lo sviluppo. Grazie!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferenze di DownThemAll!",
"message": "Preferenze di TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Pulsante DownThemAll!:",
"message": "Pulsante TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Selezione DownThemAll!",
"message": "Selezione TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -1010,7 +1010,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Seleziona i tuoi download",
"message": "TraitorousDownloading! - Seleziona i tuoi download",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1054,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Aggiungi un link",
"message": "TraitorousDownloading! - Aggiungi un link",
"description": "Title of single window"
},
"sizeB": {

View File

@ -8,7 +8,7 @@
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR"
},
"addpaused": {
"message": "一時停止状態で追加",
"message": "待機状態で追加",
"description": "Action: Add paused"
},
"add_download": {
@ -20,15 +20,15 @@
"description": "Button text (adding filters, limits and such)"
},
"add_paused_once": {
"message": "今回は一時停止で追加",
"message": "今回は待機状態で追加",
"description": "Checkbox label"
},
"add_paused_question": {
"message": "この決定を覚えて、今後新しいダウンロードを常に一時停止で追加しますか?",
"message": "この決定を覚えて、今後新しいダウンロードを常に待機状態で追加しますか?",
"description": "Messagebox text"
},
"add_paused_title": {
"message": "常に一時停止で追加しますか?",
"message": "常に待機状態で追加しますか?",
"description": "Title for the add-paused dialog"
},
"ask_again_later": {
@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - 全てのタブ",
"message": "TraitorousDownloading! - 全てのタブ",
"description": "Menu text"
},
"dta_regular_image": {
"message": "画像をDownThemAll! で保存する",
"message": "画像をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_link": {
"message": "リンク先をDownThemAll! で保存する",
"message": "リンク先をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_media": {
"message": "メディアをDownThemAll! で保存する",
"message": "メディアをTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "選択項目をDownThemAll! で保存する",
"message": "選択項目をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "高速フィルタリング",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! マネージャ",
"message": "TraitorousDownloading! マネージャ",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "これまでDownThemAllで$DOWNLOADS$ダウンロードを追加しました! 通常のユーザーとして、さらなる開発を支援するために寄付を検討することができます。 皆様のご協力、心よりお待ち致しております。",
"message": "これまでTraitorousDownloadingで$DOWNLOADS$ダウンロードを追加しました! 通常のユーザーとして、さらなる開発を支援するために寄付を検討することができます。 皆様のご協力、心よりお待ち致しております。",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,31 +566,31 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! 設定",
"message": "TraitorousDownloading! 設定",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
"message": "すぐに開始せず、新しいダウンロードを一時停止状態で追加する",
"message": "すぐに開始せず、新しいダウンロードを待機状態で追加する",
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! アイコンクリック時:",
"message": "TraitorousDownloading! アイコンクリック時:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 選択画面",
"message": "ダウンロード選択画面",
"description": "label"
},
"pref_button_type_manager": {
"message": "マネージャを開く",
"message": "マネージャを開く",
"description": "label"
},
"pref_button_type_popup": {
"message": "メニュー展開",
"message": "メニュー展開",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick! ダウンロード",
"message": "OneClick! ダウンロード",
"description": "label"
},
"pref_concurrent_downloads": {
@ -654,9 +654,25 @@
"description": "checkbox text"
},
"pref_text_links": {
"message": "Webサイトの文字列リンクを見つけてみる (但し、遅い)",
"message": "Webサイトの文字列からリンクを抽出する (但し、遅い)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "テーマ:",
"description": "label text"
},
"pref_theme_dark": {
"message": "ダーク",
"description": "option text"
},
"pref_theme_default": {
"message": "システム/ブラウザのテーマ",
"description": "option text"
},
"pref_theme_light": {
"message": "ライト",
"description": "option text"
},
"pref_ui": {
"message": "ユーザーインターフェイス",
"description": "Preferences/General; group text"
@ -820,7 +836,7 @@
"description": "Messagebox text"
},
"remove_selected_downloads": {
"message": "選択を削除",
"message": "選択した項目を削除",
"description": "Menu text"
},
"rename": {
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - ダウンロードの選択",
"message": "TraitorousDownloading! - ダウンロードの選択",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - リンクを追加",
"message": "TraitorousDownloading! - リンクを追加",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - 모든 탭",
"message": "TraitorousDownloading! - 모든 탭",
"description": "Menu text"
},
"dta_regular_image": {
"message": "이미지를 DownThemAll!로 저장",
"message": "이미지를 TraitorousDownloading!로 저장",
"description": "Menu text"
},
"dta_regular_link": {
"message": "링크를 DownThemAll!로 저장",
"message": "링크를 TraitorousDownloading!로 저장",
"description": "Menu text"
},
"dta_regular_media": {
"message": "미디어를 DownThemAll!로 저장",
"message": "미디어를 TraitorousDownloading!로 저장",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "선택영역을 DownThemAll!로 저장",
"message": "선택영역을 TraitorousDownloading!로 저장",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "빠른 필터링",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! 관리자",
"message": "TraitorousDownloading! 관리자",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "지금까지 DownThemAll!로 $DOWNLOADS$ 다운로드를 추가하셨습니다. 일반 사용자로서 추가 개발을 지원하기 위해 기부를 고려할 수 있습니다. 감사합니다!",
"message": "지금까지 TraitorousDownloading!로 $DOWNLOADS$ 다운로드를 추가하셨습니다. 일반 사용자로서 추가 개발을 지원하기 위해 기부를 고려할 수 있습니다. 감사합니다!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! 설정",
"message": "TraitorousDownloading! 설정",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! 버튼:",
"message": "TraitorousDownloading! 버튼:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 선택",
"message": "TraitorousDownloading! 선택",
"description": "label"
},
"pref_button_type_manager": {
@ -1010,7 +1010,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - 다운로드 선택",
"message": "TraitorousDownloading! - 다운로드 선택",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1054,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - 링크 추가",
"message": "TraitorousDownloading! - 링크 추가",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Visoms kortelėms",
"message": "TraitorousDownloading! - Visoms kortelėms",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Išsaugoti vaizdą su DownThemAll!",
"message": "Išsaugoti vaizdą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Išsaugoti nuorodą su DownThemAll!",
"message": "Išsaugoti nuorodą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Išsaugoti media su DownThemAll!",
"message": "Išsaugoti media su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Išsaugoti pažymėtą su DownThemAll!",
"message": "Išsaugoti pažymėtą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Masinio parsisiuntimo programa jūsų naršyklėje",
"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": "TraitorousDownloading! 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": {
"message": "Greitas filtravimas",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! menedžeris",
"message": "TraitorousDownloading! menedžeris",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Iki šiol, naudodami DownThemAll!, pridėjote $DOWNLOADS$ parsisiuntimų! Kaip paprastas vartotojas, galbūt norėsite apsvarstyti galimybę paaukoti tolimesnei plėtrai. Ačiū!",
"message": "Iki šiol, naudodami TraitorousDownloading!, pridėjote $DOWNLOADS$ parsisiuntimų! Kaip paprastas vartotojas, galbūt norėsite apsvarstyti galimybę paaukoti tolimesnei plėtrai. Ačiū!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! nuostatos",
"message": "TraitorousDownloading! nuostatos",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! mygtukas:",
"message": "TraitorousDownloading! mygtukas:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! pasirinkimas",
"message": "TraitorousDownloading! pasirinkimas",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Bandyti tinklalapio tekste rasti nuorodas (lėčiau)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Tamsi",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistemos/Naršyklės",
"description": "option text"
},
"pref_theme_light": {
"message": "Šviesi",
"description": "option text"
},
"pref_ui": {
"message": "Naudotojo sąsaja",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Pasirinkite parsisiuntimus",
"message": "TraitorousDownloading! - Pasirinkite parsisiuntimus",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Pridėti nuorodą",
"message": "TraitorousDownloading! - Pridėti nuorodą",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Alle Tabbladen",
"message": "TraitorousDownloading! - Alle Tabbladen",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Afbeelding opslaan met DownThemAll!",
"message": "Afbeelding opslaan met TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Link opslaan met DownThemAll!",
"message": "Link opslaan met TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Media opslaan met DownThemAll!",
"message": "Media opslaan met TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Selectie opslaan met DownThemAll!",
"message": "Selectie opslaan met TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "De bulkdownloader voor uw 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": "TraitorousDownloading! 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": {
"message": "Snel filteren",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! beheerder",
"message": "TraitorousDownloading! beheerder",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "U heeft al $DOWNLOADS$ downloads toegevoegd met DownThemAll! Als regelmatige gebruiker wilt u wellicht een donatie overwegen om verdere ontwikkeling te ondersteunen. Alvast bedankt!",
"message": "U heeft al $DOWNLOADS$ downloads toegevoegd met TraitorousDownloading! Als regelmatige gebruiker wilt u wellicht een donatie overwegen om verdere ontwikkeling te ondersteunen. Alvast bedankt!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! voorkeuren",
"message": "TraitorousDownloading! voorkeuren",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! knop:",
"message": "TraitorousDownloading! knop:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! selectie",
"message": "TraitorousDownloading! selectie",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Probeer links te vinden in de tekst van de website (langzamer)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Thema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Donker",
"description": "option text"
},
"pref_theme_default": {
"message": "Systeem/Browser",
"description": "option text"
},
"pref_theme_light": {
"message": "Licht",
"description": "option text"
},
"pref_ui": {
"message": "Gebruikersinterface",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Selecteer uw Downloads",
"message": "TraitorousDownloading! - Selecteer uw Downloads",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Link toevoegen",
"message": "TraitorousDownloading! - Link toevoegen",
"description": "Title of single window"
},
"sizeB": {

View File

@ -156,7 +156,7 @@
"description": "Filter label for the Archives filter"
},
"deffilter_aud": {
"message": "Audio (mp3, flac, wav, …)",
"message": "Dźwięk (mp3, flac, wav, …)",
"description": "Filter label for the Audio filter"
},
"deffilter_bin": {
@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Wszystkie zakładki",
"message": "TraitorousDownloading! - Wszystkie zakładki",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Zapisz Obraz z DownThemAll!",
"message": "Zapisz Obraz z TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Zapisz Link z DownThemAll!",
"message": "Zapisz Link z TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Zapisz Multimedia z DownThemAll!",
"message": "Zapisz Multimedia z TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Zapisz wybór z DownThemAll!",
"message": "Zapisz wybór z TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Narzędzie do zbiorowego pobierania dla Twojej przeglądarki",
"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": "TraitorousDownloading! 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": {
"message": "Szybkie filtrowanie",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "Menedżer DownThemAll!",
"message": "Menedżer TraitorousDownloading!",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Dodałeś do tej pory $DOWNLOADS$ pobrań z DownThemAll! Jako stały użytkownik możesz rozważyć darowiznę na wsparcie dalszego rozwoju. Dzięki!",
"message": "Dodałeś do tej pory $DOWNLOADS$ pobrań z TraitorousDownloading! Jako stały użytkownik możesz rozważyć darowiznę na wsparcie dalszego rozwoju. Dzięki!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Ustawienia DownThemAll!",
"message": "Ustawienia TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Przycisk DownThemAll!:",
"message": "Przycisk TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Wybór DownThemAll!:",
"message": "Wybór TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Spróbuj znaleźć linki w treści strony internetowej (wolniejsze)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Motyw:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Ciemny",
"description": "option text"
},
"pref_theme_default": {
"message": "Systemowy/Przeglądarki",
"description": "option text"
},
"pref_theme_light": {
"message": "Jasny",
"description": "option text"
},
"pref_ui": {
"message": "Interfejs Użytkownika",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Wybierz swoje pobierania",
"message": "TraitorousDownloading! - Wybierz swoje pobierania",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Dodaj link",
"message": "TraitorousDownloading! - Dodaj link",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Todas as abas",
"message": "TraitorousDownloading! - Todas as abas",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Salvar Imagem com o DownThemAll!",
"message": "Salvar Imagem com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Salvar Link com o DownThemAll!",
"message": "Salvar Link com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Salvar Mídia com o DownThemAll!",
"message": "Salvar Mídia com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Salvar Seleção com o DownThemAll!",
"message": "Salvar Seleção com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "A ferramenta de download em massa para o seu navegador",
"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": "TraitorousDownloading! 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": {
"message": "Filtragem rápida",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "Gerenciador do DownThemAll!",
"message": "Gerenciador do TraitorousDownloading!",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Você já adicionou $DOWNLOADS$ downloads com DownThemAll! Como usuário regular, você pode considerar uma doação para apoiar desenvolvimento adicional. Obrigado!",
"message": "Você já adicionou $DOWNLOADS$ downloads com TraitorousDownloading! Como usuário regular, você pode considerar uma doação para apoiar desenvolvimento adicional. Obrigado!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferências do DownThemAll!",
"message": "Preferências do TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Botão DownThemAll!",
"message": "Botão TraitorousDownloading!",
"description": "label"
},
"pref_button_type_dta": {
"message": "Seleção do DownThemAll!",
"message": "Seleção do TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Tentar encontrar links no texto do site (mais lento)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Escuro",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistema/Navegador",
"description": "option text"
},
"pref_theme_light": {
"message": "Claro",
"description": "option text"
},
"pref_ui": {
"message": "Interface de usuário",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Selecione seus Downloads",
"message": "TraitorousDownloading! - Selecione seus Downloads",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Adicone um link",
"message": "TraitorousDownloading! - Adicone um link",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Все вкладки",
"message": "TraitorousDownloading! - Все вкладки",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Закачать изображение через DownThemAll!",
"message": "Закачать изображение через TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Закачать ссылку через DownThemAll!",
"message": "Закачать ссылку через TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Закачать медиа через DownThemAll!",
"message": "Закачать медиа через TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Закачать выделенное через DownThemAll!",
"message": "Закачать выделенное через TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "Быстрый фильтр",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! Менеджер",
"message": "TraitorousDownloading! Менеджер",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Добавлено $DOWNLOADS$ закачек через DownThemAll! на текущий момент! Как постоянный пользователь подумайте над тем чтобы поддержать дальнейшую разработку. Спасибо!",
"message": "Добавлено $DOWNLOADS$ закачек через TraitorousDownloading! на текущий момент! Как постоянный пользователь подумайте над тем чтобы поддержать дальнейшую разработку. Спасибо!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Настройки DownThemAll!",
"message": "Настройки TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Кнопка DownThemAll!",
"message": "Кнопка TraitorousDownloading!",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! выделенного",
"message": "TraitorousDownloading! выделенного",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Пытаться обнаружить ссылки в тексте на сайте",
"description": "Preferences/General"
},
"pref_theme": {
"message": "Тема:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Тёмная",
"description": "option text"
},
"pref_theme_default": {
"message": "Система/Браузер",
"description": "option text"
},
"pref_theme_light": {
"message": "Светлая",
"description": "option text"
},
"pref_ui": {
"message": "Интерфейс пользователя",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Выбрать ваши закачки",
"message": "TraitorousDownloading! - Выбрать ваши закачки",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Добавить ссылку",
"message": "TraitorousDownloading! - Добавить ссылку",
"description": "Title of single window"
},
"sizeB": {

1224
_locales/sv/messages.json Normal file

File diff suppressed because it is too large Load Diff

1300
_locales/tr/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - 全部标签页",
"message": "TraitorousDownloading! - 全部标签页",
"description": "Menu text"
},
"dta_regular_image": {
"message": "用 DownThemAll! 保存图片",
"message": "用 TraitorousDownloading! 保存图片",
"description": "Menu text"
},
"dta_regular_link": {
"message": "用 DownThemAll! 保存链接",
"message": "用 TraitorousDownloading! 保存链接",
"description": "Menu text"
},
"dta_regular_media": {
"message": "用 DownThemAll! 保存媒体",
"message": "用 TraitorousDownloading! 保存媒体",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "用 DownThemAll! 保存选中项",
"message": "用 TraitorousDownloading! 保存选中项",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "快速筛选",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! 管理器",
"message": "TraitorousDownloading! 管理器",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "您使用 DownThemAll! 至今已经添加了 $DOWNLOADS$ 个下载。作为一名普通用户,您可以考虑捐助来支持一下开发。多谢!",
"message": "您使用 TraitorousDownloading! 至今已经添加了 $DOWNLOADS$ 个下载。作为一名普通用户,您可以考虑捐助来支持一下开发。多谢!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! 首选项",
"message": "TraitorousDownloading! 首选项",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! 按钮:",
"message": "TraitorousDownloading! 按钮:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 选择框",
"message": "TraitorousDownloading! 选择框",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "尝试在网站文本中寻找链接(较慢)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "主题:",
"description": "label text"
},
"pref_theme_dark": {
"message": "深邃",
"description": "option text"
},
"pref_theme_default": {
"message": "系统/浏览器",
"description": "option text"
},
"pref_theme_light": {
"message": "明亮",
"description": "option text"
},
"pref_ui": {
"message": "用户界面",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - 选择您要下载的内容",
"message": "TraitorousDownloading! - 选择您要下载的内容",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - 添加链接",
"message": "TraitorousDownloading! - 添加链接",
"description": "Title of single window"
},
"sizeB": {
@ -1246,7 +1262,7 @@
"description": "Tooltip text; manager/downloads"
},
"tooltip_eta": {
"message": "重命名",
"message": "剩余时间",
"description": "Tooltip text; manager/downloads; Time"
},
"tooltip_from": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll!- 全部分頁",
"message": "TraitorousDownloading!- 全部分頁",
"description": "Menu text"
},
"dta_regular_image": {
"message": "以 DownThemAll! 儲存圖片",
"message": "以 TraitorousDownloading! 儲存圖片",
"description": "Menu text"
},
"dta_regular_link": {
"message": "以 DownThemAll! 下載連結",
"message": "以 TraitorousDownloading! 下載連結",
"description": "Menu text"
},
"dta_regular_media": {
"message": "以 DownThemAll! 儲存媒體檔案",
"message": "以 TraitorousDownloading! 儲存媒體檔案",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "以 DownThemAll! 儲存選取項目",
"message": "以 TraitorousDownloading! 儲存選取項目",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"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": "TraitorousDownloading! 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": {
"message": "快速篩選",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll!下載管理",
"message": "TraitorousDownloading!下載管理",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "目前已透過DownThemAll! 加入 $DOWNLOADS$ 個下載您可以贊助我們支持更進一步的開發謝謝!",
"message": "目前已透過TraitorousDownloading! 加入 $DOWNLOADS$ 個下載您可以贊助我們支持更進一步的開發謝謝!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll!偏好設定",
"message": "TraitorousDownloading!偏好設定",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! 按鈕:",
"message": "TraitorousDownloading! 按鈕:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 選取",
"message": "TraitorousDownloading! 選取",
"description": "label"
},
"pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "試著從網頁文字尋找連結〈較慢〉",
"description": "Preferences/General"
},
"pref_theme": {
"message": "主題:",
"description": "label text"
},
"pref_theme_dark": {
"message": "暗色",
"description": "option text"
},
"pref_theme_default": {
"message": "系統 / 瀏覽器",
"description": "option text"
},
"pref_theme_light": {
"message": "亮色",
"description": "option text"
},
"pref_ui": {
"message": "操作介面",
"description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll!- 選擇下載",
"message": "TraitorousDownloading!- 選擇下載",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll!- 新增連結",
"message": "TraitorousDownloading!- 新增連結",
"description": "Title of single window"
},
"sizeB": {

View File

@ -15,7 +15,7 @@
"deffilter-aud": {
"label": "Audio",
"expr": "/\\.(?:mp3|wav|og(?:g|a)|flac|midi?|rm|aac|wma|mka|ape|opus)$/i",
"type": 1,
"type": 3,
"active": false,
"icon": "mp3"
},

View File

@ -17,6 +17,7 @@
"remove-missing-on-init": false,
"retries": 5,
"retry-time": 10,
"theme": "default",
"limits": [
{
"domain": "*",

File diff suppressed because one or more lines are too long

View File

@ -11,7 +11,7 @@ import { getManager } from "./manager/man";
import { select } from "./select";
import { single } from "./single";
import { Notification } from "./notifications";
import { MASK, FASTFILTER, SUBFOLDER } from "./recentlist";
import { MASK, FASTFILTER, SUBFOLDER, SERVER } from "./recentlist";
import { openManager } from "./windowutils";
import { _ } from "./i18n";
@ -20,7 +20,9 @@ const MAX_BATCH = 10000;
export interface QueueOptions {
mask?: string;
subfolder?: string;
server?: string;
paused?: boolean;
cookies?: boolean;
}
export const API = new class APIImpl {
@ -32,8 +34,10 @@ export const API = new class APIImpl {
await Promise.all([MASK.init(), SUBFOLDER.init()]);
const {mask = MASK.current} = options;
const {subfolder = SUBFOLDER.current} = options;
const {server = SERVER.current} = options;
const {paused = false} = options;
const {cookies = false} = options;
const defaults: any = {
_idx: 0,
get idx() {
@ -49,8 +53,10 @@ export const API = new class APIImpl {
postData: null,
mask,
subfolder,
server,
date: Date.now(),
paused
paused,
cookies,
};
let currentBatch = await Prefs.get("currentBatch", 0);
const initialBatch = currentBatch;
@ -80,7 +86,7 @@ export const API = new class APIImpl {
new Notification(null, _("queued-downloads", items.length));
}
}
if (await Prefs.get("open-manager-on-queue")) {
if (false && await Prefs.get("open-manager-on-queue")) {
await openManager(false);
}
}
@ -124,6 +130,10 @@ export const API = new class APIImpl {
await SUBFOLDER.init();
await SUBFOLDER.push(options.subfolder);
}
if (typeof options.server === "string" && !options.serverOnce) {
await SERVER.init();
await SERVER.push(options.server);
}
if (typeof options.type === "string") {
await Prefs.set("last-type", options.type);
}

View File

@ -22,9 +22,12 @@ import {
runtime,
history,
sessions,
// eslint-disable-next-line no-unused-vars
OnInstalled,
} from "./browser";
import { Bus } from "./bus";
import { filterInSitu } from "./util";
import { DB } from "./db";
const menus = typeof (_menus) !== "undefined" && _menus || _cmenus;
@ -104,19 +107,19 @@ class Handler {
async performSelection(options: SelectionOptions) {
try {
const toptions: any = {
const tabOptions: any = {
currentWindow: true,
discarded: false,
};
if (!CHROME) {
toptions.hidden = false;
tabOptions.hidden = false;
}
const selectedTabs = options.allTabs ?
await tabs.query(toptions) as any[] :
await tabs.query(tabOptions) as any[] :
[options.tab];
const textLinks = await Prefs.get("text-links", true);
const goptions = {
const gatherOptions = {
type: "DTA:gather",
selectionOnly: options.selectionOnly,
textLinks,
@ -125,7 +128,7 @@ class Handler {
};
const results = await Promise.all(selectedTabs.
map((tab: any) => runContentJob(tab, GATHER, goptions)));
map((tab: any) => runContentJob(tab, GATHER, gatherOptions)));
await this.processResults(options.turbo, results.flat());
}
@ -135,13 +138,40 @@ 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 === "update" && major !== prevMajor) {
// tabs.create({
// url: `https://about.downthemall.org/changelog/?cur=${major}&prev=${prevMajor}`,
// });
}
else if (reason === "install") {
// tabs.create({
// url: `https://about.downthemall.org/4.0/?cur=${major}`,
// });
}
});
locale.then(() => {
const menuHandler = new class Menus extends Handler {
constructor() {
super();
this.onClicked = this.onClicked.bind(this);
const alls = new Map<string, string[]>();
const mcreate = (options: any) => {
const menuCreate = (options: any) => {
if (CHROME) {
delete options.icons;
options.contexts = options.contexts.
@ -155,7 +185,7 @@ locale.then(() => {
}
menus.create(options);
};
mcreate({
menuCreate({
id: "DTARegularLink",
contexts: ["link"],
icons: {
@ -164,7 +194,7 @@ locale.then(() => {
},
title: _("dta.regular.link"),
});
mcreate({
menuCreate({
id: "DTATurboLink",
contexts: ["link"],
icons: {
@ -173,7 +203,7 @@ locale.then(() => {
},
title: _("dta.turbo.link"),
});
mcreate({
menuCreate({
id: "DTARegularImage",
contexts: ["image"],
icons: {
@ -182,7 +212,7 @@ locale.then(() => {
},
title: _("dta.regular.image"),
});
mcreate({
menuCreate({
id: "DTATurboImage",
contexts: ["image"],
icons: {
@ -191,7 +221,7 @@ locale.then(() => {
},
title: _("dta.turbo.image"),
});
mcreate({
menuCreate({
id: "DTARegularMedia",
contexts: ["video", "audio"],
icons: {
@ -200,7 +230,7 @@ locale.then(() => {
},
title: _("dta.regular.media"),
});
mcreate({
menuCreate({
id: "DTATurboMedia",
contexts: ["video", "audio"],
icons: {
@ -209,7 +239,7 @@ locale.then(() => {
},
title: _("dta.turbo.media"),
});
mcreate({
menuCreate({
id: "DTARegularSelection",
contexts: ["selection"],
icons: {
@ -218,7 +248,7 @@ locale.then(() => {
},
title: _("dta.regular.selection"),
});
mcreate({
menuCreate({
id: "DTATurboSelection",
contexts: ["selection"],
icons: {
@ -227,7 +257,7 @@ locale.then(() => {
},
title: _("dta.turbo.selection"),
});
mcreate({
menuCreate({
id: "DTARegular",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -236,7 +266,7 @@ locale.then(() => {
},
title: _("dta.regular"),
});
mcreate({
menuCreate({
id: "DTATurbo",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -245,12 +275,12 @@ locale.then(() => {
},
title: _("dta.turbo"),
});
mcreate({
menuCreate({
id: "sep-1",
contexts: ["all", "browser_action", "tools_menu"],
type: "separator"
});
mcreate({
menuCreate({
id: "DTARegularAll",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -259,7 +289,7 @@ locale.then(() => {
},
title: _("dta-regular-all"),
});
mcreate({
menuCreate({
id: "DTATurboAll",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -271,12 +301,12 @@ locale.then(() => {
const sep2ctx = menus.ACTION_MENU_TOP_LEVEL_LIMIT === 6 ?
["all", "tools_menu"] :
["all", "browser_action", "tools_menu"];
mcreate({
menuCreate({
id: "sep-2",
contexts: sep2ctx,
type: "separator"
});
mcreate({
menuCreate({
id: "DTAAdd",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -287,12 +317,12 @@ locale.then(() => {
},
title: _("add-download"),
});
mcreate({
menuCreate({
id: "sep-3",
contexts: ["all", "browser_action", "tools_menu"],
type: "separator"
});
mcreate({
/* menuCreate({
id: "DTAManager",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -300,8 +330,8 @@ locale.then(() => {
32: "/style/button-manager@2x.png",
},
title: _("manager.short"),
});
mcreate({
});*/
menuCreate({
id: "DTAPrefs",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -537,7 +567,6 @@ locale.then(() => {
32: "/style/icon32.png",
48: "/style/icon48.png",
64: "/style/icon64.png",
96: "/style/icon96.png",
128: "/style/icon128.png",
256: "/style/icon256.png"
};
@ -634,6 +663,13 @@ locale.then(() => {
await sessionRemover();
}
try {
await DB.init();
}
catch (ex) {
console.error("db init", ex.toString(), ex.message, ex.stack, ex);
}
await Prefs.set("last-run", new Date());
await filters();
await getManager();

View File

@ -73,7 +73,7 @@ class Numeral implements Generator {
this.digits = dir ? rawpieces[0].length : rawpieces[1].length;
this.length = Math.floor(
(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);
}
@ -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 {
private readonly gens: Generator[];
@ -120,11 +174,16 @@ export class BatchGenerator implements Generator {
try {
this.gens.push(new Numeral(tok));
}
catch (ex) {
catch {
try {
this.gens.push(new Character(tok));
}
catch {
this.gens.push(new Literal(`[${tok}]`));
this.hasInvalid = true;
}
}
}
if (str) {
this.gens.push(new Literal(str));
}

View File

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

View File

@ -8,32 +8,35 @@ import {runtime, tabs, RawPort, MessageSender} from "./browser";
export class Port extends EventEmitter {
private port: RawPort | null;
private disconnected = false;
constructor(port: RawPort) {
super();
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
if (port.sender && port.sender.tab && port.sender.tab.id) {
const otherTabId = port.sender.tab.id;
const tabListener = function(tabId: number) {
const tabListener = (tabId: number) => {
if (tabId !== otherTabId) {
return;
}
disconnect();
this.disconnect();
};
tabs.onRemoved.addListener(tabListener);
}
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() {
@ -120,6 +123,9 @@ export const Bus = new class extends EventEmitter {
port.disconnect();
return;
}
this.ports.emit(port.name, new Port(port));
const wrapped = new Port(port);
if (!this.ports.emit(port.name, wrapped)) {
wrapped.disconnect();
}
}
}();

132
lib/db.ts
View File

@ -1,17 +1,25 @@
"use strict";
// License: MIT
// eslint-disable-next-line no-unused-vars
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
import { storage } from "./browser";
import { sort } from "./sorting";
const VERSION = 1;
const STORE = "queue";
export const DB = new class DB {
interface Database {
init(): Promise<void>;
saveItems(items: Download[]): Promise<unknown>;
deleteItems(items: any[]): Promise<void>;
getAll(): Promise<BaseItem[]>;
}
export class IDB implements Database {
private db?: IDBDatabase;
constructor() {
@ -106,7 +114,7 @@ export const DB = new class DB {
return await new Promise(this.saveItemsInternal.bind(this, items));
}
deleteItemsInternal(items: any[], resolve: Function, reject: Function) {
deleteItemsInternal(items: any[], resolve: () => void, reject: Function) {
if (!items || !items.length || !this.db) {
resolve();
return;
@ -139,4 +147,120 @@ export const DB = new class DB {
await this.init();
await new Promise(this.deleteItemsInternal.bind(this, items));
}
}
class StorageDB implements Database {
private counter = 1;
async init(): Promise<void> {
const {db = null} = await storage.local.get("db");
if (!db || !db.counter) {
return;
}
this.counter = db.counter;
}
async saveItems(items: Download[]) {
const db: any = {items: []};
for (const item of items) {
if (!item.dbId) {
item.dbId = ++this.counter;
}
db.items.push(item.toJSON());
}
db.counter = this.counter;
await storage.local.set({db});
}
async deleteItems(items: any[]): Promise<void> {
const gone = new Set(items.map(i => i.dbId));
const {db = null} = await storage.local.get("db");
if (!db) {
return;
}
db.items = db.items.filter((i: any) => !gone.has(i.dbId));
await storage.local.set({db});
}
async getAll() {
const {db = null} = await storage.local.get("db");
if (!db || !Array.isArray(db.items)) {
return [];
}
return sort(db.items, (i: any) => i.position) as BaseItem[];
}
}
class MemoryDB implements Database {
private counter = 1;
private items = new Map();
init(): Promise<void> {
return Promise.resolve();
}
saveItems(items: Download[]) {
for (const item of items) {
if (item.private) {
continue;
}
if (!item.dbId) {
item.dbId = ++this.counter;
}
this.items.set(item.dbId, item.toJSON());
}
return Promise.resolve();
}
deleteItems(items: any[]) {
for (const item of items) {
if (!("dbId" in item)) {
continue;
}
this.items.delete(item.dbId);
}
return Promise.resolve();
}
getAll(): Promise<BaseItem[]> {
return Promise.resolve(Array.from(this.items.values()));
}
}
export const DB = new class DBWrapper implements Database {
saveItems(items: Download[]): Promise<unknown> {
return this.db.saveItems(items);
}
deleteItems(items: any[]): Promise<void> {
return this.db.deleteItems(items);
}
getAll(): Promise<BaseItem[]> {
return this.db.getAll();
}
private db: Database;
async init() {
try {
this.db = new IDB();
await this.db.init();
}
catch (ex) {
console.warn(
"Failed to initialize idb backend, using storage db fallback", ex);
try {
this.db = new StorageDB();
await this.db.init();
}
catch (ex) {
console.warn(
"Failed to initialize storage backend, using memory db fallback", ex);
this.db = new MemoryDB();
await this.db.init();
}
}
}
}();

View File

@ -4,7 +4,7 @@
import {memoize} from "./memoize";
import langs from "../_locales/all.json";
import { sorted, naturalCaseCompare } from "./sorting";
import lf from "localforage";
export const ALL_LANGS = Object.freeze(new Map<string, string>(
sorted(Object.entries(langs), e => {
@ -40,11 +40,11 @@ class Entry {
this.message = entry.message.replace(/\$[A-Z0-9]+\$/g, (r: string) => {
hit = true;
const id = r.substr(1, r.length - 2).toLocaleLowerCase();
const pholder = entry.placeholders[id];
if (!pholder || !pholder.content) {
const placeholder = entry.placeholders[id];
if (!placeholder || !placeholder.content) {
throw new Error(`Invalid placeholder: ${id}`);
}
return `${pholder.content}$`;
return `${placeholder.content}$`;
});
if (!hit) {
throw new Error("Not entry-able");
@ -123,14 +123,17 @@ async function fetchLanguage(code: string) {
}
function loadCached() {
if (document.location.pathname.includes("/windows/")) {
const cached = localStorage.getItem(CACHE_KEY);
if (cached) {
return JSON.parse(cached) as any[];
}
}
async function loadCached(): Promise<any> {
const cached = await lf.getItem<string>(CACHE_KEY);
if (!cached) {
return null;
}
const parsed = JSON.parse(cached);
if (!Array.isArray(parsed) || !parsed[0].CRASH || !parsed[0].CRASH.message) {
console.warn("rejecting cached locales", parsed);
return null;
}
return parsed;
}
async function loadRawLocales() {
@ -187,16 +190,16 @@ async function load(): Promise<Localization> {
}
CURRENT = currentLang;
// en is the base locale
let valid = loadCached();
let valid = await loadCached();
if (!valid) {
valid = await loadRawLocales();
localStorage.setItem(CACHE_KEY, JSON.stringify(valid));
await lf.setItem(CACHE_KEY, JSON.stringify(valid));
}
if (!valid.length) {
throw new Error("Could not lood ANY of these locales");
throw new Error("Could not load ANY of these locales");
}
const custom = localStorage.getItem(CUSTOM_KEY);
const custom = await lf.getItem<string>(CUSTOM_KEY);
if (custom) {
try {
valid.push(JSON.parse(custom));
@ -239,7 +242,7 @@ locale.then(l => {
/**
* Localize a message
* @param {string} id Identifier of the string to localize
* @param {string[]} [subst] Message substituations
* @param {string[]} [subst] Message substitutions
* @returns {string} Localized message
*/
export function _(id: string, ...subst: any[]) {
@ -302,11 +305,11 @@ export async function localize<T extends HTMLElement | DocumentFragment>(
return localize_(elem);
}
export function saveCustomLocale(data?: string) {
export async function saveCustomLocale(data?: string) {
if (!data) {
localStorage.removeItem(CUSTOM_KEY);
await lf.removeItem(CUSTOM_KEY);
return;
}
new Localization(JSON.parse(data));
localStorage.setItem(CUSTOM_KEY, data);
await localStorage.setItem(CUSTOM_KEY, data);
}

View File

@ -4,9 +4,11 @@
import { downloads, CHROME } from "./browser";
import { EventEmitter } from "../uikit/lib/events";
import { PromiseSerializer } from "./pserializer";
import lf from "localforage";
const VERSION = 1;
const STORE = "iconcache";
// eslint-disable-next-line no-magic-numbers
const CACHE_SIZES = CHROME ? [16, 32] : [16, 32, 64, 127];
@ -48,37 +50,17 @@ const SYNONYMS = Object.freeze(new Map<string, string>([
]));
export const IconCache = new class IconCache extends EventEmitter {
private db: Promise<IDBDatabase>;
private db = lf.createInstance({name: STORE});
private cache: Map<string, string>;
constructor() {
super();
this.db = this.init();
this.cache = new Map();
this.get = PromiseSerializer.wrapNew(8, this, this.get);
this.set = PromiseSerializer.wrapNew(1, this, this.set);
}
private async init() {
return await new Promise<IDBDatabase>((resolve, reject) => {
const req = indexedDB.open(STORE, VERSION);
req.onupgradeneeded = evt => {
const db = req.result;
switch (evt.oldVersion) {
case 0: {
db.createObjectStore(STORE);
break;
}
}
};
req.onerror = ex => reject(ex);
req.onsuccess = () => {
resolve(req.result);
};
});
}
private normalize(ext: string) {
ext = ext.toLocaleLowerCase();
return SYNONYMS.get(ext) || ext;
@ -95,36 +77,25 @@ export const IconCache = new class IconCache extends EventEmitter {
if (rv) {
return rv;
}
const db = await this.db;
rv = this.cache.get(sext);
if (rv) {
return rv;
}
return await new Promise<string | undefined>(resolve => {
const trans = db.transaction(STORE, "readonly");
trans.onerror = () => resolve(undefined);
const store = trans.objectStore(STORE);
const req = store.get(sext);
req.onerror = () => resolve(undefined);
req.onsuccess = () => {
const rv = this.cache.get(sext);
if (rv) {
resolve(rv);
return;
}
let {result} = req;
let result = await this.db.getItem<any>(sext);
if (!result) {
resolve(undefined);
return;
return this.cache.get(sext);
}
if (typeof req.result !== "string") {
rv = this.cache.get(sext);
if (rv) {
return rv;
}
if (typeof result !== "string") {
result = URL.createObjectURL(result).toString();
}
this.cache.set(sext, result);
this.cache.set(ext, "");
resolve(result);
};
});
return result;
}
async set(ext: string, manId: number) {
@ -145,18 +116,9 @@ export const IconCache = new class IconCache extends EventEmitter {
}
for (const {size, icon} of urls) {
this.cache.set(`${ext}-${size}`, URL.createObjectURL(icon));
await this.db.setItem(`${ext}-${size}`, icon);
}
this.cache.set(ext, "");
const db = await this.db;
await new Promise((resolve, reject) => {
const trans = db.transaction(STORE, "readwrite");
trans.onerror = reject;
trans.oncomplete = resolve;
const store = trans.objectStore(STORE);
for (const {size, icon} of urls) {
store.put(icon, `${ext}-${size}`);
}
});
this.emit("cached", ext);
}
}();

View File

@ -81,6 +81,14 @@ function importMeta4(data: string) {
if (mask) {
item.mask = mask;
}
const description = file.querySelector("description");
if (description && description.textContent) {
item.description = description.textContent.trim();
}
const title = file.getElementsByTagNameNS(NS_DTA, "title");
if (title && title[0] && title[0].textContent) {
item.title = title[0].textContent;
}
items.push(item);
}
catch (ex) {
@ -94,9 +102,9 @@ 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();
const refererUrls = getTextLinks(v);
if (refererUrls && refererUrls.length) {
current.referrer = refererUrls.pop();
current.usableReferrer = decodeURIComponent(current.referrer || "");
}
break;
@ -108,7 +116,7 @@ export function importText(data: string) {
if (data.includes(NS_METALINK_RFC5854)) {
return importMeta4(data);
}
const splitter = /(.+)\n|(.+)$/g;
const splitter = /((?:.|\r)+)\n|(.+)$/g;
const spacer = /^\s+/;
let match;
let current: BaseItem | undefined = undefined;
@ -197,15 +205,15 @@ class MetalinkExporter {
const document = window.document.implementation.
createDocument(NS_METALINK_RFC5854, "metalink", null);
const root = document.documentElement;
root.setAttributeNS(NS_DTA, "generator", "DownThemAll!");
root.setAttributeNS(NS_DTA, "generator", "TraitorousDownloading!");
root.appendChild(document.createComment(
"metalink as exported by DownThemAll!",
"metalink as exported by TraitorousDownloading!",
));
for (const item of items) {
const aitem = item as any;
const anyItem = item as any;
const f = document.createElementNS(NS_METALINK_RFC5854, "file");
f.setAttribute("name", aitem.currentName);
f.setAttribute("name", anyItem.currentName);
if (item.batch) {
f.setAttributeNS(NS_DTA, "num", item.batch.toString());
}
@ -225,13 +233,19 @@ class MetalinkExporter {
f.appendChild(n);
}
if (item.title) {
const n = document.createElementNS(NS_DTA, "title");
n.textContent = item.title;
f.appendChild(n);
}
const u = document.createElementNS(NS_METALINK_RFC5854, "url");
u.textContent = item.url;
f.appendChild(u);
if (aitem.totalSize > 0) {
if (anyItem.totalSize > 0) {
const s = document.createElementNS(NS_METALINK_RFC5854, "size");
s.textContent = aitem.totalSize.toString();
s.textContent = anyItem.totalSize.toString();
f.appendChild(s);
}
root.appendChild(f);

View File

@ -32,7 +32,8 @@ const OPTIONPROPS = Object.freeze([
"startDate",
"private",
"postData",
"paused"
"paused",
"server", "cookies",
]);
function maybeAssign(options: any, what: any) {

View File

@ -191,6 +191,7 @@ export class BaseDownload {
rv.destPath = dest.path;
rv.destFull = dest.full;
rv.currentName = this.browserName || rv.destName || rv.finalName;
rv.currentFull = `${dest.path}/${rv.currentName}`;
rv.error = this.error;
rv.ext = this.renamer.p_ext;
rv.retries = this.retries;

View File

@ -16,13 +16,14 @@ import {
DONE,
FORCABLE,
MISSING,
PAUSABLE,
PAUSEABLE,
PAUSED,
QUEUED,
RUNNING,
RETRYING
} from "./state";
import { Preroller } from "./preroller";
// eslint-disable-next-line no-unused-vars
import { Preroller, PrerollResults } from "./preroller";
function isRecoverable(error: string) {
switch (error) {
@ -130,11 +131,13 @@ export class Download extends BaseDownload {
}
const options: DownloadOptions = {
conflictAction: await Prefs.get("conflict-action"),
filename: this.dest.full,
saveAs: false,
url: this.url,
headers: [],
};
if (!CHROME) {
options.filename = this.dest.full;
}
if (!CHROME && this.private) {
options.incognito = true;
}
@ -194,15 +197,7 @@ export class Download extends BaseDownload {
if (!res) {
return;
}
if (res.mime) {
this.mime = res.mime;
}
if (res.name) {
this.serverName = res.name;
}
if (res.error) {
this.cancelAccordingToError(res.error);
}
this.adoptPrerollResults(res);
}
catch (ex) {
console.error("Failed to preroll", this, ex.toString(), ex.stack, ex);
@ -215,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) {
if (!(FORCABLE & this.state)) {
return;
@ -228,7 +235,7 @@ export class Download extends BaseDownload {
}
async pause(retry?: boolean) {
if (!(PAUSABLE & this.state)) {
if (!(PAUSEABLE & this.state)) {
return;
}
@ -270,7 +277,7 @@ export class Download extends BaseDownload {
await downloads.cancel(id);
}
catch (ex) {
// ingored
// ignored
}
await new Promise(r => setTimeout(r, 1000));
try {
@ -278,7 +285,7 @@ export class Download extends BaseDownload {
}
catch (ex) {
console.error(id, ex.toString(), ex);
// ingored
// ignored
}
}
@ -391,4 +398,27 @@ export class Download extends BaseDownload {
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

@ -16,7 +16,8 @@ import { Download } from "./download";
import { ManagerPort } from "./port";
import { Scheduler } from "./scheduler";
import { Limits } from "./limits";
import { downloads, runtime, webRequest, CHROME } from "../browser";
import { downloads, runtime, webRequest, CHROME, OPERA } from "../browser";
import { browser } from "webextension-polyfill-ts";
const US = runtime.getURL("");
@ -61,6 +62,9 @@ export class Manager extends EventEmitter {
private deadlineTimer: number;
constructor() {
if (!document.location.href.includes("background")) {
throw new Error("Not on background");
}
super();
this.active = true;
this.shouldReload = false;
@ -82,13 +86,18 @@ export class Manager extends EventEmitter {
downloads.onChanged.addListener(this.onChanged.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) => {
const mport = new ManagerPort(this, port);
const managerPort = new ManagerPort(this, port);
port.on("disconnect", () => {
this.ports.delete(mport);
this.ports.delete(managerPort);
});
this.ports.add(mport);
this.ports.add(managerPort);
return true;
});
Limits.on("changed", () => {
this.resetScheduler();
@ -118,7 +127,7 @@ export class Manager extends EventEmitter {
// Do not wait for the scheduler
this.resetScheduler();
this.emit("inited");
this.emit("initialized");
setTimeout(() => this.checkMissing(), MISSING_TIMEOUT);
runtime.onUpdateAvailable.addListener(() => {
if (this.running.size) {
@ -157,6 +166,20 @@ export class Manager extends EventEmitter {
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() {
this.scheduler = null;
await this.startNext();
@ -218,7 +241,7 @@ export class Manager extends EventEmitter {
if (this.notifiedFinished || this.running.size || this.retrying.size) {
return;
}
if (SOUNDS.value) {
if (SOUNDS.value && !OPERA) {
const audio = new Audio(runtime.getURL("/style/done.opus"));
audio.addEventListener("canplaythrough", () => audio.play());
audio.addEventListener("ended", () => document.body.removeChild(audio));
@ -239,6 +262,61 @@ export class Manager extends EventEmitter {
this.manIds.delete(id);
}
async prepareItems(items: any[]) {
var links = new Array();
for (var item of items) {
var cookiesToSend = Array();
var cs = await browser.cookies.getAll({
url: item.url,
firstPartyDomain: null,
});
if (item.cookies) {
for (var c of cs){
cookiesToSend.push({
name: c.name,
value: c.value,
domain: c.domain,
// expires: new Date(c.expirationDate * 1000) ?? null,
path: c.path,
secure: c.secure,
httponly: c.httpOnly,
// samesite: c.sameSite,
});
}
}
var status = item.paused ? "Paused":"Queue";
links.push({
description: item.description,
filename: item.fileName,
mask: item.mask,
status: status,
postData: item.postData,
subdir: item.subfolder,
title: item.title,
url: item.usable,
referrer: item.usableReferrer,
cookies: cookiesToSend,
});
}
return links;
}
addNewDownloads(items: any[]) {
if (!items || !items.length) {
return;
}
this.prepareItems(items).then(links => {
var xhr = new XMLHttpRequest();
xhr.open("POST", items[0].server);
xhr.setRequestHeader("Content-Type", "application/javascript");
xhr.send(JSON.stringify(links));
});
}
/*
addNewDownloads(items: any[]) {
if (!items || !items.length) {
return;
@ -261,6 +339,7 @@ export class Manager extends EventEmitter {
this.save(items);
this.startNext();
}
*/
setDirty(item: Download) {
this.dirty.add(item);
@ -336,8 +415,8 @@ export class Manager extends EventEmitter {
this.startNext().catch(console.error);
}
else if (newState === RUNNING) {
// Usually we already added it. Buit if a user uses the built-in
// download manager to resart
// Usually we already added it. But if a user uses the built-in
// download manager to restart
// a download, we have not, so make sure it is added either way
this.running.add(download);
}
@ -395,17 +474,18 @@ export class Manager extends EventEmitter {
sorted(sids: number[]) {
try {
// Construct new items
const csids = new Map(this.sids);
const currentSids = new Map(this.sids);
let items = mapFilterInSitu(sids, sid => {
const item = csids.get(sid);
const item = currentSids.get(sid);
if (!item) {
return null;
}
csids.delete(sid);
currentSids.delete(sid);
return item;
}, e => !!e);
if (csids.size) {
items = items.concat(sort(Array.from(csids.values()), i => i.position));
if (currentSids.size) {
items = items.concat(
sort(Array.from(currentSids.values()), i => i.position));
}
this.items = items;
this.setPositions();

View File

@ -9,6 +9,8 @@ import { BaseDownload } from "./basedownload";
import { Manager } from "./man";
// eslint-disable-next-line no-unused-vars
import { Port } from "../bus";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "../item";
type SID = {sid: number};
type SIDS = {
@ -42,6 +44,9 @@ export class ManagerPort {
port.on("prefs", () => {
openPrefs();
});
port.on("import", ({items}: {items: BaseItem[]}) => {
API.regular(items, []);
});
port.on("all", () => this.sendAll());
port.on("removeSids", this.onMsgRemoveSids);
port.on("showSingle", async () => {

View File

@ -54,6 +54,9 @@ export class Preroller {
}
get shouldPreroll() {
if (CHROME) {
return false;
}
const {uURL, renamer} = this.download;
const {pathname, search, host} = uURL;
if (PREROLL_NOPE.has(host)) {
@ -167,39 +170,15 @@ export class Preroller {
rv.mime = type.essence;
}
const {p_ext: ext} = this.download.renamer;
const dispHeader = headers.get("content-disposition");
if (dispHeader) {
const file = CDPARSER.parse(dispHeader);
// Sanitize
rv.name = sanitizePath(file.replace(/[/\\]+/g, "-"));
}
else if (!ext || PREROLL_SEARCHEXTS.has(ext.toLocaleLowerCase())) {
const {searchParams} = this.download.uURL;
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 (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;
}
else {
const detected = Preroller.maybeFindNameFromSearchParams(
this.download, rv);
if (detected) {
rv.name = detected;
}
@ -231,4 +210,43 @@ export class Preroller {
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

@ -12,5 +12,5 @@ export const RETRYING = 1 << 7;
export const RESUMABLE = PAUSED | CANCELED | RETRYING;
export const FORCABLE = PAUSED | QUEUED | CANCELED | RETRYING;
export const PAUSABLE = QUEUED | CANCELED | RUNNING | RETRYING;
export const PAUSEABLE = QUEUED | CANCELED | RUNNING | RETRYING;
export const CANCELABLE = QUEUED | RUNNING | PAUSED | DONE | MISSING | RETRYING;

View File

@ -8,7 +8,7 @@ import {EventEmitter} from "./events";
const DEFAULTS = {
type: "basic",
iconUrl: extension.getURL("/style/icon64.png"),
title: "DownThemAll!",
title: "TraitorousDownloading!",
message: "message",
};
@ -25,7 +25,7 @@ export class Notification extends EventEmitter {
super();
this.generated = !id;
id = id || `DownThemAll-notification${++gid}`;
id = id || `TraitorousDownloading-notification${++gid}`;
if (typeof options === "string") {
options = {message: options};
}

View File

@ -99,6 +99,5 @@ export class PrefWatcher {
changed(prefs: any, key: string, value: any) {
this.value = value;
return true;
}
}

View File

@ -122,3 +122,8 @@ export const SUBFOLDER = new RecentList("subfolder", [
"downthemall",
]);
SUBFOLDER.init().catch(console.error);
export const SERVER = new RecentList("server", [
"",
]);
SERVER.init().catch(console.error);

View File

@ -9,11 +9,12 @@ import { donate, openPrefs, openUrls } from "./windowutils";
// eslint-disable-next-line no-unused-vars
import { filters, FAST, Filter } from "./filters";
import { WindowStateTracker } from "./windowstatetracker";
import { windows } from "./browser";
import { windows, CHROME } from "./browser";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item";
interface BaseMatchedItem extends BaseItem {
sidx?: number;
matched?: string | null;
prevMatched?: string | null;
}
@ -29,6 +30,7 @@ function computeSelection(
onlyFast: boolean): ItemDelta[] {
let ws = items.map((item, idx: number) => {
item.idx = item.idx || idx;
item.sidx = item.sidx || idx;
const {matched = null} = item;
item.prevMatched = matched;
item.matched = null;
@ -52,7 +54,7 @@ function computeSelection(
}
return items.filter(item => item.prevMatched !== item.matched).map(item => {
return {
idx: item.idx,
idx: item.sidx as number,
matched: item.matched
};
});
@ -98,10 +100,16 @@ export async function select(links: BaseItem[], media: BaseItem[]) {
type: "popup",
});
const window = await windows.create(windowOptions);
tracker.track(window.id, null);
tracker.track(window.id);
try {
if (!CHROME) {
windows.update(window.id, tracker.getOptions({}));
}
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)]);
if (!port.isSelf) {
throw Error("Invalid sender connected");

View File

@ -6,7 +6,7 @@ import { Bus, Port } from "./bus";
import { WindowStateTracker } from "./windowstatetracker";
import { Promised, timeout } from "./util";
import { donate } from "./windowutils";
import { windows } from "./browser";
import { windows, CHROME } from "./browser";
// eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item";
@ -21,10 +21,16 @@ export async function single(item: BaseItem | null) {
type: "popup",
});
const window = await windows.create(windowOptions);
tracker.track(window.id, null);
tracker.track(window.id);
try {
if (!CHROME) {
windows.update(window.id, tracker.getOptions({}));
}
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)]);
if (!port.isSelf) {
throw Error("Invalid sender connected");

View File

@ -3,6 +3,8 @@
import { Prefs } from "./prefs";
import { windows } from "./browser";
// eslint-disable-next-line no-unused-vars
import { Port } from "./bus";
const VALID_WINDOW_STATES = Object.freeze(new Set(["normal", "maximized"]));
@ -80,6 +82,7 @@ export class WindowStateTracker {
if (!this.windowId) {
return;
}
try {
const window = await windows.get(this.windowId);
if (!VALID_WINDOW_STATES.has(window.state)) {
return;
@ -97,17 +100,30 @@ export class WindowStateTracker {
}
await this.save();
}
catch {
// ignored
}
}
track(windowId: number, port: any) {
track(windowId: number, port?: Port) {
if (port) {
port.on("resized", this.update);
port.on("unload", e => this.finalize(e));
port.on("disconnect", this.finalize.bind(this));
}
this.windowId = windowId;
}
async finalize() {
async finalize(state?: any) {
if (state) {
this.left = state.left;
this.top = state.top;
}
await this.update();
this.windowId = 0;
if (state) {
await this.save();
}
}
async save() {

View File

@ -1,11 +1,15 @@
"use strict";
// License: MIT
import { windows, tabs, runtime } from "../lib/browser";
import { windows, tabs, runtime, CHROME } from "../lib/browser";
import { getManager } from "./manager/man";
import DEFAULT_ICONS from "../data/icons.json";
import { Prefs } from "./prefs";
import { _ } from "./i18n";
import { WindowStateTracker } from "./windowstatetracker";
// eslint-disable-next-line no-unused-vars
import { Port, Bus } from "./bus";
import { timeout } from "./util";
const DONATE_URL = "https://www.downthemall.org/howto/donate/";
const DONATE_LANG_URLS = Object.freeze(new Map([
@ -26,7 +30,7 @@ export async function mostRecentBrowser(incognito: boolean): Promise<any> {
}
catch {
try {
window = await windows.getlastFocused();
window = await windows.getLastFocused();
if (window.type !== "normal") {
throw new Error("not a normal window");
}
@ -114,11 +118,37 @@ export async function openManager(focus = true) {
await windows.update(tab.windowId, {focused: true});
return;
}
const windowOptions = {
const tracker = new WindowStateTracker("manager", {
minWidth: 700,
minHeight: 500,
});
await tracker.init();
const windowOptions = tracker.getOptions({
url,
type: "popup",
};
await windows.create(windowOptions);
});
const window = await windows.create(windowOptions);
tracker.track(window.id);
try {
if (!CHROME) {
windows.update(window.id, tracker.getOptions({}));
}
const port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("manager", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]);
if (!port.isSelf) {
throw Error("Invalid sender connected");
}
tracker.track(window.id, port);
}
catch (ex) {
console.error("couldn't track manager", ex);
}
return;
}
if (focus) {

View File

@ -1,11 +1,11 @@
{
"manifest_version": 2,
"name": "DownThemAll!",
"version": "4.1.2",
"name": "TraitorousDownloading!",
"version": "4.2.6",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://downthemall.org/",
"author": "Nils Maier",
"homepage_url": "https://github.com/lordwelch/downthemall",
"author": "lordwelch",
"default_locale": "en",
@ -16,7 +16,6 @@
"32": "style/icon32.png",
"48": "style/icon48.png",
"64": "style/icon64.png",
"96": "style/icon96.png",
"128": "style/icon128.png",
"256": "style/icon256.png"
},
@ -24,6 +23,7 @@
"permissions": [
"<all_urls>",
"contextMenus",
"cookies",
"downloads",
"downloads.open",
"downloads.shelf",
@ -33,6 +33,7 @@
"sessions",
"storage",
"tabs",
"theme",
"webNavigation",
"webRequest",
"webRequestBlocking"
@ -53,11 +54,10 @@
"32": "style/icon32.png",
"48": "style/icon48.png",
"64": "style/icon64.png",
"96": "style/icon96.png",
"128": "style/icon128.png",
"256": "style/icon256.png"
},
"default_title": "DownThemAll!"
"default_title": "TraitorousDownloading!"
},
"options_ui": {
@ -67,7 +67,7 @@
"browser_specific_settings": {
"gecko": {
"id": "dtalite@downthemall.org",
"id": "downloading@traitorousenterprises.net",
"strict_min_version": "67.0"
}
}

View File

@ -1,13 +1,14 @@
{
"name": "dtalite",
"name": "tdl",
"version": "4.0.0",
"description": "DownThemAll! lite",
"description": "TraitorousDownloading!",
"main": "main.js",
"directories": {
"lib": "lib"
},
"scripts": {
"build": "util/build.py",
"build:cleanup": "rm -rf bundles",
"build:bundles": "webpack",
"build:regexps": "node util/makexregexps.js > data/xregexps.json",
"stats": "cloc --vcs=git --exclude-lang=Markdown,SVG",
@ -18,24 +19,26 @@
"author": "Nils Maier",
"license": "MIT",
"devDependencies": {
"@types/node": "^12.7.2",
"@typescript-eslint/eslint-plugin": "^2.0.0",
"@typescript-eslint/parser": "^2.0.0",
"@types/node": "^12.7.8",
"@typescript-eslint/eslint-plugin": "^2.3.2",
"@typescript-eslint/parser": "^2.3.2",
"chai": "^4.1.2",
"eslint": "^6.2.2",
"mocha": "^6.2.0",
"ts-loader": "^6.0.4",
"ts-node": "^8.3.0",
"typescript": "^3.5.3",
"webpack": "^4.39.3",
"webpack-cli": "^3.3.7",
"eslint": "^6.5.1",
"mocha": "^6.2.1",
"ts-loader": "^6.2.0",
"ts-node": "^8.4.1",
"typescript": "^3.6.3",
"webpack": "^4.41.0",
"webpack-cli": "^3.3.9",
"xregexp": "^4.2.4"
},
"dependencies": {
"@types/psl": "^1.1.0",
"@types/whatwg-mimetype": "^2.1.0",
"psl": "^1.3.0",
"webextension-polyfill": "^0.4.0",
"localforage": "^1.9.0",
"psl": "^1.4.0",
"webextension-polyfill": "^0.5.0",
"webextension-polyfill-ts": "^0.22.0",
"whatwg-mimetype": "^2.3.0"
}
}

View File

@ -121,14 +121,26 @@ class Gatherer {
*collectImageInternal(img: HTMLImageElement) {
try {
const src = img.currentSrc || img.src;
{
const {src} = img;
const item = this.makeItem(src, img);
if (item) {
item.fileName = "";
item.description = item.title;
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;
@ -146,6 +158,7 @@ class Gatherer {
}
}
}
}
catch (ex) {
console.error("oops image", ex.toString(), ex.stack, ex);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 B

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -2,11 +2,25 @@
/* License: gpl-v2 */
: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-active-border-color: #478de7;
--toolbar-hover-border-color: red;
--toolbar-hover-background: rgb(247, 149, 37);
--toolbar-border-width: 2px;
--toolbar-border: 1px solid rgba(255, 255, 255, 0.5);
--add-color: navy;
--queue-color: gray;
--pause-color: #ffa318;
@ -20,24 +34,81 @@
--maskbutton-color: rgb(236, 185, 16);
--missing-color: rgb(0, 82, 204);
--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;
--error-color: rgb(130, 3, 22);
--running-color: #67a041;
--finishing-color: #4bb111;
--done-color: #006f00;
--pause-color: #cf9308;
--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"] {
--folder-color: rgb(4, 102, 214);
}
html, body {
html,
body {
font-size: 10pt !important;
}
@font-face {
font-family: 'downthemall';
src: url('downthemall.woff2?75791791') format('woff2');
font-family: "downthemall";
src: url("downthemall.woff2?75791791") format("woff2");
font-weight: normal;
font-style: normal;
}
[class^="icon-"]:before, [class*=" icon-"]:before {
[class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: "downthemall";
font-style: normal;
font-weight: normal;
@ -54,72 +125,187 @@ html, body {
-moz-osx-font-smoothing: grayscale;
}
.icon-add:before { content: '\e800'; } /* '' */
.icon-addsegment:before { content: '\e801'; } /* '' */
.icon-bottom:before { content: '\e802'; } /* '' */
.icon-picture:before { content: '\e803'; } /* '' */
.icon-circle:before { content: '\e804'; } /* '' */
.icon-delete:before { content: '\e805'; } /* '' */
.icon-done:before { content: '\e806'; } /* '' */
.icon-down:before { content: '\e807'; } /* '' */
.icon-download:before { content: '\e808'; } /* '' */
.icon-dupe:before { content: '\e809'; } /* '' */
.icon-error:before { content: '\e80a'; } /* '' */
.icon-failed:before { content: '\e80b'; } /* '' */
.icon-file:before { content: '\e80c'; } /* '' */
.icon-find:before { content: '\e80d'; } /* '' */
.icon-folder:before { content: '\e80e'; } /* '' */
.icon-force:before { content: '\e80f'; } /* '' */
.icon-go:before { content: '\e810'; } /* '' */
.icon-import:before { content: '\e811'; } /* '' */
.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'; } /* '' */
.icon-add:before {
content: "\e800";
} /* '' */
.icon-addsegment:before {
content: "\e801";
} /* '' */
.icon-bottom:before {
content: "\e802";
} /* '' */
.icon-picture:before {
content: "\e803";
} /* '' */
.icon-circle:before {
content: "\e804";
} /* '' */
.icon-delete:before {
content: "\e805";
} /* '' */
.icon-done:before {
content: "\e806";
} /* '' */
.icon-down:before {
content: "\e807";
} /* '' */
.icon-download:before {
content: "\e808";
} /* '' */
.icon-dupe:before {
content: "\e809";
} /* '' */
.icon-error:before {
content: "\e80a";
} /* '' */
.icon-failed:before {
content: "\e80b";
} /* '' */
.icon-file:before {
content: "\e80c";
} /* '' */
.icon-find:before {
content: "\e80d";
} /* '' */
.icon-folder:before {
content: "\e80e";
} /* '' */
.icon-force:before {
content: "\e80f";
} /* '' */
.icon-go:before {
content: "\e810";
} /* '' */
.icon-import:before {
content: "\e811";
} /* '' */
.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) {
[class^="icon-file-"]:before, [class*=" icon-file-"]:before {
[class^="icon-file-"]:before,
[class*=" icon-file-"]:before {
font-weight: bold !important;
}
}
.icon-file-image {
color: rgb(17, 107, 163);
color: var(--file-icon-image-color);
}
.icon-file-pdf,
@ -140,18 +326,29 @@ html, body {
color: rgb(202, 81, 198);
}
body, html {
background: #F6F6F8;
color: #0C0C0D;
body,
html {
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%;
margin: 0;
padding: 0;
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-weight: bold;
}
@ -191,7 +388,11 @@ section {
}
.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 {
@ -218,8 +419,12 @@ td.virtualtable {
font-size: 12px;
align-items: stretch;
justify-items: center;
background: linear-gradient(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);
background: linear-gradient(
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;
margin-bottom: 1ex;
overflow: auto;
@ -246,15 +451,15 @@ td.virtualtable {
flex-grow: 3;
margin-right: 2ex;
padding-right: 1ex;
border-right: 1px dotted rgba(128,128,128,0.6);
border-right: 1px dotted rgba(128, 128, 128, 0.6);
}
#statusPrefs {
cursor: pointer;
color: #363636;
color: var(--status-icon-color);
}
#statusPrefs:hover {
color: #6e6d6d;
color: var(--status-icon-color-hover);
}
.dropdown {
@ -272,13 +477,14 @@ td.virtualtable {
outline: none;
position: absolute;
top: 0;
width:100%;
width: 100%;
}
.dropdown input {
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
color: black;
background: white;
border: none;
bottom: 2px;
@ -301,7 +507,6 @@ td.virtualtable {
padding-bottom: 1ex;
}
@supports (not (-moz-appearance: none)) {
.dropdown select {
background: white;
@ -371,3 +576,54 @@ td.virtualtable {
#maskButton {
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);
}
html.dark .context-menu-item.disabled,
html.dark .context-menu-item.disabled > * {
opacity: 0.7;
}
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);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -16,7 +16,7 @@ body > * {
#toolbar {
display: flex;
margin: 0;
background: var(--toolbar-bg-color) url(tile.png) repeat-x;
background: var(--toolbar-bg-color) var(--tile-url) repeat-x;
}
#toolbar .spacer {
@ -42,9 +42,9 @@ body > * {
justify-content: center;
align-items: center;
cursor: pointer;
box-shadow: 0px 0px 5px 1px rgba(128,128,128,0.5);
background: rgb(246,246,246);
color: black;
box-shadow: var(--general-button-shadow);
background: var(--general-button-bgcolor);
color: var(--general-button-color);
transition: box-shadow 0.5s, background 1s;
font-size: 24px;
line-height: 24px;
@ -60,7 +60,7 @@ body > * {
}
#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);
}
@ -88,14 +88,14 @@ body > * {
flex: 1 1 auto;
overflow: hidden;
display: grid;
background: white;
background: var(--general-bgcolor);
}
#loading {
display: flex;
justify-content: center;
align-items: center;
background: rgba(255,255,255,0.9);
background: var(--general-button-bgcolor);
font-weight: bolder;
font-size: 200%;
z-index: 10;
@ -311,7 +311,7 @@ body > * {
color: crimson;
}
#statusNetwork.icon-network-on {
color: navy;
color: var(--add-color);
}
#statusFilter {
@ -404,7 +404,7 @@ body > * {
font-size: 10pt !important;
}
#nagging {
border-top: 1px solid lightgray;
border-top: 1px solid var(--general-border-color);
display: grid;
grid-template-columns: 1fr auto auto auto;
align-content: center;

View File

@ -1,8 +1,8 @@
/* License: gpl-v2 */
@import 'common.css';
@import "common.css";
html, body {
background: transparent !important;
html,
body {
width: 100%;
height: 100%;
}
@ -19,9 +19,10 @@ article {
#tabs {
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);
color: white;
color: var(--general-bgcolor);
}
input.tab {
@ -54,9 +55,10 @@ input.tab {
#tabsel-general:checked ~ #tabs #tabel-general,
#tabsel-filters:checked ~ #tabs #tabel-filters,
#tabsel-network:checked ~ #tabs #tabel-network {
color: black !important;
background: white;
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color);
color: var(--general-color) !important;
background: var(--general-bgcolor);
border-top: var(--toolbar-border-width) solid
var(--toolbar-active-border-color);
}
#tabs > label {
@ -64,13 +66,14 @@ input.tab {
border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid transparent;
border-right: 1px solid transparent;
border-left: 1px solid rgba(255, 255, 255, 0.5);
border-right: 1px solid rgba(255, 255, 255, 0.5);
border-left: var(--toolbar-border);
border-right: var(--toolbar-border);
background: var(--toolbar-bg-color);
}
#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);
}
@ -102,7 +105,7 @@ input.tab {
text-align: center;
}
.buttons > button{
.buttons > button {
margin: 0 2em;
}
@ -113,15 +116,27 @@ input.tab {
fieldset {
display: flex;
margin-bottom: 1em;
border: 1px solid lightgray;
border: 1px solid var(--general-border-color);
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);
flex-direction: column;
max-width: 60em;
padding: 1.2em;
}
.optiongroups,
fieldset > label {
display: flex;
align-items: center;
}
fieldset > label > input,
fieldset > label > select {
margin-left: 1ex;
margin-right: 1ex;
}
legend {
font-weight: bold;
font-size: 120%;
@ -134,10 +149,10 @@ legend {
}
.virtualtable-container {
border: 1px solid lightgray;
border: 1px solid var(--general-border-color);
border-radius: 6px;
background: rgba(128, 128, 128, 0.05);
box-shadow: 1px 1px 6px lightgray;
box-shadow: 1px 1px 6px var(--general-border-color);
}
#network-general {
@ -146,3 +161,24 @@ legend {
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-left: calc(2em + 32px);
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-size: 150%;
font-weight: bold;
@ -117,7 +117,7 @@ body > * {
}
@media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 124.8dpi) {
#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;
user-select: none;
background: var(--toolbar-bg-color);
color: white;
color: var(--general-color);
min-width: 10em;
padding: 1ex;
padding-left: 1em;
cursor: pointer;
border: 0;
border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid rgba(255,255,255,0.3);
border-right: 1px solid rgba(255,255,255,0.3);
border-left: var(--toolbar-border);
border-right: var(--toolbar-border);
transition: border 1s;
}
.tab:not(.active):not(.disabled):hover {
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);
}
.tab.active {
color: black;
background: white;
color: var(--general-color);
background: var(--table-head-bgcolor);
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color);
border-left: 1px solid transparent;
border-right: 1px solid transparent;

View File

@ -64,7 +64,7 @@ p.example {
}
#options > #subfolderOptions,
#options > #maskOptions {
#options > #maskOptions, #options > #serverOptions {
display: grid;
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(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);
});
});

View File

@ -108,8 +108,13 @@ export class MenuItem extends MenuItemBase {
super(owner, id, text, options);
this.disabled = options.disabled === "true";
this.elem.setAttribute("aria-role", "menuitem");
this.elem.addEventListener(
"click", () => this.owner.emit("clicked", this.id, this.autoHide));
this.clicked = this.clicked.bind(this);
this.elem.addEventListener("click", this.clicked);
this.elem.addEventListener("contextmenu", this.clicked);
}
clicked() {
this.owner.emit("clicked", this.id, this.autoHide);
}
get disabled() {

View File

@ -104,7 +104,7 @@ export class EventEmitter {
for (const e of Array.from(handlers)) {
try {
// eslint-disable-next-line prefer-spread
handled = handled || !!e.apply(null, args);
handled = !!e.apply(null, args) || handled;
}
catch (ex) {
console.error(`Event handler ${e} for ${event} failed`, ex.toString(), ex.stack, ex);

View File

@ -45,10 +45,10 @@ export class TableEvents extends BaseTable {
"scroll", debounce(this.scrolled.bind(this), SCROLL_DEBOUNCE), {
passive: true
});
body.addEventListener("contextmenu", this.contextmenu.bind(this), true);
table.addEventListener("keypress", this.keypressed.bind(this), true);
table.addEventListener("keydown", this.keypressed.bind(this), true);
table.addEventListener("contextmenu", this.contextmenu.bind(this), true);
selectionGrippy.addEventListener("click", this.grippyClicked.bind(this));
}

View File

@ -20,16 +20,19 @@ FILES = [
"LICENSE.*",
]
RELEASE_ID = "{DDC359D1-844A-42a7-9AA1-88A850A938A8}"
RELEASE_ID = "downloading@traitorousenterprises.net"
UNCOMPRESSABLE = set((".png", ".jpg", ".zip", ".woff2"))
LICENSED = set((".css", ".html", ".js", "*.ts"))
IGNORED = set((".DS_Store", "Thumbs.db"))
# XXX: #125
IGNORED_OPERA = set(("done.opus", "error.opus"))
PERM_IGNORED_FX = set(("downloads.shelf", "webRequest", "webRequestBlocking"))
PERM_IGNORED_CHROME = set(("menus", "sessions"))
PERM_IGNORED_CHROME = set(("menus", "sessions", "theme"))
SCRIPTS = [
"yarn build:cleanup",
"yarn build:regexps",
"yarn build:bundles",
]
@ -45,17 +48,17 @@ def check_licenses():
raise Exception(f"No license in {file}")
def files():
def files(additional_ignored):
p = Path("")
for pattern in FILES:
for file in sorted(p.glob(pattern)):
if file.name in IGNORED or not file.is_file():
if file.name in IGNORED or file.name in additional_ignored or not file.is_file():
continue
yield file
def build(out, manifest):
with ZipFile(out, "w", compression=ZIP_DEFLATED, allowZip64=False, compresslevel=2) as zp:
for file in files():
def build(out, manifest, additional_ignored=set()):
with ZipFile(out, "w", compression=ZIP_DEFLATED, allowZip64=False) as zp:
for file in files(additional_ignored):
if str(file) == "manifest.json":
buf = manifest
else:
@ -68,7 +71,7 @@ def build(out, manifest):
if file.suffix in UNCOMPRESSABLE:
zp.writestr(zinfo, buf, compress_type=ZIP_STORED)
else:
zp.writestr(zinfo, buf, compress_type=ZIP_DEFLATED, compresslevel=2)
zp.writestr(zinfo, buf, compress_type=ZIP_DEFLATED)
print(file)
@ -85,14 +88,14 @@ def build_firefox(args):
if args.mode != "release":
infos["version_name"] = f"{version}-{args.mode}"
infos["browser_specific_settings"]["gecko"]["id"] = f"{args.mode}@downthemall.org"
infos["browser_specific_settings"]["gecko"]["id"] = f"{args.mode}@traitorousenterprises.net"
infos["short_name"] = infos.get("name")
infos["name"] = f"{infos.get('name')} {args.mode}"
else:
infos["browser_specific_settings"]["gecko"]["id"] = RELEASE_ID
infos["permissions"] = [p for p in infos.get("permissions") if not p in PERM_IGNORED_FX]
out = Path("web-ext-artifacts") / f"dta-{version}-{args.mode}-fx.zip"
out = Path("web-ext-artifacts") / f"tdl-{version}-{args.mode}-fx.zip"
if not out.parent.exists():
out.parent.mkdir()
if out.exists():
@ -101,7 +104,7 @@ def build_firefox(args):
build(out, json.dumps(infos, indent=2).encode("utf-8"))
def build_chrome(args):
def build_chromium(args, pkg, additional_ignored=set()):
now = datetime.now().strftime("%Y%m%d%H%M%S")
with open("manifest.json") as manip:
infos = json.load(manip, object_pairs_hook=OrderedDict)
@ -119,13 +122,13 @@ def build_chrome(args):
infos["name"] = f"{infos.get('name')} {args.mode}"
infos["permissions"] = [p for p in infos.get("permissions") if not p in PERM_IGNORED_CHROME]
out = Path("web-ext-artifacts") / f"dta-{version}-{args.mode}-crx.zip"
out = Path("web-ext-artifacts") / f"tdl-{version}-{args.mode}-{pkg}.zip"
if not out.parent.exists():
out.parent.mkdir()
if out.exists():
out.unlink()
print("Output", out)
build(out, json.dumps(infos, indent=2).encode("utf-8"))
build(out, json.dumps(infos, indent=2).encode("utf-8"), additional_ignored=additional_ignored)
def main():
from argparse import ArgumentParser
@ -140,7 +143,8 @@ def main():
else:
run([script], shell=True)
build_firefox(args)
build_chrome(args)
build_chromium(args, "crx")
build_chromium(args, "opr", IGNORED_OPERA)
print("DONE.")
if __name__ == "__main__":

View File

@ -6,7 +6,7 @@ langs = sorted(Path("_locales").glob("**/messages.json"), key=lambda p: p.parent
all = {}
for m in langs:
loc = m.parent.name
with m.open("r") as mp:
with m.open("r", encoding="utf-8") as mp:
lang = json.load(mp).get("language").get("message")
if not lang:
raise Exception(f"{m}: no language")

View File

@ -3,7 +3,7 @@
<!-- License: gpl-v2 -->
<head>
<meta charset="utf-8">
<title data-i18n="manager.title">DownThemAll!</title>
<title data-i18n="manager.title">TraitorousDownloading!</title>
<style>
@import "/uikit/css/virtualtable.css";
@import "/uikit/css/modal.css";
@ -13,8 +13,8 @@
<link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.png">
<link rel="icon" sizes="48x48" href="/style/icon48.png">
<link rel="icon" sizes="64x64" href="/style/icon64.png">
<link rel="icon" sizes="96x96" href="/style/icon96.png">
<link rel="icon" sizes="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script>

View File

@ -9,6 +9,7 @@ import { runtime } from "../lib/browser";
import { Promised } from "../lib/util";
import { PromiseSerializer } from "../lib/pserializer";
import { Keys } from "./keys";
import "./theme";
const $ = document.querySelector.bind(document);
@ -130,7 +131,6 @@ addEventListener("DOMContentLoaded", function dom() {
addEventListener("contextmenu", event => {
event.preventDefault();
event.stopPropagation();
return false;
});

View File

@ -4,6 +4,7 @@
import { EventEmitter } from "../../lib/events";
// eslint-disable-next-line no-unused-vars
import { runtime, RawPort } from "../../lib/browser";
import { WindowState } from "../windowstate";
const PORT = new class Port extends EventEmitter {
port: RawPort | null;
@ -14,6 +15,17 @@ const PORT = new class Port extends EventEmitter {
if (!this.port) {
throw new Error("Could not connect");
}
new WindowState(this.port);
addEventListener("beforeunload", () => {
if (this.port) {
this.port.postMessage({
msg: "unload",
left: window.screenX,
top: window.screenY
});
}
});
this.port.onMessage.addListener((msg: any) => {
if (typeof msg === "string") {
this.emit(msg);

View File

@ -41,7 +41,6 @@ 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 RUNNING_TIMEOUT = 1000;
@ -122,6 +121,8 @@ export class DownloadItem extends EventEmitter {
public currentName: string;
public currentFull: string;
public ext?: string;
public position: number;
@ -569,9 +570,7 @@ export class DownloadTable extends VirtualTable {
ctx.on("dismissed", () => this.table.focus());
this.on("contextmenu", (tree, event) => {
if (!this.selection.empty) {
this.showContextMenu(event);
}
return true;
});
@ -791,7 +790,7 @@ export class DownloadTable extends VirtualTable {
const items = this.getSelectedItems();
const states = items.reduce((p, c) => p |= c.state, 0);
if (!(states & DownloadState.PAUSABLE)) {
if (!(states & DownloadState.PAUSEABLE)) {
this.pauseAction.disabled = true;
}
@ -829,7 +828,7 @@ export class DownloadTable extends VirtualTable {
}
pauseDownloads() {
const sids = this.getSelectedSids(DownloadState.PAUSABLE);
const sids = this.getSelectedSids(DownloadState.PAUSEABLE);
if (!sids.length) {
return;
}
@ -1204,7 +1203,7 @@ export class DownloadTable extends VirtualTable {
if (!items || !items.length) {
return;
}
API.regular(items, []);
PORT.post("import", {items});
};
reader.readAsText(picker.files[0], "utf-8");
};

View File

@ -182,7 +182,7 @@ export class Tooltip {
}
const icon = item.largeIcon;
this.icon.className = icon;
this.name.textContent = item.destFull;
this.name.textContent = item.currentFull;
this.from.textContent = item.usable;
this.size.textContent = item.fmtSize;
this.date.textContent = new Date(item.startDate).toLocaleString();

View File

@ -1,4 +1,6 @@
<!doctype html>
<html id="popup">
<head>
<!-- License: GPL-v2 -->
<meta charset="utf-8">
@ -11,6 +13,8 @@
height: auto !important;
-webkit-user-select: none;
user-select: none;
margin: 0;
padding: 0;
}
ul {
@ -96,13 +100,15 @@
<li class="sep">
<hr>
</li>
<li id="manager" data-action="open-manager">
<!-- <li id="manager" data-action="open-manager">
<img srcset="/style/button-manager.png, /style/button-manager@2x.png 2x">
<span data-i18n="manager.short"></span>
</li>
</li> -->
<li id="prefs" data-action="open-prefs">
<span class="icon icon-settings"></span>
<span data-i18n="prefs.short">Preferences</span>
</li>
</ul>
</body>
</html>

View File

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

View File

@ -16,12 +16,12 @@
}
</style>
<title data-i18n="prefs.title">DownThemAll! - Preferences</title>
<title data-i18n="prefs.title">TraitorousDownloading! - Preferences</title>
<link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.png">
<link rel="icon" sizes="48x48" href="/style/icon48.png">
<link rel="icon" sizes="64x64" href="/style/icon64.png">
<link rel="icon" sizes="96x96" href="/style/icon96.png">
<link rel="icon" sizes="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script>
@ -43,15 +43,23 @@
<article id="tab-general" class="tab">
<fieldset>
<legend data-i18n="pref.ui">UI</legend>
<div id="pref-button-type">
<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>
<label style="display: none;"><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 style="display: none;"><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-sounds"> <span data-i18n="pref-sounds"></span></label>
<label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label>
@ -60,15 +68,16 @@
<button id="reset-layout" data-i18n="reset-layouts"></button>
</div>
</fieldset>
<fieldset>
<fieldset style="display: none;">
<legend data-i18n="pref.manager">Manager</legend>
<label><input type="checkbox" id="pref-tooltip"> <span data-i18n="pref-manager-tooltip"></span></label>
<label><input type="checkbox" id="pref-show-urls"> <span data-i18n="pref-show-urls"></span></label>
</fieldset>
<fieldset>
<legend data-i18n="pref.queueing">Queueing Downloads</legend>
<label><input type="checkbox" id="pref-cookies"> <span data-i18n="pref-cookies"></span></label>
<label><input type="checkbox" id="pref-queue-notification"> <span data-i18n="pref-queue-notification"></span></label>
<label><input type="checkbox" id="pref-open-manager-on-queue"> <span data-i18n="pref-open-manager-on-queue"></span></label>
<label style="display: none;"><input type="checkbox" id="pref-open-manager-on-queue"> <span data-i18n="pref-open-manager-on-queue"></span></label>
<label><input type="checkbox" id="pref-text-links"> <span data-i18n="pref-text-links"></span></label>
<label><input type="checkbox" id="pref-add-paused"> <span data-i18n="pref-add-paused"></span></label>
<label><input type="checkbox" id="pref-remove-missing-on-init"> <span data-i18n="pref-remove-missing-on-init"></span></label>
@ -81,7 +90,8 @@
</fieldset>
<fieldset>
<legend>Translations</legend>
<label>Language:
<label>
<span>Language:</span>
<select id="languages">
<option value="default">Browser default</option>
</select>
@ -123,14 +133,16 @@
</article>
<article id="tab-network" class="tab">
<fieldset id="network-general">
<fieldset>
<legend data-i18n="pref.netglobal"></legend>
<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>
<table id="limits" data-singleselect="true">
<tr>

View File

@ -19,7 +19,8 @@ import { iconForPath, visible } from "../lib/windowutils";
import { VirtualTable } from "../uikit/lib/table";
import { Icons } from "./icons";
import { $ } from "./winutil";
import { runtime, storage } from "../lib/browser";
import { runtime, storage, OPERA } from "../lib/browser";
import "./theme";
const ICON_BASE_SIZE = 16;
@ -557,15 +558,24 @@ addEventListener("DOMContentLoaded", async () => {
new BoolPref("pref-manager-in-popup", "manager-in-popup");
new BoolPref("pref-queue-notification", "queue-notification");
new BoolPref("pref-finish-notification", "finish-notification");
new BoolPref("pref-sounds", "sounds");
// XXX: #125
const sounds = new BoolPref("pref-sounds", "sounds");
if (OPERA) {
const sp = sounds.elem.parentElement;
if (sp) {
sp.style.display = "none";
}
}
new BoolPref("pref-hide-context", "hide-context");
new BoolPref("pref-tooltip", "tooltip");
new BoolPref("pref-cookies", "cookies");
new BoolPref("pref-open-manager-on-queue", "open-manager-on-queue");
new BoolPref("pref-text-links", "text-links");
new BoolPref("pref-add-paused", "add-paused");
new BoolPref("pref-show-urls", "show-urls");
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");
$("#reset-confirmations").addEventListener("click", async () => {
@ -632,8 +642,9 @@ addEventListener("DOMContentLoaded", async () => {
$<HTMLInputElement>("#loadCustomLocale").addEventListener("click", () => {
customLocale.click();
});
$<HTMLInputElement>("#clearCustomLocale").addEventListener("click", () => {
saveCustomLocale(undefined);
$<HTMLInputElement>("#clearCustomLocale").
addEventListener("click", async () => {
await saveCustomLocale(undefined);
runtime.reload();
});
customLocale.addEventListener("change", async () => {
@ -653,8 +664,9 @@ addEventListener("DOMContentLoaded", async () => {
reader.onerror = reject;
reader.readAsText(file);
});
saveCustomLocale(text);
if (confirm("Imported your file.\nWant to relaod the extension now?")) {
await saveCustomLocale(text);
if (confirm("Imported your file.\nWant to reload the extension now?")) {
runtime.reload();
}
}

View File

@ -4,7 +4,7 @@
<head>
<meta charset="utf-8">
<title data-i18n="select.title">DownThemAll! - Select your links</title>
<title data-i18n="select.title">TraitorousDownloading! - Select your links</title>
<style>
@import "/uikit/css/virtualtable.css";
@import "/uikit/css/modal.css";
@ -14,8 +14,8 @@
<link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.png">
<link rel="icon" sizes="48x48" href="/style/icon48.png">
<link rel="icon" sizes="64x64" href="/style/icon64.png">
<link rel="icon" sizes="96x96" href="/style/icon96.png">
<link rel="icon" sizes="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script>
@ -75,6 +75,17 @@
<input type="checkbox" id="maskOnceCheck">
<span data-i18n="useonlyonce">Use only once</span>
</label>
<h2 data-i18n="server">Server</h2>
<input id="server">
<label id="cookies">
<input type="checkbox" id="cookiesCheck">
<span data-i18n="cookies">Send cookies to server</span>
</label>
<label>
<input type="checkbox" id="serverOnceCheck">
<span data-i18n="useonlyonce">Use only once</span>
</label>
</section>
<section id="notification"></section>
<section id="buttons">

View File

@ -7,7 +7,7 @@ import { ContextMenu } from "./contextmenu";
import { iconForPath } from "../lib/windowutils";
import { _, localize } from "../lib/i18n";
import { Prefs } from "../lib/prefs";
import { MASK, FASTFILTER, SUBFOLDER } from "../lib/recentlist";
import { MASK, FASTFILTER, SUBFOLDER, SERVER } from "../lib/recentlist";
import { WindowState } from "./windowstate";
import { Dropdown } from "./dropdown";
import { Keys } from "./keys";
@ -25,6 +25,7 @@ import { ItemDelta } from "../lib/select";
// eslint-disable-next-line no-unused-vars
import { TableConfig } from "../uikit/lib/config";
import { validateSubFolder as validateSubfolder } from "../lib/util";
import "./theme";
const PORT: RawPort = runtime.connect(null, { name: "select" });
@ -42,6 +43,7 @@ const NUM_FILTER_CLASSES = 8;
let Table: SelectionTable;
let Mask: Dropdown;
let OServer: Dropdown;
let FastFilter: Dropdown;
let Subfolder: Dropdown;
@ -49,6 +51,7 @@ let Subfolder: Dropdown;
type DELTAS = {deltaLinks: ItemDelta[]; deltaMedia: ItemDelta[]};
interface BaseMatchedItem extends BaseItem {
backIdx: number;
matched?: string | null;
rowid: number;
}
@ -137,7 +140,8 @@ class ItemCollection {
constructor(items: BaseMatchedItem[]) {
this.items = items;
this.assignRows();
this.indexes = new Map(items.map(i => [i.idx, i]));
this.items.forEach((item, idx) => item.backIdx = idx);
this.indexes = new Map(items.map((i, idx) => [idx, i]));
}
assignRows() {
@ -158,11 +162,11 @@ class ItemCollection {
return rv;
}
get checkedIndexes() {
get checkedBackIndexes() {
const rv: number[] = [];
this.items.forEach(function (item) {
this.items.forEach(function(item) {
if (item.matched && item.matched !== "unmanual") {
rv.push(item.idx);
rv.push(item.backIdx);
}
});
return rv;
@ -430,6 +434,12 @@ class SelectionTable extends VirtualTable {
return true;
});
Prefs.get("cookies").then(checked=>{
if ($<HTMLInputElement>("#cookiesCheck").checked != !!checked) {
$<HTMLInputElement>("#cookiesCheck").click();
}
});
this.init();
this.switchTab(type);
}
@ -675,10 +685,14 @@ async function download(paused = false) {
if (!mask) {
throw new Error("error.invalidMask");
}
const server = OServer.value;
if (!server) {
throw new Error("error.invalidServer");
}
const subfolder = Subfolder.value;
validateSubfolder(subfolder);
const items = Table.items.checkedIndexes;
const items = Table.items.checkedBackIndexes;
if (!items.length) {
throw new Error("error.noItemsSelected");
}
@ -713,6 +727,9 @@ async function download(paused = false) {
fastOnce: $<HTMLInputElement>("#fastOnceCheck").checked,
subfolder,
subfolderOnce: $<HTMLInputElement>("#subfolderOnceCheck").checked,
server,
serverOnce: $<HTMLInputElement>("#serverOnceCheck").checked,
cookies: $<HTMLInputElement>("#cookiesCheck").checked,
}
});
}
@ -788,7 +805,9 @@ function cancel() {
}
async function init() {
await Promise.all([MASK.init(), FASTFILTER.init(), SUBFOLDER.init()]);
await Promise.all([MASK.init(), FASTFILTER.init(), SUBFOLDER.init(), SERVER.init()]);
OServer = new Dropdown("#server", SERVER.values);
OServer.on("changed", clearErrors);
Mask = new Dropdown("#mask", MASK.values);
Mask.on("changed", clearErrors);
FastFilter = new Dropdown("#fast", FASTFILTER.values);
@ -887,7 +906,6 @@ addEventListener("DOMContentLoaded", function dom() {
addEventListener("contextmenu", event => {
event.preventDefault();
event.stopPropagation();
return false;
});
@ -897,4 +915,3 @@ addEventListener("beforeunload", function() {
});
new WindowState(PORT);

View File

@ -4,7 +4,7 @@
<head>
<meta charset="utf-8">
<title data-i18n="single.title">DownThemAll! - Add a Link</title>
<title data-i18n="single.title">TraitorousDownloading! - Add a Link</title>
<style>
@import "/uikit/css/modal.css";
@import "/style/single.css";
@ -13,8 +13,8 @@
<link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.png">
<link rel="icon" sizes="48x48" href="/style/icon48.png">
<link rel="icon" sizes="64x64" href="/style/icon64.png">
<link rel="icon" sizes="96x96" href="/style/icon96.png">
<link rel="icon" sizes="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script>
@ -32,12 +32,12 @@
<input type="text" id="URL">
<h2 data-i18n="custom-filename">Custom Filename</h2>
<input type="text" id="filename">
<h3 data-i18n="referrer">Referring page</h3>
<h3 data-i18n="referrer">Referring page (Not implemented)</h3>
<input type="text" id="referrer">
<h3 data-i18n="title">Title</h3>
<input type="text" id="title">
<h3 data-i18n="description">Description</h3>
<input type="text" id="description">
<h3 data-i18n="title" style="display: none;">Title</h3>
<input type="text" id="title" style="display: none;">
<h3 data-i18n="description" style="display: none;">Description</h3>
<input type="text" id="description" style="display: none;">
<h3 data-i18n="mask">Mask</h3>
<div id="maskOptions">
<input type="text" id="mask">
@ -47,6 +47,18 @@
<span data-i18n="useonlyonce">Use only once</span>
</label>
</div>
<h3 data-i18n="server">Server</h3>
<div id="serverOptions">
<input type="text" id="server">
<label id="cookies">
<input type="checkbox" id="cookiesCheck">
<span data-i18n="cookies">Send cookies to server</span>
</label>
<label id="serverOnce">
<input type="checkbox" id="serverOnceCheck">
<span data-i18n="useonlyonce">Use only once</span>
</label>
</div>
<h3 data-i18n="subfolder"></h3>
<div id="subfolderOptions">
<input type="text" id="subfolder" data-i18n="placeholder=subfolder.placeholder">

View File

@ -4,9 +4,10 @@
import ModalDialog from "../uikit/lib/modal";
import { _, localize } from "../lib/i18n";
import { Prefs } from "../lib/prefs";
// eslint-disable-next-line no-unused-vars
import { Item, BaseItem } from "../lib/item";
import { MASK, SUBFOLDER } from "../lib/recentlist";
import { MASK, SUBFOLDER, SERVER } from "../lib/recentlist";
import { BatchGenerator } from "../lib/batches";
import { WindowState } from "./windowstate";
import { Dropdown } from "./dropdown";
@ -15,12 +16,14 @@ import { hookButton } from "../lib/manager/renamer";
import { runtime } from "../lib/browser";
import { $ } from "./winutil";
import { validateSubFolder } from "../lib/util";
import "./theme";
const PORT = runtime.connect(null, { name: "single" });
let ITEM: BaseItem;
let Mask: Dropdown;
let Subfolder: Dropdown;
let OServer: Dropdown;
class BatchModalDialog extends ModalDialog {
private readonly gen: BatchGenerator;
@ -130,6 +133,11 @@ async function downloadInternal(paused: boolean) {
return displayError("error.invalidMask");
}
const server = OServer.value;
if (!server) {
throw new Error("error.invalidServer");
}
const subfolder = Subfolder.value.trim();
validateSubFolder(subfolder);
@ -198,6 +206,9 @@ async function downloadInternal(paused: boolean) {
maskOnce: $<HTMLInputElement>("#maskOnceCheck").checked,
subfolder,
subfolderOnce: $<HTMLInputElement>("#subfolderOnceCheck").checked,
server,
serverOnce: $<HTMLInputElement>("#serverOnceCheck").checked,
cookies: $<HTMLInputElement>("#cookiesCheck").checked,
}
});
return null;
@ -214,9 +225,15 @@ function cancel() {
async function init() {
await localize(document.documentElement);
await Promise.all([MASK.init(), SUBFOLDER.init()]);
await Promise.all([MASK.init(), SUBFOLDER.init(), SERVER.init()]);
Mask = new Dropdown("#mask", MASK.values);
Subfolder = new Dropdown("#subfolder", SUBFOLDER.values);
OServer = new Dropdown("#server", SERVER.values);
Prefs.get("cookies").then(checked=>{
if ($<HTMLInputElement>("#cookiesCheck").checked != !!checked) {
$<HTMLInputElement>("#cookiesCheck").click();
}
});
}
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");
}
}();

View File

@ -2,7 +2,7 @@
// License: MIT
export function $<T extends HTMLElement>(
q: string, el?: HTMLElement | DocumentFragment): T {
q: string, el?: HTMLElement | DocumentFragment | Document): T {
if (!el) {
el = document;
}

Some files were not shown because too many files have changed in this diff Show More