Просмотр исходного кода

add support of custom shortcuts
(fix #1814, #1815)

Gildas 2 месяцев назад
Родитель
Сommit
a676005803

+ 52 - 0
_locales/az/messages.json

@@ -11,6 +11,50 @@
 		"message": "Bütün tabları yaddaşa qeyd et",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Xüsusi qısa yol",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Xüsusi qısa yol #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Xüsusi qısa yol #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Xüsusi qısa yol #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Xüsusi qısa yol #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Xüsusi qısa yol #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Xüsusi qısa yol #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Xüsusi qısa yol #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Xüsusi qısa yol #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Xüsusi qısa yol #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Xüsusi qısa yol #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Səhifəni SingleFile ilə yaddaşa qeyd et",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "səhifə yaddaşa qeyd edildikdən sonra tabı avtomatik olaraq bağlayın",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "klaviatura qısa yolu əmri",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "standart qısa yol",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Fayl adı",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/de/messages.json

@@ -11,6 +11,50 @@
 		"message": "Speichern aller Tabs",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Benutzerdefinierte Tastenkombination",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Benutzerdefinierte Tastenkombination #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Benutzerdefinierte Tastenkombination #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Benutzerdefinierte Tastenkombination #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Benutzerdefinierte Tastenkombination #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Benutzerdefinierte Tastenkombination #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Benutzerdefinierte Tastenkombination #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Benutzerdefinierte Tastenkombination #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Benutzerdefinierte Tastenkombination #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Benutzerdefinierte Tastenkombination #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Benutzerdefinierte Tastenkombination #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Speichern der Webseite mit SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "Automatisches Schließen des Tabs nach dem Speichern der Seite",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "Tastenkombination Befehl",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "Standard-Tastenkombination",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Dateiname",
 		"description": "Options sub-title: 'File name'"

+ 53 - 1
_locales/en/messages.json

@@ -11,6 +11,50 @@
 		"message": "Save all tabs",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Custom shortcut",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Custom shortcut #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Custom shortcut #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Custom shortcut #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Custom shortcut #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Custom shortcut #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Custom shortcut #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Custom shortcut #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Custom shortcut #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Custom shortcut #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Custom shortcut #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Save page with SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "auto-close the tab after the page is saved",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "keyboard shortcut command",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "default shortcut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "File name",
 		"description": "Options sub-title: 'File name'"
@@ -1063,4 +1115,4 @@
 		"message": "Invalid JSON",
 		"description": "Options editor error message: 'Invalid JSON'"
 	}
-}
+}

+ 52 - 0
_locales/es/messages.json

@@ -11,6 +11,50 @@
 		"message": "Guardar todas las pestañas",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Atajo personalizado",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Atajo personalizado #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Atajo personalizado #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Atajo personalizado #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Atajo personalizado #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Atajo personalizado #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Atajo personalizado #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Atajo personalizado #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Atajo personalizado #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Atajo personalizado #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Atajo personalizado #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Guardar página con SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "cerrar automáticamente la pestaña después de guardar la página",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "comando de atajo de teclado",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "atajo predeterminado",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nombre del archivo",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/fr/messages.json

@@ -11,6 +11,50 @@
 		"message": "Sauver tous les onglets",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Raccourci personnalisé",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Raccourci personnalisé #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Raccourci personnalisé #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Raccourci personnalisé #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Raccourci personnalisé #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Raccourci personnalisé #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Raccourci personnalisé #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Raccourci personnalisé #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Raccourci personnalisé #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Raccourci personnalisé #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Raccourci personnalisé #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Sauver la page avec SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "fermer automatiquement l'onglet après l'enregistrement de la page",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "commande de raccourci clavier",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "raccourci par défaut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nom de fichier",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/it/messages.json

@@ -11,6 +11,50 @@
 		"message": "Salva tutte le schede",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Scorciatoia personalizzata",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Scorciatoia personalizzata #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Scorciatoia personalizzata #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Scorciatoia personalizzata #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Scorciatoia personalizzata #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Scorciatoia personalizzata #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Scorciatoia personalizzata #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Scorciatoia personalizzata #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Scorciatoia personalizzata #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Scorciatoia personalizzata #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Scorciatoia personalizzata #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Salva pagina con SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "auto-chiudi la scheda dopo che la pagina è stata salvata",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "comando di scorciatoia da tastiera",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "scorciatoia predefinita",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nome file",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/ja/messages.json

