Преглед изворни кода

integration of the annotation editor (fixes #161)

Former-commit-id: bcdb70fbaf85bde16cb824b9d84bce5968dc5cff
Gildas пре 6 година
родитељ
комит
5909443455
43 измењених фајлова са 6005 додато и 4168 уклоњено
  1. 514 454
      _locales/de/messages.json
  2. 513 453
      _locales/en/messages.json
  3. 512 452
      _locales/es/messages.json
  4. 513 453
      _locales/fr/messages.json
  5. 513 453
      _locales/ja/messages.json
  6. 513 453
      _locales/pl/messages.json
  7. 513 453
      _locales/ru/messages.json
  8. 513 456
      _locales/zh_CN/messages.json
  9. 513 456
      _locales/zh_TW/messages.json
  10. 4 2
      extension/core/bg/business.js
  11. 2 1
      extension/core/bg/config.js
  12. 28 16
      extension/core/bg/downloads.js
  13. 45 0
      extension/core/bg/editor.js
  14. 3 0
      extension/core/bg/messages.js
  15. 93 0
      extension/core/content/content-download.js
  16. 5 63
      extension/core/content/content-main.js
  17. 170 0
      extension/ui/bg/ui-editor.js
  18. 16 0
      extension/ui/bg/ui-menus.js
  19. 9 1
      extension/ui/bg/ui-options.js
  20. 632 0
      extension/ui/content/content-ui-editor-web.js
  21. 28 0
      extension/ui/pages/editor-frame-web.css
  22. 25 0
      extension/ui/pages/editor-mask-web.css
  23. 155 0
      extension/ui/pages/editor-note-web.css
  24. 96 0
      extension/ui/pages/editor.css
  25. 57 0
      extension/ui/pages/editor.html
  26. 6 0
      extension/ui/pages/help.html
  27. 6 1
      extension/ui/pages/options.html
  28. BIN
      extension/ui/resources/button_download.png
  29. BIN
      extension/ui/resources/button_edit.png
  30. BIN
      extension/ui/resources/button_highlighter_blue.png
  31. BIN
      extension/ui/resources/button_highlighter_delete.png
  32. BIN
      extension/ui/resources/button_highlighter_green.png
  33. BIN
      extension/ui/resources/button_highlighter_hidden.png
  34. BIN
      extension/ui/resources/button_highlighter_pink.png
  35. BIN
      extension/ui/resources/button_highlighter_visible.png
  36. BIN
      extension/ui/resources/button_highlighter_yellow.png
  37. BIN
      extension/ui/resources/button_note_blue.png
  38. BIN
      extension/ui/resources/button_note_green.png
  39. BIN
      extension/ui/resources/button_note_hidden.png
  40. BIN
      extension/ui/resources/button_note_pink.png
  41. BIN
      extension/ui/resources/button_note_visible.png
  42. BIN
      extension/ui/resources/button_note_yellow.png
  43. 8 1
      manifest.json

+ 514 - 454
_locales/de/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "Speichern einer kompletten Webseite in eine einzige HTML-Datei",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Speichern einer Webseite mit SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Wählen Sie das Standardprofil aus",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Profil der aktuellen Regel auswählen",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Profil der aktuellen Domain auswählen",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "Auswahl speichern",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Rahmen speichern",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveTabs": {
-        "message": "Tab speichern",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Speichern der ausgewählten Tabs",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Speichern der nicht angehefteten Tabs",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Speichern aller Tabs",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Automatische Speicherung",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Deaktiviert",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Automatische Speicherung dieses Tabs",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Automatische Speicherung der nicht angehefteten Tabs",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Automatische Speicherung aller Tabs",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Webseite mit SingleFile abspeichern",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "SingleFile kann diese Webseite nicht speichern",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Initialisierung von SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Speicherung aktiviert: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Automatische Speicherung ist aktiv",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Auswahlmenu",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "Benutzerschnittstelle",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "Eintrag im Kontextmenü der Webseite hinzufügen",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "Während der Speicherung die Webseite grau unterlegen",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "Infoknopf beim Betrachten einer gespeicherten Seite anzeigen",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "Muster für Inhalt des Infoknopfs",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "Einfügen Inhalt des Infoknopfs in die gespeicherte Seite",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "Inhalt des Infoknopfs im Dialogfenster eingeben",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "Automatisches Schließen des Tabs nach dem Speichern der Seite",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "Dateiname",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "Vorlage",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "Dialogfenster \"Sichern als\" zur Bestätigung des Dateinamens öffnen",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "Vorgehensweise bei Konflikt mit dem Dateinamen",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "Eindeutigen Dateinamen erzeugen",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "Bestehende Datei überschreiben",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "Dialogfenster zur Eingabe eines Dateinamens",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML-Inhalt",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "HTML-Inhalt komprimieren",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "Eingebundene HTML-Inhalte entfernen",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "Rahmen entfernen",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "Verborgene Elemente entfernen",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Bilder",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "Doppelte Bilder zusammenfassen",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "Speicherung zurückgestellter Bilder",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "maximale Inaktivitätszeit (ms)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "Bilder für alternative Bildschirmauflösungen entfernen",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Schriftarten",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "Unbenutze Schriftarten entfernen",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "Alternative Schriftarten entfernen",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Formatvorlagen",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "CSS-Inhalte komprimieren",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "Nicht verwendete Stile entfernen",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "Formatvorlagen für alternative Bildschirme löschen",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Weitere Ressourcen",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "Scripte entfernen",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "Videoquellen entfernen",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "Audioquellen entfernen",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Automatische Speicherung",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Automatische Einstellung festlegen",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Löschbestätigung für alle aufgelisteten Regeln",
-        "description": "Popup text 'Confirm the deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Löschen aller aufgelisteten Regeln",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the Auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "URL komplett oder teilweise eingeben (z.B. example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Profil",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Profil für automatische Speicherung",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "Alle Profiles auflisten",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "'Profil für automatische Speicherung' anzeigen Spalte",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Regel ändern",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Regel löschen",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Regel hinzufügen",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Änderungen bestätigen",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Löschung der auswählten Regel bestätigen",
-        "description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "Automatische Speicherung nach dem Laden oder Schließen der Seite",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "Automatische Speicherung nach dem Laden der Seite",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "Automatische Speicherung beim Schließen der Seite",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "Automatische Speicherung nach Seitenaufbau verzögern (s)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "Automatische Speicherung in regelmäßigen Abständen wiederholen",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "Zeitraum (s.)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Sonstiges",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "Speicherung der Seiten im Hintergrund",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "Statistik nach Verarbeitung in der Konsole anzeigen",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "Maximale Größe für eingebettete Ressourcen",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "Maximale Größe (MB)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "Originalseite sichern",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "In die Zwischenablage speichern",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "Hilfe",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Zurücksetzen",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Zurücksetzung aller Optionen auf Standardeinstellung",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Zurücksetzung aller Optionen des aktuellen Profils bestätigen",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Alle Optionen zurücksetzen",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Das aktuelle Profil zurücksetzen",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Abbrechen",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Exportieren",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Importieren",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Zurückgestellte Bilder",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Rahmeninhalte",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Schritt",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "150",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Standardeinstellungen",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Deaktiviert",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Neues Profil anlegen",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Profil umbenennen",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Profil löschen",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Neuen Profilnamen eingeben",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Löschung des auswählten Profils bestätigen",
-        "description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Neuen Namen für das ausgewählte Profil eingeben",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
-}
+{
+	"extensionDescription": {
+		"message": "Speichern einer kompletten Webseite in eine einzige HTML-Datei",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Speichern der Webseite mit SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Annotieren und Speichern der Webseite...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Wählen Sie das Standardprofil aus",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Profil der aktuellen Regel auswählen",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Profil der aktuellen Domain auswählen",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "Auswahl speichern",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Rahmen speichern",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveTabs": {
+		"message": "Tab speichern",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Speichern der ausgewählten Tabs",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Speichern der nicht angehefteten Tabs",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Speichern aller Tabs",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Automatische Speicherung",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Deaktiviert",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Automatische Speicherung dieses Tabs",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Automatische Speicherung der nicht angehefteten Tabs",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Automatische Speicherung aller Tabs",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Webseite mit SingleFile abspeichern",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "SingleFile kann diese Webseite nicht speichern",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Initialisierung von SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Speicherung aktiviert: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Automatische Speicherung ist aktiv",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Auswahlmenu",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "Benutzerschnittstelle",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "Eintrag im Kontextmenü der Webseite hinzufügen",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "Während der Speicherung die Webseite grau unterlegen",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "Infoknopf beim Betrachten einer gespeicherten Seite anzeigen",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "Muster für Inhalt des Infoknopfs",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "Einfügen Inhalt des Infoknopfs in die gespeicherte Seite",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "Inhalt des Infoknopfs im Dialogfenster eingeben",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "Automatisches Schließen des Tabs nach dem Speichern der Seite",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "Dateiname",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "Vorlage",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "Dialogfenster \"Sichern als\" zur Bestätigung des Dateinamens öffnen",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "Vorgehensweise bei Konflikt mit dem Dateinamen",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "Eindeutigen Dateinamen erzeugen",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "Bestehende Datei überschreiben",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "Dialogfenster zur Eingabe eines Dateinamens",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML-Inhalt",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "HTML-Inhalt komprimieren",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "Eingebundene HTML-Inhalte entfernen",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "Rahmen entfernen",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "Verborgene Elemente entfernen",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Bilder",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "Doppelte Bilder zusammenfassen",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "Speicherung zurückgestellter Bilder",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "maximale Inaktivitätszeit (ms)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "Bilder für alternative Bildschirmauflösungen entfernen",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Schriftarten",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "Unbenutze Schriftarten entfernen",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "Alternative Schriftarten entfernen",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Formatvorlagen",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "CSS-Inhalte komprimieren",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "Nicht verwendete Stile entfernen",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "Formatvorlagen für alternative Bildschirme löschen",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Weitere Ressourcen",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "Scripte entfernen",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "Videoquellen entfernen",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "Audioquellen entfernen",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Automatische Speicherung",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Automatische Einstellung festlegen",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Löschbestätigung für alle aufgelisteten Regeln",
+		"description": "Popup text 'Confirm the deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Löschen aller aufgelisteten Regeln",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the Auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "URL komplett oder teilweise eingeben (z.B. example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Profil",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Profil für automatische Speicherung",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "Alle Profiles auflisten",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "'Profil für automatische Speicherung' anzeigen Spalte",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Regel ändern",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Regel löschen",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Regel hinzufügen",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Änderungen bestätigen",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Löschung der auswählten Regel bestätigen",
+		"description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "Automatische Speicherung nach dem Laden oder Schließen der Seite",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "Automatische Speicherung nach dem Laden der Seite",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "Automatische Speicherung beim Schließen der Seite",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "Automatische Speicherung nach Seitenaufbau verzögern (s)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "Automatische Speicherung in regelmäßigen Abständen wiederholen",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "Zeitraum (s.)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Sonstiges",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "Speicherung der Seiten im Hintergrund",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "Statistik nach Verarbeitung in der Konsole anzeigen",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "Maximale Größe für eingebettete Ressourcen",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "Maximale Größe (MB)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "Originalseite sichern",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "In die Zwischenablage speichern",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "Hilfe",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Zurücksetzen",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Zurücksetzung aller Optionen auf Standardeinstellung",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Zurücksetzung aller Optionen des aktuellen Profils bestätigen",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Alle Optionen zurücksetzen",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Das aktuelle Profil zurücksetzen",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Abbrechen",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Exportieren",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Importieren",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Zurückgestellte Bilder",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Rahmeninhalte",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Schritt",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "150",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Standardeinstellungen",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Deaktiviert",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Neues Profil anlegen",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Profil umbenennen",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Profil löschen",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Neuen Profilnamen eingeben",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Löschung des auswählten Profils bestätigen",
+		"description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Neuen Namen für das ausgewählte Profil eingeben",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
+}

+ 513 - 453
_locales/en/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "Save a complete page into a single HTML file",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Save page with SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Select the default profile",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Select the profile of the current rule",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Select the profile of the current domain",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "Save selection",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Save frame",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveTabs": {
-        "message": "Save tabs",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Save selected tabs",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Save unpinned tabs",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Save all tabs",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Auto-save",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Disabled",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Auto-save this tab",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Auto-save unpinned tabs",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Auto-save all tabs",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Save page with SingleFile",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "This page cannot be saved with SingleFile",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Initializing SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Save progress: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Auto-save active",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Options",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "User interface",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "add entry in the context menu of the webpage",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "overlay a shadow on the page during processing",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "display an infobar when viewing a saved page",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "template of the infobar content",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "include the infobar in the saved page",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "open a prompt dialog to edit the infobar content",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "auto-close the tab after the page is saved",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "File name",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "template",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "open the \"Save as\" dialog to confirm the file name",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "file name conflict resolution",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "create a unique name",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "overwrite the existing file",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "prompt for a name",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML content",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "compress HTML content",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "remove HTML imports",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "remove frames",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "remove hidden elements",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Images",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "group duplicate images together",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "save deferred images",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "maximum idle time (ms)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "remove images for alternative screen resolutions",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Fonts",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "remove unused fonts",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "remove alternative fonts",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Stylesheets",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "compress CSS content",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "remove unused styles",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "remove stylesheets for alternative devices to screens",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Other resources",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "remove scripts",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "remove video sources",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "remove audio sources",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Auto-save",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Auto-settings rules",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Confirm the deletion of all displayed rules",
-        "description": "Popup text 'Confirm the deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Delete all displayed rules",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the Auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "Type a complete or partial URL (e.g. example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Profile",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Auto-save profile",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "display all profiles",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "display 'Auto-save profile' column",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Update the rule",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Delete the rule",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Add the rule",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Validate changes",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Confirm the deletion of the selected rule",
-        "description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "auto-save after page load or on page unload",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "auto-save after page load",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "auto-save on page unload",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "auto-save waiting delay after page load (s)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "auto-save periodically",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "period (s.)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Misc.",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "save pages in background",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "display stats in the console after processing",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "set a maximum size for embedded resources",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "maximum size (MB)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "save raw page",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "save to clipboard",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "help",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Reset",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Reset all options to their default values",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Confirm the reset of all options or the current profile",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Reset all options",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Reset the current profile",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Cancel",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Export",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Import",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Deferred images",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Frame contents",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Step",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "122",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Default settings",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Disabled",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Add a new profile",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Rename the profile",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Delete the profile",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Enter a name for this new profile",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Confirm the deletion of the selected profile",
-        "description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Enter a new name for the selected profile",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+{
+	"extensionDescription": {
+		"message": "Save a complete page into a single HTML file",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Save page with SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Annotate and save the page...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Select the default profile",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Select the profile of the current rule",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Select the profile of the current domain",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "Save selection",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Save frame",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveTabs": {
+		"message": "Save tabs",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Save selected tabs",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Save unpinned tabs",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Save all tabs",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Auto-save",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Disabled",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Auto-save this tab",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Auto-save unpinned tabs",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Auto-save all tabs",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Save page with SingleFile",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "This page cannot be saved with SingleFile",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Initializing SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Save progress: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Auto-save active",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Options",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "User interface",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "add entry in the context menu of the webpage",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "overlay a shadow on the page during processing",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "display an infobar when viewing a saved page",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "template of the infobar content",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "include the infobar in the saved page",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "open a prompt dialog to edit the infobar content",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "auto-close the tab after the page is saved",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "File name",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "template",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "open the \"Save as\" dialog to confirm the file name",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "file name conflict resolution",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "create a unique name",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "overwrite the existing file",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "prompt for a name",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML content",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "compress HTML content",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "remove HTML imports",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "remove frames",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "remove hidden elements",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Images",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "group duplicate images together",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "save deferred images",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "maximum idle time (ms)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "remove images for alternative screen resolutions",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Fonts",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "remove unused fonts",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "remove alternative fonts",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Stylesheets",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "compress CSS content",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "remove unused styles",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "remove stylesheets for alternative devices to screens",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Other resources",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "remove scripts",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "remove video sources",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "remove audio sources",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Auto-save",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Auto-settings rules",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Confirm the deletion of all displayed rules",
+		"description": "Popup text 'Confirm the deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Delete all displayed rules",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the Auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "Type a complete or partial URL (e.g. example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Profile",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Auto-save profile",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "display all profiles",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "display 'Auto-save profile' column",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Update the rule",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Delete the rule",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Add the rule",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Validate changes",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Confirm the deletion of the selected rule",
+		"description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "auto-save after page load or on page unload",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "auto-save after page load",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "auto-save on page unload",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "auto-save waiting delay after page load (s)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "auto-save periodically",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "period (s.)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Misc.",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "save pages in background",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "display stats in the console after processing",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "set a maximum size for embedded resources",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "maximum size (MB)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "save raw page",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "save to clipboard",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "help",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Reset",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Reset all options to their default values",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Confirm the reset of all options or the current profile",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Reset all options",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Reset the current profile",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Cancel",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Export",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Import",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Deferred images",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Frame contents",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Step",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "122",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Default settings",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Disabled",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Add a new profile",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Rename the profile",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Delete the profile",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Enter a name for this new profile",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Confirm the deletion of the selected profile",
+		"description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Enter a new name for the selected profile",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 512 - 452
_locales/es/messages.json

@@ -1,454 +1,514 @@
 {
-    "extensionDescription": {
-        "message": "Guarda una página completa en un único archivo HTML",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Guardar página con SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Seleccionar el perfil predeterminado",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Seleccionar el perfil de la regla actual",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Seleccionar el perfil del dominio actual",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "Guardar selección",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Guardar marco (frame)",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveTabs": {
-        "message": "Guardar pestañas",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Guardar pestañas seleccionadas",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Guardar pestañas no fijadas",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Guardar todas las pestañas",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Auto-guardar",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Deshabilitado",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Auto-guardar esta pestaña",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Auto-guardar pestañas no fijadas",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Auto-guardar todas las pestañas",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Guardar página con SingleFile",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "Esta página no se puede guardar con SingleFile",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Inicializando SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Progresión del guardado: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Auto-guardar activado",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Opciones",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "Interfaz de usuario",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "añadir entrada en el menú contextual de la página web",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "cubrir la página con un sombreado durante el procesado",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "mostrar una barra informativa al ver una página guardada",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "plantilla del contenido de la barra informativa",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "incluir la barra informativa en la página guardada",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "abrir un cuadro de diálogo para editar el contenido de la barra informativa",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "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'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "Nombre del archivo",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "plantilla",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "abrir el cuadro de diálogo \"Guardar como\" para confirmar el nombre del archivo",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "resolución de conflictos de nombre de archivo",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "crear un nombre exclusivo",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "sobrescribir el archivo existente",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "preguntar por un nombre",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "Contenido HTML",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "comprimir contenido HTML",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "eliminar importaciones de HTML (import)",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "eliminar marcos (frame)",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "eliminar elementos ocultos (hidden)",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Imágenes",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "agrupar imágenes duplicadas combinadamente",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "guardar imágenes diferidas",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "periodo máximo de espera (ms)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "eliminar imágenes para resoluciones alternativas de pantalla",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Fuentes",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "eliminar fuentes no usadas",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "eliminar fuentes alternativas",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Hojas de estilo",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "comprimir contenido CSS",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "eliminar estilos no usados",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "eliminar hojas de estilo para dispositivos alternativos a las pantallas",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Otros recursos",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "eliminar scripts",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "eliminar fuentes de vídeo",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "eliminar fuentes de audio",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Auto-guardado",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Reglas de auto-guardado",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Confirmar la eliminación de todas las reglas mostradas",
-        "description": "Popup text 'Confirm the deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Elimina todas las reglas mostradas",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the Auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "Escriba una URL parcial o completa (ej. ejemplo.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Perfil",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Perfil de auto-guardado",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "mostrar todos los perfiles",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "mostrar columna 'Perfil de auto-guardado'",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Actualizar la regla",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Eliminar la regla",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Añadir la regla",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Validar cambios",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Confirmar la eliminación de la regla seleccionada",
-        "description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "auto-guardar tras cargar la página o al purgar la página",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "auto-guardar tras cargar la página",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "auto-guardar al purgar la página",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "retardo de auto-guardado tras cargar la página (s)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "auto-guardar periódicamente",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "periodo (s)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Miscelánea",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "guardar páginas en segundo plano",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "mostrar estadísticas en la consola tras el procesado",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "establecer un tamaño máximo para recursos incrustados",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "tamaño máximo (MB)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "guardar página en crudo",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "guardar en el portapapeles",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "ayuda",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Restablecer",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Restablece todas las opciones a sus valores predeterminados",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Confirmar el restablecimiento de todas las opciones o del perfil actual",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Restablecer todas las ocpiones",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Restablecer el perfil actual",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "Aceptar",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Cancelar",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Exportar",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Importar",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Imágenes diferidas",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Contenidos de marco (frame)",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Nivel",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "192",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Configuración predeterminada",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Deshabilitado",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Añade un perfil nuevo",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Renombra el perfil",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Elimina el perfil",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Introducir un nombre para este nuevo perfil",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Confirmar la eliminación del perfil seleccionado",
-        "description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Introducir un nuevo nombre para el perfil seleccionado",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+	"extensionDescription": {
+		"message": "Guarda una página completa en un único archivo HTML",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Guardar página con SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Anotar y guardar la página",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Seleccionar el perfil predeterminado",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Seleccionar el perfil de la regla actual",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Seleccionar el perfil del dominio actual",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "Guardar selección",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Guardar marco (frame)",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveTabs": {
+		"message": "Guardar pestañas",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Guardar pestañas seleccionadas",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Guardar pestañas no fijadas",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Guardar todas las pestañas",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Auto-guardar",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Deshabilitado",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Auto-guardar esta pestaña",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Auto-guardar pestañas no fijadas",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Auto-guardar todas las pestañas",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Guardar página con SingleFile",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "Esta página no se puede guardar con SingleFile",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Inicializando SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Progresión del guardado: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Auto-guardar activado",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Opciones",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "Interfaz de usuario",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "añadir entrada en el menú contextual de la página web",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "cubrir la página con un sombreado durante el procesado",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "mostrar una barra informativa al ver una página guardada",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "plantilla del contenido de la barra informativa",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "incluir la barra informativa en la página guardada",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "abrir un cuadro de diálogo para editar el contenido de la barra informativa",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"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'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "Nombre del archivo",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "plantilla",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "abrir el cuadro de diálogo \"Guardar como\" para confirmar el nombre del archivo",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "resolución de conflictos de nombre de archivo",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "crear un nombre exclusivo",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "sobrescribir el archivo existente",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "preguntar por un nombre",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "Contenido HTML",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "comprimir contenido HTML",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "eliminar importaciones de HTML (import)",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "eliminar marcos (frame)",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "eliminar elementos ocultos (hidden)",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Imágenes",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "agrupar imágenes duplicadas combinadamente",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "guardar imágenes diferidas",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "periodo máximo de espera (ms)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "eliminar imágenes para resoluciones alternativas de pantalla",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Fuentes",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "eliminar fuentes no usadas",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "eliminar fuentes alternativas",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Hojas de estilo",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "comprimir contenido CSS",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "eliminar estilos no usados",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "eliminar hojas de estilo para dispositivos alternativos a las pantallas",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Otros recursos",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "eliminar scripts",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "eliminar fuentes de vídeo",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "eliminar fuentes de audio",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Auto-guardado",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Reglas de auto-guardado",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Confirmar la eliminación de todas las reglas mostradas",
+		"description": "Popup text 'Confirm the deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Elimina todas las reglas mostradas",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the Auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "Escriba una URL parcial o completa (ej. ejemplo.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Perfil",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Perfil de auto-guardado",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "mostrar todos los perfiles",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "mostrar columna 'Perfil de auto-guardado'",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Actualizar la regla",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Eliminar la regla",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Añadir la regla",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Validar cambios",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Confirmar la eliminación de la regla seleccionada",
+		"description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "auto-guardar tras cargar la página o al purgar la página",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "auto-guardar tras cargar la página",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "auto-guardar al purgar la página",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "retardo de auto-guardado tras cargar la página (s)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "auto-guardar periódicamente",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "periodo (s)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Miscelánea",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "guardar páginas en segundo plano",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "mostrar estadísticas en la consola tras el procesado",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "establecer un tamaño máximo para recursos incrustados",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "tamaño máximo (MB)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "guardar página en crudo",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "guardar en el portapapeles",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "ayuda",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Restablecer",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Restablece todas las opciones a sus valores predeterminados",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Confirmar el restablecimiento de todas las opciones o del perfil actual",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Restablecer todas las ocpiones",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Restablecer el perfil actual",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "Aceptar",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Cancelar",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Exportar",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Importar",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Imágenes diferidas",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Contenidos de marco (frame)",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Nivel",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "192",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Configuración predeterminada",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Deshabilitado",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Añade un perfil nuevo",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Renombra el perfil",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Elimina el perfil",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Introducir un nombre para este nuevo perfil",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Confirmar la eliminación del perfil seleccionado",
+		"description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Introducir un nuevo nombre para el perfil seleccionado",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 453
_locales/fr/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "Sauvegardez une page complète dans un simple fichier HTML",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Sauver la page avec SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Sélectionner le profil par défaut",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Sélectionner le profil de la règle courante",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Sélectionner le profil du domaine courant",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveTabs": {
-        "message": "Sauver les onglets",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelection": {
-        "message": "Sauver la sélection",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Sauver le cadre",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Sauver les onglets sélectionnés",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Sauver les onglets non épinglés",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Sauver tous les onglets",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Auto-sauvegarde",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Désactivée",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Auto-sauvegarder cet onglet",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Auto-sauvegarder les onglets non épinglés",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Auto-sauvegarder tous les onglets",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Sauver la page avec SingleFile",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "Cette page ne peut pas être sauvée avec SingleFile",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Initialisation de SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Progression de la sauvegarde : ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Auto-sauvegarde active",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Options",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "Interface utilisateur",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "ajouter une entrée dans le menu contextuel de la page web",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "assombrir la page pendant la sauvegarde",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "afficher une barre d'information quand une sauvegarde est affichée",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "modèle du contenu de la barre d'information",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "inclure la barre d'information dans la page sauvegardée",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "ouvrir une boite de dialogue pour éditer le contenu de la barre d'information",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "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'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "Nom de fichier",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "modèle",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "ouvrir la boite de dialogue \"Sauver sous\" pour confimer le nom de fichier",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "résolution de conflit de noms",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "créer un nom unique",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique filename'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "écraser le fichier existant",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "demander un nom de fichier",
-        "description": "Value for 'filename conflict resolution' option: 'prompt for a filename'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "Contenu HTML",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "compresser le contenu HTML",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "supprimer les imports HTML",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "supprimer les cadres",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "supprimer les élements cachés",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Images",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "regrouper les images dupliquées",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "sauver les images chargées de manière différées",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "temps d'inactivité maximal (ms)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "supprimer les images pour des résolutions d'écran alternatives",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Polices de caractère",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "supprimer les polices de caractère inutilisées",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "supprimer les polices de caractère alternatives",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Feuilles de style",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "compresser le contenu CSS",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "supprimer les styles inutilisés",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "supprimer les feuilles de styles pour les appareils autres que des écrans",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Autres ressources",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "supprimer les scripts",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "supprimer les sources video",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "supprimer les sources audio",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Auto-sauvegarde",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Règles d'auto-configuration",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Confirmez la suppression de toutes les règles affichées",
-        "description": "Popup text 'Confirm deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Supprimer toutes les règles affichées",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "Entrer une URL complète ou partielle (e.g. example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Profil",
-        "description": "Options label in the auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Profil auto-sauvegarde",
-        "description": "Options label in the auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "afficher tous les profils",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "afficher la colonne 'Profil auto-sauvegarde'",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Mettre à jour la règle",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Supprimer la règle",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Ajouter la règle",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Valider les changements",
-        "description": "Popup text 'Valider les changements' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Confimer la suppression de la règle selectionnée",
-        "description": "Popup text 'Confirm deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "auto-sauvegarder après le chargement de la page ou au déchargement",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "auto-sauvegarder après le chargement de la page",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "auto-sauvegarder au déchargement de la page",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "délai d'attente après le chargement de la page (s)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "auto-sauvegarder périodiquement",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "période (s)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Divers",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "sauvegarder la page en tâche de fond",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "afficher les statistiques dans la console après la sauvegarde",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "définir une taille maximale pour les ressources embarquées",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "taille maximale (Mo)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "sauvegarder la page brute",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "enregistrer dans le presse-papiers",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "aide (anglais)",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Remise à zéro",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Remettre toutes les options à leur valeur par défaut",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Confirmer la remise à zéro de toutes les options ou la remise à zéro du profil courant",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Remettre à zéro toutes les options",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Remettre à zéro le profil courant",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Annuler",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Exporter",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Importer",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Images différées",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Contenus des cadres",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Étape",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "147",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Configuration par défaut",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Désactivé",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Ajouter un nouveau profil",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Renommer le profil",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Supprimer le profil",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Saisissez un nom pour ce nouveau profil",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Confirmez la suppression du profil selectionné",
-        "description": "Popup text 'Confirm deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Saisissez un nouveau nom pour le profil sélectionné",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+{
+	"extensionDescription": {
+		"message": "Sauvegardez une page complète dans un simple fichier HTML",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Sauver la page avec SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Annoter et sauver la page...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Sélectionner le profil par défaut",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Sélectionner le profil de la règle courante",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Sélectionner le profil du domaine courant",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveTabs": {
+		"message": "Sauver les onglets",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelection": {
+		"message": "Sauver la sélection",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Sauver le cadre",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Sauver les onglets sélectionnés",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Sauver les onglets non épinglés",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Sauver tous les onglets",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Auto-sauvegarde",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Désactivée",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Auto-sauvegarder cet onglet",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Auto-sauvegarder les onglets non épinglés",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Auto-sauvegarder tous les onglets",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Sauver la page avec SingleFile",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "Cette page ne peut pas être sauvée avec SingleFile",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Initialisation de SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Progression de la sauvegarde : ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Auto-sauvegarde active",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Options",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "Interface utilisateur",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "ajouter une entrée dans le menu contextuel de la page web",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "assombrir la page pendant la sauvegarde",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "afficher une barre d'information quand une sauvegarde est affichée",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "modèle du contenu de la barre d'information",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "inclure la barre d'information dans la page sauvegardée",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "ouvrir une boite de dialogue pour éditer le contenu de la barre d'information",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annoter la page avant de la sauvegerder",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"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'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "Nom de fichier",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "modèle",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "ouvrir la boite de dialogue \"Sauver sous\" pour confimer le nom de fichier",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "résolution de conflit de noms",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "créer un nom unique",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique filename'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "écraser le fichier existant",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "demander un nom de fichier",
+		"description": "Value for 'filename conflict resolution' option: 'prompt for a filename'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "Contenu HTML",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "compresser le contenu HTML",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "supprimer les imports HTML",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "supprimer les cadres",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "supprimer les élements cachés",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Images",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "regrouper les images dupliquées",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "sauver les images chargées de manière différées",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "temps d'inactivité maximal (ms)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "supprimer les images pour des résolutions d'écran alternatives",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Polices de caractère",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "supprimer les polices de caractère inutilisées",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "supprimer les polices de caractère alternatives",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Feuilles de style",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "compresser le contenu CSS",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "supprimer les styles inutilisés",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "supprimer les feuilles de styles pour les appareils autres que des écrans",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Autres ressources",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "supprimer les scripts",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "supprimer les sources video",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "supprimer les sources audio",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Auto-sauvegarde",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Règles d'auto-configuration",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Confirmez la suppression de toutes les règles affichées",
+		"description": "Popup text 'Confirm deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Supprimer toutes les règles affichées",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "Entrer une URL complète ou partielle (e.g. example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Profil",
+		"description": "Options label in the auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Profil auto-sauvegarde",
+		"description": "Options label in the auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "afficher tous les profils",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "afficher la colonne 'Profil auto-sauvegarde'",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Mettre à jour la règle",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Supprimer la règle",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Ajouter la règle",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Valider les changements",
+		"description": "Popup text 'Valider les changements' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Confimer la suppression de la règle selectionnée",
+		"description": "Popup text 'Confirm deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "auto-sauvegarder après le chargement de la page ou au déchargement",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "auto-sauvegarder après le chargement de la page",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "auto-sauvegarder au déchargement de la page",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "délai d'attente après le chargement de la page (s)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "auto-sauvegarder périodiquement",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "période (s)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Divers",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "sauvegarder la page en tâche de fond",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "afficher les statistiques dans la console après la sauvegarde",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "définir une taille maximale pour les ressources embarquées",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "taille maximale (Mo)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "sauvegarder la page brute",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "enregistrer dans le presse-papiers",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "aide (anglais)",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Remise à zéro",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Remettre toutes les options à leur valeur par défaut",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Confirmer la remise à zéro de toutes les options ou la remise à zéro du profil courant",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Remettre à zéro toutes les options",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Remettre à zéro le profil courant",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Annuler",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Exporter",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Importer",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Images différées",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Contenus des cadres",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Étape",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "147",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Configuration par défaut",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Désactivé",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Ajouter un nouveau profil",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Renommer le profil",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Supprimer le profil",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Saisissez un nom pour ce nouveau profil",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Confirmez la suppression du profil selectionné",
+		"description": "Popup text 'Confirm deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Saisissez un nouveau nom pour le profil sélectionné",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Ajouter une note jaune",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Ajouter une note rose",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Ajouter une note bleue",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Ajouter une note verte",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Surligner en jaune le text selectionné",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Surligner en rose le text selectionné",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Surligner en bleu le text selectionné",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Surligner en vert le text selectionné",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Afficher/cacher les notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Afficher/cacher le texte surligné",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Supprimer le surlignement du texte selectionné",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Activer/déactiver le mode lecture seule",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Sauver la page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 453
_locales/ja/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "完全なページを単一の HTML ファイルに保存する",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "SingleFile でページを保存",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "規定(default)のプロファイルを選択",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "現在のルールのプロファイルを選択",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "現在のドメインのプロファイルを選択",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveTabs": {
-        "message": "タブを保存",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelection": {
-        "message": "選択を保存",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "フレームを保存",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "選択したタブを保存",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "固定解除されたタブを保存する",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "すべてのタブを保存",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "自動保存",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "無効",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "このタブを自動保存する",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "固定解除されたタブの自動保存",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "すべてのタブを自動的に保存する",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "SingleFile でページを保存",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "このページは SingleFile では保存できません",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "SingleFile の初期化",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "進行状況を保存: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "エラー",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "有効な自動保存",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "オプション(設定)",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "ユーザーインターフェイス(表示)",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "ウェブページのコンテキストメニューにエントリを追加する",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "処理中のページに影を重ねる",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "保存したページを表示するときに情報バーを表示する",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "infobar コンテンツのテンプレート",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "保存されたページに、infobar を含める",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "infobar のコンテンツを編集するためのプロンプトダイアログを開く",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "ページが保存された後にタブを自動的に閉じる",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "ファイル名",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "保存時の定形書式",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "を開く(として保存する:ファイル名を確認するためのダイアログ)",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "ファイル名の競合を解決する",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "独自の名前を作成する",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "既存のファイルを上書きする",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "名前を求めるプロンプト",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML コンテンツ",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "HTML コンテンツを圧縮する",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "取り込んだ HTML を削除する",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "フレームを削除する",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "隠された要素を削除する",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "画像",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "オプション重複画像のグループ化",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "遅延画像を保存する",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "最大アイドル時間(秒)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "代替画面解像度用の画像を削除します",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "フォント",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "未使用のフォントを削除する",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "代替フォントを削除する",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "スタイルシート",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "CSS コンテンツを圧縮する",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "未使用のスタイルを削除する",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "代替デバイス用のスタイルシートを画面に表示しない",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "その他の要素",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "スクリプトを削除する",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "ビデオソースを削除する",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "オーディオソースを削除する",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "自動保存",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "自動設定のルール",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "表示されているすべてのルールの削除を確認します",
-        "description": "Popup text 'Confirm the deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "表示されているすべてのルールを削除する",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the Auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "完全または部分的な URL を入力します (例 example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "プロファイル",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "プロファイルの自動保存",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "すべてのプロファイルを表示します",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "「プロファイルの自動保存」列を表示する",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "ルールを更新する",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "ルールを削除する",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "ルールを追加する",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "変更内容を検証します",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "選択したルールの削除を確認する",
-        "description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "ページの読み込み後またはページの非読み込み時に自動保存",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "ページ読み込み後の自動保存",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "ページの非読み込み時に自動保存",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "ページ読み込み後の自動保存待ち時間(秒)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "定期的に自動保存する",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "所要時間(秒)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "その他",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "バックグラウンドでページを保存する",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "処理後、コンソールに統計情報を表示する",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "埋め込み要素の最大サイズを設定する",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "最大サイズ(MB)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "生のページを保存",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "クリップボードに保存する",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "ヘルプ",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "リセット",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "すべてのオプションを規定値にリセットする",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "すべてのオプションまたは現在のプロファイルのリセットを確認します",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "すべてのオプションをリセットする",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "現在のプロファイルをリセットする",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "キャンセル",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "エクスポート",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "インポート",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "遅延画像",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "フレームの内容",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "ステップ",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "115",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "デフォルトの設定",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "無効",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "新しいプロファイルを追加します",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "プロファイルの名前を変更する",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "プロファイルを削除する",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "この新しいプロファイルの名前を入力します。",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "選択したプロファイルの削除を確認する",
-        "description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "選択したプロファイルの新しい名前を入力します。",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+{
+	"extensionDescription": {
+		"message": "完全なページを単一の HTML ファイルに保存する",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "SingleFile でページを保存",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "ページに注釈を付けて保存する...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "規定(default)のプロファイルを選択",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "現在のルールのプロファイルを選択",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "現在のドメインのプロファイルを選択",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveTabs": {
+		"message": "タブを保存",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelection": {
+		"message": "選択を保存",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "フレームを保存",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "選択したタブを保存",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "固定解除されたタブを保存する",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "すべてのタブを保存",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "自動保存",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "無効",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "このタブを自動保存する",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "固定解除されたタブの自動保存",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "すべてのタブを自動的に保存する",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "SingleFile でページを保存",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "このページは SingleFile では保存できません",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "SingleFile の初期化",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "進行状況を保存: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "エラー",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "有効な自動保存",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "オプション(設定)",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "ユーザーインターフェイス(表示)",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "ウェブページのコンテキストメニューにエントリを追加する",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "処理中のページに影を重ねる",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "保存したページを表示するときに情報バーを表示する",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "infobar コンテンツのテンプレート",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "保存されたページに、infobar を含める",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "infobar のコンテンツを編集するためのプロンプトダイアログを開く",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "ページが保存された後にタブを自動的に閉じる",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "ファイル名",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "保存時の定形書式",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "を開く(として保存する:ファイル名を確認するためのダイアログ)",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "ファイル名の競合を解決する",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "独自の名前を作成する",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "既存のファイルを上書きする",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "名前を求めるプロンプト",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML コンテンツ",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "HTML コンテンツを圧縮する",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "取り込んだ HTML を削除する",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "フレームを削除する",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "隠された要素を削除する",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "画像",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "オプション重複画像のグループ化",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "遅延画像を保存する",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "最大アイドル時間(秒)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "代替画面解像度用の画像を削除します",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "フォント",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "未使用のフォントを削除する",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "代替フォントを削除する",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "スタイルシート",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "CSS コンテンツを圧縮する",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "未使用のスタイルを削除する",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "代替デバイス用のスタイルシートを画面に表示しない",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "その他の要素",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "スクリプトを削除する",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "ビデオソースを削除する",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "オーディオソースを削除する",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "自動保存",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "自動設定のルール",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "表示されているすべてのルールの削除を確認します",
+		"description": "Popup text 'Confirm the deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "表示されているすべてのルールを削除する",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the Auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "完全または部分的な URL を入力します (例 example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "プロファイル",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "プロファイルの自動保存",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "すべてのプロファイルを表示します",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "「プロファイルの自動保存」列を表示する",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "ルールを更新する",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "ルールを削除する",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "ルールを追加する",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "変更内容を検証します",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "選択したルールの削除を確認する",
+		"description": "Popup text 'Confirm the deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "ページの読み込み後またはページの非読み込み時に自動保存",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "ページ読み込み後の自動保存",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "ページの非読み込み時に自動保存",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "ページ読み込み後の自動保存待ち時間(秒)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "定期的に自動保存する",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "所要時間(秒)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "その他",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "バックグラウンドでページを保存する",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "処理後、コンソールに統計情報を表示する",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "埋め込み要素の最大サイズを設定する",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "最大サイズ(MB)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "生のページを保存",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "クリップボードに保存する",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "ヘルプ",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "リセット",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "すべてのオプションを規定値にリセットする",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "すべてのオプションまたは現在のプロファイルのリセットを確認します",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "すべてのオプションをリセットする",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "現在のプロファイルをリセットする",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "キャンセル",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "エクスポート",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "インポート",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "遅延画像",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "フレームの内容",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "ステップ",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "115",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "デフォルトの設定",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "無効",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "新しいプロファイルを追加します",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "プロファイルの名前を変更する",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "プロファイルを削除する",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "この新しいプロファイルの名前を入力します。",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "選択したプロファイルの削除を確認する",
+		"description": "Popup text 'Confirm the deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "選択したプロファイルの新しい名前を入力します。",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 453
_locales/pl/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "Zapisuj kompletną stronę w pojedynczym pliku HTML.",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Zapisz stronę z SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Wybierz profil domyślny",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Wybierz profil bieżącej reguły",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Wybierz profil bieżącej domeny",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "Zapisz wybór",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Zapisz ramkę",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveTabs": {
-        "message": "Zapisz karty",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Zapisz wybrane karty",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Zapisz odpięte karty",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Zapisz wszystkie karty",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Automatyczny zapis",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Wyłączony",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Automatycznie zapisz tę kartę",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Automatycznie zapisz odpięte karty",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Automatycznie zapisz wszystkie karty",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Zapisz stronę z SingleFile",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "Tej strony nie można zapisać z SingleFile",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Inicjowanie SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Postęp zapisywania: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Automatyczny zapis aktywny",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Opcje",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "Interfejs użytkownika",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "dodawaj wpis w menu kontekstowym strony",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "nakładaj cień na stronę podczas przetwarzania",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "wyświetlaj pasek informacyjny podczas przeglądania zapisanej strony",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "szablon zawartości paska informacyjnego",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "włączyć paska informacyjnego do zapisanej strony",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "otwieraj okno dialogowe z monitem, aby edytować zawartość paska informacyjnego",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "auto-close the tab after the page is saved",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "Nazwa pliku",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "szablon",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "otwieraj okno \"Zapisz jako\", aby potwierdzić nazwę pliku",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "rozwiązywanie konfliktu nazwy pliku",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "stwórz unikalną nazwę pliku",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "nadpisz istniejący plik",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "zapytaj o nazwę",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "Zawartość HTML",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "kompresuj zawartość HTML",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "usuwaj importy HTML",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "usuwaj ramki",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "usuwaj ukryte elementy",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Obrazy",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "grupuj zduplikowane obrazy razem",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "zapisuj odroczone obrazy",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "maksymalny czas bezczynności (ms)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "usuwaj obrazy dla alternatywnych rozdzielczości ekranu",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Czcionki",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "usuwaj nieużywane czcionki",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "usuwaj alternatywne czcionki",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Arkusze stylów",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "kompresuj zawartość CSS",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "usuwaj nieużywane style",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "usuwaj arkusze stylów dla urządzeń innych niż ekrany",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Inne zasoby",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "usuwaj skrypty",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "usuwaj źródła wideo",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "usuwaj źródła audio",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Automatyczny zapis",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Reguły automatycznej konfiguracji",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Potwierdź usunięcie wszystkich wyświetlanych reguł",
-        "description": "Popup text 'Confirm deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Usuń wszystkie wyświetlane reguły",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "Adres URL",
-        "description": "Options label in the Auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "Wpisz cały lub częściowy adres URL (np. example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Profil",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Automatyczny zapis profilu",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "wyświetlaj wszystkie profile",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "wyświetlaj kolumnę 'Automatyczny zapis profilu'",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Uaktualnij regułę",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Usuń regułę",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Dodaj regułę",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Zatwierdź zmiany",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Potwierdź usunięcie wybranej reguły",
-        "description": "Popup text 'Confirm deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "automatycznie zapisuj po załadowaniu lub przy wyładowaniu strony",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "automatycznie zapisuj po załadowaniu strony",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "automatycznie zapisuj przy wyładowaniu strony",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "opóźnienie oczekiwania automatycznego zapisywania po załadowaniu strony (s.)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "automatycznie zapisuj okresowo",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "okres (s)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Różne",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "zapisuj strony w tle",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "wyświetlaj statystyki w konsoli po przetworzeniu",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "ustaw maksymalny rozmiar dla zasobów osadzonych",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "maksymalny rozmiar (MB)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "zapisuj surową stronę",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "zapisz do schowka",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "pomoc (w języku angielskim)",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Resetuj",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Zresetuj wszystkie opcje do ich wartości domyślnych",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Potwierdź zresetowanie wszystkich opcji lub bieżącego profilu",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Zresetuj wszystkie opcje",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Zresetuj bieżący profil",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Anuluj",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Eksportuj",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Importuj",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Odroczone obrazy",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Zawartość ramki",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Krok",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "130",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Ustawienia domyślne",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Wyłączony",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Dodaj nowy profil",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Zmień nazwę profilu",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Usuń profil",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Wpisz nazwę tego nowego profilu",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Potwierdź usunięcie wybranego profilu",
-        "description": "Popup text 'Confirm deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Wpisz nową nazwę wybranego profilu",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+{
+	"extensionDescription": {
+		"message": "Zapisuj kompletną stronę w pojedynczym pliku HTML.",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Zapisz stronę z SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Adnotuj i zapisz stronę...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Wybierz profil domyślny",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Wybierz profil bieżącej reguły",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Wybierz profil bieżącej domeny",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "Zapisz wybór",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Zapisz ramkę",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveTabs": {
+		"message": "Zapisz karty",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Zapisz wybrane karty",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Zapisz odpięte karty",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Zapisz wszystkie karty",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Automatyczny zapis",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Wyłączony",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Automatycznie zapisz tę kartę",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Automatycznie zapisz odpięte karty",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Automatycznie zapisz wszystkie karty",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Zapisz stronę z SingleFile",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "Tej strony nie można zapisać z SingleFile",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Inicjowanie SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Postęp zapisywania: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Automatyczny zapis aktywny",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Opcje",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "Interfejs użytkownika",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "dodawaj wpis w menu kontekstowym strony",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "nakładaj cień na stronę podczas przetwarzania",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "wyświetlaj pasek informacyjny podczas przeglądania zapisanej strony",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "szablon zawartości paska informacyjnego",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "włączyć paska informacyjnego do zapisanej strony",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "otwieraj okno dialogowe z monitem, aby edytować zawartość paska informacyjnego",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "auto-close the tab after the page is saved",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "Nazwa pliku",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "szablon",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "otwieraj okno \"Zapisz jako\", aby potwierdzić nazwę pliku",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "rozwiązywanie konfliktu nazwy pliku",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "stwórz unikalną nazwę pliku",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "nadpisz istniejący plik",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "zapytaj o nazwę",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "Zawartość HTML",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "kompresuj zawartość HTML",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "usuwaj importy HTML",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "usuwaj ramki",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "usuwaj ukryte elementy",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Obrazy",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "grupuj zduplikowane obrazy razem",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "zapisuj odroczone obrazy",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "maksymalny czas bezczynności (ms)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "usuwaj obrazy dla alternatywnych rozdzielczości ekranu",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Czcionki",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "usuwaj nieużywane czcionki",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "usuwaj alternatywne czcionki",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Arkusze stylów",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "kompresuj zawartość CSS",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "usuwaj nieużywane style",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "usuwaj arkusze stylów dla urządzeń innych niż ekrany",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Inne zasoby",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "usuwaj skrypty",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "usuwaj źródła wideo",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "usuwaj źródła audio",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Automatyczny zapis",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Reguły automatycznej konfiguracji",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Potwierdź usunięcie wszystkich wyświetlanych reguł",
+		"description": "Popup text 'Confirm deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Usuń wszystkie wyświetlane reguły",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "Adres URL",
+		"description": "Options label in the Auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "Wpisz cały lub częściowy adres URL (np. example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Profil",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Automatyczny zapis profilu",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "wyświetlaj wszystkie profile",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "wyświetlaj kolumnę 'Automatyczny zapis profilu'",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Uaktualnij regułę",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Usuń regułę",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Dodaj regułę",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Zatwierdź zmiany",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Potwierdź usunięcie wybranej reguły",
+		"description": "Popup text 'Confirm deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "automatycznie zapisuj po załadowaniu lub przy wyładowaniu strony",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "automatycznie zapisuj po załadowaniu strony",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "automatycznie zapisuj przy wyładowaniu strony",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "opóźnienie oczekiwania automatycznego zapisywania po załadowaniu strony (s.)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "automatycznie zapisuj okresowo",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "okres (s)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Różne",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "zapisuj strony w tle",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "wyświetlaj statystyki w konsoli po przetworzeniu",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "ustaw maksymalny rozmiar dla zasobów osadzonych",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "maksymalny rozmiar (MB)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "zapisuj surową stronę",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "zapisz do schowka",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "pomoc (w języku angielskim)",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Resetuj",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Zresetuj wszystkie opcje do ich wartości domyślnych",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Potwierdź zresetowanie wszystkich opcji lub bieżącego profilu",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Zresetuj wszystkie opcje",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Zresetuj bieżący profil",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Anuluj",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Eksportuj",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Importuj",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Odroczone obrazy",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Zawartość ramki",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Krok",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "130",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Ustawienia domyślne",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Wyłączony",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Dodaj nowy profil",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Zmień nazwę profilu",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Usuń profil",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Wpisz nazwę tego nowego profilu",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Potwierdź usunięcie wybranego profilu",
+		"description": "Popup text 'Confirm deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Wpisz nową nazwę wybranego profilu",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 453
_locales/ru/messages.json

@@ -1,454 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "Сохранить полную страницу в одном HTML-файле",
-        "description": "Description of the extension."
-    },
-    "menuSavePage": {
-        "message": "Сохранить страницу с помощью SingleFile",
-        "description": "Menu entry: 'Save page with SingleFile'"
-    },
-    "menuSelectProfile": {
-        "message": "Выберите профиль по умолчанию",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "Выберите профиль текущего правила",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "Выберите профиль текущего домена",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "Сохранить выделенное",
-        "description": "Menu entry: 'Save selection'"
-    },
-    "menuSaveFrame": {
-        "message": "Сохранить фрейм",
-        "description": "Menu entry: 'Save frame'"
-    },
-    "menuSaveTabs": {
-        "message": "Сохранить вкладки",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "Сохранить выбранные вкладки",
-        "description": "Menu entry: 'Save selected tabs'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "Сохранить незакрепленные вкладки",
-        "description": "Menu entry: 'Save unpinned tabs'"
-    },
-    "menuSaveAllTabs": {
-        "message": "Сохранить все вкладки",
-        "description": "Menu entry: 'Save all tabs'"
-    },
-    "menuAutoSave": {
-        "message": "Автосохранение",
-        "description": "Menu entry: 'Auto-save'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "Отключено",
-        "description": "Menu entry: 'Auto-save' > Disabled'"
-    },
-    "menuAutoSaveTab": {
-        "message": "Автосохранение этой вкладки",
-        "description": "Menu entry: 'Auto-save' > Auto-save this tab'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "Автосохранение незакрепленных вкладок",
-        "description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "Автосохранение всех вкладок",
-        "description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "Сохранить страницу с помощью SingleFile",
-        "description": "Button title: 'Save page with SingleFile'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "Эта страница не может быть сохранена с SingleFile",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "Инициализация SingleFile",
-        "description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "Badge label during initialization: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "Прогресс сохранения: ",
-        "description": "Button title during save: 'Save progress: xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "OK",
-        "description": "Badge label: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "ERR",
-        "description": "Badge label for unexpected errors"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "Автосохранение активно",
-        "description": "Button title: 'Auto-save active'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[A]",
-        "description": "Badge label when auto-save is active"
-    },
-    "optionsTitle": {
-        "message": "Параметры",
-        "description": "Options page title"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "Пользовательский интерфейс",
-        "description": "Options sub-title: 'User interface'"
-    },
-    "optionAddMenuEntry": {
-        "message": "добавить пункт в контекстное меню веб-страницы",
-        "description": "Options page label: 'add entry in the context menu of the webpage'"
-    },
-    "optionDisplayShadow": {
-        "message": "накладывать тень на страницу во время обработки",
-        "description": "Options page label: 'overlay a shadow on the page during processing'"
-    },
-    "optionDisplayInfobar": {
-        "message": "отображать информационную панель при просмотре сохраненной страницы",
-        "description": "Options page label: 'display an infobar when viewing a saved page'"
-    },
-    "optionInfobarTemplate": {
-        "message": "шаблон содержимого информационной панели",
-        "description": "Options page label: 'template of the infobar content'"
-    },
-    "optionIncludeInfobar": {
-        "message": "добавлять информационную панель в сохраняемую страницу",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "открывать диалоговое окно для редактирования содержимого информационной панели",
-        "description": "Options page label: 'open a prompt dialog to edit the infobar content'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "auto-close the tab after the page is saved",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "Имя файла",
-        "description": "Options sub-title: 'File name'"
-    },
-    "optionFilenameTemplate": {
-        "message": "шаблон",
-        "description": "Options page label: 'template'"
-    },
-    "optionConfirmFilename": {
-        "message": "открывать диалоговое окно \"Сохранить как\" для подтверждения имени файла",
-        "description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "разрешение конфликтов имен файлов",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "создать уникальное имя",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "перезаписать существующий файл",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "запросить имя",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML-контент",
-        "description": "Options sub-title: 'HTML content'"
-    },
-    "optionCompressHTML": {
-        "message": "сжать HTML-контент",
-        "description": "Options page label: 'compress HTML content'"
-    },
-    "optionRemoveImports": {
-        "message": "удалить HTML-импорт",
-        "description": "Options page label: 'remove HTML imports'"
-    },
-    "optionRemoveFrames": {
-        "message": "удалить фреймы",
-        "description": "Options page label: 'remove frames'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "удалить скрытые элементы",
-        "description": "Options page label: 'remove hidden elements'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "Изображения",
-        "description": "Options sub-title: 'Images'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "группировать дубликаты изображений",
-        "description": "Options page label: 'group duplicate images together'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "сохранить отложенные изображения",
-        "description": "Options page label: 'save deferred images'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "максимальное время простоя (мс)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "удалить изображения для альтернативных разрешений экрана",
-        "description": "Options page label: 'remove images for alternative screen resolutions'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "Шрифты",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "удалить неиспользуемые шрифты",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "удалить альтернативные шрифты",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "Таблицы стилей",
-        "description": "Options sub-title: 'Stylesheets'"
-    },
-    "optionCompressCSS": {
-        "message": "сжать содержимое CSS",
-        "description": "Options page label: 'compress CSS content'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "удалить неиспользуемые стили",
-        "description": "Options page label: 'remove unused styles'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "удалить таблицы стилей для экранов альтернативных устройств",
-        "description": "Options page label: 'remove stylesheets for alternative devices to screens'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "Другие ресурсы",
-        "description": "Options sub-title: 'Other resources'"
-    },
-    "optionRemoveScripts": {
-        "message": "удалить скрипты",
-        "description": "Options page label: 'remove scripts'"
-    },
-    "optionRemoveVideo": {
-        "message": "удалить источники видео",
-        "description": "Options page label: 'remove video sources'"
-    },
-    "optionRemoveAudio": {
-        "message": "удалить источники аудио",
-        "description": "Options page label: 'remove audio sources'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "Автосохранение",
-        "description": "Options sub-title: 'Auto-save'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "Правила автонастройки",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "Подтвердите удаление всех отображаемых правил",
-        "description": "Popup text 'Confirm deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "Удалить все отображаемые правила",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "Введите полный или частичный URL (т.к. example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "Профиль",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "Профиль автосохранения",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "показать все профили",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "отобразить столбец 'Профиль автосохранения'",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "Обновить правило",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "Удалить правило",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "Добавить правило",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "Подтвердить изменения",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "Подтвердите удаление выбранного правила",
-        "description": "Popup text 'Confirm deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "автосохранение после загрузки или выгрузки страницы",
-        "description": "auto-save after page load or on page unload"
-    },
-    "optionAutoSaveLoad": {
-        "message": "автосохранение после загрузки страницы",
-        "description": "Options page label: 'auto-save after page load'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "автосохранение после выгрузки страницы",
-        "description": "Options page label: 'auto-save on page unload'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "задержка автосохранения после загрузки страницы (с)",
-        "description": "Options page label: 'auto-save waiting delay after page load (s)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "переодическое автосохранение",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "период (с)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "Разное",
-        "description": "Options sub-title: 'Misc.'"
-    },
-    "optionBackgroundSave": {
-        "message": "сохранять страницы в фоновом режиме",
-        "description": "Options page label: 'save pages in background'"
-    },
-    "optionDisplayStats": {
-        "message": "отображать статистику в консоли после обработки",
-        "description": "Options page label: 'display stats in the console after processing'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "установить максимальный размер для встроенных ресурсов",
-        "description": "Options page label: 'set a maximum size for embedded resources'"
-    },
-    "optionMaxResourceSize": {
-        "message": "максимальный размер (МБ)",
-        "description": "Options page label: 'maximum size (MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "сохранить исходную страницу",
-        "description": "Options page label: 'save raw page'"
-    },
-    "optionSaveToClipboard": {
-        "message": "сохранить в буфер обмена",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "помощь",
-        "description": "Options help link"
-    },
-    "optionsResetButton": {
-        "message": "Сброс",
-        "description": "Options button: 'Reset'"
-    },
-    "optionsResetTooltip": {
-        "message": "Сбросить все параметры к значениям по умолчанию",
-        "description": "Options 'Reset' button tooltip"
-    },
-    "optionsResetConfirm": {
-        "message": "Подтвердите сброс всех параметров или текущего профиля",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "Сбросить все параметры",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "Сбросить текущий профиль",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "OK",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "Отмена",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "Экспорт",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "Импорт",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "Отложенные изображения",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "Контент фреймов",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "Шаг",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "190",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "Настройки по умолчанию",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "Отключено",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "Добавить профиль",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "Переименовать профиль",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "Удалить профиль",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "Введите имя для этого профиля",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "Подтвердите удаление выбранного профиля",
-        "description": "Popup text 'Confirm deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "Введите новое имя для выбранного профиля",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    }
+{
+	"extensionDescription": {
+		"message": "Сохранить полную страницу в одном HTML-файле",
+		"description": "Description of the extension."
+	},
+	"menuSavePage": {
+		"message": "Сохранить страницу с помощью SingleFile",
+		"description": "Menu entry: 'Save page with SingleFile'"
+	},
+	"menuEditAndSavePage": {
+		"message": "Аннотировать и сохранить страницу...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "Выберите профиль по умолчанию",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "Выберите профиль текущего правила",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "Выберите профиль текущего домена",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "Сохранить выделенное",
+		"description": "Menu entry: 'Save selection'"
+	},
+	"menuSaveFrame": {
+		"message": "Сохранить фрейм",
+		"description": "Menu entry: 'Save frame'"
+	},
+	"menuSaveTabs": {
+		"message": "Сохранить вкладки",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "Сохранить выбранные вкладки",
+		"description": "Menu entry: 'Save selected tabs'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "Сохранить незакрепленные вкладки",
+		"description": "Menu entry: 'Save unpinned tabs'"
+	},
+	"menuSaveAllTabs": {
+		"message": "Сохранить все вкладки",
+		"description": "Menu entry: 'Save all tabs'"
+	},
+	"menuAutoSave": {
+		"message": "Автосохранение",
+		"description": "Menu entry: 'Auto-save'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "Отключено",
+		"description": "Menu entry: 'Auto-save' > Disabled'"
+	},
+	"menuAutoSaveTab": {
+		"message": "Автосохранение этой вкладки",
+		"description": "Menu entry: 'Auto-save' > Auto-save this tab'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "Автосохранение незакрепленных вкладок",
+		"description": "Menu entry: 'Auto-save' > Auto-save unpinned tabs'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "Автосохранение всех вкладок",
+		"description": "Menu entry: 'Auto-save' > Auto-save all tabs'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "Сохранить страницу с помощью SingleFile",
+		"description": "Button title: 'Save page with SingleFile'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "Эта страница не может быть сохранена с SingleFile",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "Инициализация SingleFile",
+		"description": "Button title during initialization: 'Initializing SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "Badge label during initialization: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "Прогресс сохранения: ",
+		"description": "Button title during save: 'Save progress: xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "OK",
+		"description": "Badge label: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "ERR",
+		"description": "Badge label for unexpected errors"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "Автосохранение активно",
+		"description": "Button title: 'Auto-save active'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[A]",
+		"description": "Badge label when auto-save is active"
+	},
+	"optionsTitle": {
+		"message": "Параметры",
+		"description": "Options page title"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "Пользовательский интерфейс",
+		"description": "Options sub-title: 'User interface'"
+	},
+	"optionAddMenuEntry": {
+		"message": "добавить пункт в контекстное меню веб-страницы",
+		"description": "Options page label: 'add entry in the context menu of the webpage'"
+	},
+	"optionDisplayShadow": {
+		"message": "накладывать тень на страницу во время обработки",
+		"description": "Options page label: 'overlay a shadow on the page during processing'"
+	},
+	"optionDisplayInfobar": {
+		"message": "отображать информационную панель при просмотре сохраненной страницы",
+		"description": "Options page label: 'display an infobar when viewing a saved page'"
+	},
+	"optionInfobarTemplate": {
+		"message": "шаблон содержимого информационной панели",
+		"description": "Options page label: 'template of the infobar content'"
+	},
+	"optionIncludeInfobar": {
+		"message": "добавлять информационную панель в сохраняемую страницу",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "открывать диалоговое окно для редактирования содержимого информационной панели",
+		"description": "Options page label: 'open a prompt dialog to edit the infobar content'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "auto-close the tab after the page is saved",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "Имя файла",
+		"description": "Options sub-title: 'File name'"
+	},
+	"optionFilenameTemplate": {
+		"message": "шаблон",
+		"description": "Options page label: 'template'"
+	},
+	"optionConfirmFilename": {
+		"message": "открывать диалоговое окно \"Сохранить как\" для подтверждения имени файла",
+		"description": "Options page label: 'open the \"Save as\" dialog to confirm the file name'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "разрешение конфликтов имен файлов",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "создать уникальное имя",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "перезаписать существующий файл",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "запросить имя",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML-контент",
+		"description": "Options sub-title: 'HTML content'"
+	},
+	"optionCompressHTML": {
+		"message": "сжать HTML-контент",
+		"description": "Options page label: 'compress HTML content'"
+	},
+	"optionRemoveImports": {
+		"message": "удалить HTML-импорт",
+		"description": "Options page label: 'remove HTML imports'"
+	},
+	"optionRemoveFrames": {
+		"message": "удалить фреймы",
+		"description": "Options page label: 'remove frames'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "удалить скрытые элементы",
+		"description": "Options page label: 'remove hidden elements'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "Изображения",
+		"description": "Options sub-title: 'Images'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "группировать дубликаты изображений",
+		"description": "Options page label: 'group duplicate images together'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "сохранить отложенные изображения",
+		"description": "Options page label: 'save deferred images'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "максимальное время простоя (мс)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "удалить изображения для альтернативных разрешений экрана",
+		"description": "Options page label: 'remove images for alternative screen resolutions'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "Шрифты",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "удалить неиспользуемые шрифты",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "удалить альтернативные шрифты",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "Таблицы стилей",
+		"description": "Options sub-title: 'Stylesheets'"
+	},
+	"optionCompressCSS": {
+		"message": "сжать содержимое CSS",
+		"description": "Options page label: 'compress CSS content'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "удалить неиспользуемые стили",
+		"description": "Options page label: 'remove unused styles'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "удалить таблицы стилей для экранов альтернативных устройств",
+		"description": "Options page label: 'remove stylesheets for alternative devices to screens'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "Другие ресурсы",
+		"description": "Options sub-title: 'Other resources'"
+	},
+	"optionRemoveScripts": {
+		"message": "удалить скрипты",
+		"description": "Options page label: 'remove scripts'"
+	},
+	"optionRemoveVideo": {
+		"message": "удалить источники видео",
+		"description": "Options page label: 'remove video sources'"
+	},
+	"optionRemoveAudio": {
+		"message": "удалить источники аудио",
+		"description": "Options page label: 'remove audio sources'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "Автосохранение",
+		"description": "Options sub-title: 'Auto-save'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "Правила автонастройки",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "Подтвердите удаление всех отображаемых правил",
+		"description": "Popup text 'Confirm deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "Удалить все отображаемые правила",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "Введите полный или частичный URL (т.к. example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "Профиль",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "Профиль автосохранения",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "показать все профили",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "отобразить столбец 'Профиль автосохранения'",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "Обновить правило",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "Удалить правило",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "Добавить правило",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "Подтвердить изменения",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "Подтвердите удаление выбранного правила",
+		"description": "Popup text 'Confirm deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "автосохранение после загрузки или выгрузки страницы",
+		"description": "auto-save after page load or on page unload"
+	},
+	"optionAutoSaveLoad": {
+		"message": "автосохранение после загрузки страницы",
+		"description": "Options page label: 'auto-save after page load'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "автосохранение после выгрузки страницы",
+		"description": "Options page label: 'auto-save on page unload'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "задержка автосохранения после загрузки страницы (с)",
+		"description": "Options page label: 'auto-save waiting delay after page load (s)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "переодическое автосохранение",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "период (с)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "Разное",
+		"description": "Options sub-title: 'Misc.'"
+	},
+	"optionBackgroundSave": {
+		"message": "сохранять страницы в фоновом режиме",
+		"description": "Options page label: 'save pages in background'"
+	},
+	"optionDisplayStats": {
+		"message": "отображать статистику в консоли после обработки",
+		"description": "Options page label: 'display stats in the console after processing'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "установить максимальный размер для встроенных ресурсов",
+		"description": "Options page label: 'set a maximum size for embedded resources'"
+	},
+	"optionMaxResourceSize": {
+		"message": "максимальный размер (МБ)",
+		"description": "Options page label: 'maximum size (MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "сохранить исходную страницу",
+		"description": "Options page label: 'save raw page'"
+	},
+	"optionSaveToClipboard": {
+		"message": "сохранить в буфер обмена",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "помощь",
+		"description": "Options help link"
+	},
+	"optionsResetButton": {
+		"message": "Сброс",
+		"description": "Options button: 'Reset'"
+	},
+	"optionsResetTooltip": {
+		"message": "Сбросить все параметры к значениям по умолчанию",
+		"description": "Options 'Reset' button tooltip"
+	},
+	"optionsResetConfirm": {
+		"message": "Подтвердите сброс всех параметров или текущего профиля",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "Сбросить все параметры",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "Сбросить текущий профиль",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "OK",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "Отмена",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "Экспорт",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "Импорт",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "Отложенные изображения",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "Контент фреймов",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "Шаг",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "190",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "Настройки по умолчанию",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "Отключено",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "Добавить профиль",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "Переименовать профиль",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "Удалить профиль",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "Введите имя для этого профиля",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "Подтвердите удаление выбранного профиля",
+		"description": "Popup text 'Confirm deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "Введите новое имя для выбранного профиля",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 456
_locales/zh_CN/messages.json

@@ -1,457 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "将完整的页面保存到一个 HTML 文件中",
-        "description": "扩展描述。"
-    },
-    "menuSavePage": {
-        "message": "使用 SingleFile 保存页面",
-        "description": "菜单项: '使用 SingleFile 保存页面'"
-    },
-    "menuSelectProfile": {
-        "message": "选择默认配置文件",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "选择当前规则的配置",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "选择当前域名的配置",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "保存选中部分",
-        "description": "菜单项: '保存选中部分'"
-    },
-    "menuSaveFrame": {
-        "message": "保存框架",
-        "description": "菜单项: '保存框架'"
-    },
-    "menuSaveTabs": {
-        "message": "保存标签页",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "保存选中标签页",
-        "description": "菜单项: '保存选中标签页'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "保存非固定标签页",
-        "description": "菜单项: '保存非固定标签页'"
-    },
-    "menuSaveAllTabs": {
-        "message": "保存所有标签页",
-        "description": "菜单项: '保存所有标签页'"
-    },
-    "menuAutoSave": {
-        "message": "自动保存",
-        "description": "菜单项: '自动保存'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "禁用",
-        "description": "菜单项: '自动保存' > '禁用'"
-    },
-    "menuAutoSaveTab": {
-        "message": "自动保存此标签页",
-        "description": "菜单项: '自动保存' > '自动保存此标签页'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "自动保存非固定标签页",
-        "description": "菜单项: '自动保存' > '自动保存非固定标签页'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "自动保存所有标签页",
-        "description": "菜单项: '自动保存' > '自动保存所有标签页'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "使用 SingleFile 保存页面",
-        "description": "按钮标题: '使用 SingleFile 保存页面'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "SingleFile 无法保存这个页面",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "正在初始化 SingleFile",
-        "description": "保存时候的按钮标题: '正在初始化 SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "初始化时候的徽标标签: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "保存进度:",
-        "description": "保存时候的按钮标题: '保存进度:xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "完成",
-        "description": "徽标标签: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "错误",
-        "description": "出现意外错误时候的徽标标签"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "自动保存动作",
-        "description": "按钮标题: '自动保存动作'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[自动]",
-        "description": "自动保存激活时候的徽标标签"
-    },
-    "optionsTitle": {
-        "message": "选项",
-        "description": "选项页标题"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "用户界面",
-        "description": "选项页副标题: '用户界面'"
-    },
-    "optionAddMenuEntry": {
-        "message": "添加菜单项到页面的右键菜单",
-        "description": "选项页标签: '添加菜单项到页面的右键菜单'"
-    },
-    "optionDisplayShadow": {
-        "message": "处理过程中以阴影遮盖页面",
-        "description": "选项页标签: '处理过程中以阴影遮盖页面'"
-    },
-    "optionDisplayInfobar": {
-        "message": "查看一个已保存的页面时显示信息栏",
-        "description": "选项页标签: '查看一个已保存的页面时显示信息栏'"
-    },
-    "optionInfobarTemplate": {
-        "message": "信息栏内容模板",
-        "description": "选项页标签: '信息栏内容模板'"
-    },
-    "optionIncludeInfobar": {
-        "message": "include the infobar in the saved page",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "打开一个提示窗口以编辑信息栏内容",
-        "description": "选项页标签: '打开一个提示窗口以编辑信息栏内容'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "auto-close the tab after the page is saved",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "文件名",
-        "description": "选项页副标题: '文件名'"
-    },
-    "optionFilenameTemplate": {
-        "message": "模板",
-        "description": "选项页标签: '模板'"
-    },
-    "optionConfirmFilename": {
-        "message": "打开“另存为”对话框以确认文件名",
-        "description": "选项页标签: '打开“另存为”对话框以确认文件名'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "文件名冲突解决",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "创建为不冲突的名称",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "覆盖现有的文件",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "询问新名称",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML 内容",
-        "description": "选项页副标题: 'HTML 内容'"
-    },
-    "optionCompressHTML": {
-        "message": "压缩 HTML 内容",
-        "description": "选项页标签: '压缩 HTML 内容'"
-    },
-    "optionRemoveImports": {
-        "message": "移除 HTML 导入",
-        "description": "选项页标签: '移除 HTML 导入'"
-    },
-    "optionRemoveFrames": {
-        "message": "移除框架",
-        "description": "选项页标签: '移除框架'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "移除隐藏元素",
-        "description": "选项页标签: '移除隐藏元素'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "图像",
-        "description": "选项页副标题: '图像'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "重复图像合并",
-        "description": "选项页标签: '重复图像合并'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "保存延迟加载的图像",
-        "description": "选项页标签: '保存延迟加载的图像'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "最长空闲时间(毫秒)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "移除备用分辨率的图像",
-        "description": "选项页标签: '移除备用分辨率的图像'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "字体",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "移除未使用的字体",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "移除备用的字体",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "样式表",
-        "description": "选项页副标题: '样式表'"
-    },
-    "optionCompressCSS": {
-        "message": "压缩 CSS 内容",
-        "description": "选项页标签: '压缩 CSS 内容'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "移除未使用的样式",
-        "description": "选项页标签: '移除未使用的样式'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "移除其他设备分辨率的样式表",
-        "description": "选项页标签: '移除其他设备分辨率的样式表'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "其他资源",
-        "description": "选项页副标题: '其他资源'"
-    },
-    "optionRemoveScripts": {
-        "message": "移除脚本",
-        "description": "选项页标签: '移除脚本'"
-    },
-    "optionRemoveVideo": {
-        "message": "移除视频嵌入",
-        "description": "选项页标签: '移除视频嵌入'"
-    },
-    "optionRemoveAudio": {
-        "message": "移除音频嵌入",
-        "description": "选项页标签: '移除音频嵌入'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "自动保存",
-        "description": "选项页副标题: '自动保存'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "确认移除所有已显示规则",
-        "description": "Popup text 'Confirm deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "移除所有已显示规则",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "自动设置",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "输入部分或完整 URL(如 example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "配置文件",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "自动保存配置文件",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "显示所有配置文件",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "显示“自动保存配置文件”",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "更新规则",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "删除规则",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "添加规则",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "验证更改",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "确认删除所选规则",
-        "description": "Popup text 'Confirm deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "页面加载或页面卸载后自动保存",
-        "description": "页面加载或页面卸载后自动保存"
-    },
-    "optionAutoSaveLoad": {
-        "message": "页面加载后自动保存",
-        "description": "选项页标签: '页面加载后自动保存'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "页面卸载时自动保存",
-        "description": "选项页标签: '页面卸载时自动保存'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "页面加载后自动保存延时(秒)",
-        "description": "选项页标签: '页面加载后自动保存的延时(秒)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "定期自动保存",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "定期自动保存单位(秒)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "其他",
-        "description": "选项页副标题: '其他'"
-    },
-    "optionBackgroundSave": {
-        "message": "在后台保存页面",
-        "description": "选项页标签: '在后台保存页面'"
-    },
-    "optionDisplayStats": {
-        "message": "处理后在控制台消息中显示统计",
-        "description": "选项页标签: '处理后在控制台消息中显示统计'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "设定嵌入的资源的最大体积",
-        "description": "选项页标签: '设定嵌入的资源的最大体积'"
-    },
-    "optionMaxResourceSize": {
-        "message": "最大体积(MB)",
-        "description": "选项页标签: '最大体积(MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "保存原始页面",
-        "description": "选项页标签: '保存原始页面'"
-    },
-    "optionSaveToClipboard": {
-        "message": "保存到剪切板",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "帮助",
-        "description": "选项页帮助链接"
-    },
-    "optionsResetButton": {
-        "message": "重置",
-        "description": "选项按钮: '重置'"
-    },
-    "optionsResetTooltip": {
-        "message": "重置所有选项为默认值",
-        "description": "选项按钮'重置'的提示"
-    },
-    "optionsResetConfirm": {
-        "message": "确认重置所有选项或当前配置",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "重置所有选项",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "重置当前配置",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "确定",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "取消",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "导出",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "导入",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "延迟加载的图像",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "框架内容",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "步骤",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "115",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "默认设置",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "禁用",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "添加一个新配置文件",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "重命名配置文件",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "移除配置文件",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "为新配置文件输入名字",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "确认移除所选配置文件",
-        "description": "Popup text 'Confirm deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "为所选配置文件输入新名字",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    },
-    "__WET_LOCALE__": {
-        "message": "zh-cn"
-    }
+{
+	"extensionDescription": {
+		"message": "将完整的页面保存到一个 HTML 文件中",
+		"description": "扩展描述。"
+	},
+	"menuSavePage": {
+		"message": "使用 SingleFile 保存页面",
+		"description": "菜单项: '使用 SingleFile 保存页面'"
+	},
+	"menuEditAndSavePage": {
+		"message": "评论并保存页面...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "选择默认配置文件",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "选择当前规则的配置",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "选择当前域名的配置",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "保存选中部分",
+		"description": "菜单项: '保存选中部分'"
+	},
+	"menuSaveFrame": {
+		"message": "保存框架",
+		"description": "菜单项: '保存框架'"
+	},
+	"menuSaveTabs": {
+		"message": "保存标签页",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "保存选中标签页",
+		"description": "菜单项: '保存选中标签页'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "保存非固定标签页",
+		"description": "菜单项: '保存非固定标签页'"
+	},
+	"menuSaveAllTabs": {
+		"message": "保存所有标签页",
+		"description": "菜单项: '保存所有标签页'"
+	},
+	"menuAutoSave": {
+		"message": "自动保存",
+		"description": "菜单项: '自动保存'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "禁用",
+		"description": "菜单项: '自动保存' > '禁用'"
+	},
+	"menuAutoSaveTab": {
+		"message": "自动保存此标签页",
+		"description": "菜单项: '自动保存' > '自动保存此标签页'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "自动保存非固定标签页",
+		"description": "菜单项: '自动保存' > '自动保存非固定标签页'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "自动保存所有标签页",
+		"description": "菜单项: '自动保存' > '自动保存所有标签页'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "使用 SingleFile 保存页面",
+		"description": "按钮标题: '使用 SingleFile 保存页面'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "SingleFile 无法保存这个页面",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "正在初始化 SingleFile",
+		"description": "保存时候的按钮标题: '正在初始化 SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "初始化时候的徽标标签: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "保存进度:",
+		"description": "保存时候的按钮标题: '保存进度:xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "完成",
+		"description": "徽标标签: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "错误",
+		"description": "出现意外错误时候的徽标标签"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "自动保存动作",
+		"description": "按钮标题: '自动保存动作'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[自动]",
+		"description": "自动保存激活时候的徽标标签"
+	},
+	"optionsTitle": {
+		"message": "选项",
+		"description": "选项页标题"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "用户界面",
+		"description": "选项页副标题: '用户界面'"
+	},
+	"optionAddMenuEntry": {
+		"message": "添加菜单项到页面的右键菜单",
+		"description": "选项页标签: '添加菜单项到页面的右键菜单'"
+	},
+	"optionDisplayShadow": {
+		"message": "处理过程中以阴影遮盖页面",
+		"description": "选项页标签: '处理过程中以阴影遮盖页面'"
+	},
+	"optionDisplayInfobar": {
+		"message": "查看一个已保存的页面时显示信息栏",
+		"description": "选项页标签: '查看一个已保存的页面时显示信息栏'"
+	},
+	"optionInfobarTemplate": {
+		"message": "信息栏内容模板",
+		"description": "选项页标签: '信息栏内容模板'"
+	},
+	"optionIncludeInfobar": {
+		"message": "include the infobar in the saved page",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "打开一个提示窗口以编辑信息栏内容",
+		"description": "选项页标签: '打开一个提示窗口以编辑信息栏内容'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "auto-close the tab after the page is saved",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "文件名",
+		"description": "选项页副标题: '文件名'"
+	},
+	"optionFilenameTemplate": {
+		"message": "模板",
+		"description": "选项页标签: '模板'"
+	},
+	"optionConfirmFilename": {
+		"message": "打开“另存为”对话框以确认文件名",
+		"description": "选项页标签: '打开“另存为”对话框以确认文件名'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "文件名冲突解决",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "创建为不冲突的名称",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "覆盖现有的文件",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "询问新名称",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML 内容",
+		"description": "选项页副标题: 'HTML 内容'"
+	},
+	"optionCompressHTML": {
+		"message": "压缩 HTML 内容",
+		"description": "选项页标签: '压缩 HTML 内容'"
+	},
+	"optionRemoveImports": {
+		"message": "移除 HTML 导入",
+		"description": "选项页标签: '移除 HTML 导入'"
+	},
+	"optionRemoveFrames": {
+		"message": "移除框架",
+		"description": "选项页标签: '移除框架'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "移除隐藏元素",
+		"description": "选项页标签: '移除隐藏元素'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "图像",
+		"description": "选项页副标题: '图像'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "重复图像合并",
+		"description": "选项页标签: '重复图像合并'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "保存延迟加载的图像",
+		"description": "选项页标签: '保存延迟加载的图像'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "最长空闲时间(毫秒)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "移除备用分辨率的图像",
+		"description": "选项页标签: '移除备用分辨率的图像'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "字体",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "移除未使用的字体",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "移除备用的字体",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "样式表",
+		"description": "选项页副标题: '样式表'"
+	},
+	"optionCompressCSS": {
+		"message": "压缩 CSS 内容",
+		"description": "选项页标签: '压缩 CSS 内容'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "移除未使用的样式",
+		"description": "选项页标签: '移除未使用的样式'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "移除其他设备分辨率的样式表",
+		"description": "选项页标签: '移除其他设备分辨率的样式表'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "其他资源",
+		"description": "选项页副标题: '其他资源'"
+	},
+	"optionRemoveScripts": {
+		"message": "移除脚本",
+		"description": "选项页标签: '移除脚本'"
+	},
+	"optionRemoveVideo": {
+		"message": "移除视频嵌入",
+		"description": "选项页标签: '移除视频嵌入'"
+	},
+	"optionRemoveAudio": {
+		"message": "移除音频嵌入",
+		"description": "选项页标签: '移除音频嵌入'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "自动保存",
+		"description": "选项页副标题: '自动保存'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "确认移除所有已显示规则",
+		"description": "Popup text 'Confirm deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "移除所有已显示规则",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "自动设置",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "输入部分或完整 URL(如 example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "配置文件",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "自动保存配置文件",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "显示所有配置文件",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "显示“自动保存配置文件”",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "更新规则",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "删除规则",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "添加规则",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "验证更改",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "确认删除所选规则",
+		"description": "Popup text 'Confirm deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "页面加载或页面卸载后自动保存",
+		"description": "页面加载或页面卸载后自动保存"
+	},
+	"optionAutoSaveLoad": {
+		"message": "页面加载后自动保存",
+		"description": "选项页标签: '页面加载后自动保存'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "页面卸载时自动保存",
+		"description": "选项页标签: '页面卸载时自动保存'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "页面加载后自动保存延时(秒)",
+		"description": "选项页标签: '页面加载后自动保存的延时(秒)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "定期自动保存",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "定期自动保存单位(秒)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "其他",
+		"description": "选项页副标题: '其他'"
+	},
+	"optionBackgroundSave": {
+		"message": "在后台保存页面",
+		"description": "选项页标签: '在后台保存页面'"
+	},
+	"optionDisplayStats": {
+		"message": "处理后在控制台消息中显示统计",
+		"description": "选项页标签: '处理后在控制台消息中显示统计'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "设定嵌入的资源的最大体积",
+		"description": "选项页标签: '设定嵌入的资源的最大体积'"
+	},
+	"optionMaxResourceSize": {
+		"message": "最大体积(MB)",
+		"description": "选项页标签: '最大体积(MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "保存原始页面",
+		"description": "选项页标签: '保存原始页面'"
+	},
+	"optionSaveToClipboard": {
+		"message": "保存到剪切板",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "帮助",
+		"description": "选项页帮助链接"
+	},
+	"optionsResetButton": {
+		"message": "重置",
+		"description": "选项按钮: '重置'"
+	},
+	"optionsResetTooltip": {
+		"message": "重置所有选项为默认值",
+		"description": "选项按钮'重置'的提示"
+	},
+	"optionsResetConfirm": {
+		"message": "确认重置所有选项或当前配置",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "重置所有选项",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "重置当前配置",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "确定",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "取消",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "导出",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "导入",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "延迟加载的图像",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "框架内容",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "步骤",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "115",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "默认设置",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "禁用",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "添加一个新配置文件",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "重命名配置文件",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "移除配置文件",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "为新配置文件输入名字",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "确认移除所选配置文件",
+		"description": "Popup text 'Confirm deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "为所选配置文件输入新名字",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 513 - 456
_locales/zh_TW/messages.json

@@ -1,457 +1,514 @@
-{
-    "extensionDescription": {
-        "message": "將完整的頁面保存到一個 HTML 文件中",
-        "description": "擴展描述。"
-    },
-    "menuSavePage": {
-        "message": "使用 SingleFile 保存頁面",
-        "description": "菜單項: '使用 SingleFile 保存頁面'"
-    },
-    "menuSelectProfile": {
-        "message": "選擇默認配置文件",
-        "description": "Menu entry: 'Select the default profile'"
-    },
-    "menuUpdateRule": {
-        "message": "選擇當前規則的配置",
-        "description": "Menu entry: 'Select the profile of the current rule'"
-    },
-    "menuCreateDomainRule": {
-        "message": "選擇當前域名的配置",
-        "description": "Menu entry: 'Select the profile of the current domain'"
-    },
-    "menuSaveSelection": {
-        "message": "保存選中部分",
-        "description": "菜單項: '保存選中部分'"
-    },
-    "menuSaveFrame": {
-        "message": "保存框架",
-        "description": "菜單項: '保存框架'"
-    },
-    "menuSaveTabs": {
-        "message": "保存標籤頁",
-        "description": "Menu entry (SingleFile button only): 'Save tabs'"
-    },
-    "menuSaveSelectedTabs": {
-        "message": "保存選中標籤頁",
-        "description": "菜單項: '保存選中標籤頁'"
-    },
-    "menuSaveUnpinnedTabs": {
-        "message": "保存非固定標籤頁",
-        "description": "菜單項: '保存非固定標籤頁'"
-    },
-    "menuSaveAllTabs": {
-        "message": "保存所有標籤頁",
-        "description": "菜單項: '保存所有標籤頁'"
-    },
-    "menuAutoSave": {
-        "message": "自動保存",
-        "description": "菜單項: '自動保存'"
-    },
-    "menuAutoSaveDisabled": {
-        "message": "禁用",
-        "description": "菜單項: '自動保存' > '禁用'"
-    },
-    "menuAutoSaveTab": {
-        "message": "自動保存此標籤頁",
-        "description": "菜單項: '自動保存' > '自動保存此標籤頁'"
-    },
-    "menuAutoSaveUnpinnedTabs": {
-        "message": "自動保存非固定標籤頁",
-        "description": "菜單項: '自動保存' > '自動保存非固定標籤頁'"
-    },
-    "menuAutoSaveAllTabs": {
-        "message": "自動保存所有標籤頁",
-        "description": "菜單項: '自動保存' > '自動保存所有標籤頁'"
-    },
-    "buttonDefaultTooltip": {
-        "message": "使用 SingleFile 保存頁面",
-        "description": "按鈕標題: '使用 SingleFile 保存頁面'"
-    },
-    "buttonBlockedBadge": {
-        "message": "🚫",
-        "description": "Button badge when the page is blocked: '🚫'"
-    },
-    "buttonBlockedTooltip": {
-        "message": "SingleFile 無法保存這個頁面",
-        "description": "Button title: 'This page cannot be saved with SingleFile'"
-    },
-    "buttonInitializingTooltip": {
-        "message": "正在初始化 SingleFile",
-        "description": "保存時候的按鈕標題: '正在初始化 SingleFile (x/2)'"
-    },
-    "buttonInitializingBadge": {
-        "message": "•••",
-        "description": "初始化時候的徽標標籤: '•••'"
-    },
-    "buttonSaveProgressTooltip": {
-        "message": "保存進度:",
-        "description": "保存時候的按鈕標題: '保存進度:xx%'"
-    },
-    "buttonOKBadge": {
-        "message": "完成",
-        "description": "徽標標籤: 'OK'"
-    },
-    "buttonErrorBadge": {
-        "message": "錯誤",
-        "description": "出現意外錯誤時候的徽標標籤"
-    },
-    "buttonAutoSaveActiveTooltip": {
-        "message": "自動保存動作",
-        "description": "按鈕標題: '自動保存動作'"
-    },
-    "buttonAutoSaveActiveBadge": {
-        "message": "[自動]",
-        "description": "自動保存激活時候的徽標標籤"
-    },
-    "optionsTitle": {
-        "message": "選項",
-        "description": "選項頁標題"
-    },
-    "optionsUserInterfaceSubTitle": {
-        "message": "用戶界面",
-        "description": "選項頁副標題: '用戶界面'"
-    },
-    "optionAddMenuEntry": {
-        "message": "添加菜單項到頁面的右鍵菜單",
-        "description": "選項頁標籤: '添加菜單項到頁面的右鍵菜單'"
-    },
-    "optionDisplayShadow": {
-        "message": "處理過程中以陰影遮蓋頁面",
-        "description": "選項頁標籤: '處理過程中以陰影遮蓋頁面'"
-    },
-    "optionDisplayInfobar": {
-        "message": "查看一個已保存的頁面時顯示信息欄",
-        "description": "選項頁標籤: '查看一個已保存的頁面時顯示信息欄'"
-    },
-    "optionInfobarTemplate": {
-        "message": "信息欄內容模板",
-        "description": "選項頁標籤: '信息欄內容模板'"
-    },
-    "optionIncludeInfobar": {
-        "message": "include the infobar in the saved page",
-        "description": "Options page label: 'include the infobar in the saved page'"
-    },
-    "optionConfirmInfobar": {
-        "message": "打開一個提示窗口以編輯信息欄內容",
-        "description": "選項頁標籤: '打開一個提示窗口以編輯信息欄內容'"
-    },
-    "optionAutoCloseLabel": {
-        "message": "auto-close the tab after the page is saved",
-        "description": "Options page label: 'auto-close the tab after the page is saved'"
-    },
-    "optionsFileNameSubTitle": {
-        "message": "文件名",
-        "description": "選項頁副標題: '文件名'"
-    },
-    "optionFilenameTemplate": {
-        "message": "模板",
-        "description": "選項頁標籤: '模板'"
-    },
-    "optionConfirmFilename": {
-        "message": "打開“另存為”對話框以確認文件名",
-        "description": "選項頁標籤: '打開“另存為”對話框以確認文件名'"
-    },
-    "optionFilenameConflictAction": {
-        "message": "文件名衝突解決",
-        "description": "Options page label: 'filename conflict resolution'"
-    },
-    "optionFilenameConflictActionUniquify": {
-        "message": "創建為不衝突的名稱",
-        "description": "Value for 'filename conflict resolution' option: 'create a unique name'"
-    },
-    "optionFilenameConflictActionOverwrite": {
-        "message": "覆蓋現有的文件",
-        "description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
-    },
-    "optionFilenameConflictActionPrompt": {
-        "message": "詢問新名稱",
-        "description": "Value for 'name conflict resolution' option: 'prompt for a name'"
-    },
-    "optionsHTMLContentSubTitle": {
-        "message": "HTML 內容",
-        "description": "選項頁副標題: 'HTML 內容'"
-    },
-    "optionCompressHTML": {
-        "message": "壓縮 HTML 內容",
-        "description": "選項頁標籤: '壓縮 HTML 內容'"
-    },
-    "optionRemoveImports": {
-        "message": "移除 HTML 導入",
-        "description": "選項頁標籤: '移除 HTML 導入'"
-    },
-    "optionRemoveFrames": {
-        "message": "移除框架",
-        "description": "選項頁標籤: '移除框架'"
-    },
-    "optionRemoveHiddenElements": {
-        "message": "移除隱藏元素",
-        "description": "選項頁標籤: '移除隱藏元素'"
-    },
-    "optionsImagesSubTitle": {
-        "message": "圖像",
-        "description": "選項頁副標題: '圖像'"
-    },
-    "optionGroupDuplicateImages": {
-        "message": "重複圖像合併",
-        "description": "選項頁標籤: '重複圖像合併'"
-    },
-    "optionLoadDeferredImages": {
-        "message": "保存延遲加載的圖像",
-        "description": "選項頁標籤: '保存延遲加載的圖像'"
-    },
-    "optionLoadDeferredImagesMaxIdleTime": {
-        "message": "最長空閒時間(毫秒)",
-        "description": "Options page label: 'maximum idle time (ms)'"
-    },
-    "optionRemoveAlternativeImages": {
-        "message": "移除備用分辨率的圖像",
-        "description": "選項頁標籤: '移除備用分辨率的圖像'"
-    },
-    "optionsFontsSubTitle": {
-        "message": "字體",
-        "description": "Options sub-title: 'Fonts'"
-    },
-    "optionRemoveUnusedFonts": {
-        "message": "移除未使用的字體",
-        "description": "Options page label: 'remove unused fonts'"
-    },
-    "optionRemoveAlternativeFonts": {
-        "message": "移除備用的字體",
-        "description": "Options page label: 'remove alternative fonts'"
-    },
-    "optionsStylesheetsSubTitle": {
-        "message": "樣式表",
-        "description": "選項頁副標題: '樣式表'"
-    },
-    "optionCompressCSS": {
-        "message": "壓縮 CSS 內容",
-        "description": "選項頁標籤: '壓縮 CSS 內容'"
-    },
-    "optionRemoveUnusedStyles": {
-        "message": "移除未使用的樣式",
-        "description": "選項頁標籤: '移除未使用的樣式'"
-    },
-    "optionRemoveAlternativeMedias": {
-        "message": "移除其他設備分辨率的樣式表",
-        "description": "選項頁標籤: '移除其他設備分辨率的樣式表'"
-    },
-    "optionsOtherResourcesSubTitle": {
-        "message": "其他資源",
-        "description": "選項頁副標題: '其他資源'"
-    },
-    "optionRemoveScripts": {
-        "message": "移除腳本",
-        "description": "選項頁標籤: '移除腳本'"
-    },
-    "optionRemoveVideo": {
-        "message": "移除視頻嵌入",
-        "description": "選項頁標籤: '移除視頻嵌入'"
-    },
-    "optionRemoveAudio": {
-        "message": "移除音頻嵌入",
-        "description": "選項頁標籤: '移除音頻嵌入'"
-    },
-    "optionsAutoSaveSubTitle": {
-        "message": "自動保存",
-        "description": "選項頁副標題: '自動保存'"
-    },
-    "optionsDeleteDisplayedRulesConfirm": {
-        "message": "確認移除所有已顯示規則",
-        "description": "Popup text 'Confirm deletion of all displayed rules'"
-    },
-    "optionsDeleteRulesTooltip": {
-        "message": "移除所有已顯示規則",
-        "description": "Popup text 'Delete all displayed rules'"
-    },
-    "optionsAutoSettingsSubTitle": {
-        "message": "自動設置",
-        "description": "Options sub-title: 'Auto-settings rules'"
-    },
-    "optionsAutoSettingsUrl": {
-        "message": "URL",
-        "description": "Options label in the auto-settings rules: 'URL'"
-    },
-    "optionsAutoSettingsUrlPlaceholder": {
-        "message": "輸入部分或完整 URL(如 example.com)",
-        "description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
-    },
-    "optionsAutoSettingsProfile": {
-        "message": "配置文件",
-        "description": "Options label in the Auto-settings rules: 'Profile'"
-    },
-    "optionsAutoSettingsAutoSaveProfile": {
-        "message": "自動保存配置文件",
-        "description": "Options label in the Auto-settings rules: 'Auto-save profile'"
-    },
-    "optionsAutoSettingsShowAllProfiles": {
-        "message": "顯示所有配置文件",
-        "description": "Options label in the Auto-settings rules: 'display all profiles'"
-    },
-    "optionsAutoSettingsShowAutoSaveProfile": {
-        "message": "顯示“自動保存配置文件”",
-        "description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
-    },
-    "optionsUpdateRuleTooltip": {
-        "message": "更新規則",
-        "description": "Popup text 'Update the rule' in the options page"
-    },
-    "optionsDeleteRuleTooltip": {
-        "message": "刪除規則",
-        "description": "Popup text 'Delete the rule' in the options page"
-    },
-    "optionsAddRuleTooltip": {
-        "message": "添加規則",
-        "description": "Popup text 'Add the rule' in the options page"
-    },
-    "optionsValidateChangesTooltip": {
-        "message": "驗證更改",
-        "description": "Popup text 'Validate changes' in the options page"
-    },
-    "optionsDeleteRuleConfirm": {
-        "message": "確認刪除所選規則",
-        "description": "Popup text 'Confirm deletion of the selected rule' in the options page"
-    },
-    "optionAutoSaveLoadOrUnload": {
-        "message": "頁面加載或頁面卸載後自動保存",
-        "description": "頁面加載或頁面卸載後自動保存"
-    },
-    "optionAutoSaveLoad": {
-        "message": "頁面加載後自動保存",
-        "description": "選項頁標籤: '頁面加載後自動保存'"
-    },
-    "optionAutoSaveUnload": {
-        "message": "頁面卸載時自動保存",
-        "description": "選項頁標籤: '頁面卸載時自動保存'"
-    },
-    "optionAutoSaveDelay": {
-        "message": "頁面加載後自動保存延時(秒)",
-        "description": "選項頁標籤: '頁面加載後自動保存的延時(秒)'"
-    },
-    "optionAutoSaveRepeat": {
-        "message": "定期自動保存",
-        "description": "Options page label: 'auto-save periodically'"
-    },
-    "optionAutoSaveRepeatDelay": {
-        "message": "定期自動保存單位(秒)",
-        "description": "Options page label: 'period (s)'"
-    },
-    "optionsMiscSubTitle": {
-        "message": "其他",
-        "description": "選項頁副標題: '其他'"
-    },
-    "optionBackgroundSave": {
-        "message": "在後台保存頁面",
-        "description": "選項頁標籤: '在後台保存頁面'"
-    },
-    "optionDisplayStats": {
-        "message": "處理後在控制台消息中顯示統計",
-        "description": "選項頁標籤: '處理後在控制台消息中顯示統計'"
-    },
-    "optionSetMaxResourceSize": {
-        "message": "設定嵌入的資源的最大體積",
-        "description": "選項頁標籤: '設定嵌入的資源的最大體積'"
-    },
-    "optionMaxResourceSize": {
-        "message": "最大體積(MB)",
-        "description": "選項頁標籤: '最大體積(MB)'"
-    },
-    "optionSaveRawPage": {
-        "message": "保存原始頁面",
-        "description": "選項頁標籤: '保存原始頁面'"
-    },
-    "optionSaveToClipboard": {
-        "message": "保存到剪切板",
-        "description": "Options page label: 'save to clipboard'"
-    },
-    "optionsHelpLink": {
-        "message": "幫助",
-        "description": "選項頁幫助鏈接"
-    },
-    "optionsResetButton": {
-        "message": "重置",
-        "description": "選項按鈕: '重置'"
-    },
-    "optionsResetTooltip": {
-        "message": "重置所有選項為默認值",
-        "description": "選項按鈕'重置'的提示"
-    },
-    "optionsResetConfirm": {
-        "message": "確認重置所有選項或當前配置",
-        "description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
-    },
-    "optionsResetAllButton": {
-        "message": "重置所有選項",
-        "description": "Options confirm button: 'Reset all options'"
-    },
-    "optionsResetCurrentButton": {
-        "message": "重置當前配置",
-        "description": "Options confirm button: 'Reset current profile'"
-    },
-    "optionsOKButton": {
-        "message": "確定",
-        "description": "Options confirm button: 'OK'"
-    },
-    "optionsCancelButton": {
-        "message": "取消",
-        "description": "Options confirm button: 'Cancel'"
-    },
-    "optionsExportButton": {
-        "message": "導出",
-        "description": "Options button: 'Export'"
-    },
-    "optionsImportButton": {
-        "message": "導入",
-        "description": "Options button: 'Import'"
-    },
-    "logPanelDeferredImages": {
-        "message": "延遲加載的圖像",
-        "description": "Label 'Deferred images' in the log panel"
-    },
-    "logPanelFrameContents": {
-        "message": "框架內容",
-        "description": "Label 'Frame contents' in the log panel"
-    },
-    "logPanelStep": {
-        "message": "步驟",
-        "description": "Label 'Step' (for 'Step x / 4') in the log panel"
-    },
-    "logPanelWidth": {
-        "message": "115",
-        "description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
-    },
-    "profileDefaultSettings": {
-        "message": "默認設置",
-        "description": "Label 'Default settings' of the default settings in the options page"
-    },
-    "profileDisabled": {
-        "message": "禁用",
-        "description": "Label 'Disabled' of the disabled profile name in the options page"
-    },
-    "profileAddButtonTooltip": {
-        "message": "添加一個新配置文件",
-        "description": "Tooltip 'Add a new profile' in the options page"
-    },
-    "profileRenameButtonTooltip": {
-        "message": "重命名配置文件",
-        "description": "Tooltip 'Rename the profile' in the options page"
-    },
-    "profileDeleteButtonTooltip": {
-        "message": "移除配置文件",
-        "description": "Tooltip 'Delete the profile' in the options page"
-    },
-    "profileAddPrompt": {
-        "message": "為新配置文件輸入名字",
-        "description": "Popup text 'Enter a name for this new profile' in the options page"
-    },
-    "profileDeleteConfirm": {
-        "message": "確認移除所選配置文件",
-        "description": "Popup text 'Confirm deletion of the selected profile' in the options page"
-    },
-    "profileRenamePrompt": {
-        "message": "為所選配置文件輸入新名字",
-        "description": "Popup text 'Enter a new name for the selected profile' in the options page"
-    },
-    "__WET_LOCALE__": {
-        "message": "zh_TW"
-    }
+{
+	"extensionDescription": {
+		"message": "將完整的頁面保存到一個 HTML 文件中",
+		"description": "擴展描述。"
+	},
+	"menuSavePage": {
+		"message": "使用 SingleFile 保存頁面",
+		"description": "菜單項: '使用 SingleFile 保存頁面'"
+	},
+	"menuEditAndSavePage": {
+		"message": "評論並保存頁面...",
+		"description": "Menu entry: 'Annotate and save the page...'"
+	},
+	"menuSelectProfile": {
+		"message": "選擇默認配置文件",
+		"description": "Menu entry: 'Select the default profile'"
+	},
+	"menuUpdateRule": {
+		"message": "選擇當前規則的配置",
+		"description": "Menu entry: 'Select the profile of the current rule'"
+	},
+	"menuCreateDomainRule": {
+		"message": "選擇當前域名的配置",
+		"description": "Menu entry: 'Select the profile of the current domain'"
+	},
+	"menuSaveSelection": {
+		"message": "保存選中部分",
+		"description": "菜單項: '保存選中部分'"
+	},
+	"menuSaveFrame": {
+		"message": "保存框架",
+		"description": "菜單項: '保存框架'"
+	},
+	"menuSaveTabs": {
+		"message": "保存標籤頁",
+		"description": "Menu entry (SingleFile button only): 'Save tabs'"
+	},
+	"menuSaveSelectedTabs": {
+		"message": "保存選中標籤頁",
+		"description": "菜單項: '保存選中標籤頁'"
+	},
+	"menuSaveUnpinnedTabs": {
+		"message": "保存非固定標籤頁",
+		"description": "菜單項: '保存非固定標籤頁'"
+	},
+	"menuSaveAllTabs": {
+		"message": "保存所有標籤頁",
+		"description": "菜單項: '保存所有標籤頁'"
+	},
+	"menuAutoSave": {
+		"message": "自動保存",
+		"description": "菜單項: '自動保存'"
+	},
+	"menuAutoSaveDisabled": {
+		"message": "禁用",
+		"description": "菜單項: '自動保存' > '禁用'"
+	},
+	"menuAutoSaveTab": {
+		"message": "自動保存此標籤頁",
+		"description": "菜單項: '自動保存' > '自動保存此標籤頁'"
+	},
+	"menuAutoSaveUnpinnedTabs": {
+		"message": "自動保存非固定標籤頁",
+		"description": "菜單項: '自動保存' > '自動保存非固定標籤頁'"
+	},
+	"menuAutoSaveAllTabs": {
+		"message": "自動保存所有標籤頁",
+		"description": "菜單項: '自動保存' > '自動保存所有標籤頁'"
+	},
+	"buttonDefaultTooltip": {
+		"message": "使用 SingleFile 保存頁面",
+		"description": "按鈕標題: '使用 SingleFile 保存頁面'"
+	},
+	"buttonBlockedBadge": {
+		"message": "🚫",
+		"description": "Button badge when the page is blocked: '🚫'"
+	},
+	"buttonBlockedTooltip": {
+		"message": "SingleFile 無法保存這個頁面",
+		"description": "Button title: 'This page cannot be saved with SingleFile'"
+	},
+	"buttonInitializingTooltip": {
+		"message": "正在初始化 SingleFile",
+		"description": "保存時候的按鈕標題: '正在初始化 SingleFile (x/2)'"
+	},
+	"buttonInitializingBadge": {
+		"message": "•••",
+		"description": "初始化時候的徽標標籤: '•••'"
+	},
+	"buttonSaveProgressTooltip": {
+		"message": "保存進度:",
+		"description": "保存時候的按鈕標題: '保存進度:xx%'"
+	},
+	"buttonOKBadge": {
+		"message": "完成",
+		"description": "徽標標籤: 'OK'"
+	},
+	"buttonErrorBadge": {
+		"message": "錯誤",
+		"description": "出現意外錯誤時候的徽標標籤"
+	},
+	"buttonAutoSaveActiveTooltip": {
+		"message": "自動保存動作",
+		"description": "按鈕標題: '自動保存動作'"
+	},
+	"buttonAutoSaveActiveBadge": {
+		"message": "[自動]",
+		"description": "自動保存激活時候的徽標標籤"
+	},
+	"optionsTitle": {
+		"message": "選項",
+		"description": "選項頁標題"
+	},
+	"optionsUserInterfaceSubTitle": {
+		"message": "用戶界面",
+		"description": "選項頁副標題: '用戶界面'"
+	},
+	"optionAddMenuEntry": {
+		"message": "添加菜單項到頁面的右鍵菜單",
+		"description": "選項頁標籤: '添加菜單項到頁面的右鍵菜單'"
+	},
+	"optionDisplayShadow": {
+		"message": "處理過程中以陰影遮蓋頁面",
+		"description": "選項頁標籤: '處理過程中以陰影遮蓋頁面'"
+	},
+	"optionDisplayInfobar": {
+		"message": "查看一個已保存的頁面時顯示信息欄",
+		"description": "選項頁標籤: '查看一個已保存的頁面時顯示信息欄'"
+	},
+	"optionInfobarTemplate": {
+		"message": "信息欄內容模板",
+		"description": "選項頁標籤: '信息欄內容模板'"
+	},
+	"optionIncludeInfobar": {
+		"message": "include the infobar in the saved page",
+		"description": "Options page label: 'include the infobar in the saved page'"
+	},
+	"optionConfirmInfobar": {
+		"message": "打開一個提示窗口以編輯信息欄內容",
+		"description": "選項頁標籤: '打開一個提示窗口以編輯信息欄內容'"
+	},
+	"optionOpenEditorLabel": {
+		"message": "annotate the page before saving",
+		"description": "Options page label: 'annotate the page before saving'"
+	},
+	"optionAutoCloseLabel": {
+		"message": "auto-close the tab after the page is saved",
+		"description": "Options page label: 'auto-close the tab after the page is saved'"
+	},
+	"optionsFileNameSubTitle": {
+		"message": "文件名",
+		"description": "選項頁副標題: '文件名'"
+	},
+	"optionFilenameTemplate": {
+		"message": "模板",
+		"description": "選項頁標籤: '模板'"
+	},
+	"optionConfirmFilename": {
+		"message": "打開“另存為”對話框以確認文件名",
+		"description": "選項頁標籤: '打開“另存為”對話框以確認文件名'"
+	},
+	"optionFilenameConflictAction": {
+		"message": "文件名衝突解決",
+		"description": "Options page label: 'filename conflict resolution'"
+	},
+	"optionFilenameConflictActionUniquify": {
+		"message": "創建為不衝突的名稱",
+		"description": "Value for 'filename conflict resolution' option: 'create a unique name'"
+	},
+	"optionFilenameConflictActionOverwrite": {
+		"message": "覆蓋現有的文件",
+		"description": "Value for 'filename conflict resolution' option: 'overwrite the existing file'"
+	},
+	"optionFilenameConflictActionPrompt": {
+		"message": "詢問新名稱",
+		"description": "Value for 'name conflict resolution' option: 'prompt for a name'"
+	},
+	"optionsHTMLContentSubTitle": {
+		"message": "HTML 內容",
+		"description": "選項頁副標題: 'HTML 內容'"
+	},
+	"optionCompressHTML": {
+		"message": "壓縮 HTML 內容",
+		"description": "選項頁標籤: '壓縮 HTML 內容'"
+	},
+	"optionRemoveImports": {
+		"message": "移除 HTML 導入",
+		"description": "選項頁標籤: '移除 HTML 導入'"
+	},
+	"optionRemoveFrames": {
+		"message": "移除框架",
+		"description": "選項頁標籤: '移除框架'"
+	},
+	"optionRemoveHiddenElements": {
+		"message": "移除隱藏元素",
+		"description": "選項頁標籤: '移除隱藏元素'"
+	},
+	"optionsImagesSubTitle": {
+		"message": "圖像",
+		"description": "選項頁副標題: '圖像'"
+	},
+	"optionGroupDuplicateImages": {
+		"message": "重複圖像合併",
+		"description": "選項頁標籤: '重複圖像合併'"
+	},
+	"optionLoadDeferredImages": {
+		"message": "保存延遲加載的圖像",
+		"description": "選項頁標籤: '保存延遲加載的圖像'"
+	},
+	"optionLoadDeferredImagesMaxIdleTime": {
+		"message": "最長空閒時間(毫秒)",
+		"description": "Options page label: 'maximum idle time (ms)'"
+	},
+	"optionRemoveAlternativeImages": {
+		"message": "移除備用分辨率的圖像",
+		"description": "選項頁標籤: '移除備用分辨率的圖像'"
+	},
+	"optionsFontsSubTitle": {
+		"message": "字體",
+		"description": "Options sub-title: 'Fonts'"
+	},
+	"optionRemoveUnusedFonts": {
+		"message": "移除未使用的字體",
+		"description": "Options page label: 'remove unused fonts'"
+	},
+	"optionRemoveAlternativeFonts": {
+		"message": "移除備用的字體",
+		"description": "Options page label: 'remove alternative fonts'"
+	},
+	"optionsStylesheetsSubTitle": {
+		"message": "樣式表",
+		"description": "選項頁副標題: '樣式表'"
+	},
+	"optionCompressCSS": {
+		"message": "壓縮 CSS 內容",
+		"description": "選項頁標籤: '壓縮 CSS 內容'"
+	},
+	"optionRemoveUnusedStyles": {
+		"message": "移除未使用的樣式",
+		"description": "選項頁標籤: '移除未使用的樣式'"
+	},
+	"optionRemoveAlternativeMedias": {
+		"message": "移除其他設備分辨率的樣式表",
+		"description": "選項頁標籤: '移除其他設備分辨率的樣式表'"
+	},
+	"optionsOtherResourcesSubTitle": {
+		"message": "其他資源",
+		"description": "選項頁副標題: '其他資源'"
+	},
+	"optionRemoveScripts": {
+		"message": "移除腳本",
+		"description": "選項頁標籤: '移除腳本'"
+	},
+	"optionRemoveVideo": {
+		"message": "移除視頻嵌入",
+		"description": "選項頁標籤: '移除視頻嵌入'"
+	},
+	"optionRemoveAudio": {
+		"message": "移除音頻嵌入",
+		"description": "選項頁標籤: '移除音頻嵌入'"
+	},
+	"optionsAutoSaveSubTitle": {
+		"message": "自動保存",
+		"description": "選項頁副標題: '自動保存'"
+	},
+	"optionsDeleteDisplayedRulesConfirm": {
+		"message": "確認移除所有已顯示規則",
+		"description": "Popup text 'Confirm deletion of all displayed rules'"
+	},
+	"optionsDeleteRulesTooltip": {
+		"message": "移除所有已顯示規則",
+		"description": "Popup text 'Delete all displayed rules'"
+	},
+	"optionsAutoSettingsSubTitle": {
+		"message": "自動設置",
+		"description": "Options sub-title: 'Auto-settings rules'"
+	},
+	"optionsAutoSettingsUrl": {
+		"message": "URL",
+		"description": "Options label in the auto-settings rules: 'URL'"
+	},
+	"optionsAutoSettingsUrlPlaceholder": {
+		"message": "輸入部分或完整 URL(如 example.com)",
+		"description": "Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'"
+	},
+	"optionsAutoSettingsProfile": {
+		"message": "配置文件",
+		"description": "Options label in the Auto-settings rules: 'Profile'"
+	},
+	"optionsAutoSettingsAutoSaveProfile": {
+		"message": "自動保存配置文件",
+		"description": "Options label in the Auto-settings rules: 'Auto-save profile'"
+	},
+	"optionsAutoSettingsShowAllProfiles": {
+		"message": "顯示所有配置文件",
+		"description": "Options label in the Auto-settings rules: 'display all profiles'"
+	},
+	"optionsAutoSettingsShowAutoSaveProfile": {
+		"message": "顯示“自動保存配置文件”",
+		"description": "Options label in the Auto-settings rules: 'display 'Auto-save profile' column'"
+	},
+	"optionsUpdateRuleTooltip": {
+		"message": "更新規則",
+		"description": "Popup text 'Update the rule' in the options page"
+	},
+	"optionsDeleteRuleTooltip": {
+		"message": "刪除規則",
+		"description": "Popup text 'Delete the rule' in the options page"
+	},
+	"optionsAddRuleTooltip": {
+		"message": "添加規則",
+		"description": "Popup text 'Add the rule' in the options page"
+	},
+	"optionsValidateChangesTooltip": {
+		"message": "驗證更改",
+		"description": "Popup text 'Validate changes' in the options page"
+	},
+	"optionsDeleteRuleConfirm": {
+		"message": "確認刪除所選規則",
+		"description": "Popup text 'Confirm deletion of the selected rule' in the options page"
+	},
+	"optionAutoSaveLoadOrUnload": {
+		"message": "頁面加載或頁面卸載後自動保存",
+		"description": "頁面加載或頁面卸載後自動保存"
+	},
+	"optionAutoSaveLoad": {
+		"message": "頁面加載後自動保存",
+		"description": "選項頁標籤: '頁面加載後自動保存'"
+	},
+	"optionAutoSaveUnload": {
+		"message": "頁面卸載時自動保存",
+		"description": "選項頁標籤: '頁面卸載時自動保存'"
+	},
+	"optionAutoSaveDelay": {
+		"message": "頁面加載後自動保存延時(秒)",
+		"description": "選項頁標籤: '頁面加載後自動保存的延時(秒)'"
+	},
+	"optionAutoSaveRepeat": {
+		"message": "定期自動保存",
+		"description": "Options page label: 'auto-save periodically'"
+	},
+	"optionAutoSaveRepeatDelay": {
+		"message": "定期自動保存單位(秒)",
+		"description": "Options page label: 'period (s)'"
+	},
+	"optionsMiscSubTitle": {
+		"message": "其他",
+		"description": "選項頁副標題: '其他'"
+	},
+	"optionBackgroundSave": {
+		"message": "在後台保存頁面",
+		"description": "選項頁標籤: '在後台保存頁面'"
+	},
+	"optionDisplayStats": {
+		"message": "處理後在控制台消息中顯示統計",
+		"description": "選項頁標籤: '處理後在控制台消息中顯示統計'"
+	},
+	"optionSetMaxResourceSize": {
+		"message": "設定嵌入的資源的最大體積",
+		"description": "選項頁標籤: '設定嵌入的資源的最大體積'"
+	},
+	"optionMaxResourceSize": {
+		"message": "最大體積(MB)",
+		"description": "選項頁標籤: '最大體積(MB)'"
+	},
+	"optionSaveRawPage": {
+		"message": "保存原始頁面",
+		"description": "選項頁標籤: '保存原始頁面'"
+	},
+	"optionSaveToClipboard": {
+		"message": "保存到剪切板",
+		"description": "Options page label: 'save to clipboard'"
+	},
+	"optionsHelpLink": {
+		"message": "幫助",
+		"description": "選項頁幫助鏈接"
+	},
+	"optionsResetButton": {
+		"message": "重置",
+		"description": "選項按鈕: '重置'"
+	},
+	"optionsResetTooltip": {
+		"message": "重置所有選項為默認值",
+		"description": "選項按鈕'重置'的提示"
+	},
+	"optionsResetConfirm": {
+		"message": "確認重置所有選項或當前配置",
+		"description": "Popup text 'Confirm the reset of all options or the current profile' in the options page"
+	},
+	"optionsResetAllButton": {
+		"message": "重置所有選項",
+		"description": "Options confirm button: 'Reset all options'"
+	},
+	"optionsResetCurrentButton": {
+		"message": "重置當前配置",
+		"description": "Options confirm button: 'Reset current profile'"
+	},
+	"optionsOKButton": {
+		"message": "確定",
+		"description": "Options confirm button: 'OK'"
+	},
+	"optionsCancelButton": {
+		"message": "取消",
+		"description": "Options confirm button: 'Cancel'"
+	},
+	"optionsExportButton": {
+		"message": "導出",
+		"description": "Options button: 'Export'"
+	},
+	"optionsImportButton": {
+		"message": "導入",
+		"description": "Options button: 'Import'"
+	},
+	"logPanelDeferredImages": {
+		"message": "延遲加載的圖像",
+		"description": "Label 'Deferred images' in the log panel"
+	},
+	"logPanelFrameContents": {
+		"message": "框架內容",
+		"description": "Label 'Frame contents' in the log panel"
+	},
+	"logPanelStep": {
+		"message": "步驟",
+		"description": "Label 'Step' (for 'Step x / 4') in the log panel"
+	},
+	"logPanelWidth": {
+		"message": "115",
+		"description": "Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')"
+	},
+	"profileDefaultSettings": {
+		"message": "默認設置",
+		"description": "Label 'Default settings' of the default settings in the options page"
+	},
+	"profileDisabled": {
+		"message": "禁用",
+		"description": "Label 'Disabled' of the disabled profile name in the options page"
+	},
+	"profileAddButtonTooltip": {
+		"message": "添加一個新配置文件",
+		"description": "Tooltip 'Add a new profile' in the options page"
+	},
+	"profileRenameButtonTooltip": {
+		"message": "重命名配置文件",
+		"description": "Tooltip 'Rename the profile' in the options page"
+	},
+	"profileDeleteButtonTooltip": {
+		"message": "移除配置文件",
+		"description": "Tooltip 'Delete the profile' in the options page"
+	},
+	"profileAddPrompt": {
+		"message": "為新配置文件輸入名字",
+		"description": "Popup text 'Enter a name for this new profile' in the options page"
+	},
+	"profileDeleteConfirm": {
+		"message": "確認移除所選配置文件",
+		"description": "Popup text 'Confirm deletion of the selected profile' in the options page"
+	},
+	"profileRenamePrompt": {
+		"message": "為所選配置文件輸入新名字",
+		"description": "Popup text 'Enter a new name for the selected profile' in the options page"
+	},
+	"editorAddYellowNote": {
+		"message": "Add a yellow note",
+		"description": "Title of the button 'Add a yellow note' in the editor"
+	},
+	"editorAddPinkNote": {
+		"message": "Add a pink note",
+		"description": "Title of the button 'Add a pink note' in the editor"
+	},
+	"editorAddBlueNote": {
+		"message": "Add a blue note",
+		"description": "Title of the button 'Add a blue note' in the editor"
+	},
+	"editorAddGreenNote": {
+		"message": "Add a green note",
+		"description": "Title of the button 'Add a green note' in the editor"
+	},
+	"editorHighlightYellow": {
+		"message": "Highlight selected text in yellow",
+		"description": "Title of the button 'Highlight selected text in yellow' in the editor"
+	},
+	"editorHighlightPink": {
+		"message": "Highlight selected text in pink",
+		"description": "Title of the button 'Highlight selected text in pink' in the editor"
+	},
+	"editorHighlightBlue": {
+		"message": "Highlight selected text in blue",
+		"description": "Title of the button 'Highlight selected text in blue' in the editor"
+	},
+	"editorHighlightGreen": {
+		"message": "Highlight selected text in green",
+		"description": "Title of the button 'Highlight selected text in green' in the editor"
+	},
+	"editorToggleNotes": {
+		"message": "Display/hide notes",
+		"description": "Title of the button 'Display/hide notes' in the editor"
+	},
+	"editorToggleHighlights": {
+		"message": "Display/hide the highlighted text",
+		"description": "Title of the button 'Display/hide the highlighted text' in the editor"
+	},
+	"editorRemoveHighlight": {
+		"message": "Remove the selected highlighted text",
+		"description": "Title of the button 'Remove the selected highlighted text' in the editor"
+	},
+	"editorEditPage": {
+		"message": "Enable/disable read-only",
+		"description": "Title of the button 'Enable/disable read-only' in the editor"
+	},
+	"editorSavePage": {
+		"message": "Save the page",
+		"description": "Title of the button 'Save the page' in the editor"
+	}
 }

+ 4 - 2
extension/core/bg/business.js

@@ -38,6 +38,7 @@ singlefile.extension.core.bg.business = (() => {
 		"extension/core/index.js",
 		"extension/ui/index.js",
 		"extension/core/content/content-main.js",
+		"extension/core/content/content-download.js",
 		"extension/ui/content/content-ui-main.js"
 	];
 
@@ -94,10 +95,11 @@ singlefile.extension.core.bg.business = (() => {
 		}
 	}
 
-	async function saveLink(url) {
+	async function saveLink(url, options = {}) {
 		const tabs = singlefile.extension.core.bg.tabs;
 		const tab = await tabs.create({ url, active: false });
-		await saveTabs([tab], { autoClose: true });
+		options.autoClose = true;
+		await saveTabs([tab], options);
 	}
 
 	async function cancelTab(tab) {

+ 2 - 1
extension/core/bg/config.js

@@ -79,7 +79,8 @@ singlefile.extension.core.bg.config = (() => {
 		saveRawPage: false,
 		saveToClipboard: false,
 		resolveFragmentIdentifierURLs: false,
-		userScriptEnabled: false
+		userScriptEnabled: false,
+		openEditor: false
 	};
 
 	let pendingUpgradePromise = upgrade();

+ 28 - 16
extension/core/bg/downloads.js

@@ -60,23 +60,35 @@ singlefile.extension.core.bg.downloads = (() => {
 				contents = [message.content];
 			}
 			if (!message.truncated || message.finished) {
-				if (message.saveToClipboard) {
-					message.content = contents.join("");
-					saveToClipboard(message);
+				if (message.openEditor) {
+					await singlefile.extension.core.bg.editor.open({ filename: message.filename, content: contents.join("") }, {
+						backgroundSave: message.backgroundSave,
+						saveToClipboard: message.saveToClipboard,
+						confirmFilename: message.confirmFilename,
+						incognito: sender.tab.incognito,
+						filenameConflictAction: message.filenameConflictAction,
+						filenameReplacementCharacter: message.filenameReplacementCharacter,
+						compressHTML: message.compressHTML
+					});
 				} else {
-					message.url = URL.createObjectURL(new Blob([contents], { type: MIMETYPE_HTML }));
-					try {
-						await downloadPage(message, {
-							confirmFilename: message.confirmFilename,
-							incognito: sender.tab.incognito,
-							filenameConflictAction: message.filenameConflictAction,
-							filenameReplacementCharacter: message.filenameReplacementCharacter
-						});
-					} catch (error) {
-						console.error(error); // eslint-disable-line no-console
-						singlefile.extension.ui.bg.main.onError(sender.tab.id);
-					} finally {
-						URL.revokeObjectURL(message.url);
+					if (message.saveToClipboard) {
+						message.content = contents.join("");
+						saveToClipboard(message);
+					} else {
+						message.url = URL.createObjectURL(new Blob([contents], { type: MIMETYPE_HTML }));
+						try {
+							await downloadPage(message, {
+								confirmFilename: message.confirmFilename,
+								incognito: sender.tab.incognito,
+								filenameConflictAction: message.filenameConflictAction,
+								filenameReplacementCharacter: message.filenameReplacementCharacter
+							});
+						} catch (error) {
+							console.error(error); // eslint-disable-line no-console
+							singlefile.extension.ui.bg.main.onError(sender.tab.id);
+						} finally {
+							URL.revokeObjectURL(message.url);
+						}
 					}
 				}
 			}

+ 45 - 0
extension/core/bg/editor.js

@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010-2019 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ * 
+ * This file is part of SingleFile.
+ *
+ *   The code in this file is free software: you can redistribute it and/or 
+ *   modify it under the terms of the GNU Affero General Public License 
+ *   (GNU AGPL) as published by the Free Software Foundation, either version 3
+ *   of the License, or (at your option) any later version.
+ * 
+ *   The code in this file is distributed in the hope that it will be useful, 
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero 
+ *   General Public License for more details.
+ *
+ *   As additional permission under GNU AGPL version 3 section 7, you may 
+ *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU 
+ *   AGPL normally required by section 4, provided you include this license 
+ *   notice and a URL through which recipients can access the Corresponding 
+ *   Source.
+ */
+
+/* global browser, singlefile */
+
+singlefile.extension.core.bg.editor = (() => {
+
+	const tabsData = new Map();
+
+	return {
+		onMessage,
+		async open({ content, filename }, options) {
+			const tab = await browser.tabs.create({ active: true, url: "/extension/ui/pages/editor.html" });
+			tabsData.set(tab.id, { content, filename, options });
+		}
+	};
+
+	async function onMessage(message, sender) {
+		if (message.method.endsWith(".getTabData")) {
+			const tab = sender.tab;
+			return tabsData.get(tab.id);
+		}
+	}
+
+})();

+ 3 - 0
extension/core/bg/messages.js

@@ -47,6 +47,9 @@ singlefile.extension.core.bg.messages = (() => {
 		if (message.method.startsWith("devtools.")) {
 			return singlefile.extension.core.bg.devtools.onMessage(message, sender);
 		}
+		if (message.method.startsWith("editor.")) {
+			return singlefile.extension.core.bg.editor.onMessage(message, sender);
+		}
 	});
 	if (browser.runtime.onMessageExternal) {
 		browser.runtime.onMessageExternal.addListener(async (message, sender) => {

+ 93 - 0
extension/core/content/content-download.js

@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010-2019 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ * 
+ * This file is part of SingleFile.
+ *
+ *   The code in this file is free software: you can redistribute it and/or 
+ *   modify it under the terms of the GNU Affero General Public License 
+ *   (GNU AGPL) as published by the Free Software Foundation, either version 3
+ *   of the License, or (at your option) any later version.
+ * 
+ *   The code in this file is distributed in the hope that it will be useful, 
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero 
+ *   General Public License for more details.
+ *
+ *   As additional permission under GNU AGPL version 3 section 7, you may 
+ *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU 
+ *   AGPL normally required by section 4, provided you include this license 
+ *   notice and a URL through which recipients can access the Corresponding 
+ *   Source.
+ */
+
+/* global browser, document, URL, Blob, MouseEvent */
+
+this.singlefile.extension.core.content.download = this.singlefile.extension.core.content.download || (() => {
+
+	const singlefile = this.singlefile;
+
+	const MAX_CONTENT_SIZE = 32 * (1024 * 1024);
+
+	return { downloadPage };
+
+	async function downloadPage(pageData, options) {
+		if (options.includeInfobar) {
+			await singlefile.common.ui.content.infobar.includeScript(pageData);
+		}
+		if (options.backgroundSave || options.openEditor) {
+			for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) {
+				const message = {
+					method: "downloads.download",
+					confirmFilename: options.confirmFilename,
+					filenameConflictAction: options.filenameConflictAction,
+					filename: pageData.filename,
+					saveToClipboard: options.saveToClipboard,
+					filenameReplacementCharacter: options.filenameReplacementCharacter,
+					openEditor: options.openEditor,
+					compressHTML: options.compressHTMLEdit,
+					backgroundSave: options.backgroundSave
+				};
+				message.truncated = pageData.content.length > MAX_CONTENT_SIZE;
+				if (message.truncated) {
+					message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length;
+					message.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);
+				} else {
+					message.content = pageData.content;
+				}
+				await browser.runtime.sendMessage(message);
+			}
+		} else {
+			if (options.saveToClipboard) {
+				saveToClipboard(pageData);
+			} else {
+				downloadPageForeground(pageData);
+			}
+		}
+		await browser.runtime.sendMessage({ method: "downloads.end", autoClose: options.autoClose });
+	}
+
+	function downloadPageForeground(pageData) {
+		if (pageData.filename && pageData.filename.length) {
+			const link = document.createElement("a");
+			link.download = pageData.filename;
+			link.href = URL.createObjectURL(new Blob([pageData.content], { type: "text/html" }));
+			link.dispatchEvent(new MouseEvent("click"));
+			URL.revokeObjectURL(link.href);
+		}
+	}
+
+	function saveToClipboard(page) {
+		const command = "copy";
+		document.addEventListener(command, listener);
+		document.execCommand(command);
+		document.removeEventListener(command, listener);
+
+		function listener(event) {
+			event.clipboardData.setData("text/html", page.content);
+			event.clipboardData.setData("text/plain", page.content);
+			event.preventDefault();
+		}
+	}
+
+})();

+ 5 - 63
extension/core/content/content-main.js

@@ -21,14 +21,12 @@
  *   Source.
  */
 
-/* global browser, document, window, setTimeout, URL, Blob, MouseEvent */
+/* global browser, document, window, setTimeout */
 
 this.singlefile.extension.core.content.main = this.singlefile.extension.core.content.main || (() => {
 
 	const singlefile = this.singlefile;
 
-	const MAX_CONTENT_SIZE = 32 * (1024 * 1024);
-
 	let ui, processing = false, processor;
 
 	singlefile.lib.main.init({
@@ -77,7 +75,10 @@ this.singlefile.extension.core.content.main = this.singlefile.extension.core.con
 				try {
 					const pageData = await processPage(options);
 					if (pageData) {
-						await downloadPage(pageData, options);
+						if (!options.backgroundSave && !options.saveToClipboard && options.confirmFilename) {
+							pageData.filename = ui.prompt("File name", pageData.filename);
+						}
+						await singlefile.extension.core.content.download.downloadPage(pageData, options);
 					}
 				} catch (error) {
 					if (!processor.cancelled) {
@@ -211,63 +212,4 @@ this.singlefile.extension.core.content.main = this.singlefile.extension.core.con
 		return page;
 	}
 
-	async function downloadPage(pageData, options) {
-		if (options.includeInfobar) {
-			await singlefile.common.ui.content.infobar.includeScript(pageData);
-		}
-		if (options.backgroundSave) {
-			for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) {
-				const message = {
-					method: "downloads.download",
-					confirmFilename: options.confirmFilename,
-					filenameConflictAction: options.filenameConflictAction,
-					filename: pageData.filename,
-					saveToClipboard: options.saveToClipboard,
-					filenameReplacementCharacter: options.filenameReplacementCharacter
-				};
-				message.truncated = pageData.content.length > MAX_CONTENT_SIZE;
-				if (message.truncated) {
-					message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length;
-					message.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);
-				} else {
-					message.content = pageData.content;
-				}
-				await browser.runtime.sendMessage(message);
-			}
-		} else {
-			if (options.saveToClipboard) {
-				saveToClipboard(pageData);
-			} else {
-				downloadPageForeground(pageData, options);
-			}
-		}
-		await browser.runtime.sendMessage({ method: "downloads.end", autoClose: options.autoClose });
-	}
-
-	function downloadPageForeground(pageData, options) {
-		if (options.confirmFilename) {
-			pageData.filename = ui.prompt("File name", pageData.filename);
-		}
-		if (pageData.filename && pageData.filename.length) {
-			const link = document.createElement("a");
-			link.download = pageData.filename;
-			link.href = URL.createObjectURL(new Blob([pageData.content], { type: "text/html" }));
-			link.dispatchEvent(new MouseEvent("click"));
-			URL.revokeObjectURL(link.href);
-		}
-	}
-
-	function saveToClipboard(page) {
-		const command = "copy";
-		document.addEventListener(command, listener);
-		document.execCommand(command);
-		document.removeEventListener(command, listener);
-
-		function listener(event) {
-			event.clipboardData.setData("text/html", page.content);
-			event.clipboardData.setData("text/plain", page.content);
-			event.preventDefault();
-		}
-	}
-
 })();

+ 170 - 0
extension/ui/bg/ui-editor.js

@@ -0,0 +1,170 @@
+/*
+ * Copyright 2010-2019 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ * 
+ * This file is part of SingleFile.
+ *
+ *   The code in this file is free software: you can redistribute it and/or 
+ *   modify it under the terms of the GNU Affero General Public License 
+ *   (GNU AGPL) as published by the Free Software Foundation, either version 3
+ *   of the License, or (at your option) any later version.
+ * 
+ *   The code in this file is distributed in the hope that it will be useful, 
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero 
+ *   General Public License for more details.
+ *
+ *   As additional permission under GNU AGPL version 3 section 7, you may 
+ *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU 
+ *   AGPL normally required by section 4, provided you include this license 
+ *   notice and a URL through which recipients can access the Corresponding 
+ *   Source.
+ */
+
+/* global browser, singlefile, window, document */
+
+singlefile.extension.ui.bg.editor = (() => {
+
+	const editorElement = document.querySelector(".editor");
+	const highlightYellowButton = document.querySelector(".highlight-yellow-button");
+	const highlightPinkButton = document.querySelector(".highlight-pink-button");
+	const highlightBlueButton = document.querySelector(".highlight-blue-button");
+	const highlightGreenButton = document.querySelector(".highlight-green-button");
+	const highlightButtons = Array.from(document.querySelectorAll(".highlight-button"));
+	const toggleNotesButton = document.querySelector(".toggle-notes-button");
+	const toggleHighlightsButton = document.querySelector(".toggle-highlights-button");
+	const removeHighlightButton = document.querySelector(".remove-highlight-button");
+	const addYellowNoteButton = document.querySelector(".add-note-yellow-button");
+	const addPinkNoteButton = document.querySelector(".add-note-pink-button");
+	const addBlueNoteButton = document.querySelector(".add-note-blue-button");
+	const addGreenNoteButton = document.querySelector(".add-note-green-button");
+	const editPageButton = document.querySelector(".edit-page-button");
+	const savePageButton = document.querySelector(".save-page-button");
+
+	let tabData;
+
+	addYellowNoteButton.title = browser.i18n.getMessage("editorAddYellowNote");
+	addPinkNoteButton.title = browser.i18n.getMessage("editorAddPinkNote");
+	addBlueNoteButton.title = browser.i18n.getMessage("editorAddBlueNote");
+	addGreenNoteButton.title = browser.i18n.getMessage("editorAddGreenNote");
+	highlightYellowButton.title = browser.i18n.getMessage("editorHighlightYellow");
+	highlightPinkButton.title = browser.i18n.getMessage("editorHighlightPink");
+	highlightBlueButton.title = browser.i18n.getMessage("editorHighlightBlue");
+	highlightGreenButton.title = browser.i18n.getMessage("editorHighlightGreen");
+	toggleNotesButton.title = browser.i18n.getMessage("editorToggleNotes");
+	toggleHighlightsButton.title = browser.i18n.getMessage("editorToggleHighlights");
+	removeHighlightButton.title = browser.i18n.getMessage("editorRemoveHighlight");
+	editPageButton.title = browser.i18n.getMessage("editorEditPage");
+	savePageButton.title = browser.i18n.getMessage("editorSavePage");
+
+	addYellowNoteButton.onclick = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: "addNote", color: "note-yellow" }), "*");
+	addPinkNoteButton.onclick = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: "addNote", color: "note-pink" }), "*");
+	addBlueNoteButton.onclick = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: "addNote", color: "note-blue" }), "*");
+	addGreenNoteButton.onclick = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: "addNote", color: "note-green" }), "*");
+	highlightYellowButton.onclick = () => {
+		if (highlightYellowButton.classList.contains("highlight-disabled")) {
+			highlightButtons.forEach(highlightButton => highlightButton.classList.add("highlight-disabled"));
+			highlightYellowButton.classList.remove("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableHighlight", color: "single-file-highlight-yellow" }), "*");
+		} else {
+			highlightYellowButton.classList.add("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableHighlight" }), "*");
+		}
+	};
+	highlightPinkButton.onclick = () => {
+		if (highlightPinkButton.classList.contains("highlight-disabled")) {
+			highlightButtons.forEach(highlightButton => highlightButton.classList.add("highlight-disabled"));
+			highlightPinkButton.classList.remove("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableHighlight", color: "single-file-highlight-pink" }), "*");
+		} else {
+			highlightPinkButton.classList.add("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableHighlight" }), "*");
+		}
+	};
+	highlightBlueButton.onclick = () => {
+		if (highlightBlueButton.classList.contains("highlight-disabled")) {
+			highlightButtons.forEach(highlightButton => highlightButton.classList.add("highlight-disabled"));
+			highlightBlueButton.classList.remove("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableHighlight", color: "single-file-highlight-blue" }), "*");
+		} else {
+			highlightBlueButton.classList.add("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableHighlight" }), "*");
+		}
+	};
+	highlightGreenButton.onclick = () => {
+		if (highlightGreenButton.classList.contains("highlight-disabled")) {
+			highlightButtons.forEach(highlightButton => highlightButton.classList.add("highlight-disabled"));
+			highlightGreenButton.classList.remove("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableHighlight", color: "single-file-highlight-green" }), "*");
+		} else {
+			highlightGreenButton.classList.add("highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableHighlight" }), "*");
+		}
+	};
+	toggleNotesButton.onclick = () => {
+		if (toggleNotesButton.getAttribute("src") == "/extension/ui/resources/button_note_visible.png") {
+			toggleNotesButton.src = "/extension/ui/resources/button_note_hidden.png";
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "hideNotes" }), "*");
+		} else {
+			toggleNotesButton.src = "/extension/ui/resources/button_note_visible.png";
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "displayNotes" }), "*");
+		}
+	};
+	toggleHighlightsButton.onclick = () => {
+		if (toggleHighlightsButton.getAttribute("src") == "/extension/ui/resources/button_highlighter_visible.png") {
+			toggleHighlightsButton.src = "/extension/ui/resources/button_highlighter_hidden.png";
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "hideHighlights" }), "*");
+		} else {
+			toggleHighlightsButton.src = "/extension/ui/resources/button_highlighter_visible.png";
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "displayHighlights" }), "*");
+		}
+	};
+	removeHighlightButton.onclick = () => {
+		if (removeHighlightButton.classList.contains("remove-highlight-disabled")) {
+			removeHighlightButton.classList.remove("remove-highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableRemoveHighlights" }), "*");
+		} else {
+			removeHighlightButton.classList.add("remove-highlight-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableRemoveHighlights" }), "*");
+		}
+	};
+	editPageButton.onclick = () => {
+		if (editPageButton.classList.contains("edit-disabled")) {
+			editPageButton.classList.remove("edit-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "enableEditPage" }), "*");
+		} else {
+			editPageButton.classList.add("edit-disabled");
+			editorElement.contentWindow.postMessage(JSON.stringify({ method: "disableEditPage" }), "*");
+		}
+	};
+	savePageButton.onclick = () => {
+		editorElement.contentWindow.postMessage(JSON.stringify({ method: "getContent", compressHTML: tabData.options.compressHTML }), "*");
+	};
+	window.onmessage = event => {
+		const message = JSON.parse(event.data);
+		if (message.method == "setMetadata") {
+			document.title = message.title + " (edit)";
+			if (message.icon) {
+				const linkElement = document.createElement("link");
+				linkElement.rel = "icon";
+				linkElement.href = message.icon;
+				document.head.appendChild(linkElement);
+			}
+		}
+		if (message.method == "setContent") {
+			const pageData = {
+				content: message.content,
+				filename: tabData.filename
+			};
+			tabData.options.openEditor = false;
+			singlefile.extension.core.content.download.downloadPage(pageData, tabData.options);
+		}
+	};
+	window.onload = async () => {
+		tabData = await browser.runtime.sendMessage({ method: "editor.getTabData" });
+		editorElement.contentWindow.postMessage(JSON.stringify({ method: "init", content: tabData.content }), "*");
+	};
+
+	return {};
+
+})();

