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

View File

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

View File

@ -1,3 +1,7 @@
![DownThemAll!](https://raw.githubusercontent.com/downthemall/downthemall/master/style/icon128.png)
# DownThemAll! WE # DownThemAll! WE
The DownThemAll! WebExtension. The DownThemAll! WebExtension.
@ -27,28 +31,59 @@ If you would like to help out translating DTA, please see our [translation guide
## Development ## 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. 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. 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. 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. 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. 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 ### 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. 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 TODO
--- ---
aka a lot
P2 P2
=== ===
@ -26,11 +24,7 @@ Nice-to-haves.
* Manipulate downloads (e.g. rewrite URLs) * Manipulate downloads (e.g. rewrite URLs)
* Native context menus? * Native context menus?
* Would require massive reworks incl the need for new icon formats, but potentially feasible. * Would require massive reworks incl the need for new icon formats, but potentially feasible.
* Import/Export
* Download priorities (manual scheduling overrides) * Download priorities (manual scheduling overrides)
* Dark Theme support
* os/browser define be default
* overwritable
* Remove `any` types as possible, and generally improve typescript (new language to me) * Remove `any` types as possible, and generally improve typescript (new language to me)
P4 P4

View File

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

View File

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

View File

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

View File

@ -191,6 +191,22 @@
"message": "Smazat", "message": "Smazat",
"description": "button text" "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": { "description": {
"message": "Popis", "message": "Popis",
"description": "Description (keep it short); e.g. the description column in select" "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" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - Všechny záložky", "message": "TraitorousDownloading! - Všechny záložky",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Stáhnout obrázek pomocí DownThemAll!", "message": "Stáhnout obrázek pomocí TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Stáhnout odkaz pomocí DownThemAll!", "message": "Stáhnout odkaz pomocí TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Stáhnout média pomocí DownThemAll!", "message": "Stáhnout média pomocí TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Stáhnout vybrané pomocí DownThemAll!", "message": "Stáhnout vybrané pomocí TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -275,13 +291,37 @@
"message": "Neplatná URL adresa", "message": "Neplatná URL adresa",
"description": "Error message; single window" "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": { "error_noItemsSelected": {
"message": "Nic není vybráno", "message": "Nic není vybráno",
"description": "Error Message; select window" "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": { "extensionDescription": {
"message": "Správce stahování pro Váš prohlížeč", "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": { "fastfiltering": {
"message": "Rychlé filtrování", "message": "Rychlé filtrování",
@ -331,6 +371,10 @@
"message": "Vynutit spuštění", "message": "Vynutit spuštění",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "Importovat ze souboru",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "Informace", "message": "Informace",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -406,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "DownThemAll! Manažer", "message": "TraitorousDownloading! Manažer",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -442,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "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", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -522,13 +566,33 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "Nastavení DownThemAll!", "message": "Nastavení TraitorousDownloading!",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
"message": "Přidávat nová stahování pozastavená", "message": "Přidávat nová stahování pozastavená",
"description": "Preferences/General" "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": { "pref_concurrent_downloads": {
"message": "Souběžná stahování", "message": "Souběžná stahování",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "Zobrazit oznámení po dokončení fronty stahování", "message": "Zobrazit oznámení po dokončení fronty stahování",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "Tlačítho na liště je OneClick!",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "Nezobrazovat v kontextové nabídce", "message": "Nezobrazovat v kontextové nabídce",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,8 +609,12 @@
"message": "Manažer", "message": "Manažer",
"description": "Preferences/General; group text" "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": { "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" "description": "Preferences/General"
}, },
"pref_netglobal": { "pref_netglobal": {
@ -558,7 +622,7 @@
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_open_manager_on_queue": { "pref_open_manager_on_queue": {
"message": "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" "description": "Preferences/General"
}, },
"pref_queueing": { "pref_queueing": {
@ -573,14 +637,42 @@
"message": "Odebrat chybějící stahování po restartu", "message": "Odebrat chybějící stahování po restartu",
"description": "Preferences/General" "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": { "pref_show_urls": {
"message": "Zobrazit URL adresy místo názvů souborů", "message": "Zobrazit URL adresy místo názvů souborů",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "Přehrát zvuky",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "Vyhledat odkazy v textu stránky (pomalejší)", "message": "Vyhledat odkazy v textu stránky (pomalejší)",
"description": "Preferences/General" "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": { "pref_ui": {
"message": "Uživatelské rozhraní", "message": "Uživatelské rozhraní",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -895,6 +987,20 @@
"message": "Pokračovat", "message": "Pokračovat",
"description": "Action for resuming a download" "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": { "running": {
"message": "Probíhá", "message": "Probíhá",
"description": "Status text" "description": "Status text"
@ -920,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - Vyberte soubory ke stažení", "message": "TraitorousDownloading! - Vyberte soubory ke stažení",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -943,6 +1049,18 @@
"message": "Nastavit masku přejmenování", "message": "Nastavit masku přejmenování",
"description": "Menu text; select window" "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": { "single_batchexamples": {
"message": "Jsou podporována dávková stahování, například:", "message": "Jsou podporována dávková stahování, například:",
"description": "Header text; single window" "description": "Header text; single window"
@ -952,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - Přidat odkaz", "message": "TraitorousDownloading! - Přidat odkaz",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "sizeB": {
@ -1123,6 +1241,14 @@
"message": "Nová stahování nebudou spuštěna", "message": "Nová stahování nebudou spuštěna",
"description": "Status bar tooltip; manager network icon" "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": { "title": {
"message": "Popisek", "message": "Popisek",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1292,9 @@
"useonlyonce": { "useonlyonce": {
"message": "Použít pouze jednou", "message": "Použít pouze jednou",
"description": "Label for Use-Once checkboxes" "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" "description": "Error message when an input field is empty but has to have a value"
}, },
"change_later_reminder": { "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" "description": "Checkbox label text for decision confirmations"
}, },
"check_selected_items": { "check_selected_items": {
@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - alle faner", "message": "TraitorousDownloading! - alle faner",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Gem billede med DownThemAll!", "message": "Gem billede med TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Gem link med DownThemAll!", "message": "Gem link med TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Gem medie med DownThemAll!", "message": "Gem medie med TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Gem valgte med DownThemAll!", "message": "Gem valgte med TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -321,7 +321,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "\"The Mass Downloader\" til din browser", "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": { "fastfiltering": {
"message": "Hurtigfilter", "message": "Hurtigfilter",
@ -450,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "DownThemAll! Manager", "message": "TraitorousDownloading! Manager",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "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", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "DownThemAll! indstillinger", "message": "TraitorousDownloading! indstillinger",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "DownThemAll! knap:", "message": "TraitorousDownloading! knap:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "DownThemAll! markering", "message": "TraitorousDownloading! markering",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Forsøg at finde links via hjemmesidens tekstindhold (langsommere)", "message": "Forsøg at finde links via hjemmesidens tekstindhold (langsommere)",
"description": "Preferences/General" "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": { "pref_ui": {
"message": "Brugergrænseflade", "message": "Brugergrænseflade",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -716,7 +732,7 @@
"description": "Action for removing complete downloads" "description": "Action for removing complete downloads"
}, },
"remove_complete_downloads_question": { "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" "description": "Messagebox text"
}, },
"remove_complete_filter_downloads_question": { "remove_complete_filter_downloads_question": {
@ -770,7 +786,7 @@
"description": "Menu text" "description": "Menu text"
}, },
"remove_downloads_title": { "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" "description": "Messagebox title; manager"
}, },
"remove_download_question": { "remove_download_question": {
@ -800,7 +816,7 @@
"description": "Menu text" "description": "Menu text"
}, },
"remove_missing_downloads_question": { "remove_missing_downloads_question": {
"message": "Vil du rydde alle manglende downloads?", "message": "Vil du rydde op i alle manglende downloads?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_paused_downloads": { "remove_paused_downloads": {
@ -1010,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - vælg dine downloads", "message": "TraitorousDownloading! - vælg dine downloads",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - tilføj et link", "message": "TraitorousDownloading! - tilføj et link",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "sizeB": {

View File

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

View File

@ -305,7 +305,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "Ο Διαχειριστής Πολλαπλών Λήψεων για τον φυλλομετρητή σας.", "message": "Ο Διαχειριστής Πολλαπλών Λήψεων για τον φυλλομετρητή σας.",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "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": { "fastfiltering": {
"message": "Γρήγορο Φιλτράρισμα", "message": "Γρήγορο Φιλτράρισμα",

View File

@ -253,27 +253,27 @@
}, },
"dta_regular": { "dta_regular": {
"description": "Regular dta action; Menu text", "description": "Regular dta action; Menu text",
"message": "DownThemAll!" "message": "TraitorousDownloading!"
}, },
"dta_regular_all": { "dta_regular_all": {
"description": "Menu text", "description": "Menu text",
"message": "DownThemAll! - All Tabs" "message": "TraitorousDownloading! - All Tabs"
}, },
"dta_regular_image": { "dta_regular_image": {
"description": "Menu text", "description": "Menu text",
"message": "Save Image with DownThemAll!" "message": "Save Image with TraitorousDownloading!"
}, },
"dta_regular_link": { "dta_regular_link": {
"description": "Menu text", "description": "Menu text",
"message": "Save Link with DownThemAll!" "message": "Save Link with TraitorousDownloading!"
}, },
"dta_regular_media": { "dta_regular_media": {
"description": "Menu text", "description": "Menu text",
"message": "Save Media with DownThemAll!" "message": "Save Media with TraitorousDownloading!"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"description": "Menu text", "description": "Menu text",
"message": "Save Selection with DownThemAll!" "message": "Save Selection with TraitorousDownloading!"
}, },
"dta_turbo": { "dta_turbo": {
"description": "OneClick! action; Menu text", "description": "OneClick! action; Menu text",
@ -303,6 +303,10 @@
"description": "Error message; single/select window", "description": "Error message; single/select window",
"message": "Invalid Renaming Mask" "message": "Invalid Renaming Mask"
}, },
"error_invalidServer": {
"description": "Error message; single/select window",
"message": "Invalid server URL"
},
"error_invalidReferrer": { "error_invalidReferrer": {
"description": "Error message; single window", "description": "Error message; single window",
"message": "Invalid Referrer" "message": "Invalid Referrer"
@ -340,7 +344,7 @@
"message": "Export As Text" "message": "Export As Text"
}, },
"extensionDescription": { "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" "message": "The Mass Downloader for your browser"
}, },
"fastfilter_placeholder": { "fastfilter_placeholder": {
@ -475,7 +479,7 @@
}, },
"manager_title": { "manager_title": {
"description": "Window/tab title", "description": "Window/tab title",
"message": "DownThemAll! Manager" "message": "TraitorousDownloading! Manager"
}, },
"mask": { "mask": {
"description": "Renaming mask (short); used in e.g. select", "description": "Renaming mask (short); used in e.g. select",
@ -511,7 +515,7 @@
}, },
"nagging_message": { "nagging_message": {
"description": "Donation nagging message; displayed as a notification bar in manager", "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": { "placeholders": {
"downloads": { "downloads": {
"content": "$1", "content": "$1",
@ -583,11 +587,11 @@
}, },
"pref_button_type": { "pref_button_type": {
"description": "label", "description": "label",
"message": "DownThemAll! button:" "message": "TraitorousDownloading! button:"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"description": "label", "description": "label",
"message": "DownThemAll! selection" "message": "TraitorousDownloading! selection"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
"description": "label", "description": "label",
@ -633,6 +637,10 @@
"description": "Preferences/General", "description": "Preferences/General",
"message": "Open the Manager tab after queuing some downloads" "message": "Open the Manager tab after queuing some downloads"
}, },
"pref_cookies": {
"description": "Preferences/General",
"message": "Send cookies to the download server"
},
"pref_queue_notification": { "pref_queue_notification": {
"description": "Preferences/General", "description": "Preferences/General",
"message": "Show a notification when queuing new downloads" "message": "Show a notification when queuing new downloads"
@ -665,6 +673,22 @@
"description": "Preferences/General", "description": "Preferences/General",
"message": "Try to find links in the website text (slower)" "message": "Try to find links in the website text (slower)"
}, },
"pref_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": { "pref_ui": {
"description": "Preferences/General; group text", "description": "Preferences/General; group text",
"message": "User Interface" "message": "User Interface"
@ -679,7 +703,7 @@
}, },
"prefs_title": { "prefs_title": {
"description": "Window/tab title; Preferences", "description": "Window/tab title; Preferences",
"message": "DownThemAll! Preferences" "message": "TraitorousDownloading! Preferences"
}, },
"queue_finished": { "queue_finished": {
"description": "Notification text", "description": "Notification text",
@ -705,7 +729,7 @@
}, },
"referrer": { "referrer": {
"description": "Label for \"Referrer\"", "description": "Label for \"Referrer\"",
"message": "Referrer" "message": "Referrer (Not implemented)"
}, },
"remember": { "remember": {
"description": "Checkbox text for confirmation, e.g. when removing a download in manager", "description": "Checkbox text for confirmation, e.g. when removing a download in manager",
@ -905,7 +929,7 @@
}, },
"renamer_ref": { "renamer_ref": {
"description": "Mask text; see mask button", "description": "Mask text; see mask button",
"message": "Referrer" "message": "Referrer (Not implemented)"
}, },
"renamer_refdomain": { "renamer_refdomain": {
"description": "Mask text; see mask button", "description": "Mask text; see mask button",
@ -1031,7 +1055,11 @@
}, },
"select_title": { "select_title": {
"description": "Title of the select window", "description": "Title of the select window",
"message": "DownThemAll! - Select your Downloads" "message": "TraitorousDownloading! - Select your Downloads"
},
"server": {
"description": "Downloader Server",
"message": "Server"
}, },
"set_mask": { "set_mask": {
"description": "Menu text; select window", "description": "Menu text; select window",
@ -1059,7 +1087,7 @@
}, },
"single_title": { "single_title": {
"description": "Title of single window", "description": "Title of single window",
"message": "DownThemAll! - Add a link" "message": "TraitorousDownloading! - Add a link"
}, },
"sizeB": { "sizeB": {
"description": "Size formatting; bytes", "description": "Size formatting; bytes",
@ -1280,5 +1308,9 @@
"useonlyonce": { "useonlyonce": {
"description": "Label for Use-Once checkboxes", "description": "Label for Use-Once checkboxes",
"message": "Use Once" "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" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - Todas las pestañas", "message": "TraitorousDownloading! - Todas las pestañas",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Guardar imagen con DownThemAll!", "message": "Guardar imagen con TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Guardar enlace con DownThemAll!", "message": "Guardar enlace con TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Guardar multimedia con DownThemAll!", "message": "Guardar multimedia con TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Guardar selección con DownThemAll!", "message": "Guardar selección con TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -321,7 +321,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "El programa de descargas masivas para su navegador", "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": { "fastfiltering": {
"message": "Filtro rápido", "message": "Filtro rápido",
@ -450,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "Gestor DownThemAll!", "message": "Gestor TraitorousDownloading!",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "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", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "Preferencias de DownThemAll!", "message": "Preferencias de TraitorousDownloading!",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "Botón DownThemAll!:", "message": "Botón TraitorousDownloading!:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "Selección DownThemAll!", "message": "Selección TraitorousDownloading!",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Intentar buscar enlaces en el texto del sitio web (más lento)", "message": "Intentar buscar enlaces en el texto del sitio web (más lento)",
"description": "Preferences/General" "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": { "pref_ui": {
"message": "Interfaz de usuario", "message": "Interfaz de usuario",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - Seleccionar sus descargas", "message": "TraitorousDownloading! - Seleccionar sus descargas",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - Añadir un enlace", "message": "TraitorousDownloading! - Añadir un enlace",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "sizeB": {

View File

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

View File

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

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - Összes lap", "message": "TraitorousDownloading! - Összes lap",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Kép mentése a DownThemAll-al!", "message": "Kép mentése a TraitorousDownloading-al!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Hivatkozás mentése DownThemAll-al", "message": "Hivatkozás mentése TraitorousDownloading-al",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Média mentése DownThemAll-al", "message": "Média mentése TraitorousDownloading-al",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Kiválasztás mentése DownThemAll-al", "message": "Kiválasztás mentése TraitorousDownloading-al",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -321,7 +321,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "A tömeges letöltő a böngésződ számára", "message": "A tömeges letöltő a böngésződ számára",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "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": { "fastfiltering": {
"message": "Gyors szűrés", "message": "Gyors szűrés",
@ -450,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "DownThemAll! kezelő", "message": "TraitorousDownloading! kezelő",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "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", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "DownThemAll! beállításai", "message": "TraitorousDownloading! beállításai",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "DownThemAll gomb:", "message": "TraitorousDownloading gomb:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "DownThemAll választás", "message": "TraitorousDownloading választás",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Keress hivatkozásokat a honlap szövegében (lassabb)", "message": "Keress hivatkozásokat a honlap szövegében (lassabb)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"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": { "pref_ui": {
"message": "Felhasználói felület", "message": "Felhasználói felület",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "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" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - Adj hozzá egy hivatkozást", "message": "TraitorousDownloading! - Adj hozzá egy hivatkozást",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "sizeB": {

View File

@ -216,23 +216,23 @@
"description": "Download (verb/action); e.g. in single and select buttons" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll - Semua Tab", "message": "TraitorousDownloading - Semua Tab",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Simpan Gambar menggunakan DownThemAll!", "message": "Simpan Gambar menggunakan TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Simpan Tautan menggunakan DownThemAll!", "message": "Simpan Tautan menggunakan TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Simpan Media menggunakan DownThemAll!", "message": "Simpan Media menggunakan TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Simpan Pilihan menggunakan DownThemAll!", "message": "Simpan Pilihan menggunakan TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo_all": { "dta_turbo_all": {
@ -297,7 +297,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "Pengunduh Masal untuk browser anda", "message": "Pengunduh Masal untuk browser anda",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "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": { "fastfiltering": {
"message": "Penyaringan Cepat", "message": "Penyaringan Cepat",
@ -398,7 +398,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "Pengelola DownThemAll!", "message": "Pengelola TraitorousDownloading!",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask_default": { "mask_default": {
@ -426,7 +426,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "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", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -498,7 +498,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "Preferensi DownThemAll!", "message": "Preferensi TraitorousDownloading!",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -506,11 +506,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "Tombol DownThemAll!:", "message": "Tombol TraitorousDownloading!:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "Pilihan DownThemAll!", "message": "Pilihan TraitorousDownloading!",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -926,7 +926,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - Pilih Unduhan Anda", "message": "TraitorousDownloading! - Pilih Unduhan Anda",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -970,7 +970,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - Tambah tautan", "message": "TraitorousDownloading! - Tambah tautan",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizes_huge": { "sizes_huge": {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - Все вкладки", "message": "TraitorousDownloading! - Все вкладки",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "Закачать изображение через DownThemAll!", "message": "Закачать изображение через TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "Закачать ссылку через DownThemAll!", "message": "Закачать ссылку через TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "Закачать медиа через DownThemAll!", "message": "Закачать медиа через TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "Закачать выделенное через DownThemAll!", "message": "Закачать выделенное через TraitorousDownloading!",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -321,7 +321,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "Универсальная качалка для вашего браузера", "message": "Универсальная качалка для вашего браузера",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "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": { "fastfiltering": {
"message": "Быстрый фильтр", "message": "Быстрый фильтр",
@ -450,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "DownThemAll! Менеджер", "message": "TraitorousDownloading! Менеджер",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "nagging_message": {
"message": "Добавлено $DOWNLOADS$ закачек через DownThemAll! на текущий момент! Как постоянный пользователь подумайте над тем чтобы поддержать дальнейшую разработку. Спасибо!", "message": "Добавлено $DOWNLOADS$ закачек через TraitorousDownloading! на текущий момент! Как постоянный пользователь подумайте над тем чтобы поддержать дальнейшую разработку. Спасибо!",
"description": "Donation nagging message; displayed as a notification bar in manager", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "Настройки DownThemAll!", "message": "Настройки TraitorousDownloading!",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "Кнопка DownThemAll!", "message": "Кнопка TraitorousDownloading!",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "DownThemAll! выделенного", "message": "TraitorousDownloading! выделенного",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "Пытаться обнаружить ссылки в тексте на сайте", "message": "Пытаться обнаружить ссылки в тексте на сайте",
"description": "Preferences/General" "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": { "pref_ui": {
"message": "Интерфейс пользователя", "message": "Интерфейс пользователя",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - Выбрать ваши закачки", "message": "TraitorousDownloading! - Выбрать ваши закачки",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - Добавить ссылку", "message": "TraitorousDownloading! - Добавить ссылку",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "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" "description": "Download (verb/action); e.g. in single and select buttons"
}, },
"dta_regular": { "dta_regular": {
"message": "DownThemAll!", "message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text" "description": "Regular dta action; Menu text"
}, },
"dta_regular_all": { "dta_regular_all": {
"message": "DownThemAll! - 全部标签页", "message": "TraitorousDownloading! - 全部标签页",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_image": { "dta_regular_image": {
"message": "用 DownThemAll! 保存图片", "message": "用 TraitorousDownloading! 保存图片",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_link": { "dta_regular_link": {
"message": "用 DownThemAll! 保存链接", "message": "用 TraitorousDownloading! 保存链接",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_media": { "dta_regular_media": {
"message": "用 DownThemAll! 保存媒体", "message": "用 TraitorousDownloading! 保存媒体",
"description": "Menu text" "description": "Menu text"
}, },
"dta_regular_selection": { "dta_regular_selection": {
"message": "用 DownThemAll! 保存选中项", "message": "用 TraitorousDownloading! 保存选中项",
"description": "Menu text" "description": "Menu text"
}, },
"dta_turbo": { "dta_turbo": {
@ -321,7 +321,7 @@
}, },
"extensionDescription": { "extensionDescription": {
"message": "适用您浏览器的批量下载工具", "message": "适用您浏览器的批量下载工具",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "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": { "fastfiltering": {
"message": "快速筛选", "message": "快速筛选",
@ -450,7 +450,7 @@
} }
}, },
"manager_title": { "manager_title": {
"message": "DownThemAll! 管理器", "message": "TraitorousDownloading! 管理器",
"description": "Window/tab title" "description": "Window/tab title"
}, },
"mask": { "mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up" "description": "Action for moving a download up"
}, },
"nagging_message": { "nagging_message": {
"message": "您使用 DownThemAll! 至今已经添加了 $DOWNLOADS$ 个下载。作为一名普通用户,您可以考虑捐助来支持一下开发。多谢!", "message": "您使用 TraitorousDownloading! 至今已经添加了 $DOWNLOADS$ 个下载。作为一名普通用户,您可以考虑捐助来支持一下开发。多谢!",
"description": "Donation nagging message; displayed as a notification bar in manager", "description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": { "placeholders": {
"downloads": { "downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences" "description": "Menu text; Preferences"
}, },
"prefs_title": { "prefs_title": {
"message": "DownThemAll! 首选项", "message": "TraitorousDownloading! 首选项",
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "DownThemAll! 按钮:", "message": "TraitorousDownloading! 按钮:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "DownThemAll! 选择框", "message": "TraitorousDownloading! 选择框",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
@ -657,6 +657,22 @@
"message": "尝试在网站文本中寻找链接(较慢)", "message": "尝试在网站文本中寻找链接(较慢)",
"description": "Preferences/General" "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": { "pref_ui": {
"message": "用户界面", "message": "用户界面",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -1010,7 +1026,7 @@
"description": "Menu text; select context" "description": "Menu text; select context"
}, },
"select_title": { "select_title": {
"message": "DownThemAll! - 选择您要下载的内容", "message": "TraitorousDownloading! - 选择您要下载的内容",
"description": "Title of the select window" "description": "Title of the select window"
}, },
"SERVER_BAD_CONTENT": { "SERVER_BAD_CONTENT": {
@ -1054,7 +1070,7 @@
"description": "Header text; single window" "description": "Header text; single window"
}, },
"single_title": { "single_title": {
"message": "DownThemAll! - 添加链接", "message": "TraitorousDownloading! - 添加链接",
"description": "Title of single window" "description": "Title of single window"
}, },
"sizeB": { "sizeB": {
@ -1246,7 +1262,7 @@
"description": "Tooltip text; manager/downloads" "description": "Tooltip text; manager/downloads"
}, },
"tooltip_eta": { "tooltip_eta": {
"message": "重命名", "message": "剩余时间",
"description": "Tooltip text; manager/downloads; Time" "description": "Tooltip text; manager/downloads; Time"
}, },
"tooltip_from": { "tooltip_from": {

View File

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

View File

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

View File

@ -17,6 +17,7 @@
"remove-missing-on-init": false, "remove-missing-on-init": false,
"retries": 5, "retries": 5,
"retry-time": 10, "retry-time": 10,
"theme": "default",
"limits": [ "limits": [
{ {
"domain": "*", "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 { select } from "./select";
import { single } from "./single"; import { single } from "./single";
import { Notification } from "./notifications"; import { Notification } from "./notifications";
import { MASK, FASTFILTER, SUBFOLDER } from "./recentlist"; import { MASK, FASTFILTER, SUBFOLDER, SERVER } from "./recentlist";
import { openManager } from "./windowutils"; import { openManager } from "./windowutils";
import { _ } from "./i18n"; import { _ } from "./i18n";
@ -20,7 +20,9 @@ const MAX_BATCH = 10000;
export interface QueueOptions { export interface QueueOptions {
mask?: string; mask?: string;
subfolder?: string; subfolder?: string;
server?: string;
paused?: boolean; paused?: boolean;
cookies?: boolean;
} }
export const API = new class APIImpl { export const API = new class APIImpl {
@ -32,8 +34,10 @@ export const API = new class APIImpl {
await Promise.all([MASK.init(), SUBFOLDER.init()]); await Promise.all([MASK.init(), SUBFOLDER.init()]);
const {mask = MASK.current} = options; const {mask = MASK.current} = options;
const {subfolder = SUBFOLDER.current} = options; const {subfolder = SUBFOLDER.current} = options;
const {server = SERVER.current} = options;
const {paused = false} = options; const {paused = false} = options;
const {cookies = false} = options;
const defaults: any = { const defaults: any = {
_idx: 0, _idx: 0,
get idx() { get idx() {
@ -49,8 +53,10 @@ export const API = new class APIImpl {
postData: null, postData: null,
mask, mask,
subfolder, subfolder,
server,
date: Date.now(), date: Date.now(),
paused paused,
cookies,
}; };
let currentBatch = await Prefs.get("currentBatch", 0); let currentBatch = await Prefs.get("currentBatch", 0);
const initialBatch = currentBatch; const initialBatch = currentBatch;
@ -80,7 +86,7 @@ export const API = new class APIImpl {
new Notification(null, _("queued-downloads", items.length)); 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); await openManager(false);
} }
} }
@ -124,6 +130,10 @@ export const API = new class APIImpl {
await SUBFOLDER.init(); await SUBFOLDER.init();
await SUBFOLDER.push(options.subfolder); 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") { if (typeof options.type === "string") {
await Prefs.set("last-type", options.type); await Prefs.set("last-type", options.type);
} }

View File

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

View File

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

View File

@ -9,33 +9,33 @@ interface ExtensionListener {
} }
export interface MessageSender { export interface MessageSender {
tab?: Tab; readonly tab?: Tab;
frameId?: number; readonly frameId?: number;
id?: number; readonly id?: number;
url?: string; readonly url?: string;
tlsChannelId?: string; readonly tlsChannelId?: string;
} }
export interface Tab { export interface Tab {
id?: number; readonly id?: number;
incognito?: boolean; readonly incognito?: boolean;
} }
export interface MenuClickInfo { export interface MenuClickInfo {
menuItemId: string | number; readonly menuItemId: string | number;
button?: number; readonly button?: number;
linkUrl?: string; readonly linkUrl?: string;
srcUrl?: string; readonly srcUrl?: string;
} }
export interface RawPort { export interface RawPort {
error: any; readonly error: any;
name: string; readonly name: string;
onDisconnect: ExtensionListener; readonly sender?: MessageSender;
onMessage: ExtensionListener; readonly onDisconnect: ExtensionListener;
sender?: MessageSender; readonly onMessage: ExtensionListener;
disconnect: () => void; disconnect: () => void;
postMessage: (message: any) => void; postMessage: (message: any) => void;
} }
@ -57,7 +57,7 @@ type Header = {name: string; value: string};
export interface DownloadOptions { export interface DownloadOptions {
conflictAction: string; conflictAction: string;
filename: string; filename?: string;
saveAs: boolean; saveAs: boolean;
url: string; url: string;
method?: string; method?: string;
@ -82,15 +82,22 @@ interface Downloads {
getFileIcon(id: number, options?: any): Promise<string>; getFileIcon(id: number, options?: any): Promise<string>;
setShelfEnabled(state: boolean): void; setShelfEnabled(state: boolean): void;
removeFile(manId: number): Promise<void>; removeFile(manId: number): Promise<void>;
onCreated: ExtensionListener; readonly onCreated: ExtensionListener;
onChanged: ExtensionListener; readonly onChanged: ExtensionListener;
onErased: ExtensionListener; readonly onErased: ExtensionListener;
readonly onDeterminingFilename?: ExtensionListener;
} }
interface WebRequest { interface WebRequest {
onBeforeSendHeaders: WebRequestListener; readonly onBeforeSendHeaders: WebRequestListener;
onSendHeaders: WebRequestListener; readonly onSendHeaders: WebRequestListener;
onHeadersReceived: WebRequestListener; readonly onHeadersReceived: WebRequestListener;
}
export interface OnInstalled {
readonly reason: string;
readonly previousVersion?: string;
readonly temporary: boolean;
} }
export const {browserAction} = polyfill; export const {browserAction} = polyfill;
@ -107,5 +114,7 @@ export const {tabs} = polyfill;
export const {webNavigation} = polyfill; export const {webNavigation} = polyfill;
export const {webRequest}: {webRequest: WebRequest} = polyfill; export const {webRequest}: {webRequest: WebRequest} = polyfill;
export const {windows} = polyfill; export const {windows} = polyfill;
export const {theme} = polyfill;
export const CHROME = navigator.appVersion.includes("Chrome/"); export const CHROME = navigator.appVersion.includes("Chrome/");
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 { export class Port extends EventEmitter {
private port: RawPort | null; private port: RawPort | null;
private disconnected = false;
constructor(port: RawPort) { constructor(port: RawPort) {
super(); super();
this.port = port; this.port = port;
let disconnected = false;
const disconnect = () => {
if (disconnected) {
return;
}
disconnected = true;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
};
// Nasty firefox bug, thus listen for tab removal explicitly // Nasty firefox bug, thus listen for tab removal explicitly
if (port.sender && port.sender.tab && port.sender.tab.id) { if (port.sender && port.sender.tab && port.sender.tab.id) {
const otherTabId = port.sender.tab.id; const otherTabId = port.sender.tab.id;
const tabListener = function(tabId: number) { const tabListener = (tabId: number) => {
if (tabId !== otherTabId) { if (tabId !== otherTabId) {
return; return;
} }
disconnect(); this.disconnect();
}; };
tabs.onRemoved.addListener(tabListener); tabs.onRemoved.addListener(tabListener);
} }
port.onMessage.addListener(this.onMessage.bind(this)); port.onMessage.addListener(this.onMessage.bind(this));
port.onDisconnect.addListener(disconnect); port.onDisconnect.addListener(this.disconnect.bind(this));
}
disconnect() {
if (this.disconnected) {
return;
}
this.disconnected = true;
const {port} = this;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
} }
get name() { get name() {
@ -120,6 +123,9 @@ export const Bus = new class extends EventEmitter {
port.disconnect(); port.disconnect();
return; return;
} }
this.ports.emit(port.name, new Port(port)); const wrapped = new Port(port);
if (!this.ports.emit(port.name, wrapped)) {
wrapped.disconnect();
}
} }
}(); }();

132
lib/db.ts
View File

@ -1,17 +1,25 @@
"use strict"; "use strict";
// License: MIT
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item"; import { BaseItem } from "./item";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { Download } from "./manager/download"; import { Download } from "./manager/download";
import { RUNNING, QUEUED, RETRYING } from "./manager/state"; import { RUNNING, QUEUED, RETRYING } from "./manager/state";
import { storage } from "./browser";
// License: MIT import { sort } from "./sorting";
const VERSION = 1; const VERSION = 1;
const STORE = "queue"; 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; private db?: IDBDatabase;
constructor() { constructor() {
@ -106,7 +114,7 @@ export const DB = new class DB {
return await new Promise(this.saveItemsInternal.bind(this, items)); 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) { if (!items || !items.length || !this.db) {
resolve(); resolve();
return; return;
@ -139,4 +147,120 @@ export const DB = new class DB {
await this.init(); await this.init();
await new Promise(this.deleteItemsInternal.bind(this, items)); 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 {memoize} from "./memoize";
import langs from "../_locales/all.json"; import langs from "../_locales/all.json";
import { sorted, naturalCaseCompare } from "./sorting"; import { sorted, naturalCaseCompare } from "./sorting";
import lf from "localforage";
export const ALL_LANGS = Object.freeze(new Map<string, string>( export const ALL_LANGS = Object.freeze(new Map<string, string>(
sorted(Object.entries(langs), e => { sorted(Object.entries(langs), e => {
@ -40,11 +40,11 @@ class Entry {
this.message = entry.message.replace(/\$[A-Z0-9]+\$/g, (r: string) => { this.message = entry.message.replace(/\$[A-Z0-9]+\$/g, (r: string) => {
hit = true; hit = true;
const id = r.substr(1, r.length - 2).toLocaleLowerCase(); const id = r.substr(1, r.length - 2).toLocaleLowerCase();
const pholder = entry.placeholders[id]; const placeholder = entry.placeholders[id];
if (!pholder || !pholder.content) { if (!placeholder || !placeholder.content) {
throw new Error(`Invalid placeholder: ${id}`); throw new Error(`Invalid placeholder: ${id}`);
} }
return `${pholder.content}$`; return `${placeholder.content}$`;
}); });
if (!hit) { if (!hit) {
throw new Error("Not entry-able"); throw new Error("Not entry-able");
@ -123,15 +123,18 @@ async function fetchLanguage(code: string) {
} }
function loadCached() { async function loadCached(): Promise<any> {
if (document.location.pathname.includes("/windows/")) { const cached = await lf.getItem<string>(CACHE_KEY);
const cached = localStorage.getItem(CACHE_KEY); if (!cached) {
if (cached) {
return JSON.parse(cached) as any[];
}
}
return null; 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() { async function loadRawLocales() {
// en is the base locale, always to be loaded // en is the base locale, always to be loaded
@ -187,16 +190,16 @@ async function load(): Promise<Localization> {
} }
CURRENT = currentLang; CURRENT = currentLang;
// en is the base locale // en is the base locale
let valid = loadCached(); let valid = await loadCached();
if (!valid) { if (!valid) {
valid = await loadRawLocales(); valid = await loadRawLocales();
localStorage.setItem(CACHE_KEY, JSON.stringify(valid)); await lf.setItem(CACHE_KEY, JSON.stringify(valid));
} }
if (!valid.length) { 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) { if (custom) {
try { try {
valid.push(JSON.parse(custom)); valid.push(JSON.parse(custom));
@ -239,7 +242,7 @@ locale.then(l => {
/** /**
* Localize a message * Localize a message
* @param {string} id Identifier of the string to localize * @param {string} id Identifier of the string to localize
* @param {string[]} [subst] Message substituations * @param {string[]} [subst] Message substitutions
* @returns {string} Localized message * @returns {string} Localized message
*/ */
export function _(id: string, ...subst: any[]) { export function _(id: string, ...subst: any[]) {
@ -302,11 +305,11 @@ export async function localize<T extends HTMLElement | DocumentFragment>(
return localize_(elem); return localize_(elem);
} }
export function saveCustomLocale(data?: string) { export async function saveCustomLocale(data?: string) {
if (!data) { if (!data) {
localStorage.removeItem(CUSTOM_KEY); await lf.removeItem(CUSTOM_KEY);
return; return;
} }
new Localization(JSON.parse(data)); 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 { downloads, CHROME } from "./browser";
import { EventEmitter } from "../uikit/lib/events"; import { EventEmitter } from "../uikit/lib/events";
import { PromiseSerializer } from "./pserializer"; import { PromiseSerializer } from "./pserializer";
import lf from "localforage";
const VERSION = 1;
const STORE = "iconcache"; const STORE = "iconcache";
// eslint-disable-next-line no-magic-numbers // eslint-disable-next-line no-magic-numbers
const CACHE_SIZES = CHROME ? [16, 32] : [16, 32, 64, 127]; 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 { export const IconCache = new class IconCache extends EventEmitter {
private db: Promise<IDBDatabase>; private db = lf.createInstance({name: STORE});
private cache: Map<string, string>; private cache: Map<string, string>;
constructor() { constructor() {
super(); super();
this.db = this.init();
this.cache = new Map(); this.cache = new Map();
this.get = PromiseSerializer.wrapNew(8, this, this.get); this.get = PromiseSerializer.wrapNew(8, this, this.get);
this.set = PromiseSerializer.wrapNew(1, this, this.set); 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) { private normalize(ext: string) {
ext = ext.toLocaleLowerCase(); ext = ext.toLocaleLowerCase();
return SYNONYMS.get(ext) || ext; return SYNONYMS.get(ext) || ext;
@ -95,36 +77,25 @@ export const IconCache = new class IconCache extends EventEmitter {
if (rv) { if (rv) {
return rv; return rv;
} }
const db = await this.db;
rv = this.cache.get(sext); rv = this.cache.get(sext);
if (rv) { if (rv) {
return rv; return rv;
} }
return await new Promise<string | undefined>(resolve => { let result = await this.db.getItem<any>(sext);
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;
if (!result) { if (!result) {
resolve(undefined); return this.cache.get(sext);
return;
} }
if (typeof req.result !== "string") { rv = this.cache.get(sext);
if (rv) {
return rv;
}
if (typeof result !== "string") {
result = URL.createObjectURL(result).toString(); result = URL.createObjectURL(result).toString();
} }
this.cache.set(sext, result); this.cache.set(sext, result);
this.cache.set(ext, ""); this.cache.set(ext, "");
resolve(result); return result;
};
});
} }
async set(ext: string, manId: number) { async set(ext: string, manId: number) {
@ -145,18 +116,9 @@ export const IconCache = new class IconCache extends EventEmitter {
} }
for (const {size, icon} of urls) { for (const {size, icon} of urls) {
this.cache.set(`${ext}-${size}`, URL.createObjectURL(icon)); this.cache.set(`${ext}-${size}`, URL.createObjectURL(icon));
await this.db.setItem(`${ext}-${size}`, icon);
} }
this.cache.set(ext, ""); 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); this.emit("cached", ext);
} }
}(); }();

View File

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

View File

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

View File

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

View File

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

View File

@ -16,7 +16,8 @@ import { Download } from "./download";
import { ManagerPort } from "./port"; import { ManagerPort } from "./port";
import { Scheduler } from "./scheduler"; import { Scheduler } from "./scheduler";
import { Limits } from "./limits"; 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(""); const US = runtime.getURL("");
@ -61,6 +62,9 @@ export class Manager extends EventEmitter {
private deadlineTimer: number; private deadlineTimer: number;
constructor() { constructor() {
if (!document.location.href.includes("background")) {
throw new Error("Not on background");
}
super(); super();
this.active = true; this.active = true;
this.shouldReload = false; this.shouldReload = false;
@ -82,13 +86,18 @@ export class Manager extends EventEmitter {
downloads.onChanged.addListener(this.onChanged.bind(this)); downloads.onChanged.addListener(this.onChanged.bind(this));
downloads.onErased.addListener(this.onErased.bind(this)); downloads.onErased.addListener(this.onErased.bind(this));
if (CHROME && downloads.onDeterminingFilename) {
downloads.onDeterminingFilename.addListener(
this.onDeterminingFilename.bind(this));
}
Bus.onPort("manager", (port: Port) => { Bus.onPort("manager", (port: Port) => {
const mport = new ManagerPort(this, port); const managerPort = new ManagerPort(this, port);
port.on("disconnect", () => { port.on("disconnect", () => {
this.ports.delete(mport); this.ports.delete(managerPort);
}); });
this.ports.add(mport); this.ports.add(managerPort);
return true;
}); });
Limits.on("changed", () => { Limits.on("changed", () => {
this.resetScheduler(); this.resetScheduler();
@ -118,7 +127,7 @@ export class Manager extends EventEmitter {
// Do not wait for the scheduler // Do not wait for the scheduler
this.resetScheduler(); this.resetScheduler();
this.emit("inited"); this.emit("initialized");
setTimeout(() => this.checkMissing(), MISSING_TIMEOUT); setTimeout(() => this.checkMissing(), MISSING_TIMEOUT);
runtime.onUpdateAvailable.addListener(() => { runtime.onUpdateAvailable.addListener(() => {
if (this.running.size) { if (this.running.size) {
@ -157,6 +166,20 @@ export class Manager extends EventEmitter {
this.manIds.delete(downloadId); this.manIds.delete(downloadId);
} }
onDeterminingFilename(state: any, suggest: Function) {
const download = this.manIds.get(state.id);
if (!download) {
return;
}
try {
download.updateFromSuggestion(state);
}
finally {
const suggestion = {filename: download.dest.full};
suggest(suggestion);
}
}
async resetScheduler() { async resetScheduler() {
this.scheduler = null; this.scheduler = null;
await this.startNext(); await this.startNext();
@ -218,7 +241,7 @@ export class Manager extends EventEmitter {
if (this.notifiedFinished || this.running.size || this.retrying.size) { if (this.notifiedFinished || this.running.size || this.retrying.size) {
return; return;
} }
if (SOUNDS.value) { if (SOUNDS.value && !OPERA) {
const audio = new Audio(runtime.getURL("/style/done.opus")); const audio = new Audio(runtime.getURL("/style/done.opus"));
audio.addEventListener("canplaythrough", () => audio.play()); audio.addEventListener("canplaythrough", () => audio.play());
audio.addEventListener("ended", () => document.body.removeChild(audio)); audio.addEventListener("ended", () => document.body.removeChild(audio));
@ -239,6 +262,61 @@ export class Manager extends EventEmitter {
this.manIds.delete(id); 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[]) { addNewDownloads(items: any[]) {
if (!items || !items.length) { if (!items || !items.length) {
return; return;
@ -261,6 +339,7 @@ export class Manager extends EventEmitter {
this.save(items); this.save(items);
this.startNext(); this.startNext();
} }
*/
setDirty(item: Download) { setDirty(item: Download) {
this.dirty.add(item); this.dirty.add(item);
@ -336,8 +415,8 @@ export class Manager extends EventEmitter {
this.startNext().catch(console.error); this.startNext().catch(console.error);
} }
else if (newState === RUNNING) { else if (newState === RUNNING) {
// Usually we already added it. Buit if a user uses the built-in // Usually we already added it. But if a user uses the built-in
// download manager to resart // download manager to restart
// a download, we have not, so make sure it is added either way // a download, we have not, so make sure it is added either way
this.running.add(download); this.running.add(download);
} }
@ -395,17 +474,18 @@ export class Manager extends EventEmitter {
sorted(sids: number[]) { sorted(sids: number[]) {
try { try {
// Construct new items // Construct new items
const csids = new Map(this.sids); const currentSids = new Map(this.sids);
let items = mapFilterInSitu(sids, sid => { let items = mapFilterInSitu(sids, sid => {
const item = csids.get(sid); const item = currentSids.get(sid);
if (!item) { if (!item) {
return null; return null;
} }
csids.delete(sid); currentSids.delete(sid);
return item; return item;
}, e => !!e); }, e => !!e);
if (csids.size) { if (currentSids.size) {
items = items.concat(sort(Array.from(csids.values()), i => i.position)); items = items.concat(
sort(Array.from(currentSids.values()), i => i.position));
} }
this.items = items; this.items = items;
this.setPositions(); this.setPositions();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -122,3 +122,8 @@ export const SUBFOLDER = new RecentList("subfolder", [
"downthemall", "downthemall",
]); ]);
SUBFOLDER.init().catch(console.error); 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 // eslint-disable-next-line no-unused-vars
import { filters, FAST, Filter } from "./filters"; import { filters, FAST, Filter } from "./filters";
import { WindowStateTracker } from "./windowstatetracker"; import { WindowStateTracker } from "./windowstatetracker";
import { windows } from "./browser"; import { windows, CHROME } from "./browser";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { BaseItem } from "./item"; import { BaseItem } from "./item";
interface BaseMatchedItem extends BaseItem { interface BaseMatchedItem extends BaseItem {
sidx?: number;
matched?: string | null; matched?: string | null;
prevMatched?: string | null; prevMatched?: string | null;
} }
@ -29,6 +30,7 @@ function computeSelection(
onlyFast: boolean): ItemDelta[] { onlyFast: boolean): ItemDelta[] {
let ws = items.map((item, idx: number) => { let ws = items.map((item, idx: number) => {
item.idx = item.idx || idx; item.idx = item.idx || idx;
item.sidx = item.sidx || idx;
const {matched = null} = item; const {matched = null} = item;
item.prevMatched = matched; item.prevMatched = matched;
item.matched = null; item.matched = null;
@ -52,7 +54,7 @@ function computeSelection(
} }
return items.filter(item => item.prevMatched !== item.matched).map(item => { return items.filter(item => item.prevMatched !== item.matched).map(item => {
return { return {
idx: item.idx, idx: item.sidx as number,
matched: item.matched matched: item.matched
}; };
}); });
@ -98,10 +100,16 @@ export async function select(links: BaseItem[], media: BaseItem[]) {
type: "popup", type: "popup",
}); });
const window = await windows.create(windowOptions); const window = await windows.create(windowOptions);
tracker.track(window.id, null); tracker.track(window.id);
try { try {
if (!CHROME) {
windows.update(window.id, tracker.getOptions({}));
}
const port = await Promise.race<Port>([ const port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("select", resolve)), new Promise<Port>(resolve => Bus.oncePort("select", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]); timeout<Port>(5 * 1000)]);
if (!port.isSelf) { if (!port.isSelf) {
throw Error("Invalid sender connected"); throw Error("Invalid sender connected");

View File

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

View File

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

View File

@ -1,11 +1,15 @@
"use strict"; "use strict";
// License: MIT // License: MIT
import { windows, tabs, runtime } from "../lib/browser"; import { windows, tabs, runtime, CHROME } from "../lib/browser";
import { getManager } from "./manager/man"; import { getManager } from "./manager/man";
import DEFAULT_ICONS from "../data/icons.json"; import DEFAULT_ICONS from "../data/icons.json";
import { Prefs } from "./prefs"; import { Prefs } from "./prefs";
import { _ } from "./i18n"; 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_URL = "https://www.downthemall.org/howto/donate/";
const DONATE_LANG_URLS = Object.freeze(new Map([ const DONATE_LANG_URLS = Object.freeze(new Map([
@ -26,7 +30,7 @@ export async function mostRecentBrowser(incognito: boolean): Promise<any> {
} }
catch { catch {
try { try {
window = await windows.getlastFocused(); window = await windows.getLastFocused();
if (window.type !== "normal") { if (window.type !== "normal") {
throw new Error("not a normal window"); throw new Error("not a normal window");
} }
@ -114,11 +118,37 @@ export async function openManager(focus = true) {
await windows.update(tab.windowId, {focused: true}); await windows.update(tab.windowId, {focused: true});
return; return;
} }
const windowOptions = {
const tracker = new WindowStateTracker("manager", {
minWidth: 700,
minHeight: 500,
});
await tracker.init();
const windowOptions = tracker.getOptions({
url, url,
type: "popup", 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; return;
} }
if (focus) { if (focus) {

View File

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

View File

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

View File

@ -121,14 +121,26 @@ class Gatherer {
*collectImageInternal(img: HTMLImageElement) { *collectImageInternal(img: HTMLImageElement) {
try { try {
const src = img.currentSrc || img.src; {
const {src} = img;
const item = this.makeItem(src, img); const item = this.makeItem(src, img);
if (item) { if (item) {
item.fileName = ""; item.fileName = "";
item.description = item.title; item.description = item.title;
yield item; yield item;
} }
}
{
const {currentSrc} = img;
const item = this.makeItem(currentSrc, img);
if (item) {
item.fileName = "";
item.description = item.title;
yield item;
}
}
{
const {srcset} = img; const {srcset} = img;
if (!srcset) { if (!srcset) {
return; return;
@ -146,6 +158,7 @@ class Gatherer {
} }
} }
} }
}
catch (ex) { catch (ex) {
console.error("oops image", ex.toString(), ex.stack, 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 */ /* License: gpl-v2 */
:root { :root {
--general-color: #2a2a2e;
--general-bgcolor: rgb(249, 249, 250);
--general-border-color: lightgray;
--general-input-color: black;
--general-input-bgcolor: white;
--general-button-color: black;
--general-button-bgcolor: rgb(246, 246, 246);
--general-button-bgcolor-hover: white;
--general-button-shadow: 0px 0px 5px 1px rgba(128, 128, 128, 0.5);
--menu-bgcolor: white;
--menu-bgcolor-hover: #2283fb;
--table-bgcolor: white;
--table-head-bgcolor: white;
--toolbar-bg-color: rgb(248, 134, 6); --toolbar-bg-color: rgb(248, 134, 6);
--toolbar-active-border-color: #478de7; --toolbar-active-border-color: #478de7;
--toolbar-hover-border-color: red; --toolbar-hover-border-color: red;
--toolbar-hover-background: rgb(247, 149, 37); --toolbar-hover-background: rgb(247, 149, 37);
--toolbar-border-width: 2px; --toolbar-border-width: 2px;
--toolbar-border: 1px solid rgba(255, 255, 255, 0.5);
--add-color: navy; --add-color: navy;
--queue-color: gray; --queue-color: gray;
--pause-color: #ffa318; --pause-color: #ffa318;
@ -20,24 +34,81 @@
--maskbutton-color: rgb(236, 185, 16); --maskbutton-color: rgb(236, 185, 16);
--missing-color: rgb(0, 82, 204); --missing-color: rgb(0, 82, 204);
--open-color: rgba(236, 185, 16, 0.8); --open-color: rgba(236, 185, 16, 0.8);
--status-icon-color: #363636;
--status-icon-color-hover: #6e6d6d;
--tile-url: url(tile.png);
--file-icon-image-color: rgb(17, 107, 163);
--popup-bgcolor: #fff;
--popup-color: #0c0c0d;
--modal-color: black;
--modal-bgcolor: white;
}
html.dark {
--add-color: lightblue;
--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"] { html[data-platform="mac"] {
--folder-color: rgb(4, 102, 214); --folder-color: rgb(4, 102, 214);
} }
html, body { html,
body {
font-size: 10pt !important; font-size: 10pt !important;
} }
@font-face { @font-face {
font-family: 'downthemall'; font-family: "downthemall";
src: url('downthemall.woff2?75791791') format('woff2'); src: url("downthemall.woff2?75791791") format("woff2");
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
[class^="icon-"]:before, [class*=" icon-"]:before { [class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: "downthemall"; font-family: "downthemall";
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
@ -54,72 +125,187 @@ html, body {
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-add:before { content: '\e800'; } /* '' */ .icon-add:before {
.icon-addsegment:before { content: '\e801'; } /* '' */ content: "\e800";
.icon-bottom:before { content: '\e802'; } /* '' */ } /* '' */
.icon-picture:before { content: '\e803'; } /* '' */ .icon-addsegment:before {
.icon-circle:before { content: '\e804'; } /* '' */ content: "\e801";
.icon-delete:before { content: '\e805'; } /* '' */ } /* '' */
.icon-done:before { content: '\e806'; } /* '' */ .icon-bottom:before {
.icon-down:before { content: '\e807'; } /* '' */ content: "\e802";
.icon-download:before { content: '\e808'; } /* '' */ } /* '' */
.icon-dupe:before { content: '\e809'; } /* '' */ .icon-picture:before {
.icon-error:before { content: '\e80a'; } /* '' */ content: "\e803";
.icon-failed:before { content: '\e80b'; } /* '' */ } /* '' */
.icon-file:before { content: '\e80c'; } /* '' */ .icon-circle:before {
.icon-find:before { content: '\e80d'; } /* '' */ content: "\e804";
.icon-folder:before { content: '\e80e'; } /* '' */ } /* '' */
.icon-force:before { content: '\e80f'; } /* '' */ .icon-delete:before {
.icon-go:before { content: '\e810'; } /* '' */ content: "\e805";
.icon-import:before { content: '\e811'; } /* '' */ } /* '' */
.icon-info:before { content: '\e812'; } /* '' */ .icon-done:before {
.icon-launch:before { content: '\e813'; } /* '' */ content: "\e806";
.icon-missing:before { content: '\e814'; } /* '' */ } /* '' */
.icon-network-off:before { content: '\e815'; } /* '' */ .icon-down:before {
.icon-network-on:before { content: '\e816'; } /* '' */ content: "\e807";
.icon-pause:before { content: '\e817'; } /* '' */ } /* '' */
.icon-remsegment:before { content: '\e818'; } /* '' */ .icon-download:before {
.icon-rename:before { content: '\e819'; } /* '' */ content: "\e808";
.icon-save:before { content: '\e81a'; } /* '' */ } /* '' */
.icon-settings:before { content: '\e81b'; } /* '' */ .icon-dupe:before {
.icon-top:before { content: '\e81c'; } /* '' */ content: "\e809";
.icon-unchecked:before { content: '\e81d'; } /* '' */ } /* '' */
.icon-unlimited:before { content: '\e81e'; } /* '' */ .icon-error:before {
.icon-link:before { content: '\e81f'; } /* '' */ content: "\e80a";
.icon-up:before { content: '\e820'; } /* '' */ } /* '' */
.icon-privacy:before { content: '\e821'; } /* '' */ .icon-failed:before {
.icon-tags:before { content: '\e822'; } /* '' */ content: "\e80b";
.icon-attention:before { content: '\e823'; } /* '' */ } /* '' */
.icon-notification:before { content: '\e824'; } /* '' */ .icon-file:before {
.icon-file-video:before { content: '\e825'; } /* '' */ content: "\e80c";
.icon-file-generic:before { content: '\e826'; } /* '' */ } /* '' */
.icon-question-dark:before { content: '\e827'; } /* '' */ .icon-find:before {
.icon-forward:before { content: '\e828'; } /* '' */ content: "\e80d";
.icon-filter:before { content: '\f0b0'; } /* '' */ } /* '' */
.icon-donate:before { content: '\f0d6'; } /* '' */ .icon-folder:before {
.icon-file-doc:before { content: '\f0f6'; } /* '' */ content: "\e80e";
.icon-interface:before { content: '\f108'; } /* '' */ } /* '' */
.icon-folder-1:before { content: '\f115'; } /* '' */ .icon-force:before {
.icon-sort-asc:before { content: '\f15d'; } /* '' */ content: "\e80f";
.icon-sort-desc:before { content: '\f15e'; } /* '' */ } /* '' */
.icon-file-pdf:before { content: '\f1c1'; } /* '' */ .icon-go:before {
.icon-file-word:before { content: '\f1c2'; } /* '' */ content: "\e810";
.icon-file-image:before { content: '\f1c5'; } /* '' */ } /* '' */
.icon-file-archive:before { content: '\f1c6'; } /* '' */ .icon-import:before {
.icon-file-audio:before { content: '\f1c7'; } /* '' */ content: "\e811";
.icon-toggle-off:before { content: '\f204'; } /* '' */ } /* '' */
.icon-toggle-on:before { content: '\f205'; } /* '' */ .icon-info:before {
.icon-server:before { content: '\f233'; } /* '' */ content: "\e812";
.icon-question-light:before { content: '\f29c'; } /* '' */ } /* '' */
.icon-launch:before {
content: "\e813";
} /* '' */
.icon-missing:before {
content: "\e814";
} /* '' */
.icon-network-off:before {
content: "\e815";
} /* '' */
.icon-network-on:before {
content: "\e816";
} /* '' */
.icon-pause:before {
content: "\e817";
} /* '' */
.icon-remsegment:before {
content: "\e818";
} /* '' */
.icon-rename:before {
content: "\e819";
} /* '' */
.icon-save:before {
content: "\e81a";
} /* '' */
.icon-settings:before {
content: "\e81b";
} /* '' */
.icon-top:before {
content: "\e81c";
} /* '' */
.icon-unchecked:before {
content: "\e81d";
} /* '' */
.icon-unlimited:before {
content: "\e81e";
} /* '' */
.icon-link:before {
content: "\e81f";
} /* '' */
.icon-up:before {
content: "\e820";
} /* '' */
.icon-privacy:before {
content: "\e821";
} /* '' */
.icon-tags:before {
content: "\e822";
} /* '' */
.icon-attention:before {
content: "\e823";
} /* '' */
.icon-notification:before {
content: "\e824";
} /* '' */
.icon-file-video:before {
content: "\e825";
} /* '' */
.icon-file-generic:before {
content: "\e826";
} /* '' */
.icon-question-dark:before {
content: "\e827";
} /* '' */
.icon-forward:before {
content: "\e828";
} /* '' */
.icon-filter:before {
content: "\f0b0";
} /* '' */
.icon-donate:before {
content: "\f0d6";
} /* '' */
.icon-file-doc:before {
content: "\f0f6";
} /* '' */
.icon-interface:before {
content: "\f108";
} /* '' */
.icon-folder-1:before {
content: "\f115";
} /* '' */
.icon-sort-asc:before {
content: "\f15d";
} /* '' */
.icon-sort-desc:before {
content: "\f15e";
} /* '' */
.icon-file-pdf:before {
content: "\f1c1";
} /* '' */
.icon-file-word:before {
content: "\f1c2";
} /* '' */
.icon-file-image:before {
content: "\f1c5";
} /* '' */
.icon-file-archive:before {
content: "\f1c6";
} /* '' */
.icon-file-audio:before {
content: "\f1c7";
} /* '' */
.icon-toggle-off:before {
content: "\f204";
} /* '' */
.icon-toggle-on:before {
content: "\f205";
} /* '' */
.icon-server:before {
content: "\f233";
} /* '' */
.icon-question-light:before {
content: "\f29c";
} /* '' */
@media (min-resolution: 144dpi) { @media (min-resolution: 144dpi) {
[class^="icon-file-"]:before, [class*=" icon-file-"]:before { [class^="icon-file-"]:before,
[class*=" icon-file-"]:before {
font-weight: bold !important; font-weight: bold !important;
} }
} }
.icon-file-image { .icon-file-image {
color: rgb(17, 107, 163); color: var(--file-icon-image-color);
} }
.icon-file-pdf, .icon-file-pdf,
@ -140,18 +326,29 @@ html, body {
color: rgb(202, 81, 198); color: rgb(202, 81, 198);
} }
body, html { body,
background: #F6F6F8; html {
color: #0C0C0D;
font: message-box; font: message-box;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Ubuntu",
"Helvetica Neue", sans-serif;
height: 100%; height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 100%; width: 100%;
color: var(--general-color);
background: var(--general-bgcolor);
} }
h1, h2, h3, h4 { html#popup,
html#popup > body {
color: var(--popup-color);
background: var(--popup-bgcolor);
}
h1,
h2,
h3,
h4 {
font: caption; font: caption;
font-weight: bold; font-weight: bold;
} }
@ -191,7 +388,11 @@ section {
} }
.virtualtable-column:active { .virtualtable-column:active {
background-image: linear-gradient(to top, rgba(0,0,0,0.03), rgba(128,128,128,0.1)); background-image: linear-gradient(
to top,
rgba(0, 0, 0, 0.03),
rgba(128, 128, 128, 0.1)
);
} }
th.virtualtable { th.virtualtable {
@ -218,7 +419,11 @@ td.virtualtable {
font-size: 12px; font-size: 12px;
align-items: stretch; align-items: stretch;
justify-items: center; justify-items: center;
background: linear-gradient(to bottom, rgba(128,128,128,0.1) 0%,rgba(0,0,0,0) 100%); background: linear-gradient(
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); border-top: 1px solid rgba(128, 128, 128, 0.6);
display: flex; display: flex;
margin-bottom: 1ex; margin-bottom: 1ex;
@ -251,10 +456,10 @@ td.virtualtable {
#statusPrefs { #statusPrefs {
cursor: pointer; cursor: pointer;
color: #363636; color: var(--status-icon-color);
} }
#statusPrefs:hover { #statusPrefs:hover {
color: #6e6d6d; color: var(--status-icon-color-hover);
} }
.dropdown { .dropdown {
@ -279,6 +484,7 @@ td.virtualtable {
-moz-appearance: none; -moz-appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
appearance: none; appearance: none;
color: black;
background: white; background: white;
border: none; border: none;
bottom: 2px; bottom: 2px;
@ -301,7 +507,6 @@ td.virtualtable {
padding-bottom: 1ex; padding-bottom: 1ex;
} }
@supports (not (-moz-appearance: none)) { @supports (not (-moz-appearance: none)) {
.dropdown select { .dropdown select {
background: white; background: white;
@ -371,3 +576,54 @@ td.virtualtable {
#maskButton { #maskButton {
color: var(--maskbutton-color); color: var(--maskbutton-color);
} }
table.virtualtable,
.virtualtable-body {
color: var(--general-color);
background: var(--table-bgcolor);
}
.virtualtable-head,
.virtualtable-head > table {
background: var(--table-head-bgcolor) !important;
}
.virtualtable-column {
border-right: 1px solid var(--general-border-color);
}
.virtualtable-cell {
border-right: 1px dotted var(--general-border-color);
}
.virtualtable-head,
.virtualtable-body {
border-bottom: 1px solid var(--general-border-color);
}
ul.context-menu,
ul.context-menu ul {
color: var(--general-color);
background: var(--menu-bgcolor);
}
.context-menu-item:hover:not(.context-menu-seperator),
.context-menu-item:hover:not(.context-menu-seperator) > * {
background: var(--menu-bgcolor-hover);
}
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 { #toolbar {
display: flex; display: flex;
margin: 0; margin: 0;
background: var(--toolbar-bg-color) url(tile.png) repeat-x; background: var(--toolbar-bg-color) var(--tile-url) repeat-x;
} }
#toolbar .spacer { #toolbar .spacer {
@ -42,9 +42,9 @@ body > * {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
box-shadow: 0px 0px 5px 1px rgba(128,128,128,0.5); box-shadow: var(--general-button-shadow);
background: rgb(246,246,246); background: var(--general-button-bgcolor);
color: black; color: var(--general-button-color);
transition: box-shadow 0.5s, background 1s; transition: box-shadow 0.5s, background 1s;
font-size: 24px; font-size: 24px;
line-height: 24px; line-height: 24px;
@ -60,7 +60,7 @@ body > * {
} }
#toolbar > .button:hover:not(.disabled) { #toolbar > .button:hover:not(.disabled) {
background: white; background: var(--general-button-bgcolor-hover);
box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75); box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75);
} }
@ -88,14 +88,14 @@ body > * {
flex: 1 1 auto; flex: 1 1 auto;
overflow: hidden; overflow: hidden;
display: grid; display: grid;
background: white; background: var(--general-bgcolor);
} }
#loading { #loading {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
background: rgba(255,255,255,0.9); background: var(--general-button-bgcolor);
font-weight: bolder; font-weight: bolder;
font-size: 200%; font-size: 200%;
z-index: 10; z-index: 10;
@ -311,7 +311,7 @@ body > * {
color: crimson; color: crimson;
} }
#statusNetwork.icon-network-on { #statusNetwork.icon-network-on {
color: navy; color: var(--add-color);
} }
#statusFilter { #statusFilter {
@ -404,7 +404,7 @@ body > * {
font-size: 10pt !important; font-size: 10pt !important;
} }
#nagging { #nagging {
border-top: 1px solid lightgray; border-top: 1px solid var(--general-border-color);
display: grid; display: grid;
grid-template-columns: 1fr auto auto auto; grid-template-columns: 1fr auto auto auto;
align-content: center; align-content: center;

View File

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

View File

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

View File

@ -64,7 +64,7 @@ p.example {
} }
#options > #subfolderOptions, #options > #subfolderOptions,
#options > #maskOptions { #options > #maskOptions, #options > #serverOptions {
display: grid; display: grid;
grid-template-columns: 2fr auto auto; grid-template-columns: 2fr auto auto;
} }

BIN
style/tile-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

10
tests/.editorconfig Normal file
View File

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

View File

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

View File

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

View File

@ -104,7 +104,7 @@ export class EventEmitter {
for (const e of Array.from(handlers)) { for (const e of Array.from(handlers)) {
try { try {
// eslint-disable-next-line prefer-spread // eslint-disable-next-line prefer-spread
handled = handled || !!e.apply(null, args); handled = !!e.apply(null, args) || handled;
} }
catch (ex) { catch (ex) {
console.error(`Event handler ${e} for ${event} failed`, ex.toString(), ex.stack, 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), { "scroll", debounce(this.scrolled.bind(this), SCROLL_DEBOUNCE), {
passive: true passive: true
}); });
body.addEventListener("contextmenu", this.contextmenu.bind(this), true);
table.addEventListener("keypress", this.keypressed.bind(this), true); table.addEventListener("keypress", this.keypressed.bind(this), true);
table.addEventListener("keydown", 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)); selectionGrippy.addEventListener("click", this.grippyClicked.bind(this));
} }

View File

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

View File

@ -6,7 +6,7 @@ langs = sorted(Path("_locales").glob("**/messages.json"), key=lambda p: p.parent
all = {} all = {}
for m in langs: for m in langs:
loc = m.parent.name 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") lang = json.load(mp).get("language").get("message")
if not lang: if not lang:
raise Exception(f"{m}: no language") raise Exception(f"{m}: no language")

View File

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

View File

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

View File

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

View File

@ -41,7 +41,6 @@ import { IconCache } from "../../lib/iconcache";
import * as imex from "../../lib/imex"; import * as imex from "../../lib/imex";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { BaseItem } from "../../lib/item"; import { BaseItem } from "../../lib/item";
import { API } from "../../lib/api";
const TREE_CONFIG_VERSION = 2; const TREE_CONFIG_VERSION = 2;
const RUNNING_TIMEOUT = 1000; const RUNNING_TIMEOUT = 1000;
@ -122,6 +121,8 @@ export class DownloadItem extends EventEmitter {
public currentName: string; public currentName: string;
public currentFull: string;
public ext?: string; public ext?: string;
public position: number; public position: number;
@ -569,9 +570,7 @@ export class DownloadTable extends VirtualTable {
ctx.on("dismissed", () => this.table.focus()); ctx.on("dismissed", () => this.table.focus());
this.on("contextmenu", (tree, event) => { this.on("contextmenu", (tree, event) => {
if (!this.selection.empty) {
this.showContextMenu(event); this.showContextMenu(event);
}
return true; return true;
}); });
@ -791,7 +790,7 @@ export class DownloadTable extends VirtualTable {
const items = this.getSelectedItems(); const items = this.getSelectedItems();
const states = items.reduce((p, c) => p |= c.state, 0); const states = items.reduce((p, c) => p |= c.state, 0);
if (!(states & DownloadState.PAUSABLE)) { if (!(states & DownloadState.PAUSEABLE)) {
this.pauseAction.disabled = true; this.pauseAction.disabled = true;
} }
@ -829,7 +828,7 @@ export class DownloadTable extends VirtualTable {
} }
pauseDownloads() { pauseDownloads() {
const sids = this.getSelectedSids(DownloadState.PAUSABLE); const sids = this.getSelectedSids(DownloadState.PAUSEABLE);
if (!sids.length) { if (!sids.length) {
return; return;
} }
@ -1204,7 +1203,7 @@ export class DownloadTable extends VirtualTable {
if (!items || !items.length) { if (!items || !items.length) {
return; return;
} }
API.regular(items, []); PORT.post("import", {items});
}; };
reader.readAsText(picker.files[0], "utf-8"); reader.readAsText(picker.files[0], "utf-8");
}; };

View File

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

View File

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

View File

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

View File

@ -16,12 +16,12 @@
} }
</style> </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" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png"> <link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.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="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="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png"> <link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script> <script defer src="/bundles/common.js"></script>
@ -43,15 +43,23 @@
<article id="tab-general" class="tab"> <article id="tab-general" class="tab">
<fieldset> <fieldset>
<legend data-i18n="pref.ui">UI</legend> <legend data-i18n="pref.ui">UI</legend>
<div id="pref-button-type"> <div class="optiongroups">
<label data-i18n="pref-button-type"></label> <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="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="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="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> </div>
<hr> <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-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-sounds"> <span data-i18n="pref-sounds"></span></label>
<label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label> <label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label>
@ -60,15 +68,16 @@
<button id="reset-layout" data-i18n="reset-layouts"></button> <button id="reset-layout" data-i18n="reset-layouts"></button>
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset style="display: none;">
<legend data-i18n="pref.manager">Manager</legend> <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-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> <label><input type="checkbox" id="pref-show-urls"> <span data-i18n="pref-show-urls"></span></label>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend data-i18n="pref.queueing">Queueing Downloads</legend> <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-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-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-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> <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>
<fieldset> <fieldset>
<legend>Translations</legend> <legend>Translations</legend>
<label>Language: <label>
<span>Language:</span>
<select id="languages"> <select id="languages">
<option value="default">Browser default</option> <option value="default">Browser default</option>
</select> </select>
@ -123,14 +133,16 @@
</article> </article>
<article id="tab-network" class="tab"> <article id="tab-network" class="tab">
<fieldset id="network-general"> <fieldset>
<legend data-i18n="pref.netglobal"></legend> <legend data-i18n="pref.netglobal"></legend>
<div id="network-general">
<label data-i18n="pref-concurrent-downloads">Concurrent downloads</label> <label data-i18n="pref-concurrent-downloads">Concurrent downloads</label>
<input id="pref-concurrent-downloads" type="number" min="1" max="10"> <input id="pref-concurrent-downloads" type="number" min="1" max="10">
<label data-i18n="pref-retries"></label> <label data-i18n="pref-retries"></label>
<input id="pref-retries" type="number" min="0" max="100"> <input id="pref-retries" type="number" min="0" max="100">
<label data-i18n="pref-retry-time"></label> <label data-i18n="pref-retry-time"></label>
<input id="pref-retry-time" type="number" min="1" max="600"> <input id="pref-retry-time" type="number" min="1" max="600">
</div>
</fieldset> </fieldset>
<table id="limits" data-singleselect="true"> <table id="limits" data-singleselect="true">
<tr> <tr>

View File

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

View File

@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <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> <style>
@import "/uikit/css/virtualtable.css"; @import "/uikit/css/virtualtable.css";
@import "/uikit/css/modal.css"; @import "/uikit/css/modal.css";
@ -14,8 +14,8 @@
<link rel="icon" href="/style/icon32.png"> <link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png"> <link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.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="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="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png"> <link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script> <script defer src="/bundles/common.js"></script>
@ -75,6 +75,17 @@
<input type="checkbox" id="maskOnceCheck"> <input type="checkbox" id="maskOnceCheck">
<span data-i18n="useonlyonce">Use only once</span> <span data-i18n="useonlyonce">Use only once</span>
</label> </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>
<section id="notification"></section> <section id="notification"></section>
<section id="buttons"> <section id="buttons">

View File

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

View File

@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <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> <style>
@import "/uikit/css/modal.css"; @import "/uikit/css/modal.css";
@import "/style/single.css"; @import "/style/single.css";
@ -13,8 +13,8 @@
<link rel="icon" href="/style/icon32.png"> <link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png"> <link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.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="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="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png"> <link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script> <script defer src="/bundles/common.js"></script>
@ -32,12 +32,12 @@
<input type="text" id="URL"> <input type="text" id="URL">
<h2 data-i18n="custom-filename">Custom Filename</h2> <h2 data-i18n="custom-filename">Custom Filename</h2>
<input type="text" id="filename"> <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"> <input type="text" id="referrer">
<h3 data-i18n="title">Title</h3> <h3 data-i18n="title" style="display: none;">Title</h3>
<input type="text" id="title"> <input type="text" id="title" style="display: none;">
<h3 data-i18n="description">Description</h3> <h3 data-i18n="description" style="display: none;">Description</h3>
<input type="text" id="description"> <input type="text" id="description" style="display: none;">
<h3 data-i18n="mask">Mask</h3> <h3 data-i18n="mask">Mask</h3>
<div id="maskOptions"> <div id="maskOptions">
<input type="text" id="mask"> <input type="text" id="mask">
@ -47,6 +47,18 @@
<span data-i18n="useonlyonce">Use only once</span> <span data-i18n="useonlyonce">Use only once</span>
</label> </label>
</div> </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> <h3 data-i18n="subfolder"></h3>
<div id="subfolderOptions"> <div id="subfolderOptions">
<input type="text" id="subfolder" data-i18n="placeholder=subfolder.placeholder"> <input type="text" id="subfolder" data-i18n="placeholder=subfolder.placeholder">

View File

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

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