@@ -11,6 +11,50 @@
 		"message": "すべてのタブを保存",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "カスタムショートカット",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "カスタムショートカット #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "カスタムショートカット #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "カスタムショートカット #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "カスタムショートカット #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "カスタムショートカット #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "カスタムショートカット #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "カスタムショートカット #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "カスタムショートカット #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "カスタムショートカット #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "カスタムショートカット #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "SingleFile でページを保存",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "ページが保存された後にタブを自動的に閉じる",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "キーボードショートカットコマンド",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "デフォルトのショートカット",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "ファイル名",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/nl_NL/messages.json

@@ -11,6 +11,50 @@
 		"message": "Sla alle tabbladen op",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Aangepaste snelkoppeling",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Aangepaste snelkoppeling #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Aangepaste snelkoppeling #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Aangepaste snelkoppeling #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Aangepaste snelkoppeling #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Aangepaste snelkoppeling #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Aangepaste snelkoppeling #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Aangepaste snelkoppeling #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Aangepaste snelkoppeling #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Aangepaste snelkoppeling #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Aangepaste snelkoppeling #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Sla pagina op met SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "sluit het tabblad automatisch na het opslaan van de pagina",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "toetsenbord snelkoppeling opdracht",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "standaard snelkoppeling",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Bestandsnaam",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/pl/messages.json

@@ -11,6 +11,50 @@
 		"message": "Zapisz wszystkie karty",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Custom shortcut",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Custom shortcut #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Custom shortcut #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Custom shortcut #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Custom shortcut #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Custom shortcut #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Custom shortcut #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Custom shortcut #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Custom shortcut #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Custom shortcut #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Custom shortcut #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Zapisz stronę z SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "automatycznie zamykaj kartę po zapisaniu strony",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "keyboard shortcut command",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "default shortcut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nazwa pliku",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/pt_PT/messages.json

@@ -11,6 +11,50 @@
 		"message": "Guardar todos os separadores",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Atalho personalizado",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Atalho personalizado #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Atalho personalizado #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Atalho personalizado #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Atalho personalizado #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Atalho personalizado #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Atalho personalizado #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Atalho personalizado #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Atalho personalizado #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Atalho personalizado #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Atalho personalizado #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Guardar página com SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "fechar automaticamente o separador depois de a página ser guardada",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "comando de atalho de teclado",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "atalho padrão",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nome de ficheiro",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/pt_br/messages.json

@@ -11,6 +11,50 @@
 		"message": "Salvar todas abas",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Atalho personalizado",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Atalho personalizado #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Atalho personalizado #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Atalho personalizado #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Atalho personalizado #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Atalho personalizado #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Atalho personalizado #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Atalho personalizado #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Atalho personalizado #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Atalho personalizado #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Atalho personalizado #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Salvar página via SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "fechar autom. a aba após página ser salva",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "comando de atalho de teclado",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "atalho padrão",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Nome de arquivo",
 		"description": "Options sub-title: 'File name'"

+ 53 - 1
_locales/ru/messages.json

@@ -11,6 +11,50 @@
 		"message": "Сохранить все вкладки",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Custom shortcut",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Custom shortcut #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Custom shortcut #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Custom shortcut #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Custom shortcut #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Custom shortcut #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Custom shortcut #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Custom shortcut #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Custom shortcut #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Custom shortcut #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Custom shortcut #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Сохранить страницу",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "автозакрытие вкладки после сохранения страницы",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "keyboard shortcut command",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "default shortcut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Имя файла",
 		"description": "Options sub-title: 'File name'"
@@ -1063,4 +1115,4 @@
 		"message": "Неправильный JSON",
 		"description": "Options editor error message: 'Invalid JSON'"
 	}
-}
+}

+ 52 - 0
_locales/sv/messages.json