+ 16 - 0
extension/ui/bg/ui-menus.js

@@ -28,6 +28,7 @@ singlefile.extension.ui.bg.menus = (() => {
 	const menus = browser.menus || browser.contextMenus;
 	const BROWSER_MENUS_API_SUPPORTED = menus && menus.onClicked && menus.create && menus.update && menus.removeAll;
 	const MENU_ID_SAVE_PAGE = "save-page";
+	const MENU_ID_EDIT_AND_SAVE_PAGE = "edit-and-save-page";
 	const MENU_ID_SELECT_PROFILE = "select-profile";
 	const MENU_ID_SELECT_PROFILE_PREFIX = "select-profile-";
 	const MENU_ID_ASSOCIATE_WITH_PROFILE = "associate-with-profile";
@@ -49,6 +50,7 @@ singlefile.extension.ui.bg.menus = (() => {
 	const MENU_CREATE_DOMAIN_RULE_MESSAGE = browser.i18n.getMessage("menuCreateDomainRule");
 	const MENU_UPDATE_RULE_MESSAGE = browser.i18n.getMessage("menuUpdateRule");
 	const MENU_SAVE_PAGE_MESSAGE = browser.i18n.getMessage("menuSavePage");
+	const MENU_EDIT_AND_SAVE_PAGE_MESSAGE = browser.i18n.getMessage("menuEditAndSavePage");
 	const MENU_SAVE_SELECTION_MESSAGE = browser.i18n.getMessage("menuSaveSelection");
 	const MENU_SAVE_FRAME_MESSAGE = browser.i18n.getMessage("menuSaveFrame");
 	const MENU_SAVE_TABS_MESSAGE = browser.i18n.getMessage("menuSaveTabs");
@@ -114,6 +116,13 @@ singlefile.extension.ui.bg.menus = (() => {
 				contexts: defaultContexts,
 				title: MENU_SAVE_PAGE_MESSAGE
 			});
+			if (!options.openEditor) {
+				menus.create({
+					id: MENU_ID_EDIT_AND_SAVE_PAGE,
+					contexts: defaultContexts,
+					title: MENU_EDIT_AND_SAVE_PAGE_MESSAGE
+				});
+			}
 			if (options.contextMenuEnabled) {
 				menus.create({
 					id: "separator-1",
@@ -326,6 +335,13 @@ singlefile.extension.ui.bg.menus = (() => {
 						business.saveTabs([tab]);
 					}
 				}
+				if (event.menuItemId == MENU_ID_EDIT_AND_SAVE_PAGE) {
+					if (event.linkUrl) {
+						business.saveLink(event.linkUrl, { openEditor: true });
+					} else {
+						business.saveTabs([tab], { openEditor: true });
+					}
+				}
 				if (event.menuItemId == MENU_ID_SAVE_SELECTED) {
 					business.saveTabs([tab], { selected: true });
 				}

+ 9 - 1
extension/ui/bg/ui-options.js

@@ -82,6 +82,7 @@
 	const groupDuplicateImagesLabel = document.getElementById("groupDuplicateImagesLabel");
 	const confirmInfobarLabel = document.getElementById("confirmInfobarLabel");
 	const autoCloseLabel = document.getElementById("autoCloseLabel");
+	const openEditorLabel = document.getElementById("openEditorLabel");
 	const infobarTemplateLabel = document.getElementById("infobarTemplateLabel");
 	const includeInfobarLabel = document.getElementById("includeInfobarLabel");
 	const miscLabel = document.getElementById("miscLabel");
@@ -132,6 +133,7 @@
 	const includeInfobarInput = document.getElementById("includeInfobarInput");
 	const confirmInfobarInput = document.getElementById("confirmInfobarInput");
 	const autoCloseInput = document.getElementById("autoCloseInput");
+	const openEditorInput = document.getElementById("openEditorInput");
 	const expandAllButton = document.getElementById("expandAllButton");
 	const rulesDeleteAllButton = document.getElementById("rulesDeleteAllButton");
 	const ruleUrlInput = document.getElementById("ruleUrlInput");
@@ -358,6 +360,9 @@
 				if (target == contextMenuEnabledInput) {
 					await browser.runtime.sendMessage({ method: "ui.refreshMenu" });
 				}
+				if (target == openEditorInput) {
+					await browser.runtime.sendMessage({ method: "ui.refreshMenu" });
+				}
 				await refresh();
 			}
 		}
@@ -417,6 +422,7 @@
 	includeInfobarLabel.textContent = browser.i18n.getMessage("optionIncludeInfobar");
 	confirmInfobarLabel.textContent = browser.i18n.getMessage("optionConfirmInfobar");
 	autoCloseLabel.textContent = browser.i18n.getMessage("optionAutoCloseLabel");
+	openEditorLabel.textContent = browser.i18n.getMessage("optionOpenEditorLabel");
 	resetButton.textContent = browser.i18n.getMessage("optionsResetButton");
 	exportButton.textContent = browser.i18n.getMessage("optionsExportButton");
 	importButton.textContent = browser.i18n.getMessage("optionsImportButton");
@@ -590,6 +596,7 @@
 		includeInfobarInput.checked = profileOptions.includeInfobar;
 		confirmInfobarInput.checked = profileOptions.confirmInfobarContent;
 		autoCloseInput.checked = profileOptions.autoClose;
+		openEditorInput.checked = profileOptions.openEditor;
 		removeFramesInput.disabled = saveRawPageInput.checked;
 		removeFramesInput.checked = removeFramesInput.checked || saveRawPageInput.checked;
 		loadDeferredImagesInput.disabled = saveRawPageInput.checked;
@@ -645,7 +652,8 @@
 				infobarTemplate: infobarTemplateInput.value,
 				includeInfobar: includeInfobarInput.checked,
 				confirmInfobarContent: confirmInfobarInput.checked,
-				autoClose: autoCloseInput.checked
+				autoClose: autoCloseInput.checked,
+				openEditor: openEditorInput.checked
 			}
 		});
 		await pendingSave;

+ 632 - 0
extension/ui/content/content-ui-editor-web.js

@@ -0,0 +1,632 @@
+/*
+ * Copyright 2010-2019 Gildas Lormeau
+ * contact : gildas.lormeau <at> gmail.com
+ * 
+ * This file is part of SingleFile.
+ *
+ *   The code in this file is free software: you can redistribute it and/or 
+ *   modify it under the terms of the GNU Affero General Public License 
+ *   (GNU AGPL) as published by the Free Software Foundation, either version 3
+ *   of the License, or (at your option) any later version.
+ * 
+ *   The code in this file is distributed in the hope that it will be useful, 
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero 
+ *   General Public License for more details.
+ *
+ *   As additional permission under GNU AGPL version 3 section 7, you may 
+ *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU 
+ *   AGPL normally required by section 4, provided you include this license 
+ *   notice and a URL through which recipients can access the Corresponding 
+ *   Source.
+ */
+
+/* global singlefile, window, document, fetch, DOMParser, getComputedStyle */
+
+(async () => {
+
+	const SELF_CLOSED_TAG_NAMES = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"];
+	const BUTTON_ANCHOR_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH4woJCScQox8NKQAAAJZJREFUGNOF0DEOAWEUBODPv6Ki1CgVq1HtQai0CoUTqCTuIZptZAsqJxJ7BolQoPklPyEmmWQy814y7/GOPIRQhxBq5GnQ+Bg84hD1CH0/UOEaufUHu8if6ODxwfYrbGKMFvboYhOzOc6Y4AZl3J4lPauoZzErA4poDr/UeXlFhjUuWOGOHjIMsMQC03S7jzo55JT+8Ql3/B/LcN3QKQAAAABJRU5ErkJggg==";
+	const BUTTON_CLOSE_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4woIDi82BDhzPAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAk0lEQVQY023QQQrCQAyF4a8WF7rQW3gVryK4c9lFQaG2UPQE3sSjeAhXdiFC3UQYywQCIfnz5k0K7LDBQT4qLOGKN1oUCVCgxojbr9nihQZl5BGfEPrbbvDEKRYHnHNeyoCGeK5Kh7MJPMci6mVOrQhPQyg1UXdTsA7jqacuen16p3H6u4g+ZpcSWzywz4B3rLD+Api7H1RudMpLAAAAAElFTkSuQmCC";
+	const SHADOW_MODE_ATTRIBUTE_NAME = "shadowmode";
+	const SHADOW_DELEGATE_FOCUS_ATTRIBUTE_NAME = "delegatesfocus";
+	const SCRIPT_TEMPLATE_SHADOW_ROOT = "data-template-shadow-root";
+	const NOTE_TAGNAME = "single-file-note";
+	const NOTE_CLASS = "note";
+	const NOTE_MASK_CLASS = "note-mask";
+	const NOTE_HIDDEN_CLASS = "note-hidden";
+	const NOTE_ANCHORED_CLASS = "note-anchored";
+	const NOTE_SELECTED_CLASS = "note-selected";
+	const PAGE_MASK_CLASS = "page-mask";
+	const MASK_CLASS = "single-file-mask";
+	const HIGHLIGHT_CLASS = "single-file-highlight";
+	const HIGHLIGHT_HIDDEN_CLASS = "single-file-highlight-hidden";
+	const NOTE_INITIAL_POSITION_X = 20;
+	const NOTE_INITIAL_POSITION_Y = 20;
+	const NOTE_INITIAL_WIDTH = 100;
+	const NOTE_INITIAL_HEIGHT = 100;
+
+	let NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET;
+	let selectedNote, anchorElement, maskNoteElement, maskPageElement, highlightSelectionMode, removeHighlightMode, highlightColor;
+
+	window.onmessage = async event => {
+		const message = JSON.parse(event.data);
+		if (message.method == "init") {
+			await initConstants();
+			const contentDocument = (new DOMParser()).parseFromString(message.content, "text/html");
+			if (document.doctype) {
+				document.replaceChild(contentDocument.doctype, document.doctype);
+			} else {
+				document.insertBefore(contentDocument.doctype, document.documentElement);
+			}
+			document.replaceChild(contentDocument.documentElement, document.documentElement);
+			deserializeShadowRoots(document);
+			window.parent.postMessage(JSON.stringify({ "method": "setMetadata", title: document.title, icon: document.querySelector("link[rel*=icon]").href }), "*");
+			document.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => attachNoteListeners(containerElement));
+			document.documentElement.appendChild(getStyleElement(HIGHLIGHTS_WEB_STYLESHEET));
+			maskPageElement = getMaskElement(PAGE_MASK_CLASS);
+			maskNoteElement = getMaskElement(NOTE_MASK_CLASS);
+			document.documentElement.onmouseup = onMouseUp;
+			window.onclick = event => event.preventDefault();
+		}
+		if (message.method == "addNote") {
+			addNote(message);
+		}
+		if (message.method == "displayNotes") {
+			document.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector("." + NOTE_CLASS).classList.remove(NOTE_HIDDEN_CLASS));
+		}
+		if (message.method == "hideNotes") {
+			document.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector("." + NOTE_CLASS).classList.add(NOTE_HIDDEN_CLASS));
+		}
+		if (message.method == "enableHighlight") {
+			highlightColor = message.color;
+			highlightSelectionMode = true;
+		}
+		if (message.method == "disableHighlight") {
+			highlightSelectionMode = false;
+		}
+		if (message.method == "displayHighlights") {
+			document.querySelectorAll("." + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));
+		}
+		if (message.method == "hideHighlights") {
+			document.querySelectorAll("." + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.add(HIGHLIGHT_HIDDEN_CLASS));
+		}
+		if (message.method == "enableRemoveHighlights") {
+			removeHighlightMode = true;
+		}
+		if (message.method == "disableRemoveHighlights") {
+			removeHighlightMode = false;
+		}
+		if (message.method == "enableEditPage") {
+			document.body.contentEditable = true;
+		}
+		if (message.method == "disableEditPage") {
+			document.body.contentEditable = false;
+		}
+		if (message.method == "getContent") {
+			serializeShadowRoots(document);
+			const doc = document.cloneNode(true);
+			deserializeShadowRoots(document);
+			doc.querySelectorAll("." + MASK_CLASS).forEach(maskElement => maskElement.remove());
+			doc.querySelectorAll("." + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));
+			doc.querySelectorAll(`template[${SHADOW_MODE_ATTRIBUTE_NAME}]`).forEach(templateElement => templateElement.querySelector("." + NOTE_CLASS).classList.remove(NOTE_HIDDEN_CLASS));
+			delete doc.body.contentEditable;
+			const scriptElement = doc.createElement("script");
+			scriptElement.setAttribute(SCRIPT_TEMPLATE_SHADOW_ROOT, "");
+			scriptElement.textContent = getEmbedScript();
+			doc.body.appendChild(scriptElement);
+			window.parent.postMessage(JSON.stringify({ "method": "setContent", content: singlefile.lib.modules.serializer.process(doc, message.compressHTML) }), "*");
+		}
+	};
+	window.onresize = reflowNotes;
+
+	async function initConstants() {
+		[NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET] = await Promise.all([
+			minifyText(await ((await fetch("editor-note-web.css")).text())),
+			minifyText(await ((await fetch("editor-mask-web.css")).text())),
+			minifyText(await ((await fetch("editor-frame-web.css")).text()))
+		]);
+	}
+
+	function addNote({ color }) {
+		const containerElement = document.createElement(NOTE_TAGNAME);
+		const noteElement = document.createElement("div");
+		const headerElement = document.createElement("header");
+		const mainElement = document.createElement("main");
+		const resizeElement = document.createElement("div");
+		const removeNoteElement = document.createElement("img");
+		const anchorIconElement = document.createElement("img");
+		const noteShadow = containerElement.attachShadow({ mode: "open" });
+		headerElement.appendChild(anchorIconElement);
+		headerElement.appendChild(removeNoteElement);
+		noteElement.appendChild(headerElement);
+		noteElement.appendChild(mainElement);
+		noteElement.appendChild(resizeElement);
+		noteShadow.appendChild(getStyleElement(NOTES_WEB_STYLESHEET));
+		noteShadow.appendChild(noteElement);
+		const notesElements = Array.from(document.querySelectorAll(NOTE_TAGNAME));
+		const noteId = Math.max.call(Math, 0, ...notesElements.map(noteElement => Number(noteElement.dataset.noteId))) + 1;
+		noteElement.classList.add(NOTE_CLASS);
+		noteElement.classList.add(NOTE_ANCHORED_CLASS);
+		noteElement.classList.add(color);
+		const boundingRectDocument = document.documentElement.getBoundingClientRect();
+		let positionX = NOTE_INITIAL_WIDTH + NOTE_INITIAL_POSITION_X - 1 - boundingRectDocument.x;
+		let positionY = NOTE_INITIAL_HEIGHT + NOTE_INITIAL_POSITION_Y - 1 - boundingRectDocument.y;
+		while (Array.from(document.elementsFromPoint(positionX - window.scrollX, positionY - window.scrollY)).find(element => element.tagName.toLowerCase() == NOTE_TAGNAME)) {
+			positionX += NOTE_INITIAL_POSITION_X;
+			positionY += NOTE_INITIAL_POSITION_Y;
+		}
+		noteElement.style.setProperty("left", (positionX - NOTE_INITIAL_WIDTH - 1) + "px");
+		noteElement.style.setProperty("top", (positionY - NOTE_INITIAL_HEIGHT - 1) + "px");
+		resizeElement.className = "note-resize";
+		resizeElement.ondragstart = event => event.preventDefault();
+		mainElement.contentEditable = true;
+		removeNoteElement.className = "note-remove";
+		removeNoteElement.src = BUTTON_CLOSE_URL;
+		removeNoteElement.ondragstart = event => event.preventDefault();
+		anchorIconElement.className = "note-anchor";
+		anchorIconElement.src = BUTTON_ANCHOR_URL;
+		anchorIconElement.ondragstart = event => event.preventDefault();
+		containerElement.dataset.noteId = noteId;
+		addNoteRef(document.documentElement, noteId);
+		attachNoteListeners(containerElement);
+		document.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);
+		noteElement.classList.add(NOTE_SELECTED_CLASS);
+		selectedNote = noteElement;
+	}
+
+	function attachNoteListeners(containerElement) {
+		const SELECT_PX_THRESHOLD = 4;
+		const NOTE_CLOSED_CLASS = "note-closed";
+		const NOTE_MOVING_CLASS = "note-moving";
+		const NOTE_MASK_MOVING_CLASS = "note-mask-moving";
+		const PAGE_MASK_ACTIVE_CLASS = "page-mask-active";
+		const noteShadow = containerElement.shadowRoot;
+		const noteElement = noteShadow.childNodes[1];
+		const headerElement = noteShadow.querySelector("header");
+		const mainElement = noteShadow.querySelector("main");
+		const noteId = containerElement.dataset.noteId;
+		const resizeElement = noteShadow.querySelector(".note-resize");
+		const anchorIconElement = noteShadow.querySelector(".note-anchor");
+		const removeNoteElement = noteShadow.querySelector(".note-remove");
+		headerElement.ondblclick = () => noteElement.classList.toggle(NOTE_CLOSED_CLASS);
+		headerElement.ontouchstart = headerElement.onmousedown = event => {
+			event.preventDefault();
+			const position = getPosition(event);
+			const clientX = position.clientX;
+			const clientY = position.clientY;
+			const boundingRect = noteElement.getBoundingClientRect();
+			const deltaX = clientX - boundingRect.left;
+			const deltaY = clientY - boundingRect.top;
+			if (event.touches && event.touches.length > 1) {
+				noteElement.classList.toggle(NOTE_CLOSED_CLASS);
+			} else {
+				maskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);
+				document.documentElement.style.setProperty("user-select", "none", "important");
+				anchorElement = getTarget(clientX, clientY) || document.documentElement;
+				document.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);
+				noteElement.style.setProperty("left", (clientX - deltaX) + "px");
+				noteElement.style.setProperty("top", (clientY - deltaY) + "px");
+				noteElement.style.setProperty("position", "fixed");
+				headerElement.ontouchmove = document.documentElement.onmousemove = event => moveNote(event, deltaX, deltaY);
+				headerElement.ontouchend = headerElement.onmouseup = event => anchorNote(event, deltaX, deltaY);
+			}
+		};
+
+		resizeElement.ontouchstart = resizeElement.onmousedown = event => {
+			event.preventDefault();
+			maskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);
+			document.documentElement.style.setProperty("user-select", "none", "important");
+			resizeElement.ontouchmove = document.documentElement.onmousemove = event => {
+				const { clientX, clientY } = getPosition(event);
+				const boundingRectNote = noteElement.getBoundingClientRect();
+				noteElement.style.width = clientX - boundingRectNote.left + "px";
+				noteElement.style.height = clientY - boundingRectNote.top + "px";
+			};
+		};
+		resizeElement.ontouchend = resizeElement.onmouseup = () => {
+			document.documentElement.style.removeProperty("user-select");
+			maskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);
+			resizeElement.ontouchmove = document.documentElement.onmousemove = null;
+		};
+		anchorIconElement.ontouchend = anchorIconElement.onclick = () => {
+			noteElement.classList.toggle(NOTE_ANCHORED_CLASS);
+			if (!noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {
+				deleteNoteRef(containerElement, noteId);
+				addNoteRef(document.documentElement, noteId);
+			}
+		};
+		removeNoteElement.ontouchend = removeNoteElement.onclick = () => {
+			deleteNoteRef(containerElement, noteId);
+			containerElement.remove();
+		};
+		noteElement.onmousedown = () => {
+			selectNote(noteElement);
+		};
+		noteElement.onpaste = event => {
+			event.preventDefault();
+			const dataTransferItem = Array.from(event.clipboardData.items).find(item => item.type == "text/plain");
+			if (dataTransferItem) {
+				dataTransferItem.getAsString(value => mainElement.textContent = value);
+			}
+		};
+
+		function moveNote(event, deltaX, deltaY) {
+			event.preventDefault();
+			const { clientX, clientY } = getPosition(event);
+			noteElement.classList.add(NOTE_MOVING_CLASS);
+			if (noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {
+				deleteNoteRef(containerElement, noteId);
+				anchorElement = getTarget(clientX, clientY) || document.documentElement;
+				addNoteRef(anchorElement, noteId);
+			} else {
+				anchorElement = document.documentElement;
+			}
+			noteElement.style.setProperty("left", (clientX - deltaX) + "px");
+			noteElement.style.setProperty("top", (clientY - deltaY) + "px");
+			noteElement.style.setProperty("position", "fixed");
+			if (anchorElement == document.documentElement || anchorElement == document.documentElement) {
+				maskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);
+			} else {
+				const boundingRectAnchor = anchorElement.getBoundingClientRect();
+				maskNoteElement.classList.add(NOTE_MASK_MOVING_CLASS);
+				maskNoteElement.style.setProperty("top", boundingRectAnchor.y + "px");
+				maskNoteElement.style.setProperty("left", boundingRectAnchor.x + "px");
+				maskNoteElement.style.setProperty("width", boundingRectAnchor.width + "px");
+				maskNoteElement.style.setProperty("height", boundingRectAnchor.height + "px");
+			}
+		}
+
+		function anchorNote(event, deltaX, deltaY) {
+			event.preventDefault();
+			const { clientX, clientY } = getPosition(event);
+			document.documentElement.style.removeProperty("user-select");
+			noteElement.classList.remove(NOTE_MOVING_CLASS);
+			maskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);
+			maskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);
+			headerElement.ontouchmove = document.documentElement.onmousemove = null;
+			headerElement.ontouchend = headerElement.onmouseup = null;
+			let currentElement = anchorElement;
+			let positionedElement;
+			while (currentElement.parentElement && !positionedElement) {
+				if (!SELF_CLOSED_TAG_NAMES.includes(currentElement.tagName.toLowerCase())) {
+					const currentElementStyle = getComputedStyle(currentElement);
+					if (currentElementStyle.position != "static") {
+						positionedElement = currentElement;
+					}
+				}
+				currentElement = currentElement.parentElement;
+			}
+			if (!positionedElement) {
+				positionedElement = document.documentElement;
+			}
+			if (positionedElement == document.documentElement) {
+				document.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);
+			} else {
+				positionedElement.appendChild(containerElement);
+			}
+			const boundingRectPositionedElement = positionedElement.getBoundingClientRect();
+			const stylePositionedElement = window.getComputedStyle(positionedElement);
+			const borderX = parseInt(stylePositionedElement.getPropertyValue("border-left-width"));
+			const borderY = parseInt(stylePositionedElement.getPropertyValue("border-top-width"));
+			noteElement.style.setProperty("position", "absolute");
+			noteElement.style.setProperty("left", (clientX - boundingRectPositionedElement.x - deltaX - borderX) + "px");
+			noteElement.style.setProperty("top", (clientY - boundingRectPositionedElement.y - deltaY - borderY) + "px");
+		}
+
+		function selectNote(noteElement) {
+			if (selectedNote) {
+				selectedNote.classList.remove(NOTE_SELECTED_CLASS);
+			}
+			noteElement.classList.add(NOTE_SELECTED_CLASS);
+			selectedNote = noteElement;
+		}
+
+		function getPosition(event) {
+			if (event.touches && event.touches.length) {
+				const touch = event.touches[0];
+				return touch;
+			} else {
+				return event;
+			}
+		}
+
+		function getTarget(clientX, clientY) {
+			const targets = Array.from(document.elementsFromPoint(clientX, clientY)).filter(element => element.tagName.toLowerCase() != NOTE_TAGNAME && !element.classList.contains(MASK_CLASS));
+			if (!targets.includes(document.documentElement)) {
+				targets.push(document.documentElement);
+			}
+			let newTarget, target = targets[0], boundingRect = target.getBoundingClientRect();
+			newTarget = determineTargetElement("floor", target, clientX - boundingRect.left, getMatchedParents(target, "left"));
+			if (newTarget == target) {
+				newTarget = determineTargetElement("ceil", target, boundingRect.left + boundingRect.width - clientX, getMatchedParents(target, "right"));
+			}
+			if (newTarget == target) {
+				newTarget = determineTargetElement("floor", target, clientY - boundingRect.top, getMatchedParents(target, "top"));
+			}
+			if (newTarget == target) {
+				newTarget = determineTargetElement("ceil", target, boundingRect.top + boundingRect.height - clientY, getMatchedParents(target, "bottom"));
+			}
+			target = newTarget;
+			while (boundingRect = target && target.getBoundingClientRect(), boundingRect && boundingRect.width <= SELECT_PX_THRESHOLD && boundingRect.height <= SELECT_PX_THRESHOLD) {
+				target = target.parentElement;
+			}
+			return target;
+		}
+
+		function getMatchedParents(target, property) {
+			let element = target, matchedParent, parents = [];
+			do {
+				const boundingRect = element.getBoundingClientRect();
+				if (element.parentElement && !element.parentElement.tagName.toLowerCase() != NOTE_TAGNAME && !element.classList.contains(MASK_CLASS)) {
+					const parentBoundingRect = element.parentElement.getBoundingClientRect();
+					matchedParent = Math.abs(parentBoundingRect[property] - boundingRect[property]) <= SELECT_PX_THRESHOLD;
+					if (matchedParent) {
+						if (element.parentElement.clientWidth > SELECT_PX_THRESHOLD && element.parentElement.clientHeight > SELECT_PX_THRESHOLD &&
+							((element.parentElement.clientWidth - element.clientWidth > SELECT_PX_THRESHOLD) || (element.parentElement.clientHeight - element.clientHeight > SELECT_PX_THRESHOLD))) {
+							parents.push(element.parentElement);
+						}
+						element = element.parentElement;
+					}
+				} else {
+					matchedParent = false;
+				}
+			} while (matchedParent && element);
+			return parents;
+		}
+
+		function determineTargetElement(roundingMethod, target, widthDistance, parents) {
+			if (Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) <= parents.length) {
+				target = parents[parents.length - Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) - 1];
+			}
+			return target;
+		}
+	}
+
+	function onMouseUp(event) {
+		if (highlightSelectionMode) {
+			highlightSelection();
+		}
+		if (removeHighlightMode) {
+			let element = event.target, done;
+			while (element && !done) {
+				if (element.classList.contains(HIGHLIGHT_CLASS)) {
+					document.querySelectorAll("." + HIGHLIGHT_CLASS + "[data-singlefile-highlight-id=" + JSON.stringify(element.dataset.singlefileHighlightId) + "]").forEach(highlightedElement => {
+						resetHighlightedElement(highlightedElement);
+					});
+					done = true;
+				}
+				element = element.parentElement;
+			}
+		}
+	}
+
+	function highlightSelection() {
+		let highlightId = 0;
+		document.querySelectorAll("." + HIGHLIGHT_CLASS).forEach(highlightedElement => highlightId = Math.max(highlightId, highlightedElement.dataset.singlefileHighlightId));
+		highlightId++;
+		const selection = window.getSelection();
+		for (let indexRange = 0; indexRange < selection.rangeCount; indexRange++) {
+			const range = selection.getRangeAt(indexRange);
+			if (!range.collapsed) {
+				const contents = range.extractContents();
+				highlightChildNodes(contents);
+				range.insertNode(contents);
+				range.collapse();
+			}
+		}
+
+		function highlightChildNodes(node) {
+			if (node.childNodes.length) {
+				node.childNodes.forEach(childNode => {
+					if (childNode.classList) {
+						resetHighlightedElement(childNode);
+						if (Array.from(childNode.childNodes).find(childNode => childNode.classList)) {
+							highlightChildNodes(childNode);
+						} else {
+							childNode.classList.add(HIGHLIGHT_CLASS);
+							childNode.classList.add(highlightColor);
+							childNode.dataset.singlefileHighlightId = highlightId;
+						}
+					} else {
+						highlightChildNodes(childNode);
+					}
+				});
+			} else if (node.textContent) {
+				const spanElement = document.createElement("span");
+				spanElement.classList.add(HIGHLIGHT_CLASS);
+				spanElement.classList.add(highlightColor);
+				spanElement.textContent = node.textContent;
+				spanElement.dataset.singlefileHighlightId = highlightId;
+				node.parentNode.replaceChild(spanElement, node);
+			}
+		}
+	}
+
+	function reflowNotes() {
+		document.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {
+			const noteElement = containerElement.shadowRoot.querySelector("." + NOTE_CLASS);
+			const noteBoundingRect = noteElement.getBoundingClientRect();
+			const anchorElement = getAnchorElement(containerElement);
+			const anchorBoundingRect = anchorElement.getBoundingClientRect();
+			const maxX = anchorBoundingRect.x + Math.max(0, anchorBoundingRect.width - noteBoundingRect.width);
+			const minX = anchorBoundingRect.x;
+			const maxY = anchorBoundingRect.y + Math.max(0, anchorBoundingRect.height - 20);
+			const minY = anchorBoundingRect.y;
+			let left = parseInt(noteElement.style.getPropertyValue("left"));
+			let top = parseInt(noteElement.style.getPropertyValue("top"));
+			if (noteBoundingRect.x > maxX) {
+				left -= noteBoundingRect.x - maxX;
+			}
+			if (noteBoundingRect.x < minX) {
+				left += minX - noteBoundingRect.x;
+			}
+			if (noteBoundingRect.y > maxY) {
+				top -= noteBoundingRect.y - maxY;
+			}
+			if (noteBoundingRect.y < minY) {
+				top += minY - noteBoundingRect.y;
+			}
+			if (fixedParent(anchorElement)) {
+				noteElement.style.setProperty("left", left + "px");
+				noteElement.style.setProperty("top", top + "px");
+				noteElement.style.setProperty("position", "fixed");
+			} else {
+				noteElement.style.setProperty("position", "absolute");
+				noteElement.style.setProperty("left", left + "px");
+				noteElement.style.setProperty("top", top + "px");
+			}
+		});
+	}
+
+	function resetHighlightedElement(element) {
+		element.classList.remove(HIGHLIGHT_CLASS);
+		element.classList.remove("single-file-highlight-yellow");
+		element.classList.remove("single-file-highlight-pink");
+		element.classList.remove("single-file-highlight-blue");
+		element.classList.remove("single-file-highlight-green");
+		delete element.dataset.singlefileHighlightId;
+	}
+
+	function serializeShadowRoots(node) {
+		node.querySelectorAll("*").forEach(element => {
+			if (element.shadowRoot) {
+				serializeShadowRoots(element.shadowRoot);
+				const templateElement = document.createElement("template");
+				templateElement.setAttribute(SHADOW_MODE_ATTRIBUTE_NAME, "open");
+				templateElement.appendChild(element.shadowRoot);
+				element.appendChild(templateElement);
+			}
+		});
+	}
+
+	function deserializeShadowRoots(node) {
+		node.querySelectorAll(`template[${SHADOW_MODE_ATTRIBUTE_NAME}]`).forEach(element => {
+			let shadowRoot = element.parentElement.shadowRoot;
+			if (shadowRoot) {
+				Array.from(element.childNodes).forEach(node => shadowRoot.appendChild(node));
+				element.remove();
+			} else {
+				shadowRoot = element.parentElement.attachShadow({ mode: "open" });
+				const contentDocument = (new DOMParser()).parseFromString(element.innerHTML, "text/html");
+				Array.from(contentDocument.head.childNodes).forEach(node => shadowRoot.appendChild(node));
+				Array.from(contentDocument.body.childNodes).forEach(node => shadowRoot.appendChild(node));
+			}
+			deserializeShadowRoots(shadowRoot);
+		});
+	}
+
+	function getMaskElement(className) {
+		let maskElement = document.documentElement.querySelector("." + className);
+		if (!maskElement) {
+			maskElement = document.createElement("div");
+			const maskContainerElement = document.createElement("div");
+			maskContainerElement.classList.add(MASK_CLASS);
+			const firstNote = document.querySelector(NOTE_TAGNAME);
+			if (firstNote && firstNote.parentElement == document.documentElement) {
+				document.documentElement.insertBefore(maskContainerElement, firstNote);
+			} else {
+				document.documentElement.appendChild(maskContainerElement);
+			}
+			maskElement.classList.add(className);
+			const maskShadow = maskContainerElement.attachShadow({ mode: "open" });
+			maskShadow.appendChild(getStyleElement(MASK_WEB_STYLESHEET));
+			maskShadow.appendChild(maskElement);
+			return maskElement;
+		}
+	}
+
+	function getEmbedScript() {
+		return minifyText(`(() => {
+			document.currentScript.remove();
+			const processNode = node => {
+				node.querySelectorAll("template[${SHADOW_MODE_ATTRIBUTE_NAME}]").forEach(element=>{
+					if (!element.parentElement.shadowRoot) {
+						const shadowRoot = element.parentElement.attachShadow({mode:element.getAttribute("${SHADOW_MODE_ATTRIBUTE_NAME}"),delegatesFocus:Boolean(element.getAttribute("${SHADOW_DELEGATE_FOCUS_ATTRIBUTE_NAME}"))});
+						shadowRoot.innerHTML = element.innerHTML;element.remove();
+						processNode(shadowRoot);
+					}
+				})
+			};
+			const SELF_CLOSED_TAG_NAMES = ${JSON.stringify(SELF_CLOSED_TAG_NAMES)};
+			const NOTE_TAGNAME = ${JSON.stringify(NOTE_TAGNAME)};
+			const NOTE_CLASS = ${JSON.stringify(NOTE_CLASS)};
+			const NOTE_ANCHORED_CLASS = ${JSON.stringify(NOTE_ANCHORED_CLASS)};
+			const NOTE_SELECTED_CLASS = ${JSON.stringify(NOTE_SELECTED_CLASS)};
+			const MASK_CLASS = ${JSON.stringify(MASK_CLASS)};
+			const HIGHLIGHT_CLASS = ${JSON.stringify(HIGHLIGHT_CLASS)};
+			const NOTES_WEB_STYLESHEET = ${JSON.stringify(NOTES_WEB_STYLESHEET)};
+			const MASK_WEB_STYLESHEET = ${JSON.stringify(MASK_WEB_STYLESHEET)};
+			const reflowNotes = ${minifyText(reflowNotes.toString())};
+			const fixedParent = ${minifyText(fixedParent.toString())};
+			const addNoteRef = ${minifyText(addNoteRef.toString())};
+			const deleteNoteRef = ${minifyText(deleteNoteRef.toString())};
+			const getNoteRefs = ${minifyText(getNoteRefs.toString())};
+			const setNoteRefs = ${minifyText(setNoteRefs.toString())};
+			const getAnchorElement = ${minifyText(getAnchorElement.toString())};
+			const getMaskElement = ${minifyText(getMaskElement.toString())};
+			const getStyleElement = ${minifyText(getStyleElement.toString())};
+			const attachNoteListeners = ${minifyText(attachNoteListeners.toString())};
+			const maskNoteElement = getMaskElement(${JSON.stringify(NOTE_MASK_CLASS)});
+			const maskPageElement = getMaskElement(${JSON.stringify(PAGE_MASK_CLASS)});
+			let selectedNote;
+			window.onresize = reflowNotes;
+			window.addEventListener("DOMContentLoaded", () => {
+				processNode(document);
+				reflowNotes();
+				document.querySelectorAll(${JSON.stringify(NOTE_TAGNAME)}).forEach(noteElement => attachNoteListeners(noteElement));
+			});
+		})()`);
+	}
+
+	function getStyleElement(stylesheet) {
+		const linkElement = document.createElement("style");
+		linkElement.textContent = stylesheet;
+		return linkElement;
+	}
+
+	function getAnchorElement(containerElement) {
+		return document.querySelector("[data-single-file-note-refs^=" + JSON.stringify(containerElement.dataset.noteId) + "], [data-single-file-note-refs$=" + JSON.stringify(containerElement.dataset.noteId) + "], [data-single-file-note-refs*=" + JSON.stringify("," + containerElement.dataset.noteId + ",") + "]");
+	}
+
+	function fixedParent(element) {
+		let positionFixed;
+		while (element && !positionFixed) {
+			positionFixed = getComputedStyle(element).position == "fixed";
+			if (positionFixed) {
+				return element;
+			} else {
+				element = element.parentElement;
+			}
+		}
+	}
+
+	function addNoteRef(anchorElement, noteId) {
+		const noteRefs = getNoteRefs(anchorElement);
+		noteRefs.push(noteId);
+		setNoteRefs(anchorElement, noteRefs);
+	}
+
+	function deleteNoteRef(containerElement, noteId) {
+		const anchorElement = getAnchorElement(containerElement);
+		const noteRefs = getNoteRefs(anchorElement).filter(noteRefs => noteRefs != noteId);
+		if (noteRefs.length) {
+			setNoteRefs(anchorElement, noteRefs);
+		} else {
+			delete anchorElement.dataset.singleFileNoteRefs;
+		}
+	}
+
+	function getNoteRefs(anchorElement) {
+		return JSON.parse("[" + (anchorElement.dataset.singleFileNoteRefs || "") + "]");
+	}
+
+	function setNoteRefs(anchorElement, noteRefs) {
+		anchorElement.dataset.singleFileNoteRefs = noteRefs.toString();
+	}
+
+	function minifyText(text) {
+		return text.replace(/[\n\t\s]+/g, " ");
+	}
+
+})();

