Compare commits

...

63 Commits

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

View File

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

View File

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

View File

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

View File

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

View File

@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "أداة التنزيل لبحور من الروابط، داخل متصفحك",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "ترشيح سريع",
@ -657,6 +657,22 @@
"message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)",
"description": "Preferences/General"
},
"pref_theme": {
"message": "السمة:",
"description": "label text"
},
"pref_theme_dark": {
"message": "داكنة",
"description": "option text"
},
"pref_theme_default": {
"message": "النظام/المتصفح",
"description": "option text"
},
"pref_theme_light": {
"message": "فاتحة",
"description": "option text"
},
"pref_ui": {
"message": "واجهة المستخدم",
"description": "Preferences/General; group text"
@ -1281,4 +1297,4 @@
"message": "ألغاها المستخدم",
"description": "Error message"
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -253,27 +253,27 @@
},
"dta_regular": {
"description": "Regular dta action; Menu text",
"message": "DownThemAll!"
"message": "TraitorousDownloading!"
},
"dta_regular_all": {
"description": "Menu text",
"message": "DownThemAll! - All Tabs"
"message": "TraitorousDownloading! - All Tabs"
},
"dta_regular_image": {
"description": "Menu text",
"message": "Save Image with DownThemAll!"
"message": "Save Image with TraitorousDownloading!"
},
"dta_regular_link": {
"description": "Menu text",
"message": "Save Link with DownThemAll!"
"message": "Save Link with TraitorousDownloading!"
},
"dta_regular_media": {
"description": "Menu text",
"message": "Save Media with DownThemAll!"
"message": "Save Media with TraitorousDownloading!"
},
"dta_regular_selection": {
"description": "Menu text",
"message": "Save Selection with DownThemAll!"
"message": "Save Selection with TraitorousDownloading!"
},
"dta_turbo": {
"description": "OneClick! action; Menu text",
@ -303,6 +303,10 @@
"description": "Error message; single/select window",
"message": "Invalid Renaming Mask"
},
"error_invalidServer": {
"description": "Error message; single/select window",
"message": "Invalid server URL"
},
"error_invalidReferrer": {
"description": "Error message; single window",
"message": "Invalid Referrer"
@ -340,7 +344,7 @@
"message": "Export As Text"
},
"extensionDescription": {
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one",
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one",
"message": "The Mass Downloader for your browser"
},
"fastfilter_placeholder": {
@ -475,7 +479,7 @@
},
"manager_title": {
"description": "Window/tab title",
"message": "DownThemAll! Manager"
"message": "TraitorousDownloading! Manager"
},
"mask": {
"description": "Renaming mask (short); used in e.g. select",
@ -511,7 +515,7 @@
},
"nagging_message": {
"description": "Donation nagging message; displayed as a notification bar in manager",
"message": "You've added $DOWNLOADS$ downloads with DownThemAll! so far! As a regular user you might want to consider a donation to support further development. Thanks!",
"message": "You've added $DOWNLOADS$ downloads with TraitorousDownloading! so far! As a regular user you might want to consider a donation to support further development. Thanks!",
"placeholders": {
"downloads": {
"content": "$1",
@ -583,11 +587,11 @@
},
"pref_button_type": {
"description": "label",
"message": "DownThemAll! button:"
"message": "TraitorousDownloading! button:"
},
"pref_button_type_dta": {
"description": "label",
"message": "DownThemAll! selection"
"message": "TraitorousDownloading! selection"
},
"pref_button_type_manager": {
"description": "label",
@ -633,6 +637,10 @@
"description": "Preferences/General",
"message": "Open the Manager tab after queuing some downloads"
},
"pref_cookies": {
"description": "Preferences/General",
"message": "Send cookies to the download server"
},
"pref_queue_notification": {
"description": "Preferences/General",
"message": "Show a notification when queuing new downloads"
@ -695,7 +703,7 @@
},
"prefs_title": {
"description": "Window/tab title; Preferences",
"message": "DownThemAll! Preferences"
"message": "TraitorousDownloading! Preferences"
},
"queue_finished": {
"description": "Notification text",
@ -721,7 +729,7 @@
},
"referrer": {
"description": "Label for \"Referrer\"",
"message": "Referrer"
"message": "Referrer (Not implemented)"
},
"remember": {
"description": "Checkbox text for confirmation, e.g. when removing a download in manager",
@ -921,7 +929,7 @@
},
"renamer_ref": {
"description": "Mask text; see mask button",
"message": "Referrer"
"message": "Referrer (Not implemented)"
},
"renamer_refdomain": {
"description": "Mask text; see mask button",
@ -1047,7 +1055,11 @@
},
"select_title": {
"description": "Title of the select window",
"message": "DownThemAll! - Select your Downloads"
"message": "TraitorousDownloading! - Select your Downloads"
},
"server": {
"description": "Downloader Server",
"message": "Server"
},
"set_mask": {
"description": "Menu text; select window",
@ -1075,7 +1087,7 @@
},
"single_title": {
"description": "Title of single window",
"message": "DownThemAll! - Add a link"
"message": "TraitorousDownloading! - Add a link"
},
"sizeB": {
"description": "Size formatting; bytes",
@ -1296,5 +1308,9 @@
"useonlyonce": {
"description": "Label for Use-Once checkboxes",
"message": "Use Once"
},
"cookies": {
"description": "Label for cookie checkboxes",
"message": "Send cookies to server"
}
}
}

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Todas las pestañas",
"message": "TraitorousDownloading! - Todas las pestañas",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Guardar imagen con DownThemAll!",
"message": "Guardar imagen con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Guardar enlace con DownThemAll!",
"message": "Guardar enlace con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Guardar multimedia con DownThemAll!",
"message": "Guardar multimedia con TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Guardar selección con DownThemAll!",
"message": "Guardar selección con TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "El programa de descargas masivas para su navegador",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "Filtro rápido",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "Gestor DownThemAll!",
"message": "Gestor TraitorousDownloading!",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "¡Ha añadido $DOWNLOADS$ descargas con DownThemAll! hasta el momento! Al ser un usuario habitual quizás podría plantearse hacer una donación para apoyar el futuro desarrollo del proyecto. ¡Gracias!",
"message": "¡Ha añadido $DOWNLOADS$ descargas con TraitorousDownloading! hasta el momento! Al ser un usuario habitual quizás podría plantearse hacer una donación para apoyar el futuro desarrollo del proyecto. ¡Gracias!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferencias de DownThemAll!",
"message": "Preferencias de TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Botón DownThemAll!:",
"message": "Botón TraitorousDownloading!:",
"description": "label"
},
"pref_button_type_dta": {
"message": "Selección DownThemAll!",
"message": "Selección TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -1026,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Seleccionar sus descargas",
"message": "TraitorousDownloading! - Seleccionar sus descargas",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1070,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Añadir un enlace",
"message": "TraitorousDownloading! - Añadir un enlace",
"description": "Title of single window"
},
"sizeB": {

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Kõik kaardid",
"message": "TraitorousDownloading! - Kõik kaardid",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Salvesta pilt DownThemAll!-iga",
"message": "Salvesta pilt TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Salvesta link DownThemAll!-iga",
"message": "Salvesta link TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Salvesta meedia DownThemAll!-iga",
"message": "Salvesta meedia TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Salvesta valik DownThemAll!-iga",
"message": "Salvesta valik TraitorousDownloading!-iga",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Massallalaadija sinu veebilehitsejale",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "Kiirfiltreerimine",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! haldur",
"message": "TraitorousDownloading! haldur",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Sa oled praeguseks DownThemAll!-iga lisanud $DOWNLOADS$ allalaadimist! Tavakasutajana võiksid edasise arendamise toetamiseks kaaluda annetamist. Täname!",
"message": "Sa oled praeguseks TraitorousDownloading!-iga lisanud $DOWNLOADS$ allalaadimist! Tavakasutajana võiksid edasise arendamise toetamiseks kaaluda annetamist. Täname!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! eelistused",
"message": "TraitorousDownloading! eelistused",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! nupp:",
"message": "TraitorousDownloading! nupp:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! valik",
"message": "TraitorousDownloading! valik",
"description": "label"
},
"pref_button_type_manager": {
@ -1026,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Vali oma allalaadimised",
"message": "TraitorousDownloading! - Vali oma allalaadimised",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1070,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Lingi lisamine",
"message": "TraitorousDownloading! - Lingi lisamine",
"description": "Title of single window"
},
"sizeB": {

View File

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

View File

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

View File

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

View File

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

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - 全てのタブ",
"message": "TraitorousDownloading! - 全てのタブ",
"description": "Menu text"
},
"dta_regular_image": {
"message": "画像をDownThemAll! で保存する",
"message": "画像をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_link": {
"message": "リンク先をDownThemAll! で保存する",
"message": "リンク先をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_media": {
"message": "メディアをDownThemAll! で保存する",
"message": "メディアをTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "選択項目をDownThemAll! で保存する",
"message": "選択項目をTraitorousDownloading! で保存する",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "ブラウザ用マスダウンローダー",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "高速フィルタリング",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! マネージャ",
"message": "TraitorousDownloading! マネージャ",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "これまでDownThemAllで$DOWNLOADS$ダウンロードを追加しました! 通常のユーザーとして、さらなる開発を支援するために寄付を検討することができます。 皆様のご協力、心よりお待ち致しております。",
"message": "これまでTraitorousDownloadingで$DOWNLOADS$ダウンロードを追加しました! 通常のユーザーとして、さらなる開発を支援するために寄付を検討することができます。 皆様のご協力、心よりお待ち致しております。",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! 設定",
"message": "TraitorousDownloading! 設定",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,7 +574,7 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! アイコンクリック時:",
"message": "TraitorousDownloading! アイコンクリック時:",
"description": "label"
},
"pref_button_type_dta": {
@ -654,7 +654,7 @@
"description": "checkbox text"
},
"pref_text_links": {
"message": "Webサイトの文字列リンクを抽出する (但し、遅い)",
"message": "Webサイトの文字列からリンクを抽出する (但し、遅い)",
"description": "Preferences/General"
},
"pref_theme": {
@ -1026,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - ダウンロードの選択",
"message": "TraitorousDownloading! - ダウンロードの選択",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1070,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - リンクを追加",
"message": "TraitorousDownloading! - リンクを追加",
"description": "Title of single window"
},
"sizeB": {

View File

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

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Visoms kortelėms",
"message": "TraitorousDownloading! - Visoms kortelėms",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Išsaugoti vaizdą su DownThemAll!",
"message": "Išsaugoti vaizdą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Išsaugoti nuorodą su DownThemAll!",
"message": "Išsaugoti nuorodą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Išsaugoti media su DownThemAll!",
"message": "Išsaugoti media su TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Išsaugoti pažymėtą su DownThemAll!",
"message": "Išsaugoti pažymėtą su TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "Masinio parsisiuntimo programa jūsų naršyklėje",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "Greitas filtravimas",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "DownThemAll! menedžeris",
"message": "TraitorousDownloading! menedžeris",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Iki šiol, naudodami DownThemAll!, pridėjote $DOWNLOADS$ parsisiuntimų! Kaip paprastas vartotojas, galbūt norėsite apsvarstyti galimybę paaukoti tolimesnei plėtrai. Ačiū!",
"message": "Iki šiol, naudodami TraitorousDownloading!, pridėjote $DOWNLOADS$ parsisiuntimų! Kaip paprastas vartotojas, galbūt norėsite apsvarstyti galimybę paaukoti tolimesnei plėtrai. Ačiū!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "DownThemAll! nuostatos",
"message": "TraitorousDownloading! nuostatos",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "DownThemAll! mygtukas:",
"message": "TraitorousDownloading! mygtukas:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! pasirinkimas",
"message": "TraitorousDownloading! pasirinkimas",
"description": "label"
},
"pref_button_type_manager": {
@ -1026,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Pasirinkite parsisiuntimus",
"message": "TraitorousDownloading! - Pasirinkite parsisiuntimus",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1070,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Pridėti nuorodą",
"message": "TraitorousDownloading! - Pridėti nuorodą",
"description": "Title of single window"
},
"sizeB": {

View File

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

View File

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

View File

@ -232,27 +232,27 @@
"description": "Download (verb/action); e.g. in single and select buttons"
},
"dta_regular": {
"message": "DownThemAll!",
"message": "TraitorousDownloading!",
"description": "Regular dta action; Menu text"
},
"dta_regular_all": {
"message": "DownThemAll! - Todas as abas",
"message": "TraitorousDownloading! - Todas as abas",
"description": "Menu text"
},
"dta_regular_image": {
"message": "Salvar Imagem com o DownThemAll!",
"message": "Salvar Imagem com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_link": {
"message": "Salvar Link com o DownThemAll!",
"message": "Salvar Link com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_media": {
"message": "Salvar Mídia com o DownThemAll!",
"message": "Salvar Mídia com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_regular_selection": {
"message": "Salvar Seleção com o DownThemAll!",
"message": "Salvar Seleção com o TraitorousDownloading!",
"description": "Menu text"
},
"dta_turbo": {
@ -321,7 +321,7 @@
},
"extensionDescription": {
"message": "A ferramenta de download em massa para o seu navegador",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
"description": "TraitorousDownloading! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
},
"fastfiltering": {
"message": "Filtragem rápida",
@ -450,7 +450,7 @@
}
},
"manager_title": {
"message": "Gerenciador do DownThemAll!",
"message": "Gerenciador do TraitorousDownloading!",
"description": "Window/tab title"
},
"mask": {
@ -486,7 +486,7 @@
"description": "Action for moving a download up"
},
"nagging_message": {
"message": "Você já adicionou $DOWNLOADS$ downloads com DownThemAll! Como usuário regular, você pode considerar uma doação para apoiar desenvolvimento adicional. Obrigado!",
"message": "Você já adicionou $DOWNLOADS$ downloads com TraitorousDownloading! Como usuário regular, você pode considerar uma doação para apoiar desenvolvimento adicional. Obrigado!",
"description": "Donation nagging message; displayed as a notification bar in manager",
"placeholders": {
"downloads": {
@ -566,7 +566,7 @@
"description": "Menu text; Preferences"
},
"prefs_title": {
"message": "Preferências do DownThemAll!",
"message": "Preferências do TraitorousDownloading!",
"description": "Window/tab title; Preferences"
},
"pref_add_paused": {
@ -574,11 +574,11 @@
"description": "Preferences/General"
},
"pref_button_type": {
"message": "Botão DownThemAll!",
"message": "Botão TraitorousDownloading!",
"description": "label"
},
"pref_button_type_dta": {
"message": "Seleção do DownThemAll!",
"message": "Seleção do TraitorousDownloading!",
"description": "label"
},
"pref_button_type_manager": {
@ -1026,7 +1026,7 @@
"description": "Menu text; select context"
},
"select_title": {
"message": "DownThemAll! - Selecione seus Downloads",
"message": "TraitorousDownloading! - Selecione seus Downloads",
"description": "Title of the select window"
},
"SERVER_BAD_CONTENT": {
@ -1070,7 +1070,7 @@
"description": "Header text; single window"
},
"single_title": {
"message": "DownThemAll! - Adicone um link",
"message": "TraitorousDownloading! - Adicone um link",
"description": "Title of single window"
},
"sizeB": {

View File

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

1224
_locales/sv/messages.json Normal file

File diff suppressed because it is too large Load Diff

1300
_locales/tr/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

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

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

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

File diff suppressed because one or more lines are too long

View File

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

View File

@ -27,6 +27,7 @@ import {
} from "./browser";
import { Bus } from "./bus";
import { filterInSitu } from "./util";
import { DB } from "./db";
const menus = typeof (_menus) !== "undefined" && _menus || _cmenus;
@ -106,19 +107,19 @@ class Handler {
async performSelection(options: SelectionOptions) {
try {
const toptions: any = {
const tabOptions: any = {
currentWindow: true,
discarded: false,
};
if (!CHROME) {
toptions.hidden = false;
tabOptions.hidden = false;
}
const selectedTabs = options.allTabs ?
await tabs.query(toptions) as any[] :
await tabs.query(tabOptions) as any[] :
[options.tab];
const textLinks = await Prefs.get("text-links", true);
const goptions = {
const gatherOptions = {
type: "DTA:gather",
selectionOnly: options.selectionOnly,
textLinks,
@ -127,7 +128,7 @@ class Handler {
};
const results = await Promise.all(selectedTabs.
map((tab: any) => runContentJob(tab, GATHER, goptions)));
map((tab: any) => runContentJob(tab, GATHER, gatherOptions)));
await this.processResults(options.turbo, results.flat());
}
@ -152,10 +153,15 @@ runtime.onInstalled.addListener(({reason, previousVersion}: OnInstalled) => {
const {version} = runtime.getManifest();
const major = getMajor(version);
const prevMajor = getMajor(previousVersion);
if (reason === "install" || (reason === "update" && major !== prevMajor)) {
tabs.create({
url: `https://about.downthemall.org/changelog/?cur=${major}&prev=${prevMajor}`,
});
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}`,
// });
}
});
@ -165,7 +171,7 @@ locale.then(() => {
super();
this.onClicked = this.onClicked.bind(this);
const alls = new Map<string, string[]>();
const mcreate = (options: any) => {
const menuCreate = (options: any) => {
if (CHROME) {
delete options.icons;
options.contexts = options.contexts.
@ -179,7 +185,7 @@ locale.then(() => {
}
menus.create(options);
};
mcreate({
menuCreate({
id: "DTARegularLink",
contexts: ["link"],
icons: {
@ -188,7 +194,7 @@ locale.then(() => {
},
title: _("dta.regular.link"),
});
mcreate({
menuCreate({
id: "DTATurboLink",
contexts: ["link"],
icons: {
@ -197,7 +203,7 @@ locale.then(() => {
},
title: _("dta.turbo.link"),
});
mcreate({
menuCreate({
id: "DTARegularImage",
contexts: ["image"],
icons: {
@ -206,7 +212,7 @@ locale.then(() => {
},
title: _("dta.regular.image"),
});
mcreate({
menuCreate({
id: "DTATurboImage",
contexts: ["image"],
icons: {
@ -215,7 +221,7 @@ locale.then(() => {
},
title: _("dta.turbo.image"),
});
mcreate({
menuCreate({
id: "DTARegularMedia",
contexts: ["video", "audio"],
icons: {
@ -224,7 +230,7 @@ locale.then(() => {
},
title: _("dta.regular.media"),
});
mcreate({
menuCreate({
id: "DTATurboMedia",
contexts: ["video", "audio"],
icons: {
@ -233,7 +239,7 @@ locale.then(() => {
},
title: _("dta.turbo.media"),
});
mcreate({
menuCreate({
id: "DTARegularSelection",
contexts: ["selection"],
icons: {
@ -242,7 +248,7 @@ locale.then(() => {
},
title: _("dta.regular.selection"),
});
mcreate({
menuCreate({
id: "DTATurboSelection",
contexts: ["selection"],
icons: {
@ -251,7 +257,7 @@ locale.then(() => {
},
title: _("dta.turbo.selection"),
});
mcreate({
menuCreate({
id: "DTARegular",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -260,7 +266,7 @@ locale.then(() => {
},
title: _("dta.regular"),
});
mcreate({
menuCreate({
id: "DTATurbo",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -269,12 +275,12 @@ locale.then(() => {
},
title: _("dta.turbo"),
});
mcreate({
menuCreate({
id: "sep-1",
contexts: ["all", "browser_action", "tools_menu"],
type: "separator"
});
mcreate({
menuCreate({
id: "DTARegularAll",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -283,7 +289,7 @@ locale.then(() => {
},
title: _("dta-regular-all"),
});
mcreate({
menuCreate({
id: "DTATurboAll",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -295,12 +301,12 @@ locale.then(() => {
const sep2ctx = menus.ACTION_MENU_TOP_LEVEL_LIMIT === 6 ?
["all", "tools_menu"] :
["all", "browser_action", "tools_menu"];
mcreate({
menuCreate({
id: "sep-2",
contexts: sep2ctx,
type: "separator"
});
mcreate({
menuCreate({
id: "DTAAdd",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -311,12 +317,12 @@ locale.then(() => {
},
title: _("add-download"),
});
mcreate({
menuCreate({
id: "sep-3",
contexts: ["all", "browser_action", "tools_menu"],
type: "separator"
});
mcreate({
/* menuCreate({
id: "DTAManager",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -324,8 +330,8 @@ locale.then(() => {
32: "/style/button-manager@2x.png",
},
title: _("manager.short"),
});
mcreate({
});*/
menuCreate({
id: "DTAPrefs",
contexts: ["all", "browser_action", "tools_menu"],
icons: {
@ -561,7 +567,6 @@ locale.then(() => {
32: "/style/icon32.png",
48: "/style/icon48.png",
64: "/style/icon64.png",
96: "/style/icon96.png",
128: "/style/icon128.png",
256: "/style/icon256.png"
};
@ -658,6 +663,13 @@ locale.then(() => {
await sessionRemover();
}
try {
await DB.init();
}
catch (ex) {
console.error("db init", ex.toString(), ex.message, ex.stack, ex);
}
await Prefs.set("last-run", new Date());
await filters();
await getManager();

View File

@ -117,3 +117,4 @@ export const {windows} = polyfill;
export const {theme} = polyfill;
export const CHROME = navigator.appVersion.includes("Chrome/");
export const OPERA = navigator.appVersion.includes("OPR/");

132
lib/db.ts
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,7 +16,7 @@ import {
DONE,
FORCABLE,
MISSING,
PAUSABLE,
PAUSEABLE,
PAUSED,
QUEUED,
RUNNING,
@ -235,7 +235,7 @@ export class Download extends BaseDownload {
}
async pause(retry?: boolean) {
if (!(PAUSABLE & this.state)) {
if (!(PAUSEABLE & this.state)) {
return;
}
@ -277,7 +277,7 @@ export class Download extends BaseDownload {
await downloads.cancel(id);
}
catch (ex) {
// ingored
// ignored
}
await new Promise(r => setTimeout(r, 1000));
try {
@ -285,7 +285,7 @@ export class Download extends BaseDownload {
}
catch (ex) {
console.error(id, ex.toString(), ex);
// ingored
// ignored
}
}
@ -399,7 +399,7 @@ export class Download extends BaseDownload {
}
}
updatefromSuggestion(state: any) {
updateFromSuggestion(state: any) {
const res: PrerollResults = {};
if (state.mime) {
res.mime = state.mime;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,13 +1,14 @@
{
"name": "dtalite",
"name": "tdl",
"version": "4.0.0",
"description": "DownThemAll! lite",
"description": "TraitorousDownloading!",
"main": "main.js",
"directories": {
"lib": "lib"
},
"scripts": {
"build": "util/build.py",
"build:cleanup": "rm -rf bundles",
"build:bundles": "webpack",
"build:regexps": "node util/makexregexps.js > data/xregexps.json",
"stats": "cloc --vcs=git --exclude-lang=Markdown,SVG",
@ -34,8 +35,10 @@
"dependencies": {
"@types/psl": "^1.1.0",
"@types/whatwg-mimetype": "^2.1.0",
"localforage": "^1.9.0",
"psl": "^1.4.0",
"webextension-polyfill": "^0.5.0",
"webextension-polyfill-ts": "^0.22.0",
"whatwg-mimetype": "^2.3.0"
}
}

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

@ -46,6 +46,11 @@
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;
@ -606,6 +611,11 @@ ul.context-menu ul {
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);

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

@ -64,7 +64,7 @@ p.example {
}
#options > #subfolderOptions,
#options > #maskOptions {
#options > #maskOptions, #options > #serverOptions {
display: grid;
grid-template-columns: 2fr auto auto;
}
@ -85,4 +85,4 @@ h3 {
#btnDownload {
font-weight: bold;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -131,7 +131,6 @@ addEventListener("DOMContentLoaded", function dom() {
addEventListener("contextmenu", event => {
event.preventDefault();
event.stopPropagation();
return false;
});

View File

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

View File

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

View File

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

View File

@ -100,10 +100,10 @@
<li class="sep">
<hr>
</li>
<li id="manager" data-action="open-manager">
<!-- <li id="manager" data-action="open-manager">
<img srcset="/style/button-manager.png, /style/button-manager@2x.png 2x">
<span data-i18n="manager.short"></span>
</li>
</li> -->
<li id="prefs" data-action="open-prefs">
<span class="icon icon-settings"></span>
<span data-i18n="prefs.short">Preferences</span>
@ -111,4 +111,4 @@
</ul>
</body>
</html>
</html>

View File

@ -16,12 +16,12 @@
}
</style>
<title data-i18n="prefs.title">DownThemAll! - Preferences</title>
<title data-i18n="prefs.title">TraitorousDownloading! - Preferences</title>
<link rel="icon" href="/style/icon32.png">
<link rel="icon" sizes="16x16" href="/style/icon16.png">
<link rel="icon" sizes="32x32" href="/style/icon32.png">
<link rel="icon" sizes="48x48" href="/style/icon48.png">
<link rel="icon" sizes="64x64" href="/style/icon64.png">
<link rel="icon" sizes="96x96" href="/style/icon96.png">
<link rel="icon" sizes="128x128" href="/style/icon128.png">
<link rel="icon" sizes="256x256" href="/style/icon256.png">
<script defer src="/bundles/common.js"></script>
@ -49,7 +49,7 @@
<label><input type="radio" name="pref-button-type" value="popup"> <span data-i18n="pref-button-type-popup"></span></label>
<label><input type="radio" name="pref-button-type" value="dta"> <span data-i18n="pref-button-type-dta"></span></label>
<label><input type="radio" name="pref-button-type" value="turbo"> <span data-i18n="pref-button-type-turbo"></span></label>
<label><input type="radio" name="pref-button-type" value="manager"> <span data-i18n="pref-button-type-manager"></span></label>
<label style="display: none;"><input type="radio" name="pref-button-type" value="manager"> <span data-i18n="pref-button-type-manager"></span></label>
</div>
<label data-i18n="pref-theme"></label>
<div id="pref-theme">
@ -59,7 +59,7 @@
</div>
</div>
<hr>
<label><input type="checkbox" id="pref-manager-in-popup"> <span data-i18n="pref-manager-in-popup"></span></label>
<label style="display: none;"><input type="checkbox" id="pref-manager-in-popup"> <span data-i18n="pref-manager-in-popup"></span></label>
<label><input type="checkbox" id="pref-finish-notification"> <span data-i18n="pref-finish-notification"></span></label>
<label><input type="checkbox" id="pref-sounds"> <span data-i18n="pref-sounds"></span></label>
<label><input type="checkbox" id="pref-hide-context"> <span data-i18n="pref-hide-context"></span></label>
@ -68,15 +68,16 @@
<button id="reset-layout" data-i18n="reset-layouts"></button>
</div>
</fieldset>
<fieldset>
<fieldset style="display: none;">
<legend data-i18n="pref.manager">Manager</legend>
<label><input type="checkbox" id="pref-tooltip"> <span data-i18n="pref-manager-tooltip"></span></label>
<label><input type="checkbox" id="pref-show-urls"> <span data-i18n="pref-show-urls"></span></label>
</fieldset>
<fieldset>
<legend data-i18n="pref.queueing">Queueing Downloads</legend>
<label><input type="checkbox" id="pref-cookies"> <span data-i18n="pref-cookies"></span></label>
<label><input type="checkbox" id="pref-queue-notification"> <span data-i18n="pref-queue-notification"></span></label>
<label><input type="checkbox" id="pref-open-manager-on-queue"> <span data-i18n="pref-open-manager-on-queue"></span></label>
<label style="display: none;"><input type="checkbox" id="pref-open-manager-on-queue"> <span data-i18n="pref-open-manager-on-queue"></span></label>
<label><input type="checkbox" id="pref-text-links"> <span data-i18n="pref-text-links"></span></label>
<label><input type="checkbox" id="pref-add-paused"> <span data-i18n="pref-add-paused"></span></label>
<label><input type="checkbox" id="pref-remove-missing-on-init"> <span data-i18n="pref-remove-missing-on-init"></span></label>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

1967
yarn.lock

File diff suppressed because it is too large Load Diff