@@ -11,6 +11,50 @@
 		"message": "Spara alla flikar",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Anpassad genväg",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Anpassad genväg #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Anpassad genväg #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Anpassad genväg #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Anpassad genväg #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Anpassad genväg #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Anpassad genväg #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Anpassad genväg #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Anpassad genväg #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Anpassad genväg #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Anpassad genväg #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Spara sidan med SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "stäng fliken automatiskt efter att sidan har sparats",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "tangentbordsgenväg kommando",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "standardgenväg",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Filnamn",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/tr/messages.json

@@ -11,6 +11,50 @@
 		"message": "Tüm sekmeleri kaydet",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Özel kısayol",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Özel kısayol #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Özel kısayol #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Özel kısayol #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Özel kısayol #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Özel kısayol #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Özel kısayol #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Özel kısayol #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Özel kısayol #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Özel kısayol #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Özel kısayol #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Sayfayı SingleFile ile kaydet",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "sayfa kaydedildikten sonra sekmeyi otomatik kapat",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "klavye kısayolu komutu",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "varsayılan kısayol",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Dosya ismi",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/uk/messages.json

@@ -11,6 +11,50 @@
 		"message": "Зберегти всі вкладки",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Власна комбінація клавіш",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Власна комбінація клавіш #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Власна комбінація клавіш #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Власна комбінація клавіш #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Власна комбінація клавіш #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Власна комбінація клавіш #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Власна комбінація клавіш #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Власна комбінація клавіш #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Власна комбінація клавіш #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Власна комбінація клавіш #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Власна комбінація клавіш #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "Зберегти сторінку з допомогою SingleFile",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "автоматично закривати вкладку після збереження сторінки",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "команда гарячої клавіші",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "стандартна гаряча клавіша",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "Ім'я файлу",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/zh_CN/messages.json

@@ -11,6 +11,50 @@
 		"message": "保存所有标签页",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Custom shortcut",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Custom shortcut #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Custom shortcut #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Custom shortcut #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Custom shortcut #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Custom shortcut #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Custom shortcut #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Custom shortcut #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Custom shortcut #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Custom shortcut #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Custom shortcut #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "使用 SingleFile 保存页面",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "页面保存后自动关闭该标签页",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "keyboard shortcut command",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "default shortcut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "文件名",
 		"description": "Options sub-title: 'File name'"

+ 52 - 0
_locales/zh_TW/messages.json

@@ -11,6 +11,50 @@
 		"message": "保存所有標籤頁",
 		"description": "Command (Ctrl+Shift+U): 'Save all tabs'"
 	},
+	"commandCustomShortcut": {
+		"message": "Custom shortcut",
+		"description": "Command label: 'Custom shortcut'"
+	},
+	"commandCustomShortcut0": {
+		"message": "Custom shortcut #1",
+		"description": "Command label: 'Custom shortcut #1'"
+	},
+	"commandCustomShortcut1": {
+		"message": "Custom shortcut #2",
+		"description": "Command label: 'Custom shortcut #2'"
+	},
+	"commandCustomShortcut2": {
+		"message": "Custom shortcut #3",
+		"description": "Command label: 'Custom shortcut #3'"
+	},
+	"commandCustomShortcut3": {
+		"message": "Custom shortcut #4",
+		"description": "Command label: 'Custom shortcut #4'"
+	},
+	"commandCustomShortcut4": {
+		"message": "Custom shortcut #5",
+		"description": "Command label: 'Custom shortcut #5'"
+	},
+	"commandCustomShortcut5": {
+		"message": "Custom shortcut #6",
+		"description": "Command label: 'Custom shortcut #6'"
+	},
+	"commandCustomShortcut6": {
+		"message": "Custom shortcut #7",
+		"description": "Command label: 'Custom shortcut #7'"
+	},
+	"commandCustomShortcut7": {
+		"message": "Custom shortcut #8",
+		"description": "Command label: 'Custom shortcut #8'"
+	},
+	"commandCustomShortcut8": {
+		"message": "Custom shortcut #9",
+		"description": "Command label: 'Custom shortcut #9'"
+	},
+	"commandCustomShortcut9": {
+		"message": "Custom shortcut #10",
+		"description": "Command label: 'Custom shortcut #10'"
+	},
 	"menuSavePage": {
 		"message": "使用 SingleFile 保存頁面",
 		"description": "Menu entry: 'Save page with SingleFile'"
@@ -191,6 +235,14 @@
 		"message": "頁面保存後自動關閉該標籤頁",
 		"description": "Options page label: 'auto-close the tab after the page is saved'"
 	},