+ 28 - 0
extension/ui/pages/editor-frame-web.css

@@ -0,0 +1,28 @@
+.single-file-highlight-yellow {
+    background-color: #ffff7c !important;
+    color: black !important;
+}
+
+.single-file-highlight-pink {
+    background-color: #ffbbb6 !important;
+    color: black !important;
+}
+
+.single-file-highlight-blue {
+    background-color: #95d0ff !important;
+    color: black !important;
+}
+
+.single-file-highlight-green {
+    background-color: #93ef8d !important;
+    color: black !important;
+}
+
+.single-file-highlight-hidden {
+    background-color: inherit !important;
+    color: inherit !important;
+}
+
+single-file-note {
+    all: initial !important;
+}

+ 25 - 0
extension/ui/pages/editor-mask-web.css

@@ -0,0 +1,25 @@
+.note-mask {
+    all: initial;
+    position: fixed;
+    z-index: 2147483645;
+    pointer-events: none;
+}
+
+.note-mask-moving {
+    background-color: rgba(236, 234, 234, 0.5);
+}
+
+.page-mask {
+    all: initial;
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 0;
+    height: 0;
+    z-index: 2147483646;
+}
+
+.page-mask-active {
+    width: 100vw;
+    height: 100vh;
+}

+ 155 - 0
extension/ui/pages/editor-note-web.css

@@ -0,0 +1,155 @@
+.note {
+    all: initial;
+    display: flex;
+    flex-direction: column;
+    height: 100px;
+    width: 100px;
+    position: absolute;
+    top: 10px;
+    left: 10px;
+    border: 1px solid rgb(191, 191, 191);
+    z-index: 2147483646;
+    box-shadow: 2px 2px 5px rgba(33, 33, 33, .7);
+    min-height: 50px;
+    min-width: 50px;
+}
+
+.note-selected {
+    z-index: 2147483647;
+}
+
+.note-closed {
+    height: 16px !important;
+    opacity: .5;
+    box-shadow: 1px 1px 2px rgba(33, 33, 33, .7);
+    min-height: 20px;
+    overflow: hidden;
+}
+
+.note-closed:hover {
+    opacity: .75;
+}
+
+.note-closed main {
+    display: none;
+}
+
+.note-hidden {
+    display: none;
+}
+
+.note main {
+    all: initial;
+    -moz-user-modify: read-write;
+    font-family: Arial, Helvetica, sans-serif;
+    font-size: 14px;
+    padding: 3px;
+    height: 100%;
+    overflow: auto;
+    -webkit-user-modify: read-write;
+    border: 1px solid transparent;
+}
+
+.note main:focus {
+    border: 1px dotted rgb(160, 160, 160);
+}
+
+.note header {
+    all: initial;
+    min-height: 20px;
+    cursor: grab;
+    user-select: none;
+}
+
+.note .note-remove {
+    all: initial;
+    position: absolute;
+    right: 0px;
+    top: 0px;
+    padding: 5px;
+    opacity: .5;
+    cursor: pointer;
+    user-select: none;
+}
+
+.note .note-anchor {
+    all: initial;
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    padding: 5px;
+    opacity: .25;
+    cursor: pointer;
+}
+
+.note .note-resize {
+    all: initial;
+    position: absolute;
+    bottom: -5px;
+    right: -5px;
+    height: 15px;
+    width: 15px;
+    cursor: nwse-resize;
+    user-select: none;
+}
+
+.note-closed .note-remove,
+.note-closed .note-anchor {
+    display: none;
+}
+
+.note .note-remove:hover {
+    opacity: 1;
+}
+
+.note .note-anchor:hover {
+    opacity: .5;
+}
+
+.note-anchored .note-anchor {
+    opacity: .5;
+}
+
+.note-anchored .note-anchor:hover {
+    opacity: 1;
+}
+
+.note-moving {
+    opacity: .5;
+}
+
+.note-moving * {
+    cursor: grabbing;
+}
+
+.note-yellow header {
+    background-color: #f5f545;
+}
+
+.note-yellow main {
+    background-color: #ffff7c;
+}
+
+.note-pink header {
+    background-color: #ffa59f;
+}
+
+.note-pink main {
+    background-color: #ffbbb6;
+}
+
+.note-blue header {
+    background-color: #84c8ff;
+}
+
+.note-blue main {
+    background-color: #95d0ff;
+}
+
+.note-green header {
+    background-color: #93ef8d;
+}
+
+.note-green main {
+    background-color: #9cff95;
+}