+	"optionCustomShortcut": {
+		"message": "keyboard shortcut command",
+		"description": "Options page label: 'keyboard shortcut command'"
+	},
+	"optionCustomShortcutDefault": {
+		"message": "default shortcut",
+		"description": "Options page label: 'default shortcut'"
+	},
 	"optionsFileNameSubTitle": {
 		"message": "文件名",
 		"description": "Options sub-title: 'File name'"

+ 30 - 0
manifest.json

@@ -76,6 +76,36 @@
 				"default": "Ctrl+Shift+U"
 			},
 			"description": "__MSG_commandSaveAllTabs__"
+		},
+		"custom-command-0": {
+			"description": "__MSG_commandCustomShortcut0__"
+		},
+		"custom-command-1": {
+			"description": "__MSG_commandCustomShortcut1__"
+		},
+		"custom-command-2": {
+			"description": "__MSG_commandCustomShortcut2__"
+		},
+		"custom-command-3": {
+			"description": "__MSG_commandCustomShortcut3__"
+		},
+		"custom-command-4": {
+			"description": "__MSG_commandCustomShortcut4__"
+		},
+		"custom-command-5": {
+			"description": "__MSG_commandCustomShortcut5__"
+		},
+		"custom-command-6": {
+			"description": "__MSG_commandCustomShortcut6__"
+		},
+		"custom-command-7": {
+			"description": "__MSG_commandCustomShortcut7__"
+		},
+		"custom-command-8": {
+			"description": "__MSG_commandCustomShortcut8__"
+		},
+		"custom-command-9": {
+			"description": "__MSG_commandCustomShortcut9__"
 		}
 	},
 	"web_accessible_resources": [

+ 3 - 1
src/core/bg/config.js

@@ -197,7 +197,8 @@ const DEFAULT_CONFIG = {
 	infobarPositionRight: "16px",
 	infobarPositionBottom: "",
 	infobarPositionLeft: "",
-	removeNoScriptTags: true
+	removeNoScriptTags: true,
+	customShortcut: null
 };
 
 const DEFAULT_RULES = [{
@@ -472,6 +473,7 @@ async function createProfile(profileName, fromProfileName) {
 	}
 	const profileFrom = await getProfile(fromProfileName);
 	const profile = JSON.parse(JSON.stringify(profileFrom));
+	profile.customShortcut = null;
 	await setProfile(profileName, profile);
 }
 

+ 16 - 2
src/ui/bg/ui-commands.js

@@ -24,6 +24,7 @@
 /* global browser */
 
 import { queryTabs } from "./../../core/bg/tabs-util.js";
+import * as config from "./../../core/bg/config.js";
 
 const commands = browser.commands;
 const BROWSER_COMMANDS_API_SUPPORTED = commands && commands.onCommand && commands.onCommand.addListener;
@@ -43,10 +44,23 @@ if (BROWSER_COMMANDS_API_SUPPORTED) {
 		if (command == "save-selected-tabs") {
 			const highlightedTabs = await queryTabs({ currentWindow: true, highlighted: true });
 			business.saveTabs(highlightedTabs, { optionallySelected: true });
-		}
-		if (command == "save-all-tabs") {
+		} else if (command == "save-all-tabs") {
 			const tabs = await queryTabs({ currentWindow: true });
 			business.saveTabs(tabs);
+		} else if (command.startsWith("custom-command-")) {
+			const profiles = await config.getProfiles();
+			let selectedProfile;
+			Object.keys(profiles).some(profile => {
+				if (profiles[profile].customShortcut == command) {
+					selectedProfile = profile;
+					return true;
+				}
+				return false;
+			});
+			if (selectedProfile) {
+				const highlightedTabs = await queryTabs({ currentWindow: true, highlighted: true });
+				business.saveTabs(highlightedTabs, profiles[selectedProfile]);
+			}
 		}
 	});
 }