+ 96 - 0
extension/ui/pages/editor.css

@@ -0,0 +1,96 @@
+html,
+body {
+    height: 100%;
+}
+
+body {
+    margin: 0;
+    display: flex;
+    flex-direction: column;
+    user-select: none;
+}
+
+.toolbar {
+    background-color: #425c69;
+    border-bottom: 1px solid #6d6d6d;
+}
+
+img[type=button] {
+    margin-left: 1px;
+    margin-right: 1px;
+    margin-top: 5px;
+    margin-bottom: 4px;
+    opacity: .75;
+    cursor: pointer;
+}
+
+img[type=button]:hover {
+    opacity: 1;
+}
+
+img[type=button].edit-disabled,
+img[type=button].highlight-disabled,
+img[type=button].remove-highlight-disabled {
+    opacity: .25;
+}
+
+img[type=button].edit-disabled:hover,
+img[type=button].highlight-disabled:hover,
+img[type=button].remove-highlight-disabled:hover {
+    opacity: .5;
+}
+
+.buttons {
+    display: inline-block;
+}
+
+.separator {
+    display: inline-block;
+    width: 2px;
+    height: 22px;
+    background-color: #9ab0bb;
+    margin-left: 2px;
+    margin-right: 2px;
+    margin-top: 1px;
+    margin-bottom: 4px;
+}
+
+.editor {
+    flex: auto;
+    border: none;
+}
+
+@media (max-width: 420px) {
+    .separator {
+        display: none;
+    }
+}
+
+@media (orientation: landscape) {
+    body {
+        flex-direction: row;
+    }
+
+    .toolbar {
+        max-width: 32px;
+        border-bottom: 0px;
+        border-right: 1px solid #6d6d6d;
+    }
+
+    .separator {
+        margin-left: 4px;
+        width: 22px;
+        height: 2px;
+    }
+
+    img[type="button"] {
+        margin-left: 4px;
+        margin-bottom: 1px;
+    }
+
+    @media (max-height: 495px) {
+        .separator {
+            display: none;
+        }
+    }
+}

+ 57 - 0
extension/ui/pages/editor.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta charset="utf-8">
+	<link rel="stylesheet" href="editor.css">
+	<meta name="viewport" content="width=device-width,initial-scale=1">
+	<title>&nbsp;</title>
+</head>
+
+<body>
+	<div class="toolbar">
+		<div class="buttons">
+			<img type="button" class="add-note-yellow-button" src="/extension/ui/resources/button_note_yellow.png">
+			<img type="button" class="add-note-pink-button" src="/extension/ui/resources/button_note_pink.png">
+			<img type="button" class="add-note-blue-button" src="/extension/ui/resources/button_note_blue.png">
+			<img type="button" class="add-note-green-button" src="/extension/ui/resources/button_note_green.png">
+			<div class="separator"></div>
+		</div>
+		<div class="buttons">
+			<img type="button" class="highlight-button highlight-yellow-button highlight-disabled"
+				src="/extension/ui/resources/button_highlighter_yellow.png">
+			<img type="button" class="highlight-button highlight-pink-button highlight-disabled"
+				src="/extension/ui/resources/button_highlighter_pink.png">
+			<img type="button" class="highlight-button highlight-blue-button highlight-disabled"
+				src="/extension/ui/resources/button_highlighter_blue.png">
+			<img type="button" class="highlight-button highlight-green-button highlight-disabled"
+				src="/extension/ui/resources/button_highlighter_green.png">
+			<div class="separator"></div>
+		</div>
+		<div class="buttons">
+			<img type="button" class="toggle-notes-button" src="/extension/ui/resources/button_note_visible.png">
+			<img type="button" class="toggle-highlights-button"
+				src="/extension/ui/resources/button_highlighter_visible.png">
+			<img type="button" class="remove-highlight-button remove-highlight-disabled"
+				src="/extension/ui/resources/button_highlighter_delete.png">
+			<img type="button" class="edit-page-button edit-disabled" src="/extension/ui/resources/button_edit.png">
+			<div class="separator"></div>
+		</div>
+		<div class="buttons">
+			<img type="button" class="save-page-button" src="/extension/ui/resources/button_download.png">
+		</div>
+	</div>
+	<iframe class="editor"
+		srcdoc="&lt;!DOCTYPE html&gt; &lt;body&gt;&lt;script src=/extension/ui/content/content-ui-editor-web.js&gt;&lt;/script&gt;&lt;script src=/lib/single-file/index.js&gt;&lt;/script&gt;&lt;script src=/lib/single-file/modules/html-serializer.js&gt;&lt;/script&gt;&lt;/body&gt;"
+		sandbox="allow-scripts"></iframe>
+	<script type="text/javascript"
+		src="/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"></script>
+	<script src="/lib/single-file/index.js"></script>
+	<script src="/extension/lib/single-file/index.js"></script>
+	<script src="/extension/core/index.js"></script>
+	<script src="/extension/core/content/content-download.js"></script>
+	<script src="/extension/ui/index.js"></script>
+	<script src="/extension/ui/bg/ui-editor.js"></script>
+</body>
+
+</html>

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