+ 50 - 2
src/ui/bg/ui-options.js

@@ -206,6 +206,18 @@ const removeInfobarSavedDateLabel = document.getElementById("removeInfobarSavedD
 const miscLabel = document.getElementById("miscLabel");
 const helpLabel = document.getElementById("helpLabel");
 const synchronizeLabel = document.getElementById("synchronizeLabel");
+const customShortcutLabel = document.getElementById("customShortcutLabel");
+const customShortcutDefaultLabel = document.getElementById("customShortcutDefaultLabel");
+const customShortcut1Label = document.getElementById("customShortcut0Label");
+const customShortcut2Label = document.getElementById("customShortcut1Label");
+const customShortcut3Label = document.getElementById("customShortcut2Label");
+const customShortcut4Label = document.getElementById("customShortcut3Label");
+const customShortcut5Label = document.getElementById("customShortcut4Label");
+const customShortcut6Label = document.getElementById("customShortcut5Label");
+const customShortcut7Label = document.getElementById("customShortcut6Label");
+const customShortcut8Label = document.getElementById("customShortcut7Label");
+const customShortcut9Label = document.getElementById("customShortcut8Label");
+const customShortcut10Label = document.getElementById("customShortcut9Label");
 const addProfileButton = document.getElementById("addProfileButton");
 const deleteProfileButton = document.getElementById("deleteProfileButton");
 const renameProfileButton = document.getElementById("renameProfileButton");
@@ -214,6 +226,7 @@ const exportButton = document.getElementById("exportButton");
 const importButton = document.getElementById("importButton");
 const fileInput = document.getElementById("fileInput");
 const profileNamesInput = document.getElementById("profileNamesInput");
+const customShortcutInput = document.getElementById("customShortcutInput");
 const removeHiddenElementsInput = document.getElementById("removeHiddenElementsInput");
 const removeUnusedStylesInput = document.getElementById("removeUnusedStylesInput");
 const removeUnusedFontsInput = document.getElementById("removeUnusedFontsInput");
@@ -827,6 +840,18 @@ showAllProfilesLabel.textContent = browser.i18n.getMessage("optionsAutoSettingsS
 showAutoSaveProfileLabel.textContent = browser.i18n.getMessage("optionsAutoSettingsShowAutoSaveProfile");
 ruleUrlInput.placeholder = ruleEditUrlInput.placeholder = browser.i18n.getMessage("optionsAutoSettingsUrlPlaceholder");
 synchronizeLabel.textContent = browser.i18n.getMessage("optionSynchronize");
+customShortcutLabel.textContent = browser.i18n.getMessage("optionCustomShortcut");
+customShortcutDefaultLabel.textContent = browser.i18n.getMessage("optionCustomShortcutDefault");
+customShortcut1Label.textContent = browser.i18n.getMessage("commandCustomShortcut0");
+customShortcut2Label.textContent = browser.i18n.getMessage("commandCustomShortcut1");
+customShortcut3Label.textContent = browser.i18n.getMessage("commandCustomShortcut2");
+customShortcut4Label.textContent = browser.i18n.getMessage("commandCustomShortcut3");
+customShortcut5Label.textContent = browser.i18n.getMessage("commandCustomShortcut4");
+customShortcut6Label.textContent = browser.i18n.getMessage("commandCustomShortcut5");
+customShortcut7Label.textContent = browser.i18n.getMessage("commandCustomShortcut6");
+customShortcut8Label.textContent = browser.i18n.getMessage("commandCustomShortcut7");
+customShortcut9Label.textContent = browser.i18n.getMessage("commandCustomShortcut8");
+customShortcut10Label.textContent = browser.i18n.getMessage("commandCustomShortcut9");
 resetAllButton.textContent = browser.i18n.getMessage("optionsResetAllButton");
 resetCurrentButton.textContent = browser.i18n.getMessage("optionsResetCurrentButton");
 resetCancelButton.textContent = promptCancelButton.textContent = cancelButton.textContent = browser.i18n.getMessage("optionsCancelButton");
@@ -1106,6 +1131,7 @@ async function refresh(profileName) {
 	removeAlternativeFontsInput.checked = profileOptions.removeAlternativeFonts;
 	removeAlternativeImagesInput.checked = profileOptions.removeAlternativeImages;
 	groupDuplicateImagesInput.checked = profileOptions.groupDuplicateImages;
+	customShortcutInput.value = profileOptions.customShortcut || "";
 	removeAlternativeMediasInput.checked = profileOptions.removeAlternativeMedias;
 	saveCreatedBookmarksInput.checked = profileOptions.saveCreatedBookmarks;
 	passReferrerOnErrorInput.checked = profileOptions.passReferrerOnError;
@@ -1160,9 +1186,30 @@ async function update() {
 	} catch (error) {
 		// ignored
 	}
+	const selectedProfileName = profileNamesInput.value;
+	const selectedCustomShortcut = customShortcutInput.value || null;
+	if (selectedCustomShortcut) {
+		try {
+			const config = await browser.runtime.sendMessage({ method: "config.get" });
+			const profiles = config.profiles || {};
+			await Promise.all(Object.keys(profiles).map(profileName => {
+				if (profileName != selectedProfileName && profiles[profileName].customShortcut == selectedCustomShortcut) {
+					return browser.runtime.sendMessage({
+						method: "config.updateProfile",
+						profileName,
+						profile: Object.assign({}, profiles[profileName], { customShortcut: null })
+					});
+				}
+				return Promise.resolve();
+			}));
+			// eslint-disable-next-line no-unused-vars
+		} catch (error) {
+			// ignored
+		}
+	}
 	pendingSave = browser.runtime.sendMessage({
 		method: "config.updateProfile",
-		profileName: profileNamesInput.value,
+		profileName: selectedProfileName,
 		profile: {
 			removeHiddenElements: removeHiddenElementsInput.checked,
 			removeUnusedStyles: removeUnusedStylesInput.checked,
@@ -1282,7 +1329,8 @@ async function update() {
 			S3Region: S3RegionInput.value,
 			S3Bucket: S3BucketInput.value,
 			S3AccessKey: S3AccessKeyInput.value,
-			S3SecretKey: S3SecretKeyInput.value
+			S3SecretKey: S3SecretKeyInput.value,
+			customShortcut: selectedCustomShortcut
 		}
 	});
 	try {

+ 6 - 0
src/ui/pages/help.html

@@ -129,6 +129,12 @@
 							page is saved</span>
 						<p>Check this option to automatically close the tab after saving the page displayed inside. </p>
 					</li>
+					<li data-options-label="customShortcutLabel">
+						<span class="option">Option: keyboard shortcut command</span>
+						<p>Use this option to select which custom keyboard shortcut command (defined in the extension
+							shortcuts page of your browser) will trigger the current profile. When a shortcut is
+							assigned here, using it will save the page with the settings of this profile.</p>
+					</li>
 				</ul>
 				<p>File name</p>
 				<ul>

+ 16 - 0
src/ui/pages/options.html

@@ -46,6 +46,22 @@
 				<label for="autoCloseInput" id="autoCloseLabel"></label>
 				<input type="checkbox" id="autoCloseInput">
 			</div>
+			<div class="option">
+				<label for="customShortcutInput" id="customShortcutLabel"></label>
+				<select id="customShortcutInput">
+					<option value="" id="customShortcutDefaultLabel"></option>
+					<option value="custom-command-0" id="customShortcut0Label"></option>
+					<option value="custom-command-1" id="customShortcut1Label"></option>
+					<option value="custom-command-2" id="customShortcut2Label"></option>
+					<option value="custom-command-3" id="customShortcut3Label"></option>
+					<option value="custom-command-4" id="customShortcut4Label"></option>
+					<option value="custom-command-5" id="customShortcut5Label"></option>
+					<option value="custom-command-6" id="customShortcut6Label"></option>
+					<option value="custom-command-7" id="customShortcut7Label"></option>
+					<option value="custom-command-8" id="customShortcut8Label"></option>
+					<option value="custom-command-9" id="customShortcut9Label"></option>
+				</select>
+			</div>
 		</details>
 		<details>
 			<summary id="filenameLabel"></summary>