@@ -123,6 +123,12 @@
 								a page having "Example Domain" as title.</li>
 						</ul>
 					</li>
+					<li data-options-label="openEditorLabel"> <span class="option">Option: edit page before
+							saving</span>
+						<p>Check this option to open the annotation editor before saving any page. Checking this option 
+							removes the entry "Annotate and save the page..." from the context menu.</p>
+						<p class="notice">It is recommended to <u>uncheck</u> this option</p>
+					</li>					
 					<li data-options-label="confirmInfobarLabel"> <span class="option">Option: open a prompt dialog to
 							edit the infobar content</span>
 						<p>Check this option to display a prompt dialog in order to confirm the infobar content before

+ 6 - 1
extension/ui/pages/options.html

@@ -42,6 +42,10 @@
 				<label for="infobarTemplateInput" id="infobarTemplateLabel"></label>
 				<input type="text" id="infobarTemplateInput">
 			</div>
+			<div class="option">
+				<label for="openEditorInput" id="openEditorLabel"></label>
+				<input type="checkbox" id="openEditorInput">
+			</div>
 			<div class="option">
 				<label for="confirmInfobarInput" id="confirmInfobarLabel"></label>
 				<input type="checkbox" id="confirmInfobarInput">
@@ -302,7 +306,8 @@
 			</form>
 		</div>
 	</main>
-	<script type="text/javascript" src="/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"></script>
+	<script type="text/javascript"
+		src="/extension/lib/single-file/browser-polyfill/chrome-browser-polyfill.js"></script>
 	<script type="text/javascript" src="../bg/ui-options.js"></script>
 </body>
 

BIN
extension/ui/resources/button_download.png


BIN
extension/ui/resources/button_edit.png


BIN
extension/ui/resources/button_highlighter_blue.png


BIN
extension/ui/resources/button_highlighter_delete.png


BIN
extension/ui/resources/button_highlighter_green.png


BIN
extension/ui/resources/button_highlighter_hidden.png


BIN
extension/ui/resources/button_highlighter_pink.png


BIN
extension/ui/resources/button_highlighter_visible.png


BIN
extension/ui/resources/button_highlighter_yellow.png


BIN
extension/ui/resources/button_note_blue.png


BIN
extension/ui/resources/button_note_green.png


BIN
extension/ui/resources/button_note_hidden.png


BIN
extension/ui/resources/button_note_pink.png


BIN
extension/ui/resources/button_note_visible.png


BIN
extension/ui/resources/button_note_yellow.png


+ 8 - 1
manifest.json

@@ -89,6 +89,7 @@
 			"extension/core/bg/downloads.js",
 			"extension/core/bg/autosave.js",
 			"extension/core/bg/devtools.js",
+			"extension/core/bg/editor.js",
 			"extension/ui/bg/ui-main.js",
 			"extension/ui/bg/ui-menus.js",
 			"extension/ui/bg/ui-commands.js",
@@ -133,9 +134,15 @@
 		}
 	},
 	"web_accessible_resources": [
+		"lib/single-file/index.js",
+		"lib/single-file/modules/html-serializer.js",
 		"lib/single-file/processors/hooks/content/content-hooks-web.js",
 		"lib/single-file/processors/hooks/content/content-hooks-frames-web.js",
-		"common/ui/content/content-infobar-web.js"
+		"common/ui/content/content-infobar-web.js",
+		"extension/ui/content/content-ui-editor-web.js",
+		"extension/ui/pages/editor-note-web.css",
+		"extension/ui/pages/editor-mask-web.css",
+		"extension/ui/pages/editor-frame-web.css"
 	],
 	"permissions": [
 		"menus",