diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 73fb09f..e8737c3 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1 +1 @@ -{"extensionName":{"message":"Tree Tabs"},"extDesc":{"message":"Manage your tabs in the sidebar!"},"OpenSidebar":{"message":"Open Tree Tabs"},"button_new":{"message":"Press left mouse button to open new tab. \nPress middle mouse button to clone the active tab. \nPress right mouse button to scroll the list to the active tab."},"button_pin":{"message":"Pin / Unpin current tab"},"button_undo":{"message":"Reopen last closed"},"button_reboot":{"message":"Reload Tree Tabs. Try this in case your tree hierarchy is lost after restart."},"button_detach":{"message":"Detach tab"},"button_move":{"message":"Detach tab"},"button_search":{"message":"Search tabs"},"button_tools":{"message":"Tools"},"button_groups":{"message":"Groups"},"filter_search_go_prev":{"message":"Previous search result"},"filter_search_go_next":{"message":"Next search result"},"button_bookmarks":{"message":"Unsorted bookmarks"},"button_downloads":{"message":"Downloads"},"button_history":{"message":"History"},"button_settings":{"message":"Settings"},"button_options":{"message":"Tree Tabs settings"},"button_extensions":{"message":"Extensions"},"button_unload":{"message":"Unload tabs"},"button_discard":{"message":"Unload tabs"},"button_filter_type":{"message":"Search titles or urls"},"button_groups_toolbar_hide":{"message":"Hide/Show Groups toolbar"},"button_new_group":{"message":"New group"},"button_remove_group":{"message":"Remove group.\nHold shift key to close tabs from this group"},"button_edit_group":{"message":"Rename group"},"button_import_group":{"message":"Import group"},"button_export_group":{"message":"Export group"},"button_backup":{"message":"Session"},"button_import_bak":{"message":"Import session"},"button_import_merge_bak":{"message":"Import and merge session.\nImporter will try to match current tabs with those from saved session, instead of opening a new window."},"button_export_bak":{"message":"Export session"},"button_load_bak1":{"message":"EMERGENCY if lost groupings: Load latest internal backup (autosave is made every 5 minutes)"},"button_load_bak2":{"message":"EMERGENCY if lost groupings: Load previous to latest internal backup (autosave is made every 10 minutes)"},"button_load_bak3":{"message":"EMERGENCY if lost groupings: Load oldest internal backup (autosave is made every 30 minutes)"},"button_folders":{"message":"Folders"},"button_new_folder":{"message":"New folder"},"button_remove_folder":{"message":"Remove selected folder/s"},"button_edit_folder":{"message":"Rename folder"},"menu_expand_all":{"message":"Expand all trees"},"menu_collapse_all":{"message":"Collapse all trees"},"menu_expand_tree":{"message":"Expand tree"},"menu_collapse_tree":{"message":"Collapse tree"},"menu_new_tab":{"message":"New tab"},"menu_new_pin":{"message":"New pinned tab"},"menu_duplicate_tab":{"message":"Duplicate"},"menu_detach_tab":{"message":"Detach"},"menu_reload_tab":{"message":"Reload"},"menu_pin_tab":{"message":"Pin"},"menu_mute_tab":{"message":"Mute"},"menu_mute_tree":{"message":"Mute tree"},"menu_unmute_tree":{"message":"Unmute tree"},"menu_unmute_tab":{"message":"Unmute"},"menu_mute_other":{"message":"Mute other"},"menu_unmute_other":{"message":"Unmute other"},"menu_unpin_tab":{"message":"Unpin"},"menu_close_tree":{"message":"Close tree"},"menu_close":{"message":"Close"},"menu_close_other":{"message":"Close other"},"menu_undo_close_tab":{"message":"Undo close"},"menu_treetabs_settings":{"message":"Settings"},"menu_unload":{"message":"Unload"},"menu_bookmark_tree":{"message":"Bookmark"},"menu_new_folder":{"message":"New folder"},"menu_rename_folder":{"message":"Rename folder"},"menu_delete_folder":{"message":"Delete"},"menu_new_group":{"message":"New group"},"menu_rename_group":{"message":"Rename"},"menu_delete_group":{"message":"Delete"},"menu_delete_group_tabs_close":{"message":"Delete with tabs"},"menu_groups_unload":{"message":"Unload"},"menu_bookmark_group":{"message":"Bookmark"},"menu_groups_hibernate":{"message":"Hibernate"},"menu_group_tabs_close":{"message":"Close tabs"},"status_bar_rearranging_tabs":{"message":"Rearranging tabs and folders"},"status_bar_rearranging_finished":{"message":"Rearranging: done."},"status_bar_loaded_tree_structure":{"message":"Loaded Tree structure..."},"status_bar_finding_ref_tabs":{"message":"Finding reference tabs..."},"status_bar_finding_other_windows":{"message":"Finding other windows to add tabs..."},"status_bar_all_done":{"message":"All done."},"status_bar_autosave":{"message":"Autosave: "},"status_bar_quick_check_recreate_structure":{"message":"Quick check and recreating structure..."},"options_vivaldi":{"message":" Vivaldi "},"opt_url_for_web_panel":{"message":"Url for the Web Panel"},"options_pinned":{"message":" Pinned tabs bar "},"options_pin_list_multi_row":{"message":"Multi row list"},"option_allow_pin_close":{"message":"Allow to close pinned tabs"},"option_pin_attention_blinking":{"message":"Blink pinned tabs that ask for attention"},"option_audio_blinking":{"message":"Blink audio indicator"},"options_tabs":{"message":" Tabs "},"options_syncro_tabbar_tabs_order":{"message":"Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_switch_with_scroll":{"message":"Switch tabs with mouse wheel"},"options_tab_group_regex":{"message":"Tab group assignments (Items matching the given pattern will be moved to the designated group. Pattern accepts regular expressions.)"},"option_tab_match":{"message":"Pattern"},"option_tab_group":{"message":"Group"},"options_orphaned_tabs_to_ungrouped":{"message":"Always place orphan tabs in the 'ungrouped' group"},"options_move_on_url_change":{"message":"Move tabs that match regexes"},"options_move_on_url_change_never":{"message":"never"},"options_move_on_url_change_from_empty":{"message":"when URL changes in Home tab (only Home tabs created by ctrl+t shortcut)"},"options_move_on_url_change_from_empty_b":{"message":"when URL changes in any Home tab"},"options_move_on_url_change_all_new":{"message":"when tab is created with a matching URL"},"options_move_on_url_change_always":{"message":"whenever URL changes to a matching pattern"},"options_always_show_close":{"message":"Show close button on all tabs and folders"},"options_never_show_close":{"message":"Never show close button (option above will be ignored)"},"options_collapse_other_trees":{"message":"Automatically collapse other trees on expand"},"options_open_tree_on_hover":{"message":"Auto expand collapsed trees when dragging and holding for a second over them"},"options_promote_children":{"message":"Promote children on close, if disabled, when closing the parent of a tree structure, all tabs and folders will be closed (be careful, because undo close tab will not recover the trees structure)"},"options_promote_children_in_first_child":{"message":"Promote first child as a parent"},"options_skip_load":{"message":"Discard tree structure after browser's restart, this option is for those who don't use browser's session. Basically it disables loading database at startup."},"options_midclick_tab":{"message":"Action for middle mouse click on tab"},"options_dbclick_tab":{"message":"Action for double click on tab"},"options_action_tab_none":{"message":"nothing"},"options_action_tab_new":{"message":"open new tab"},"options_action_tab_expand_collapse":{"message":"expand/collapse tree"},"options_action_tab_close":{"message":"close tab"},"options_action_tab_reload":{"message":"reload tab"},"options_action_tab_unload":{"message":"unload tab"},"options_action_tab_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_tab_undo_close":{"message":"reopen last closed tab"},"options_midclick_group":{"message":"Action for middle click on empty space on the left side or below the tabs"},"options_dbclick_group":{"message":"Action for double click on empty space on the left side or below the tabs"},"options_action_group_none":{"message":"nothing"},"options_action_group_new":{"message":"open new tab"},"options_action_group_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_group_undo_close_tab":{"message":"reopen last closed tab"},"options_append_pinned_tab":{"message":"Place pinned tabs"},"options_append_pinned_tab_first":{"message":"as first"},"options_append_pinned_tab_after":{"message":"after opener, or active"},"options_append_pinned_tab_last":{"message":"as last"},"options_append_child_tab":{"message":"Place children tabs"},"options_append_child_tab_top":{"message":"at the top (reverse hierarchy)"},"options_append_child_tab_bottom":{"message":" at the bottom"},"options_append_child_tab_after":{"message":"after parent tab (no automatic tree)"},"options_append_orphan_tab":{"message":"Append orphan tabs"},"options_append_orphan_tab_top":{"message":"at the top of the group"},"options_append_orphan_tab_after_active":{"message":"after active tab"},"options_append_orphan_tab_bottom":{"message":"at the bottom of the group"},"options_append_orphan_tab_as_child":{"message":"treat as active's tab child"},"options_append_orphan_tab_active_parent_top":{"message":"at the same level as active tab, but on top"},"options_append_orphan_tab_active_parent_bottom":{"message":"at the same level as active tab, but on bottom"},"options_toolbar_new_tab":{"message":"Toolbar + (new tab button) should append tab"},"options_toolbar_new_tab_as_regular_orphan":{"message":"as a regular orphan tab (option above)"},"options_toolbar_new_tab_root_of_group":{"message":"at the bottom of the group"},"options_after_closing_active_tab":{"message":"After closing active tab,"},"options_after_closing_active_tab_go_up":{"message":"activate tab above"},"options_after_closing_active_tab_go_down":{"message":"activate tab below"},"options_after_closing_active_tab_go_up_seek_in_parent":{"message":"activate tab above if on the same level"},"options_after_closing_active_tab_go_down_seek_in_parent":{"message":"activate tab below if on the same level"},"options_after_closing_active_tab_go_browser":{"message":"let browser activate tab"},"options_append_child_tab_after_limit":{"message":"Once reached maximum tree depth, place tab on the same level, but"},"options_append_child_tab_after_limit_top":{"message":"at the top"},"options_append_child_tab_after_limit_after":{"message":"after parent"},"options_append_child_tab_after_limit_bottom":{"message":"at the bottom"},"options_show_counter_tabs":{"message":"Show children tabs count on tabs and folders titles"},"options_show_counter_tabs_hints":{"message":"Show children tabs count in tabs and folders hints"},"options_max_tree_depth":{"message":"Maximum tree depth: set it to -1 for unlimited branches, 0 for flat tabs placement (no trees), any number above 0 will be its maximum"},"options_max_tree_drag_drop":{"message":"Limit Drag&Drop to tree's maximum depth, so you can't drop tabs beyond maximum depth"},"options_groups":{"message":"Groups"},"options_show_counter_groups":{"message":"Show tabs count on groups"},"options_groups_toolbar_default":{"message":"Show groups toolbar in new windows"},"options_syncro_tabbar_groups_tabs_order":{"message":"Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_hide_other_groups_tabs_firefox":{"message":"Show Firefox tabs from current group only. Requires change in about:config, find 'extensions.webextensions.tabhide.enabled' and set it to true."},"options_folders":{"message":"Folders"},"options_midclick_folder":{"message":"Action for middle mouse click on folder"},"options_dbclick_folder":{"message":"Action for double click on folder"},"options_action_folder_none":{"message":"nothing"},"options_action_folder_rename":{"message":"rename folder"},"options_action_folder_new_folder":{"message":"open new folder"},"options_action_folder_new_tab":{"message":"open new tab"},"options_action_folder_expand_collapse":{"message":"expand/collapse tree"},"options_action_folder_close":{"message":"close folder"},"options_action_folder_unload":{"message":"unload tabs in folder"},"options_global":{"message":"Global"},"options_theme":{"message":"Theme"},"options_rename_theme_button":{"message":"Rename"},"options_add_theme_button":{"message":"Add new"},"options_remove_theme_button":{"message":"Remove"},"options_import_theme_button":{"message":"Import"},"options_export_theme_button":{"message":"Export"},"options_share_theme_link":{"message":"Get more!"},"options_toolbar":{"message":" Toolbar "},"options_available_buttons":{"message":"Drag and drop buttons to arrange them, drop to the green box, buttons you don't want to use"},"options_reset_toolbar_button":{"message":"Reset toolbar"},"options_export_debug":{"message":"Export log file"},"options_print_debug":{"message":"Load log from file"},"options_toolbar_look":{"message":" Toolbar's look "},"hint_orphan_tab":{"message":"Orphan tab is a tab opened from an external source, which can be:"},"hint_ctrl_t":{"message":"ctrl+t shortcut"},"hint_from_pin":{"message":"link that opens new tab from pinned tab"},"hint_from_bookmark":{"message":"bookmark"},"hint_from_external_link":{"message":"external link"},"hint_from_popup":{"message":"popup opened as a tab (settings in browser, popup blocker or anything that redirects popups to new tabs)"},"hint_explained_new_tab_settings":{"message":"+ button in the Tree Tabs toolbar"},"hint_explained_orphan_after_active_settings":{"message":"If set to 'after active tab' and active tab is not in current group, tab will append to the root of the active group instead."},"button_background":{"message":"Toolbar buttons background"},"button_hover_background":{"message":"Toolbar buttons background, on mouse hover"},"button_on_background":{"message":"Toolbar active buttons background"},"button_icons":{"message":"Toolbar buttons icon color"},"button_icons_hover":{"message":"Toolbar buttons icon color, on mouse hover"},"button_on_icons":{"message":"Toolbar active buttons icon color"},"button_border":{"message":"Toolbar buttons border color"},"button_hover_border":{"message":"Toolbar buttons border color, on mouse hover"},"filter_box_font":{"message":"Search box, font color"},"filter_box_background":{"message":"Search box, font background color"},"filter_box_border":{"message":"Search box, border color"},"filter_clear_icon":{"message":"Clear search result x button color"},"toolbar_background":{"message":"Toolbar background color"},"toolbar_shelf_background":{"message":"Toolbar's shelf background color"},"toolbar_border_bottom":{"message":"Toolbar borders color"},"button_shelf_background":{"message":"Toolbar's shelf buttons background color"},"button_shelf_hover_background":{"message":"Toolbar's shelf buttons background color, on mouse hover"},"button_shelf_icons":{"message":"Toolbar's shelf buttons icon color"},"button_shelf_icons_hover":{"message":"Toolbar's shelf buttons icon color, on mouse hover"},"button_shelf_border":{"message":"Toolbar's shelf buttons border color"},"button_shelf_hover_border":{"message":"Toolbar's shelf buttons border color, on mouse hover"},"options_theme_tabs":{"message":" Tabs look "},"options_tabs_margin_overlap":{"message":"Tabs spacing:\nOverlap 1px, best for themes with borders"},"options_tabs_margin_0":{"message":"Tabs spacing:\nNo spacing, best for flat look"},"options_tabs_margin_1":{"message":"Tabs spacing:\nDefault, 1px between tabs"},"options_tab_list_scrollbar_width_down":{"message":"Decrease scrollbars width"},"options_tab_list_scrollbar_width_up":{"message":"Increase scrollbars width"},"options_tab_list_scrollbar_height_down":{"message":"Decrease scrollbars height"},"options_tab_list_scrollbar_height_up":{"message":"Increase scrollbars height"},"options_tabs_indentation_down":{"message":"Decrease tabs indentation"},"options_tabs_indentation_up":{"message":"Increase tabs indentation"},"options_tabs_roundness_down":{"message":"Make tabs corners more square"},"options_tabs_roundness_up":{"message":"Make tabs rounder"},"options_tabs_size_down":{"message":"Decrease tabs size"},"options_tabs_size_up":{"message":"Increase tabs size"},"options_theme_tabs_sample_text_normal":{"message":"Normal"},"options_theme_tabs_sample_text_normal_hover":{"message":"Normal, mouse hover over"},"options_theme_tabs_sample_text_normal_selected":{"message":"Normal selected"},"options_theme_tabs_sample_text_normal_selected_hover":{"message":"Normal selected, mouse hover over"},"options_theme_tabs_sample_text_active":{"message":"Active"},"options_theme_tabs_sample_text_active_hover":{"message":"Active, mouse hover over"},"options_theme_tabs_sample_text_active_selected":{"message":"Active and selected"},"options_theme_tabs_sample_text_active_selected_hover":{"message":"Active and selected, mouse hover over"},"options_theme_tabs_sample_text_discarded":{"message":"Unloaded (discarded)"},"options_theme_tabs_sample_text_discarded_hover":{"message":"Unloaded, mouse hover over"},"options_theme_tabs_sample_text_discarded_selected":{"message":"Unloaded and selected"},"options_theme_tabs_sample_text_discarded_selected_hover":{"message":"Unloaded and selected, mouse hover over"},"options_theme_tabs_sample_text_search_result":{"message":"Search result"},"options_theme_tabs_sample_text_search_result_hover":{"message":"Search result, mouse hover over"},"options_theme_tabs_sample_text_search_result_active":{"message":"Search result active"},"options_theme_tabs_sample_text_search_result_active_hover":{"message":"Search result active, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected":{"message":"Search result selected"},"options_theme_tabs_sample_text_search_result_selected_hover":{"message":"Search result selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected_active":{"message":"Search result selected, active"},"options_theme_tabs_sample_text_search_result_selected_active_hover":{"message":"Search result selected, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted":{"message":"Search result highlighted"},"options_theme_tabs_sample_text_search_result_highlighted_hover":{"message":"Search result highlighted, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_active":{"message":"Search result highlighted, active"},"options_theme_tabs_sample_text_search_result_highlighted_active_hover":{"message":"Search result highlighted, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected":{"message":"Search result highlighted, selected"},"options_theme_tabs_sample_text_search_result_highlighted_selected_hover":{"message":"Search result highlighted, selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active":{"message":"Search result highlighted, selected, active"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":{"message":"Search result highlighted, selected, active, mouse hover over"},"attention_background":{"message":"Tabs blinking for attention, background color"},"attention_border":{"message":"Tabs blinking for attention, border color"},"pin_list_border_bottom":{"message":"Pinned tabs list, border at the bottom color"},"pin_list_background":{"message":"Pinned tabs list, background color"},"folder_icon_open":{"message":"Open folder icon"},"folder_icon_closed":{"message":"Empty or closed folder icon"},"folder_icon_hover":{"message":"Folder icon on mouse hover"},"expand_open_background":{"message":"Open tree indicator"},"expand_closed_background":{"message":"Closed tree indicator"},"expand_hover_background":{"message":"Tree indicator on mouse hover"},"group_list_button_hover_background":{"message":"Group on mouse hover"},"group_list_borders":{"message":"Group list border"},"group_list_default_font_color":{"message":"Group list default font color"},"group_list_background":{"message":"Group list background color"},"tab_list_background":{"message":"Tabs background color"},"drag_indicator":{"message":"Drag&Drop indicator"},"close_x":{"message":"x inside the close button"},"close_hover_x":{"message":"x inside the close button, on mouse hover"},"close_hover_border":{"message":"close button border, on mouse hover"},"close_hover_background":{"message":"close button box color, on mouse hover"},"scrollbar_thumb":{"message":"Scrollbar thumb"},"scrollbar_thumb_hover":{"message":"Scrollbar thumb, on mouse hover"},"scrollbar_track":{"message":"Scrollbar track"},"options_example_menu_item":{"message":"menu item"},"options_menu":{"message":" Menu "},"tabs_menu_hover_border":{"message":"menu item border, on mouse hover"},"tabs_menu_hover_background":{"message":"menu item background, on mouse hover"},"tabs_menu_separator":{"message":"menu separator"},"tabs_menu_font":{"message":"menu text color"},"tabs_menu_border":{"message":"menu border"},"tabs_menu_background":{"message":"menu background"},"options_there_is_a_theme_with_this_name":{"message":"Theme with this name already exists, try a new name"},"options_theme_name_cannot_be_empty":{"message":"Theme name cannot be empty, enter some name"},"options_no_theme_to_export":{"message":"No theme to export, maybe add a new one :)"},"options_loaded_theme_older_version":{"message":"Looks like loaded theme was saved in older version of the extension, some colors or options might be missing"},"options_loaded_theme_newer_version":{"message":"Looks like loaded theme was saved in a newer version of the extension, can't load!"},"options_vivaldi_copied_url":{"message":"Web Panel Url has been copied to clipboard, add a new Web Panel and paste url."},"options_copied_wallet_address":{"message":"Wallet address has been copied to clipboard"},"options_clear_data":{"message":"Sidebar is not loading? Reset! ATTENTION! All options and saved Themes will be lost!"},"options_development":{"message":"Development"},"options_debug":{"message":"Debug"},"group_edit_button_cancel":{"message":"Cancel"},"group_edit_button_confirm":{"message":"Ok"},"folder_edit_button_cancel":{"message":"Cancel"},"folder_edit_button_confirm":{"message":"Ok"},"manager_window_button_label_import_group":{"message":"Import group"},"manager_window_button_label_import_session":{"message":"Import session"},"manager_window_button_label_save_current_session":{"message":"Save current session"},"caption_ungrouped_group":{"message":"Ungrouped"},"caption_noname_group":{"message":"untitled"},"caption_clear_filter":{"message":"Clear search results"},"caption_loading":{"message":"Loading..."},"caption_searchbox":{"message":" Search tabs..."},"manager_window_header_title":{"message":"Manager"},"menu_manager_window":{"message":"Open manager"},"button_manager_window":{"message":"Open manager window"},"manager_window_groups_button":{"message":"Hibernated groups"},"manager_window_sessions_button":{"message":"Saved sessions"},"manager_window_autosave_button":{"message":"Auto saved sessions"},"manager_window_button_label_hibernate_group":{"message":"Hibernate current group"},"manager_window_autosessions_maximum_saves_label":{"message":"Number of autosaves to keep:"},"manager_window_autosessions_save_timer_label":{"message":"Autosave every (minutes):"},"manager_window_delete_icon":{"message":"Remove"},"manager_window_savetofile_icon":{"message":"Save to file"},"manager_window_merge_icon":{"message":"Load and merge"},"manager_window_load_icon":{"message":"Load"},"options_Remove_button":{"message":"Remove"},"add_tab_group_regex":{"message":"Add"},"menu_unload_tree":{"message":"Unload tree"}} \ No newline at end of file +{"extensionName":{"message":"Tree Tabs"},"extDesc":{"message":"Manage your tabs in the sidebar!"},"OpenSidebar":{"message":"Open Tree Tabs"},"button_new":{"message":"Press left mouse button to open new tab. \nPress middle mouse button to clone the active tab. \nPress right mouse button to scroll the list to the active tab."},"button_pin":{"message":"Pin / Unpin current tab"},"button_undo":{"message":"Reopen last closed"},"button_reboot":{"message":"Reload Tree Tabs. Try this in case your tree hierarchy is lost after restart."},"button_detach":{"message":"Detach tab"},"button_move":{"message":"Detach tab"},"button_search":{"message":"Search tabs"},"button_tools":{"message":"Tools"},"button_groups":{"message":"Groups"},"filter_search_go_prev":{"message":"Previous search result"},"filter_search_go_next":{"message":"Next search result"},"button_bookmarks":{"message":"Unsorted bookmarks"},"button_downloads":{"message":"Downloads"},"button_history":{"message":"History"},"button_settings":{"message":"Settings"},"button_options":{"message":"Tree Tabs settings"},"button_extensions":{"message":"Extensions"},"button_unload":{"message":"Unload tabs"},"button_discard":{"message":"Unload tabs"},"button_filter_type":{"message":"Search titles or urls"},"button_groups_toolbar_hide":{"message":"Hide/Show Groups toolbar"},"button_new_group":{"message":"New group"},"button_remove_group":{"message":"Remove group.\nHold shift key to close tabs from this group"},"button_edit_group":{"message":"Rename group"},"button_import_group":{"message":"Import group"},"button_export_group":{"message":"Export group"},"button_backup":{"message":"Session"},"button_import_bak":{"message":"Import session"},"button_import_merge_bak":{"message":"Import and merge session.\nImporter will try to match current tabs with those from saved session, instead of opening a new window."},"button_export_bak":{"message":"Export session"},"button_load_bak1":{"message":"EMERGENCY if lost groupings: Load latest internal backup (autosave is made every 5 minutes)"},"button_load_bak2":{"message":"EMERGENCY if lost groupings: Load previous to latest internal backup (autosave is made every 10 minutes)"},"button_load_bak3":{"message":"EMERGENCY if lost groupings: Load oldest internal backup (autosave is made every 30 minutes)"},"button_folders":{"message":"Folders"},"button_new_folder":{"message":"New folder"},"button_remove_folder":{"message":"Remove selected folder/s"},"button_edit_folder":{"message":"Rename folder"},"menu_expand_all":{"message":"Expand all trees"},"menu_collapse_all":{"message":"Collapse all trees"},"menu_expand_tree":{"message":"Expand tree"},"menu_collapse_tree":{"message":"Collapse tree"},"menu_new_tab":{"message":"New tab"},"menu_new_pin":{"message":"New pinned tab"},"menu_duplicate_tab":{"message":"Duplicate"},"menu_detach_tab":{"message":"Detach"},"menu_reload_tab":{"message":"Reload"},"menu_pin_tab":{"message":"Pin"},"menu_mute_tab":{"message":"Mute"},"menu_mute_tree":{"message":"Mute tree"},"menu_unmute_tree":{"message":"Unmute tree"},"menu_unmute_tab":{"message":"Unmute"},"menu_mute_other":{"message":"Mute other"},"menu_unmute_other":{"message":"Unmute other"},"menu_unpin_tab":{"message":"Unpin"},"menu_close_tree":{"message":"Close tree"},"menu_close":{"message":"Close"},"menu_close_other":{"message":"Close other"},"menu_undo_close_tab":{"message":"Undo close"},"menu_treetabs_settings":{"message":"Settings"},"menu_unload":{"message":"Unload"},"menu_bookmark_tree":{"message":"Bookmark"},"menu_new_folder":{"message":"New folder"},"menu_rename_folder":{"message":"Rename folder"},"menu_delete_folder":{"message":"Delete"},"menu_new_group":{"message":"New group"},"menu_rename_group":{"message":"Rename"},"menu_delete_group":{"message":"Delete"},"menu_delete_group_tabs_close":{"message":"Delete with tabs"},"menu_groups_unload":{"message":"Unload"},"menu_bookmark_group":{"message":"Bookmark"},"menu_groups_hibernate":{"message":"Hibernate"},"menu_group_tabs_close":{"message":"Close tabs"},"status_bar_rearranging_tabs":{"message":"Rearranging tabs and folders"},"status_bar_rearranging_finished":{"message":"Rearranging: done."},"status_bar_loaded_tree_structure":{"message":"Loaded Tree structure..."},"status_bar_finding_ref_tabs":{"message":"Finding reference tabs..."},"status_bar_finding_other_windows":{"message":"Finding other windows to add tabs..."},"status_bar_all_done":{"message":"All done."},"status_bar_autosave":{"message":"Autosave: "},"status_bar_quick_check_recreate_structure":{"message":"Quick check and recreating structure..."},"options_vivaldi":{"message":" Vivaldi "},"opt_url_for_web_panel":{"message":"Url for the Web Panel"},"options_pinned":{"message":" Pinned tabs bar "},"options_pin_list_multi_row":{"message":"Multi row list"},"option_allow_pin_close":{"message":"Allow to close pinned tabs"},"option_pin_attention_blinking":{"message":"Blink pinned tabs that ask for attention"},"option_audio_blinking":{"message":"Blink audio indicator"},"options_tabs":{"message":" Tabs "},"options_syncro_tabbar_tabs_order":{"message":"Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_switch_with_scroll":{"message":"Switch tabs with mouse wheel"},"options_tab_group_regex":{"message":"Tab group assignments (Items matching the given pattern will be moved to the designated group. Pattern accepts regular expressions.)"},"option_tab_match":{"message":"Pattern"},"option_tab_group":{"message":"Group"},"options_orphaned_tabs_to_ungrouped":{"message":"Always place orphan tabs in the 'ungrouped' group"},"options_move_on_url_change":{"message":"Move tabs that match regexes"},"options_move_on_url_change_never":{"message":"never"},"options_move_on_url_change_from_empty":{"message":"when URL changes in Home tab (only Home tabs created by ctrl+t shortcut)"},"options_move_on_url_change_from_empty_b":{"message":"when URL changes in any Home tab"},"options_move_on_url_change_all_new":{"message":"when tab is created with a matching URL"},"options_move_on_url_change_always":{"message":"whenever URL changes to a matching pattern"},"options_always_show_close":{"message":"Show close button on all tabs and folders"},"options_never_show_close":{"message":"Never show close button (option above will be ignored)"},"options_collapse_other_trees":{"message":"Automatically collapse other trees on expand"},"options_open_tree_on_hover":{"message":"Auto expand collapsed trees when dragging and holding for a second over them"},"options_promote_children":{"message":"Promote children on close, if disabled, when closing the parent of a tree structure, all tabs and folders will be closed (be careful, because undo close tab will not recover the trees structure)"},"options_promote_children_in_first_child":{"message":"Promote first child as a parent"},"options_skip_load":{"message":"Discard tree structure after browser's restart, this option is for those who don't use browser's session. Basically it disables loading database at startup."},"options_midclick_tab":{"message":"Action for middle mouse click on tab"},"options_dbclick_tab":{"message":"Action for double click on tab"},"options_action_tab_none":{"message":"nothing"},"options_action_tab_new":{"message":"open new tab"},"options_action_tab_expand_collapse":{"message":"expand/collapse tree"},"options_action_tab_close":{"message":"close tab"},"options_action_tab_reload":{"message":"reload tab"},"options_action_tab_unload":{"message":"unload tab"},"options_action_tab_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_tab_undo_close":{"message":"reopen last closed tab"},"options_midclick_group":{"message":"Action for middle click on empty space on the left side or below the tabs"},"options_dbclick_group":{"message":"Action for double click on empty space on the left side or below the tabs"},"options_action_group_none":{"message":"nothing"},"options_action_group_new":{"message":"open new tab"},"options_action_group_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_group_undo_close_tab":{"message":"reopen last closed tab"},"options_append_pinned_tab":{"message":"Place pinned tabs"},"options_append_pinned_tab_first":{"message":"as first"},"options_append_pinned_tab_after":{"message":"after opener, or active"},"options_append_pinned_tab_last":{"message":"as last"},"options_append_child_tab":{"message":"Place children tabs"},"options_append_child_tab_top":{"message":"at the top (reverse hierarchy)"},"options_append_child_tab_bottom":{"message":" at the bottom"},"options_append_child_tab_after":{"message":"after parent tab (no automatic tree)"},"options_append_orphan_tab":{"message":"Append orphan tabs"},"options_append_orphan_tab_top":{"message":"at the top of the group"},"options_append_orphan_tab_after_active":{"message":"after active tab"},"options_append_orphan_tab_bottom":{"message":"at the bottom of the group"},"options_append_orphan_tab_as_child":{"message":"treat as active's tab child"},"options_append_orphan_tab_active_parent_top":{"message":"at the same level as active tab, but on top"},"options_append_orphan_tab_active_parent_bottom":{"message":"at the same level as active tab, but on bottom"},"options_toolbar_new_tab":{"message":"Toolbar + (new tab button) should append tab"},"options_toolbar_new_tab_as_regular_orphan":{"message":"as a regular orphan tab (option above)"},"options_toolbar_new_tab_root_of_group":{"message":"at the bottom of the group"},"options_after_closing_active_tab":{"message":"After closing active tab,"},"options_after_closing_active_tab_go_up":{"message":"activate tab above"},"options_after_closing_active_tab_go_down":{"message":"activate tab below"},"options_after_closing_active_tab_go_up_seek_in_parent":{"message":"activate tab above if on the same level"},"options_after_closing_active_tab_go_down_seek_in_parent":{"message":"activate tab below if on the same level"},"options_after_closing_active_tab_go_browser":{"message":"let browser activate tab"},"options_append_child_tab_after_limit":{"message":"Once reached maximum tree depth, place tab on the same level, but"},"options_append_child_tab_after_limit_top":{"message":"at the top"},"options_append_child_tab_after_limit_after":{"message":"after parent"},"options_append_child_tab_after_limit_bottom":{"message":"at the bottom"},"options_show_counter_tabs":{"message":"Show children tabs count on tabs and folders titles"},"options_show_counter_tabs_hints":{"message":"Show children tabs count in tabs and folders hints"},"options_max_tree_depth":{"message":"Maximum tree depth: set it to -1 for unlimited branches, 0 for flat tabs placement (no trees), any number above 0 will be its maximum"},"options_max_tree_drag_drop":{"message":"Limit Drag&Drop to tree's maximum depth, so you can't drop tabs beyond maximum depth"},"options_groups":{"message":"Groups"},"options_show_counter_groups":{"message":"Show tabs count on groups"},"options_groups_toolbar_default":{"message":"Show groups toolbar in new windows"},"options_syncro_tabbar_groups_tabs_order":{"message":"Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_hide_other_groups_tabs_firefox":{"message":"Show Firefox tabs from current group only. Requires change in about:config, find 'extensions.webextensions.tabhide.enabled' and set it to true."},"options_folders":{"message":"Folders"},"options_midclick_folder":{"message":"Action for middle mouse click on folder"},"options_dbclick_folder":{"message":"Action for double click on folder"},"options_action_folder_none":{"message":"nothing"},"options_action_folder_rename":{"message":"rename folder"},"options_action_folder_new_folder":{"message":"open new folder"},"options_action_folder_new_tab":{"message":"open new tab"},"options_action_folder_expand_collapse":{"message":"expand/collapse tree"},"options_action_folder_close":{"message":"close folder"},"options_action_folder_unload":{"message":"unload tabs in folder"},"options_global":{"message":"Global"},"options_theme":{"message":"Theme"},"options_rename_theme_button":{"message":"Rename"},"options_add_theme_button":{"message":"Add new"},"options_remove_theme_button":{"message":"Remove"},"options_import_theme_button":{"message":"Import"},"options_export_theme_button":{"message":"Export"},"options_share_theme_link":{"message":"Get more!"},"options_toolbar":{"message":" Toolbar "},"options_available_buttons":{"message":"Drag and drop buttons to arrange them, drop to the green box, buttons you don't want to use"},"options_reset_toolbar_button":{"message":"Reset toolbar"},"options_export_debug":{"message":"Export log file"},"options_print_debug":{"message":"Load log from file"},"options_toolbar_look":{"message":" Toolbar's look "},"hint_orphan_tab":{"message":"Orphan tab is a tab opened from an external source, which can be:"},"hint_ctrl_t":{"message":"ctrl+t shortcut"},"hint_from_pin":{"message":"link that opens new tab from pinned tab"},"hint_from_bookmark":{"message":"bookmark"},"hint_from_external_link":{"message":"external link"},"hint_from_popup":{"message":"popup opened as a tab (settings in browser, popup blocker or anything that redirects popups to new tabs)"},"hint_explained_new_tab_settings":{"message":"+ button in the Tree Tabs toolbar"},"hint_explained_orphan_after_active_settings":{"message":"If set to 'after active tab' and active tab is not in current group, tab will append to the root of the active group instead."},"button_background":{"message":"Toolbar buttons background"},"button_hover_background":{"message":"Toolbar buttons background, on mouse hover"},"button_on_background":{"message":"Toolbar active buttons background"},"button_icons":{"message":"Toolbar buttons icon color"},"button_icons_hover":{"message":"Toolbar buttons icon color, on mouse hover"},"button_on_icons":{"message":"Toolbar active buttons icon color"},"button_border":{"message":"Toolbar buttons border color"},"button_hover_border":{"message":"Toolbar buttons border color, on mouse hover"},"filter_box_font":{"message":"Search box, font color"},"filter_box_background":{"message":"Search box, font background color"},"filter_box_border":{"message":"Search box, border color"},"filter_clear_icon":{"message":"Clear search result x button color"},"toolbar_background":{"message":"Toolbar background color"},"toolbar_shelf_background":{"message":"Toolbar's shelf background color"},"toolbar_border_bottom":{"message":"Toolbar borders color"},"button_shelf_background":{"message":"Toolbar's shelf buttons background color"},"button_shelf_hover_background":{"message":"Toolbar's shelf buttons background color, on mouse hover"},"button_shelf_icons":{"message":"Toolbar's shelf buttons icon color"},"button_shelf_icons_hover":{"message":"Toolbar's shelf buttons icon color, on mouse hover"},"button_shelf_border":{"message":"Toolbar's shelf buttons border color"},"button_shelf_hover_border":{"message":"Toolbar's shelf buttons border color, on mouse hover"},"options_theme_tabs":{"message":" Tabs look "},"options_tabs_margin_overlap":{"message":"Tabs spacing:\nOverlap 1px, best for themes with borders"},"options_tabs_margin_0":{"message":"Tabs spacing:\nNo spacing, best for flat look"},"options_tabs_margin_1":{"message":"Tabs spacing:\nDefault, 1px between tabs"},"options_tab_list_scrollbar_width_down":{"message":"Decrease scrollbars width"},"options_tab_list_scrollbar_width_up":{"message":"Increase scrollbars width"},"options_tab_list_scrollbar_height_down":{"message":"Decrease scrollbars height"},"options_tab_list_scrollbar_height_up":{"message":"Increase scrollbars height"},"options_tabs_indentation_down":{"message":"Decrease tabs indentation"},"options_tabs_indentation_up":{"message":"Increase tabs indentation"},"options_tabs_roundness_down":{"message":"Make tabs corners more square"},"options_tabs_roundness_up":{"message":"Make tabs rounder"},"options_tabs_size_down":{"message":"Decrease tabs size"},"options_tabs_size_up":{"message":"Increase tabs size"},"options_theme_tabs_sample_text_normal":{"message":"Normal"},"options_theme_tabs_sample_text_normal_hover":{"message":"Normal, mouse hover over"},"options_theme_tabs_sample_text_normal_selected":{"message":"Normal selected"},"options_theme_tabs_sample_text_normal_selected_hover":{"message":"Normal selected, mouse hover over"},"options_theme_tabs_sample_text_active":{"message":"Active"},"options_theme_tabs_sample_text_active_hover":{"message":"Active, mouse hover over"},"options_theme_tabs_sample_text_active_selected":{"message":"Active and selected"},"options_theme_tabs_sample_text_active_selected_hover":{"message":"Active and selected, mouse hover over"},"options_theme_tabs_sample_text_discarded":{"message":"Unloaded (discarded)"},"options_theme_tabs_sample_text_discarded_hover":{"message":"Unloaded, mouse hover over"},"options_theme_tabs_sample_text_discarded_selected":{"message":"Unloaded and selected"},"options_theme_tabs_sample_text_discarded_selected_hover":{"message":"Unloaded and selected, mouse hover over"},"options_theme_tabs_sample_text_search_result":{"message":"Search result"},"options_theme_tabs_sample_text_search_result_hover":{"message":"Search result, mouse hover over"},"options_theme_tabs_sample_text_search_result_active":{"message":"Search result active"},"options_theme_tabs_sample_text_search_result_active_hover":{"message":"Search result active, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected":{"message":"Search result selected"},"options_theme_tabs_sample_text_search_result_selected_hover":{"message":"Search result selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected_active":{"message":"Search result selected, active"},"options_theme_tabs_sample_text_search_result_selected_active_hover":{"message":"Search result selected, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted":{"message":"Search result highlighted"},"options_theme_tabs_sample_text_search_result_highlighted_hover":{"message":"Search result highlighted, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_active":{"message":"Search result highlighted, active"},"options_theme_tabs_sample_text_search_result_highlighted_active_hover":{"message":"Search result highlighted, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected":{"message":"Search result highlighted, selected"},"options_theme_tabs_sample_text_search_result_highlighted_selected_hover":{"message":"Search result highlighted, selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active":{"message":"Search result highlighted, selected, active"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":{"message":"Search result highlighted, selected, active, mouse hover over"},"attention_background":{"message":"Tabs blinking for attention, background color"},"attention_border":{"message":"Tabs blinking for attention, border color"},"pin_list_border_bottom":{"message":"Pinned tabs list, border at the bottom color"},"pin_list_background":{"message":"Pinned tabs list, background color"},"folder_icon_open":{"message":"Open folder icon"},"folder_icon_closed":{"message":"Empty or closed folder icon"},"folder_icon_hover":{"message":"Folder icon on mouse hover"},"expand_open_background":{"message":"Open tree indicator"},"expand_closed_background":{"message":"Closed tree indicator"},"expand_hover_background":{"message":"Tree indicator on mouse hover"},"group_list_button_hover_background":{"message":"Group on mouse hover"},"group_list_borders":{"message":"Group list border"},"group_list_default_font_color":{"message":"Group list default font color"},"group_list_background":{"message":"Group list background color"},"tab_list_background":{"message":"Tabs background color"},"drag_indicator":{"message":"Drag&Drop indicator"},"close_x":{"message":"x inside the close button"},"close_hover_x":{"message":"x inside the close button, on mouse hover"},"close_hover_border":{"message":"close button border, on mouse hover"},"close_hover_background":{"message":"close button box color, on mouse hover"},"scrollbar_thumb":{"message":"Scrollbar thumb"},"scrollbar_thumb_hover":{"message":"Scrollbar thumb, on mouse hover"},"scrollbar_track":{"message":"Scrollbar track"},"options_example_menu_item":{"message":"menu item"},"options_menu":{"message":" Menu "},"tabs_menu_hover_border":{"message":"menu item border, on mouse hover"},"tabs_menu_hover_background":{"message":"menu item background, on mouse hover"},"tabs_menu_separator":{"message":"menu separator"},"tabs_menu_font":{"message":"menu text color"},"tabs_menu_border":{"message":"menu border"},"tabs_menu_background":{"message":"menu background"},"options_there_is_a_theme_with_this_name":{"message":"Theme with this name already exists, try a new name"},"options_theme_name_cannot_be_empty":{"message":"Theme name cannot be empty, enter some name"},"options_no_theme_to_export":{"message":"No theme to export, maybe add a new one :)"},"options_loaded_theme_older_version":{"message":"Looks like loaded theme was saved in older version of the extension, some colors or options might be missing"},"options_loaded_theme_newer_version":{"message":"Looks like loaded theme was saved in a newer version of the extension, can't load!"},"options_vivaldi_copied_url":{"message":"Web Panel Url has been copied to clipboard, add a new Web Panel and paste url."},"options_copied_wallet_address":{"message":"Wallet address has been copied to clipboard"},"options_clear_data":{"message":"Sidebar is not loading? Reset! ATTENTION! All options and saved Themes will be lost!"},"options_development":{"message":"Development"},"options_debug":{"message":"Debug"},"group_edit_button_cancel":{"message":"Cancel"},"group_edit_button_confirm":{"message":"Ok"},"folder_edit_button_cancel":{"message":"Cancel"},"folder_edit_button_confirm":{"message":"Ok"},"manager_window_button_label_import_group":{"message":"Import group"},"manager_window_button_label_import_session":{"message":"Import session"},"manager_window_button_label_save_current_session":{"message":"Save current session"},"caption_ungrouped_group":{"message":"Ungrouped"},"caption_noname_group":{"message":"untitled"},"caption_clear_filter":{"message":"Clear search results"},"caption_loading":{"message":"Loading..."},"caption_searchbox":{"message":" Search tabs..."},"manager_window_header_title":{"message":"Manager"},"menu_manager_window":{"message":"Open manager"},"button_manager_window":{"message":"Open manager window"},"manager_window_groups_button":{"message":"Hibernated groups"},"manager_window_sessions_button":{"message":"Saved sessions"},"manager_window_autosave_button":{"message":"Auto saved sessions"},"manager_window_button_label_hibernate_group":{"message":"Hibernate current group"},"manager_window_autosessions_maximum_saves_label":{"message":"Number of autosaves to keep:"},"manager_window_autosessions_save_timer_label":{"message":"Autosave every (minutes):"},"manager_window_delete_icon":{"message":"Remove"},"manager_window_savetofile_icon":{"message":"Save to file"},"manager_window_merge_icon":{"message":"Load and merge"},"manager_window_load_icon":{"message":"Load"},"options_Remove_button":{"message":"Remove"},"add_tab_group_regex":{"message":"Add"},"menu_unload_tree":{"message":"Unload tree"},"status_bar_running_in_safe_mode":{"message":"Session did not match and will not save! Click here to reload."},"status_bar_ready":{"message":"Ready."}} \ No newline at end of file diff --git a/background.js b/background.js index f8149bf..9468031 100644 --- a/background.js +++ b/background.js @@ -182,6 +182,10 @@ function StartBackgroundListeners() { sendResponse(b.bg_running); return; } + if (message.command == "is_bg_safe_mode") { + sendResponse(b.safe_mode); + return; + } if (message.command == "reload") { window.location.reload(); return; @@ -309,6 +313,32 @@ function StartBackgroundListeners() { b.schedule_save++; return; } + if (message.command == "all_tabs_exist") { + let yes = true; + for (let Win in message.windows) { + for (let Tab in message.windows[Win].tabs) { + if (b.tabs[message.windows[Win].tabs[Tab].id] == undefined) { + yes = false; + } + } + } + sendResponse(yes); + return; + } + if (message.command == "does_tabs_match") { + let match = true; + for (let Win in message.windows) { + for (let Tab in message.windows[Win].tabs) { + if (b.tabs[message.windows[Win].tabs[Tab].id] != undefined) { + if (message.windows[Win].tabs[Tab].parent !== b.tabs[message.windows[Win].tabs[Tab].id].parent) { + match = false; + } + } + } + } + sendResponse(match); + return; + } if (message.command == "discard_tab") { DiscardTab(message.tabId); return; @@ -547,14 +577,6 @@ function SafeModeCheck() { } }); } - if (browserId == "O") { - chrome.runtime.sendMessage({command: "reload_sidebar"}); - window.location.reload(); - } - if (browserId == "V") { - chrome.runtime.sendMessage({command: "reload_sidebar"}); - window.location.reload(); - } } }, 2000); } diff --git a/background_vivaldi.js b/background_vivaldi.js index 067b8ae..e7caa75 100644 --- a/background_vivaldi.js +++ b/background_vivaldi.js @@ -1,113 +1,9 @@ // VIVALDI -function VivaldiLegacyAddWindowData(win) { - b.windows[win.id] = { activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} }; -} -function VivaldiLegacyHashURL(tab) { - if (b.tabs[tab.id] == undefined) { b.tabs[tab.id] = { hash: 0, parent: tab.pinned ? "pin_list" : (b.windows[tab.windowId] ? b.windows[tab.windowId].active_group : "tab_list"), index: (Object.keys(b.tabs).length + 1), expand: "n" }; } - let hash = 0; - for (let charIndex = 0; charIndex < tab.url.length; charIndex++) { - hash += tab.url.charCodeAt(charIndex); - } - b.tabs[tab.id].hash = hash; -} - function VivaldiStart() { chrome.windows.getAll({ windowTypes: ['normal'], populate: true }, function(w) { chrome.storage.local.get(null, function(storage) { // LOAD PREFERENCES Preferences_GetCurrentPreferences(storage); - - // LEGACY START TO CONVERT DATA - if ((storage.data_version == undefined && storage.tabs != undefined && storage.tabs.length) || (storage.data_version != undefined && storage.data_version < 2)) { - b.safe_mode = true; - let refTabs = {}; - let refWins = {}; - let tabs_matched = 0; - let LoadedWindows = storage.windows ? storage.windows : []; - let LoadedTabs = storage.tabs ? storage.tabs : []; - let CurrentTabsCount = 0; - for (let win of w) { - CurrentTabsCount += win.tabs.length; - } - for (let win of w) { - let url1 = win.tabs[0].url; - let url2 = win.tabs[win.tabs.length - 1].url; - VivaldiLegacyAddWindowData(win); - if (opt.skip_load == false) { - for (let loadedWin of LoadedWindows) { - if ((loadedWin.url1 == url1 || loadedWin.url2 == url2) && refWins[loadedWin.id] == undefined) { - refWins[loadedWin.id] = win.id; - if (loadedWin.group_bar) b.windows[win.id].group_bar = loadedWin.group_bar; - if (loadedWin.search_filter) b.windows[win.id].search_filter = loadedWin.search_filter; - if (loadedWin.active_shelf) b.windows[win.id].active_shelf = loadedWin.active_shelf; - if (loadedWin.active_group) b.windows[win.id].active_group = loadedWin.active_group; - if (Object.keys(loadedWin.groups).length > 0) b.windows[win.id].groups = Object.assign({}, loadedWin.groups); - if (Object.keys(loadedWin.folders).length > 0) b.windows[win.id].folders = Object.assign({}, loadedWin.folders); - break; - } - } - } - } - for (let win of w) { - for (let tab of win.tabs) { - VivaldiLegacyHashURL(tab); - if (tab.active) b.windows[win.id].activeTabId = tab.id; - } - } - if (opt.skip_load == false && LoadedTabs.length > 0) { - for (let win of w) { - for (tab of win.tabs) { - for (let loadedTab of LoadedTabs) { - if (loadedTab.hash == b.tabs[tab.id].hash && refTabs[loadedTab.id] == undefined) { - refTabs[loadedTab.id] = tab.id; - if (loadedTab.parent) b.tabs[tab.id].parent = loadedTab.parent; - if (loadedTab.index) b.tabs[tab.id].index = loadedTab.index; - if (loadedTab.expand) b.tabs[tab.id].expand = loadedTab.expand; - tabs_matched++; - break; - } - } - } - } - for (let tabId in b.tabs) { - if (refTabs[b.tabs[tabId].parent] != undefined) b.tabs[tabId].parent = refTabs[b.tabs[tabId].parent]; - } - for (let windowId in b.windows) { - for (let group in b.windows[windowId].groups) { - if (refTabs[b.windows[windowId].groups[group].active_tab]) b.windows[windowId].groups[group].active_tab = refTabs[b.windows[windowId].groups[group].active_tab]; - if (refTabs[b.windows[windowId].groups[group].prev_active_tab]) b.windows[windowId].groups[group].prev_active_tab = refTabs[b.windows[windowId].groups[group].prev_active_tab]; - } - } - } - for (let win of w) { - if (b.windows[win.id]) b.windows[win.id].ttid = JSON.parse(win.extData).ext_id; - for (let tab of win.tabs) { - if (b.tabs[tab.id]) b.tabs[tab.id].ttid = JSON.parse(tab.extData).ext_id; - } - } - let Windows = {}; - let Tabs = {}; - for (let win of w) { - if (b.windows[win.id] != undefined && b.windows[win.id].ttid != undefined && b.windows[win.id].group_bar != undefined && b.windows[win.id].search_filter != undefined && b.windows[win.id].active_shelf != undefined && b.windows[win.id].active_group != undefined && b.windows[win.id].groups != undefined && b.windows[win.id].folders != undefined) { - Windows[b.windows[win.id].ttid] = { ttid: b.windows[win.id].ttid, group_bar: b.windows[win.id].group_bar, search_filter: b.windows[win.id].search_filter, active_shelf: b.windows[win.id].active_shelf, active_group: b.windows[win.id].active_group, groups: b.windows[win.id].groups, folders: b.windows[win.id].folders }; - for (let groupId in b.windows[win.id].groups) { - if (b.tabs[b.windows[win.id].groups[groupId].active_tab]) Windows[b.windows[win.id].ttid].groups[groupId].active_tab = b.tabs[b.windows[win.id].groups[groupId].active_tab].ttid; - if (b.tabs[b.windows[win.id].groups[groupId].prev_active_tab]) Windows[b.windows[win.id].ttid].groups[groupId].prev_active_tab = b.tabs[b.windows[win.id].groups[groupId].prev_active_tab].ttid; - } - } - for (let tab of win.tabs) { - if (b.tabs[tab.id] != undefined && b.tabs[tab.id].ttid != undefined && b.tabs[tab.id].parent != undefined && b.tabs[tab.id].index != undefined && b.tabs[tab.id].expand != undefined) { - Tabs[b.tabs[tab.id].ttid] = { ttid: b.tabs[tab.id].ttid, parent: (b.tabs[b.tabs[tab.id].parent] ? b.tabs[b.tabs[tab.id].parent].ttid : b.tabs[tab.id].parent), index: b.tabs[tab.id].index, expand: b.tabs[tab.id].expand }; - } - } - } - chrome.storage.local.set({ data_version: 2, windows: Windows, tabs: Tabs }); - chrome.storage.local.remove("t_count"); - chrome.storage.local.remove("w_count"); - chrome.runtime.sendMessage({command: "reload_sidebar"}); - window.location.reload(); - } - if (storage.data_version == undefined || storage.data_version == 2) { // load tabs and windows from storage let refTabs = {}; @@ -251,8 +147,18 @@ async function VivaldiAutoSaveData(BAK, LoopTimer) { function VivaldiAddWindowData(win) { - let extData = JSON.parse(win.extData); - if (b.windows[win.id] == undefined) b.windows[win.id] = { ttid: (win.extData.match("ext_id") != null ? JSON.parse(win.extData).ext_id : win.index), activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} }; + let extData = win.extData.match("ext_id") != null ? JSON.parse(win.extData).ext_id : win.index; + if (b.windows[win.id] == undefined) b.windows[win.id] = { ttid: extData, activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} }; + if (extData == win.index) { + let retry = setInterval(function() { + chrome.windows.get(win.id, {populate: false}, function(retry_win) { + if (retry_win.extData.match("ext_id") != null) { + b.windows[retry_win.id].ttid = JSON.parse(retry_win.extData).ext_id; + clearInterval(retry); + } + }); + }, 2000); + } return b.windows[win.id].ttid; } diff --git a/manifest.json b/manifest.json index abca888..d06775c 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,8 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], + "permissions": [ "", "tabs", "sessions", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], + "sidebar_action": { "default_icon": { "16": "icons/16.png", @@ -28,25 +29,21 @@ "browser_action": { "default_icon": "icons/24.png" }, - "commands": { - "_execute_browser_action": { - "suggested_key": { "default": "F1" }, - "description": "toggle Tree Tabs" - }, - "close_tree": { - "suggested_key": { "default": "Alt+W" }, - "description": "close tree" - } - }, "applications": { "gecko": { "id": "TreeTabs@jagiello.it", - "strict_min_version": "63.0" + "strict_min_version": "57.0" } }, "options_ui": { "page": "options/options.html", "open_in_tab": true }, - "version": "1.9.0" + "commands": { + "close_tree": { + "suggested_key": { "default": "Alt+W" }, + "description": "close tree" + } + }, + "version": "1.9.1" } \ No newline at end of file diff --git a/scripts/manager.js b/scripts/manager.js index c6d8378..a5f991d 100644 --- a/scripts/manager.js +++ b/scripts/manager.js @@ -375,8 +375,6 @@ function Manager_ImportMergeTabs(LoadedWindows) { if (opt.debug) Utils_log("f: Manager_ImportMergeTabs"); Manager_ShowStatusBar({show: true, spinner: true, message: chrome.i18n.getMessage("status_bar_loaded_tree_structure")}); chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(CurrentWindows) { - let TotalTabsCount = 0; - let tabsMade = 0; let New = {}; for (let CurrentWindow of CurrentWindows) { // Current Windows for (let LoadedWindow of LoadedWindows) { // Loaded Windows @@ -410,7 +408,6 @@ function Manager_ImportMergeTabs(LoadedWindows) { } } for (let LoadedWindow of LoadedWindows) { // CONVERT ARRAY TABS TO OBJECTS, FOR MISSING WINDOWS - TotalTabsCount += LoadedWindow.tabs.length; if (New[LoadedWindow.id] == undefined) { New[LoadedWindow.id] = Object.assign({}, LoadedWindow); let NewTabs = {}; @@ -423,7 +420,6 @@ function Manager_ImportMergeTabs(LoadedWindows) { for (let windowId in New) { // Loaded Windows if (New[windowId].oldId == undefined) { // missing window, lets make one let FirstTabId = Object.keys(New[windowId].tabs)[0]; - let tabsMade = 0; let window_params; if (browserId == "F") { if ((New[windowId].tabs[FirstTabId].url).startsWith("about")) { @@ -441,10 +437,7 @@ function Manager_ImportMergeTabs(LoadedWindows) { New[windowId].oldId = New[windowId].id; New[windowId].id = new_window.id; - - if (new_window.tabs[0]) { - tabsMade++; New[windowId].tabs[FirstTabId].oldId = New[windowId].tabs[FirstTabId].id; New[windowId].tabs[FirstTabId].id = new_window.tabs[0].id; if (New[windowId].tabs[FirstTabId].parent == "pin_list") chrome.tabs.update(new_window.tabs[0].id, {pinned: true}); @@ -462,12 +455,10 @@ function Manager_ImportMergeTabs(LoadedWindows) { params = {active: false, windowId: new_window.id, url: New[windowId].tabs[Tab].url}; } chrome.tabs.create(params, function(new_tab) { - tabsMade++; if (new_tab) { New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id; New[windowId].tabs[Tab].id = new_tab.id; if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true}); - if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]); } }); @@ -503,17 +494,13 @@ function Manager_ImportMergeTabs(LoadedWindows) { params = {active: false, windowId: New[windowId].id, url: New[windowId].tabs[Tab].url}; } chrome.tabs.create(params, function(new_tab) { - tabsMade++; if (new_tab) { New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id; New[windowId].tabs[Tab].id = new_tab.id; if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true}); - if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]); } }); - } else { - tabsMade++; } } }); @@ -522,28 +509,32 @@ function Manager_ImportMergeTabs(LoadedWindows) { } let STOP = 0; let WaitForFinish = setInterval(function() { - if (STOP > 10) clearInterval(WaitForFinish); STOP++; - if (tabsMade == TotalTabsCount) { - setTimeout(function() { - for (let windowId in New) { - for (let Tab in New[windowId].tabs) { - if (New[windowId].tabs[New[windowId].tabs[Tab].parent]) { - New[windowId].tabs[Tab].parent = New[windowId].tabs[New[windowId].tabs[Tab].parent].id; + if (STOP > 60) clearInterval(WaitForFinish); STOP++; // stop after 5 minutes + chrome.runtime.sendMessage({command: "all_tabs_exist", windows: New}, function(exist) { + if (exist == true) { + chrome.runtime.sendMessage({command: "does_tabs_match", windows: New}, function(match) { + if (match == false) { + for (let windowId in New) { + for (let Tab in New[windowId].tabs) { + if (New[windowId].tabs[New[windowId].tabs[Tab].parent]) { + New[windowId].tabs[Tab].parent = New[windowId].tabs[New[windowId].tabs[Tab].parent].id; + } + } + for (let Tab in New[windowId].tabs) { + chrome.runtime.sendMessage({command: "update_tab", tabId: New[windowId].tabs[Tab].id, tab: {index: New[windowId].tabs[Tab].index, expand: New[windowId].tabs[Tab].expand, parent: New[windowId].tabs[Tab].parent}}); + if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: New[windowId].tabs[Tab].id});}, 5000); + } + if (New[windowId].id == tt.CurrentWindowId) { + Manager_RecreateTreeStructure(New[windowId].groups, New[windowId].folders, New[windowId].tabs); + } else { + chrome.runtime.sendMessage({command: "remote_update", groups: New[windowId].groups, folders: New[windowId].folders, tabs: New[windowId].tabs, windowId: New[windowId].id}); + } + STOP = 61; } } - for (let Tab in New[windowId].tabs) { - chrome.runtime.sendMessage({command: "update_tab", tabId: New[windowId].tabs[Tab].id, tab: {index: New[windowId].tabs[Tab].index, expand: New[windowId].tabs[Tab].expand, parent: New[windowId].tabs[Tab].parent}}); - if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: New[windowId].tabs[Tab].id}); - } - if (New[windowId].id == tt.CurrentWindowId) { - Manager_RecreateTreeStructure(New[windowId].groups, New[windowId].folders, New[windowId].tabs); - } else { - chrome.runtime.sendMessage({command: "remote_update", groups: New[windowId].groups, folders: New[windowId].folders, tabs: New[windowId].tabs, windowId: New[windowId].id}); - } - } - }, 3000); - STOP = 11; - } + }); + } + }); }, 3000); }); } @@ -565,24 +556,24 @@ function Manager_RecreateSession(LoadedWindows) { chrome.windows.create(window_params, function(new_window) { chrome.runtime.sendMessage({command: "save_groups", windowId: new_window.id, groups: LoadedWindow.groups}); chrome.runtime.sendMessage({command: "save_folders", windowId: new_window.id, folders: LoadedWindow.folders}); - NewTabs[LoadedWindow.tabs[0].id] = {id: LoadedWindow.tabs[0].id, newId: new_window.tabs[0].id, expand: LoadedWindow.tabs[0].expand, favicon: LoadedWindow.tabs[0].favicon, index: LoadedWindow.tabs[0].index, parent: LoadedWindow.tabs[0].parent, title: LoadedWindow.tabs[0].title}; + NewTabs[LoadedWindow.tabs[0].id] = {id: new_window.tabs[0].id, expand: LoadedWindow.tabs[0].expand, favicon: LoadedWindow.tabs[0].favicon, index: LoadedWindow.tabs[0].index, parent: LoadedWindow.tabs[0].parent, title: LoadedWindow.tabs[0].title}; if (browserId == "F" && LoadedWindow.tabs[0].favicon > 0) browser.sessions.setTabValue(new_window.tabs[0].id, "CachedFaviconUrl", LoadedWindow.favicons[LoadedWindow.tabs[0].favicon]); for (let Tab of LoadedWindow.tabs) { if (Tab.id != LoadedWindow.tabs[0].id) { // skip first tab let params; if (browserId == "F") { if ((Tab.url).startsWith("about")) { - params = {active: false, windowId: tt.CurrentWindowId}; + params = {active: false, windowId: new_window.id}; } else { - params = {active: false, windowId: tt.CurrentWindowId, url: Tab.url, discarded: true, title: Tab.title}; + params = {active: false, windowId: new_window.id, url: Tab.url, discarded: true, title: Tab.title}; } } else { params = {active: false, windowId: new_window.id, url: Tab.url}; } chrome.tabs.create(params, function(new_tab) { - NewTabs[Tab.id] = {id: Tab.id, newId: 0, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; + NewTabs[Tab.id] = {id: 0, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; if (new_tab) { - NewTabs[Tab.id].newId = new_tab.id; + NewTabs[Tab.id].id = new_tab.id; if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedWindow.favicons[Tab.favicon]); } }); @@ -590,23 +581,26 @@ function Manager_RecreateSession(LoadedWindows) { } let STOP = 0; let WaitForFinish = setInterval(function() { - if (STOP > 10) clearInterval(WaitForFinish); STOP++; + if (STOP > 60) clearInterval(WaitForFinish); STOP++; // stop after 5 minutes if (Object.keys(NewTabs).length == LoadedWindow.tabs.length) { - for (let tabId in NewTabs) { - if (NewTabs[NewTabs[tabId].parent] != undefined) NewTabs[tabId].parent = NewTabs[NewTabs[tabId].parent].newId; - if (NewTabs[tabId].parent == "pin_list") chrome.tabs.update(parseInt(NewTabs[tabId].newId), {pinned: true}); - if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: parseInt(NewTabs[tabId].newId)}); - } - for (let tabId in NewTabs) { - chrome.runtime.sendMessage({command: "update_tab", tabId: parseInt(NewTabs[tabId].newId), tab: {index: NewTabs[tabId].index, expand: NewTabs[tabId].expand, parent: NewTabs[tabId].parent}}); - } - chrome.runtime.sendMessage({command: "sidebar_started", windowId: new_window.id}, function(response) { - if (response) { - chrome.runtime.sendMessage({command: "remote_update", groups: LoadedWindow.groups, folders: LoadedWindow.folders, tabs: NewTabs, windowId: new_window.id}); - STOP = 11; + setTimeout(function() { + for (let Tab in NewTabs) { + if (NewTabs[NewTabs[Tab].parent] != undefined) NewTabs[Tab].parent = NewTabs[NewTabs[Tab].parent].id; + if (NewTabs[Tab].parent == "pin_list") chrome.tabs.update(NewTabs[Tab].id, {pinned: true}); + if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: NewTabs[Tab].id});}, 5000); } - }); - STOP = 7; + for (let Tab in NewTabs) { + chrome.runtime.sendMessage({command: "update_tab", tabId: parseInt(NewTabs[Tab].id), tab: {index: NewTabs[Tab].index, expand: NewTabs[Tab].expand, parent: NewTabs[Tab].parent}}); + } + chrome.runtime.sendMessage({command: "sidebar_started", windowId: new_window.id}, function(response) { + if (response) { + chrome.runtime.sendMessage({command: "remote_update", groups: LoadedWindow.groups, folders: LoadedWindow.folders, tabs: NewTabs, windowId: new_window.id}, function(response) { + // if (response) + }); + } + }); + STOP = 61; + }, 5000); } }, 5000); }); @@ -614,14 +608,13 @@ function Manager_RecreateSession(LoadedWindows) { } - function Manager_RecreateGroup(LoadedGroup) { if (opt.debug) Utils_log("f: Manager_RecreateGroup"); let NewGroupId = Groups_AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font); let NewFolders = {}; - let RefTabs = {}; + // let RefTabs = {}; let NewTabs = {}; - let LastTabId = "NO_TAB_YET"; + // let LastTabId = "NO_TAB_YET"; if (Object.keys(LoadedGroup.folders).length > 0) { for (var folder in LoadedGroup.folders) { let newId = Folders_AddNewFolder({ParentId: NewGroupId, Name: LoadedGroup.folders[folder].name, ExpandState: LoadedGroup.folders[folder].expand}); @@ -651,42 +644,45 @@ function Manager_RecreateGroup(LoadedGroup) { params = {active: false, windowId: tt.CurrentWindowId, url: Tab.url}; } chrome.tabs.create(params, function(new_tab) { + NewTabs[Tab.id] = {id: new_tab.id, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; if (new_tab) { + NewTabs[Tab.id].id = new_tab.id; if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedGroup.favicons[Tab.favicon]); - NewTabs[new_tab.id] = {id: new_tab.id, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; - RefTabs[Tab.id] = new_tab.id; - if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: new_tab.id}); - LastTabId = new_tab.id; - } else { - RefTabs[Tab.id] = "failed: "+Tab.id; + if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: new_tab.id});}, 5000); + // LastTabId = new_tab.id; } + // else { + // RefTabs[Tab.id] = "failed: "+Tab.id; + // } }); } } let STOP = 0; let WaitForFinish = setInterval(function() { - if (STOP > 600) clearInterval(WaitForFinish); STOP++;// just stop after 10 minutes + if (STOP > 300) clearInterval(WaitForFinish); STOP++;// just stop after 5 minutes if (document.getElementById("°" + NewGroupId) != null) { if (Object.keys(LoadedGroup.folders).length > 0 && LoadedGroup.tabs.length == 0) { Manager_RecreateTreeStructure({}, NewFolders, {}); - STOP = 601; + STOP = 301; } - if (LoadedGroup.tabs.length > 0 && Object.keys(RefTabs).length == LoadedGroup.tabs.length && document.getElementById(LastTabId) != null) { - for (let tabId in NewTabs) { - if (RefTabs[NewTabs[tabId].parent] != undefined) { - NewTabs[tabId].parent = RefTabs[NewTabs[tabId].parent]; - } else { - if ((NewTabs[tabId].parent).startsWith("f_") && LoadedGroup.folders[NewTabs[tabId].parent]) { - NewTabs[tabId].parent = LoadedGroup.folders[NewTabs[tabId].parent].newId; + if (LoadedGroup.tabs.length > 0 && Object.keys(NewTabs).length == LoadedGroup.tabs.length /* && document.getElementById(LastTabId) != null */) { + setTimeout(function() { + for (let tabId in NewTabs) { + if (NewTabs[NewTabs[tabId].parent] != undefined) { + NewTabs[tabId].parent = NewTabs[NewTabs[tabId].parent].id; } else { - if ((NewTabs[tabId].parent).startsWith("g_") || NewTabs[tabId].parent == "tab_list") { - NewTabs[tabId].parent = NewGroupId; + if ((NewTabs[tabId].parent).startsWith("f_") && LoadedGroup.folders[NewTabs[tabId].parent]) { + NewTabs[tabId].parent = LoadedGroup.folders[NewTabs[tabId].parent].newId; + } else { + if ((NewTabs[tabId].parent).startsWith("g_") || NewTabs[tabId].parent == "tab_list") { + NewTabs[tabId].parent = NewGroupId; + } } } } - } - Manager_RecreateTreeStructure({}, NewFolders, NewTabs); - STOP = 601; + Manager_RecreateTreeStructure({}, NewFolders, NewTabs); + STOP = 301; + }, 5000); } } }, 1000); @@ -720,8 +716,8 @@ function Manager_RecreateTreeStructure(groups, folders, tabs) { // groups, folde if (tb != null && tbp != null && tb != undefined && tbp != undefined) { tbp.appendChild(tb); if (tabs[tab].expand != "") tb.classList.add(tabs[tab].expand); + if (tb.classList.contains("pin")) chrome.tabs.update(tabs[tab].id, {pinned: false}); } - if (tb.classList.contains("pin")) chrome.tabs.update(tabs[tab].id, {pinned: false}); } } } diff --git a/scripts/tabs.js b/scripts/tabs.js index 0a2b450..4af90ce 100644 --- a/scripts/tabs.js +++ b/scripts/tabs.js @@ -470,9 +470,9 @@ async function Tabs_LoadFavicon(tabId, Img, TryUrls, TabHeaderNode, i) { async function Tabs_SaveTabs() { setInterval(function() { - if (opt.debug) Utils_log("f: Tabs_SaveTabs"); if (tt.schedule_update_data > 1) tt.schedule_update_data = 1; if (tt.schedule_update_data > 0) { + if (opt.debug) Utils_log("f: Tabs_SaveTabs"); let pins_data = []; let tabs_data = []; for (let tabId in tt.tabs) { diff --git a/sidebar.js b/sidebar.js index 8274556..4ee225f 100644 --- a/sidebar.js +++ b/sidebar.js @@ -174,7 +174,7 @@ function StartSidebarListeners() { return; } if (message.command == "tab_removed") { - if (opt.debug) {Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId);} + if (opt.debug) Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId); let mTab = document.getElementById(message.tabId); if (mTab != null && tt.tabs[message.tabId]) { let ctParent = mTab.childNodes[1]; @@ -214,17 +214,18 @@ function StartSidebarListeners() { if (message.command == "tab_updated") { if (opt.debug) Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId); if (tt.tabs[message.tabId]) { - if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { + // if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { + if (message.changeInfo.favIconUrl != undefined || message.changeInfo.title != undefined) { if (browserId == "F" && (message.changeInfo.favIconUrl == undefined || message.changeInfo.favIconUrl == "")) browser.sessions.setTabValue(message.tabId, "CachedFaviconUrl", ""); setTimeout(function() { if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true); }, 100); } - if (message.changeInfo.title != undefined) { - setTimeout(function() { - if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true); - }, 1000); - } + // if (message.changeInfo.title != undefined) { + // setTimeout(function() { + // if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true); + // }, 1000); + // } if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) tt.tabs[message.tabId].RefreshMediaIcon(); if (message.changeInfo.discarded != undefined) tt.tabs[message.tabId].RefreshDiscarded(); if (message.changeInfo.pinned != undefined) { @@ -287,89 +288,90 @@ function Initialize() { Toolbar_RestoreToolbarShelf(); Toolbar_RestoreToolbarSearchFilter(); } - - chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(bgtabs) { - chrome.runtime.sendMessage({command: "get_folders", windowId: tt.CurrentWindowId}, function(f) { - tt.folders = Object.assign({}, f); - chrome.runtime.sendMessage({command: "get_groups", windowId: tt.CurrentWindowId}, function(g) { - tt.groups = Object.assign({}, g); - // APPEND GROUPS - Groups_AppendGroups(tt.groups); + chrome.runtime.sendMessage({command: "is_bg_safe_mode"}, function(safe_mode) { + if (safe_mode) { + SafeModeMessage(); + } + chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(bgtabs) { + chrome.runtime.sendMessage({command: "get_folders", windowId: tt.CurrentWindowId}, function(f) { + tt.folders = Object.assign({}, f); + chrome.runtime.sendMessage({command: "get_groups", windowId: tt.CurrentWindowId}, function(g) { + tt.groups = Object.assign({}, g); + // APPEND GROUPS + Groups_AppendGroups(tt.groups); - // APPEND FOLDERS TO TABLIST - Folders_PreAppendFolders(tt.folders); + // APPEND FOLDERS TO TABLIST + Folders_PreAppendFolders(tt.folders); - // APPEND TABS TO TABLIST - for (const tab of window.tabs) { - tt.tabs[tab.id] = new Tabs_ttTab({tab: tab, Append: true, SkipSetActive: true, AdditionalClass: ((bgtabs[tab.id] && bgtabs[tab.id].expand != "") ? bgtabs[tab.id].expand : undefined)}); - } - - // APPEND FOLDERS TO CORRECT PARENTS - Folders_AppendFolders(tt.folders); - - // APPEND TABS TO CORRECT PARENTS - if (opt.skip_load == false) { - for (const tab of window.tabs) { - if (bgtabs[tab.id] && !tab.pinned) { - let TabParent = document.getElementById("°"+bgtabs[tab.id].parent); - if (TabParent != null && document.querySelector("[id='"+tab.id+"'] #°"+bgtabs[tab.id].parent) == null) { - TabParent.appendChild(tt.tabs[tab.id].Node); - } - } - } - } - - // SET ACTIVE TAB FOR EACH GROUP, REARRENGE EVERYTHING AND START BROWSER LISTENERS - Groups_SetActiveTabInEachGroup(); - Tabs_RearrangeTree(bgtabs, tt.folders, true); - - StartSidebarListeners(); - - DOM_SetEvents(); - Manager_SetManagerEvents(); - Menu_HideMenus(); - - if (opt.switch_with_scroll) { - DOM_BindTabsSwitchingToMouseWheel("pin_list"); - } - if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) { - Tabs_RearrangeBrowserTabs(); - } - - Theme_RestorePinListRowSettings(); - Manager_StartAutoSaveSession(); - - if (browserId == "O") { - DOM_AutoRefreshMediaIcons(); - } - - setTimeout(function() { - DOM_RefreshExpandStates(); - DOM_RefreshCounters(); - Groups_SetActiveTabInEachGroup(); - }, 1000); - - Manager_ShowStatusBar({show: true, spinner: false, message: "Ready.", hideTimeout: 2000}); - - setTimeout(function() { - Tabs_SaveTabs(); - delete DefaultToolbar; - delete DefaultTheme; - delete DefaultPreferences; - if (storage.emergency_reload != undefined) { - chrome.storage.local.remove("emergency_reload"); - } - }, 5000); - - if (browserId != "F") { - if (storage.windows_BAK1 && Object.keys(storage["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); } - if (storage.windows_BAK2 && Object.keys(storage["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); } - if (storage.windows_BAK3 && Object.keys(storage["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); } - } - }); - }); - }); - }); + // APPEND TABS TO TABLIST + for (const tab of window.tabs) { + tt.tabs[tab.id] = new Tabs_ttTab({tab: tab, Append: true, SkipSetActive: true, AdditionalClass: ((bgtabs[tab.id] && bgtabs[tab.id].expand != "") ? bgtabs[tab.id].expand : undefined)}); + } + + // APPEND FOLDERS TO CORRECT PARENTS + Folders_AppendFolders(tt.folders); + + // APPEND TABS TO CORRECT PARENTS + if (opt.skip_load == false) { + for (const tab of window.tabs) { + if (bgtabs[tab.id] && !tab.pinned) { + let TabParent = document.getElementById("°"+bgtabs[tab.id].parent); + if (TabParent != null && document.querySelector("[id='"+tab.id+"'] #°"+bgtabs[tab.id].parent) == null) { + TabParent.appendChild(tt.tabs[tab.id].Node); + } + } + } + } + + // SET ACTIVE TAB FOR EACH GROUP, REARRENGE EVERYTHING AND START BROWSER LISTENERS + Groups_SetActiveTabInEachGroup(); + Tabs_RearrangeTree(bgtabs, tt.folders, true); + + StartSidebarListeners(); + + DOM_SetEvents(); + Manager_SetManagerEvents(); + Menu_HideMenus(); + + if (opt.switch_with_scroll) { + DOM_BindTabsSwitchingToMouseWheel("pin_list"); + } + if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) { + Tabs_RearrangeBrowserTabs(); + } + + Theme_RestorePinListRowSettings(); + Manager_StartAutoSaveSession(); + + if (browserId == "O") { + DOM_AutoRefreshMediaIcons(); + } + + setTimeout(function() { + DOM_RefreshExpandStates(); + DOM_RefreshCounters(); + Groups_SetActiveTabInEachGroup(); + }, 1000); + + Manager_ShowStatusBar({show: true, spinner: false, message: chrome.i18n.getMessage("status_bar_ready"), hideTimeout: 2000}); + + setTimeout(function() { + Tabs_SaveTabs(); + delete DefaultToolbar; + delete DefaultTheme; + delete DefaultPreferences; + }, 5000); + + if (browserId != "F") { + if (storage.windows_BAK1 && Object.keys(storage["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); } + if (storage.windows_BAK2 && Object.keys(storage["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); } + if (storage.windows_BAK3 && Object.keys(storage["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); } + } + }); + }); + }); + }); + }); }); } @@ -386,4 +388,20 @@ function Run() { }); } +function SafeModeMessage() { + let StatusBar = document.getElementById("status_bar"); + if (StatusBar) { + StatusBar.onclick = function(event) { + if (event.which == 1) { + chrome.runtime.sendMessage({command: "reload"}); + chrome.runtime.sendMessage({command: "reload_sidebar"}); + location.reload(); + } + } + setInterval(function() { + Manager_ShowStatusBar({show: true, spinner: false, message: chrome.i18n.getMessage("status_bar_running_in_safe_mode")}); + }, 30); + } +} + document.addEventListener("DOMContentLoaded", Run(), false); \ No newline at end of file diff --git a/translator/translator.js b/translator/translator.js index 25048f7..7a47301 100644 --- a/translator/translator.js +++ b/translator/translator.js @@ -1,26 +1,334 @@ -const english_base = {"extensionName":{"message":"Tree Tabs"},"extDesc":{"message":"Manage your tabs in the sidebar!"},"OpenSidebar":{"message":"Open Tree Tabs"},"button_new":{"message":"Press left mouse button to open new tab. \nPress middle mouse button to clone the active tab. \nPress right mouse button to scroll the list to the active tab."},"button_pin":{"message":"Pin / Unpin current tab"},"button_undo":{"message":"Reopen last closed"},"button_reboot":{"message":"Reload Tree Tabs_ Try this in case your tree hierarchy is lost after restart."},"button_detach":{"message":"Detach tab"},"button_move":{"message":"Detach tab"},"button_search":{"message":"Search tabs"},"button_tools":{"message":"Tools"},"button_groups":{"message":"Groups"},"filter_search_go_prev":{"message":"Previous search result"},"filter_search_go_next":{"message":"Next search result"},"button_bookmarks":{"message":"Unsorted bookmarks"},"button_downloads":{"message":"Downloads"},"button_history":{"message":"History"},"button_settings":{"message":"Settings"},"button_options":{"message":"Tree Tabs settings"},"button_extensions":{"message":"Extensions"}, -"button_unload":{"message":"Unload tabs"},"button_discard":{"message":"Unload tabs"},"button_filter_type":{"message":"Search titles or urls"},"button_groups_toolbar_hide":{"message":"Hide/Show Groups toolbar"},"button_new_group":{"message":"New group"},"button_remove_group":{"message":"Remove group.\nHold shift key to close tabs from this group"},"button_edit_group":{"message":"Rename group"},"button_import_group":{"message":"Import group"},"button_export_group":{"message":"Export group"},"button_backup":{"message":"Session"},"button_import_bak":{"message":"Import session"},"button_import_merge_bak":{"message":"Import and merge session.\nImporter will try to match current tabs with those from saved session, instead of opening a new window."},"button_export_bak":{"message":"Export session"},"button_load_bak1":{"message":"EMERGENCY if lost groupings: Load latest internal backup (autosave is made every 5 minutes)"},"button_load_bak2":{"message":"EMERGENCY if lost groupings: Load previous to latest internal backup (autosave is made every 10 minutes)"}, -"button_load_bak3":{"message":"EMERGENCY if lost groupings: Load oldest internal backup (autosave is made every 30 minutes)"},"button_folders":{"message":"Folders"},"button_new_folder":{"message":"New folder"},"button_remove_folder":{"message":"Remove selected folder/s"},"button_edit_folder":{"message":"Rename folder"},"menu_expand_all":{"message":"Expand all trees"},"menu_collapse_all":{"message":"Collapse all trees"},"menu_expand_tree":{"message":"Expand tree"},"menu_collapse_tree":{"message":"Collapse tree"},"menu_new_tab":{"message":"New tab"},"menu_new_pin":{"message":"New pinned tab"},"menu_duplicate_tab":{"message":"Duplicate"},"menu_detach_tab":{"message":"Detach"},"menu_reload_tab":{"message":"Reload"},"menu_pin_tab":{"message":"Pin"},"menu_mute_tab":{"message":"Mute"},"menu_mute_tree":{"message":"Mute tree"},"menu_unmute_tree":{"message":"Unmute tree"},"menu_unmute_tab":{"message":"Unmute"},"menu_mute_other":{"message":"Mute other"},"menu_unmute_other":{"message":"Unmute other"},"menu_unpin_tab":{"message":"Unpin"},"menu_close_tree":{"message":"Close tree"},"menu_close":{"message":"Close"}, -"menu_close_other":{"message":"Close other"},"menu_undo_close_tab":{"message":"Undo close"},"menu_treetabs_settings":{"message":"Settings"},"menu_unload":{"message":"Unload"},"menu_bookmark_tree":{"message":"Bookmark"},"menu_new_folder":{"message":"New folder"},"menu_rename_folder":{"message":"Rename folder"},"menu_delete_folder":{"message":"Delete"},"menu_new_group":{"message":"New group"},"menu_rename_group":{"message":"Rename"},"menu_delete_group":{"message":"Delete"},"menu_delete_group_tabs_close":{"message":"Delete with tabs"},"menu_groups_unload":{"message":"Unload"},"menu_bookmark_group":{"message":"Bookmark"},"menu_groups_hibernate":{"message":"Hibernate"},"menu_group_tabs_close":{"message":"Close tabs"},"status_bar_rearranging_tabs":{"message":"Rearranging tabs and folders"},"status_bar_rearranging_finished":{"message":"Rearranging: done."},"status_bar_loaded_tree_structure":{"message":"Loaded Tree structure..."},"status_bar_finding_ref_tabs":{"message":"Finding reference tabs..."},"status_bar_finding_other_windows":{"message":"Finding other windows to add tabs..."}, -"status_bar_all_done":{"message":"All done."},"status_bar_autosave":{"message":"Autosave: "},"status_bar_quick_check_recreate_structure":{"message":"Quick check and recreating structure..."},"options_vivaldi":{"message":" Vivaldi "},"opt_url_for_web_panel":{"message":"Url for the Web Panel"},"options_pinned":{"message":" Pinned tabs bar "},"options_pin_list_multi_row":{"message":"Multi row list"},"option_allow_pin_close":{"message":"Allow to close pinned tabs"},"option_pin_attention_blinking":{"message":"Blink pinned tabs that ask for attention"},"option_audio_blinking":{"message":"Blink audio indicator"},"options_tabs":{"message":" Tabs "},"options_syncro_tabbar_tabs_order":{"message":"Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_switch_with_scroll":{"message":"Switch tabs with mouse wheel"},"options_tab_group_regex":{"message":"Tab group assignments (Items matching the given pattern will be moved to the designated group. Pattern accepts regular expressions.)"}, -"option_tab_match":{"message":"Pattern"},"option_tab_group":{"message":"Group"},"options_orphaned_tabs_to_ungrouped":{"message":"Always place orphan tabs in the 'ungrouped' group"},"options_move_on_url_change":{"message":"Move tabs that match regexes"},"options_move_on_url_change_never":{"message":"never"},"options_move_on_url_change_from_empty":{"message":"when URL changes in Home tab (only Home tabs created by ctrl+t shortcut)"},"options_move_on_url_change_from_empty_b":{"message":"when URL changes in any Home tab"},"options_move_on_url_change_all_new":{"message":"when tab is created with a matching URL"},"options_move_on_url_change_always":{"message":"whenever URL changes to a matching pattern"},"options_always_show_close":{"message":"Show close button on all tabs and folders"},"options_never_show_close":{"message":"Never show close button (option above will be ignored)"},"options_collapse_other_trees":{"message":"Automatically collapse other trees on expand"},"options_open_tree_on_hover":{"message":"Auto expand collapsed trees when dragging and holding for a second over them"}, -"options_promote_children":{"message":"Promote children on close, if disabled, when closing the parent of a tree structure, all tabs and folders will be closed (be careful, because undo close tab will not recover the trees structure)"},"options_promote_children_in_first_child":{"message":"Promote first child as a parent"},"options_skip_load":{"message":"Discard tree structure after browser's restart, this option is for those who don't use browser's session. Basically it disables loading database at startup."},"options_midclick_tab":{"message":"Action for middle mouse click on tab"},"options_dbclick_tab":{"message":"Action for double click on tab"},"options_action_tab_none":{"message":"nothing"},"options_action_tab_new":{"message":"open new tab"},"options_action_tab_expand_collapse":{"message":"expand/collapse tree"},"options_action_tab_close":{"message":"close tab"},"options_action_tab_reload":{"message":"reload tab"},"options_action_tab_unload":{"message":"unload tab"},"options_action_tab_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"}, -"options_action_tab_undo_close":{"message":"reopen last closed tab"},"options_midclick_group":{"message":"Action for middle click on empty space on the left side or below the tabs"},"options_dbclick_group":{"message":"Action for double click on empty space on the left side or below the tabs"},"options_action_group_none":{"message":"nothing"},"options_action_group_new":{"message":"open new tab"},"options_action_group_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_group_undo_close_tab":{"message":"reopen last closed tab"},"options_append_pinned_tab":{"message":"Place pinned tabs"},"options_append_pinned_tab_first":{"message":"as first"},"options_append_pinned_tab_after":{"message":"after opener, or active"},"options_append_pinned_tab_last":{"message":"as last"},"options_append_child_tab":{"message":"Place children tabs"},"options_append_child_tab_top":{"message":"at the top (reverse hierarchy)"},"options_append_child_tab_bottom":{"message":" at the bottom"},"options_append_child_tab_after":{"message":"after parent tab (no automatic tree)"}, -"options_append_orphan_tab":{"message":"Append orphan tabs"},"options_append_orphan_tab_top":{"message":"at the top of the group"},"options_append_orphan_tab_after_active":{"message":"after active tab"},"options_append_orphan_tab_bottom":{"message":"at the bottom of the group"},"options_append_orphan_tab_as_child":{"message":"treat as active's tab child"},"options_append_orphan_tab_active_parent_top":{"message":"at the same level as active tab, but on top"},"options_append_orphan_tab_active_parent_bottom":{"message":"at the same level as active tab, but on bottom"},"options_toolbar_new_tab":{"message":"Toolbar + (new tab button) should append tab"},"options_toolbar_new_tab_as_regular_orphan":{"message":"as a regular orphan tab (option above)"},"options_toolbar_new_tab_root_of_group":{"message":"at the bottom of the group"},"options_after_closing_active_tab":{"message":"After closing active tab,"},"options_after_closing_active_tab_go_up":{"message":"activate tab above"},"options_after_closing_active_tab_go_down":{"message":"activate tab below"},"options_after_closing_active_tab_go_up_seek_in_parent":{"message":"activate tab above if on the same level"}, -"options_after_closing_active_tab_go_down_seek_in_parent":{"message":"activate tab below if on the same level"},"options_after_closing_active_tab_go_browser":{"message":"let browser activate tab"},"options_append_child_tab_after_limit":{"message":"Once reached maximum tree depth, place tab on the same level, but"},"options_append_child_tab_after_limit_top":{"message":"at the top"},"options_append_child_tab_after_limit_after":{"message":"after parent"},"options_append_child_tab_after_limit_bottom":{"message":"at the bottom"},"options_show_counter_tabs":{"message":"Show children tabs count on tabs and folders titles"},"options_show_counter_tabs_hints":{"message":"Show children tabs count in tabs and folders hints"},"options_max_tree_depth":{"message":"Maximum tree depth: set it to -1 for unlimited branches, 0 for flat tabs placement (no trees), any number above 0 will be its maximum"},"options_max_tree_drag_drop":{"message":"Limit Drag&Drop to tree's maximum depth, so you can't drop tabs beyond maximum depth"},"options_groups":{"message":"Groups"},"options_show_counter_groups":{"message":"Show tabs count on groups"}, -"options_groups_toolbar_default":{"message":"Show groups toolbar in new windows"},"options_syncro_tabbar_groups_tabs_order":{"message":"Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_hide_other_groups_tabs_firefox":{"message":"Show Firefox tabs from current group only. Requires change in about:config, find 'extensions.webextensions.tabhide.enabled' and set it to true."},"options_folders":{"message":"Folders"},"options_midclick_folder":{"message":"Action for middle mouse click on folder"},"options_dbclick_folder":{"message":"Action for double click on folder"},"options_action_folder_none":{"message":"nothing"},"options_action_folder_rename":{"message":"rename folder"},"options_action_folder_new_folder":{"message":"open new folder"},"options_action_folder_new_tab":{"message":"open new tab"},"options_action_folder_expand_collapse":{"message":"expand/collapse tree"},"options_action_folder_close":{"message":"close folder"}, -"options_action_folder_unload":{"message":"unload tabs in folder"},"options_global":{"message":"Global"},"options_theme":{"message":"Theme"},"options_rename_theme_button":{"message":"Rename"},"options_add_theme_button":{"message":"Add new"},"options_remove_theme_button":{"message":"Remove"},"options_import_theme_button":{"message":"Import"},"options_export_theme_button":{"message":"Export"},"options_share_theme_link":{"message":"Get more!"},"options_toolbar":{"message":" Toolbar "},"options_available_buttons":{"message":"Drag and drop buttons to arrange them, drop to the green box, buttons you don't want to use"},"options_reset_toolbar_button":{"message":"Reset toolbar"},"options_export_debug":{"message":"Export log file"},"options_print_debug":{"message":"Load log from file"},"options_toolbar_look":{"message":" Toolbar's look "},"hint_orphan_tab":{"message":"Orphan tab is a tab opened from an external source, which can be:"},"hint_ctrl_t":{"message":"ctrl+t shortcut"},"hint_from_pin":{"message":"link that opens new tab from pinned tab"},"hint_from_bookmark":{"message":"bookmark"},"hint_from_external_link":{"message":"external link"}, -"hint_from_popup":{"message":"popup opened as a tab (settings in browser, popup blocker or anything that redirects popups to new tabs)"},"hint_explained_new_tab_settings":{"message":"+ button in Tree Tabs toolbar, places new tabs in the root of the active group, unless set differently."},"hint_explained_orphan_after_active_settings":{"message":"If set to 'after active tab' and active tab is not in current group, tab will append to the root of the active group instead."},"button_background":{"message":"Toolbar buttons background"},"button_hover_background":{"message":"Toolbar buttons background, on mouse hover"},"button_on_background":{"message":"Toolbar active buttons background"},"button_icons":{"message":"Toolbar buttons icon color"},"button_icons_hover":{"message":"Toolbar buttons icon color, on mouse hover"},"button_on_icons":{"message":"Toolbar active buttons icon color"},"button_border":{"message":"Toolbar buttons border color"},"button_hover_border":{"message":"Toolbar buttons border color, on mouse hover"},"filter_box_font":{"message":"Search box, font color"},"filter_box_background":{"message":"Search box, font background color"}, -"filter_box_border":{"message":"Search box, border color"},"filter_clear_icon":{"message":"Clear search result x button color"},"toolbar_background":{"message":"Toolbar background color"},"toolbar_shelf_background":{"message":"Toolbar's shelf background color"},"toolbar_border_bottom":{"message":"Toolbar borders color"},"button_shelf_background":{"message":"Toolbar's shelf buttons background color"},"button_shelf_hover_background":{"message":"Toolbar's shelf buttons background color, on mouse hover"},"button_shelf_icons":{"message":"Toolbar's shelf buttons icon color"},"button_shelf_icons_hover":{"message":"Toolbar's shelf buttons icon color, on mouse hover"},"button_shelf_border":{"message":"Toolbar's shelf buttons border color"},"button_shelf_hover_border":{"message":"Toolbar's shelf buttons border color, on mouse hover"},"options_theme_tabs":{"message":" Tabs look "},"options_tabs_margin_overlap":{"message":"Tabs spacing:\nOverlap 1px, best for themes with borders"},"options_tabs_margin_0":{"message":"Tabs spacing:\nNo spacing, best for flat look"},"options_tabs_margin_1":{"message":"Tabs spacing:\nDefault, 1px between tabs"}, -"options_tab_list_scrollbar_width_down":{"message":"Decrease scrollbars width"},"options_tab_list_scrollbar_width_up":{"message":"Increase scrollbars width"},"options_tab_list_scrollbar_height_down":{"message":"Decrease scrollbars height"},"options_tab_list_scrollbar_height_up":{"message":"Increase scrollbars height"},"options_tabs_indentation_down":{"message":"Decrease tabs indentation"},"options_tabs_indentation_up":{"message":"Increase tabs indentation"},"options_tabs_roundness_down":{"message":"Make tabs corners more square"},"options_tabs_roundness_up":{"message":"Make tabs rounder"},"options_tabs_size_down":{"message":"Decrease tabs size"},"options_tabs_size_up":{"message":"Increase tabs size"},"options_theme_tabs_sample_text_normal":{"message":"Normal"},"options_theme_tabs_sample_text_normal_hover":{"message":"Normal, mouse hover over"},"options_theme_tabs_sample_text_normal_selected":{"message":"Normal selected"},"options_theme_tabs_sample_text_normal_selected_hover":{"message":"Normal selected, mouse hover over"},"options_theme_tabs_sample_text_active":{"message":"Active"},"options_theme_tabs_sample_text_active_hover":{"message":"Active, mouse hover over"}, -"options_theme_tabs_sample_text_active_selected":{"message":"Active and selected"},"options_theme_tabs_sample_text_active_selected_hover":{"message":"Active and selected, mouse hover over"},"options_theme_tabs_sample_text_discarded":{"message":"Unloaded (discarded)"},"options_theme_tabs_sample_text_discarded_hover":{"message":"Unloaded, mouse hover over"},"options_theme_tabs_sample_text_discarded_selected":{"message":"Unloaded and selected"},"options_theme_tabs_sample_text_discarded_selected_hover":{"message":"Unloaded and selected, mouse hover over"},"options_theme_tabs_sample_text_search_result":{"message":"Search result"},"options_theme_tabs_sample_text_search_result_hover":{"message":"Search result, mouse hover over"},"options_theme_tabs_sample_text_search_result_active":{"message":"Search result active"},"options_theme_tabs_sample_text_search_result_active_hover":{"message":"Search result active, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected":{"message":"Search result selected"},"options_theme_tabs_sample_text_search_result_selected_hover":{"message":"Search result selected, mouse hover over"}, -"options_theme_tabs_sample_text_search_result_selected_active":{"message":"Search result selected, active"},"options_theme_tabs_sample_text_search_result_selected_active_hover":{"message":"Search result selected, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted":{"message":"Search result highlighted"},"options_theme_tabs_sample_text_search_result_highlighted_hover":{"message":"Search result highlighted, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_active":{"message":"Search result highlighted, active"},"options_theme_tabs_sample_text_search_result_highlighted_active_hover":{"message":"Search result highlighted, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected":{"message":"Search result highlighted, selected"},"options_theme_tabs_sample_text_search_result_highlighted_selected_hover":{"message":"Search result highlighted, selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active":{"message":"Search result highlighted, selected, active"}, -"options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":{"message":"Search result highlighted, selected, active, mouse hover over"},"attention_background":{"message":"Tabs blinking for attention, background color"},"attention_border":{"message":"Tabs blinking for attention, border color"},"pin_list_border_bottom":{"message":"Pinned tabs list, border at the bottom color"},"pin_list_background":{"message":"Pinned tabs list, background color"},"folder_icon_open":{"message":"Open folder icon"},"folder_icon_closed":{"message":"Empty or closed folder icon"},"folder_icon_hover":{"message":"Folder icon on mouse hover"},"expand_open_background":{"message":"Open tree indicator"},"expand_closed_background":{"message":"Closed tree indicator"},"expand_hover_background":{"message":"Tree indicator on mouse hover"},"group_list_button_hover_background":{"message":"Group on mouse hover"},"group_list_borders":{"message":"Group list border"},"group_list_default_font_color":{"message":"Group list default font color"},"group_list_background":{"message":"Group list background color"},"tab_list_background":{"message":"Tabs background color"}, -"drag_indicator":{"message":"Drag&Drop indicator"},"close_x":{"message":"x inside the close button"},"close_hover_x":{"message":"x inside the close button, on mouse hover"},"close_hover_border":{"message":"close button border, on mouse hover"},"close_hover_background":{"message":"close button box color, on mouse hover"},"scrollbar_thumb":{"message":"Scrollbar thumb"},"scrollbar_thumb_hover":{"message":"Scrollbar thumb, on mouse hover"},"scrollbar_track":{"message":"Scrollbar track"},"options_example_menu_item":{"message":"menu item"},"options_menu":{"message":" Menu "},"tabs_menu_hover_border":{"message":"menu item border, on mouse hover"},"tabs_menu_hover_background":{"message":"menu item background, on mouse hover"},"tabs_menu_separator":{"message":"menu separator"},"tabs_menu_font":{"message":"menu text color"},"tabs_menu_border":{"message":"menu border"},"tabs_menu_background":{"message":"menu background"},"options_there_is_a_theme_with_this_name":{"message":"Theme with this name already exists, try a new name"},"options_theme_name_cannot_be_empty":{"message":"Theme name cannot be empty, enter some name"}, -"options_no_theme_to_export":{"message":"No theme to export, maybe add a new one :)"},"options_loaded_theme_older_version":{"message":"Looks like loaded theme was saved in older version of the extension, some colors or options might be missing"},"options_loaded_theme_newer_version":{"message":"Looks like loaded theme was saved in a newer version of the extension, can't load!"},"options_vivaldi_copied_url":{"message":"Web Panel Url has been copied to clipboard, add a new Web Panel and paste url."},"options_copied_wallet_address":{"message":"Wallet address has been copied to clipboard"},"options_clear_data":{"message":"Sidebar is not loading? Reset! ATTENTION! All options and saved Themes will be lost!"},"options_development":{"message":"Development"},"options_debug":{"message":"Debug"},"group_edit_button_cancel":{"message":"Cancel"},"group_edit_button_confirm":{"message":"Ok"},"folder_edit_button_cancel":{"message":"Cancel"},"folder_edit_button_confirm":{"message":"Ok"},"manager_window_button_label_import_group":{"message":"Import group"},"manager_window_button_label_import_session":{"message":"Import session"}, -"manager_window_button_label_save_current_session":{"message":"Save current session"},"caption_ungrouped_group":{"message":"Ungrouped"},"caption_noname_group":{"message":"untitled"},"caption_clear_filter":{"message":"Clear search results"},"caption_loading":{"message":"Loading..."},"caption_searchbox":{"message":" Search tabs..."},"manager_window_header_title":{"message":"Manager"},"menu_manager_window":{"message":"Open manager"},"button_manager_window":{"message":"Open manager window"},"manager_window_groups_button":{"message":"Hibernated groups"},"manager_window_sessions_button":{"message":"Saved sessions"},"manager_window_autosave_button":{"message":"Auto saved sessions"},"manager_window_button_label_hibernate_group":{"message":"Hibernate current group"},"manager_window_autosessions_maximum_saves_label":{"message":"Number of autosaves to keep:"},"manager_window_autosessions_save_timer_label":{"message":"Autosave every (minutes):"},"manager_window_delete_icon":{"message":"Remove"},"manager_window_savetofile_icon":{"message":"Save to file"},"manager_window_merge_icon":{"message":"Load and merge"},"manager_window_load_icon":{"message":"Load"}, -"options_Remove_button":{"message":"Remove"},"add_tab_group_regex":{"message":"Add"},"menu_unload_tree":{"message":"Unload tree"}}; - +const english_base = { + "extensionName":"", + "extDesc":"", + "OpenSidebar":"", + "button_new":"", + "button_pin":"", + "button_undo":"", + "button_reboot":"", + "button_detach":"", + "button_move":"", + "button_search":"", + "button_tools":"", + "button_groups":"", + "filter_search_go_prev":"", + "filter_search_go_next":"", + "button_bookmarks":"", + "button_downloads":"", + "button_history":"", + "button_settings":"", + "button_options":"", + "button_extensions":"", + "button_unload":"", + "button_discard":"", + "button_filter_type":"", + "button_groups_toolbar_hide":"", + "button_new_group":"", + "button_remove_group":"", + "button_edit_group":"", + "button_import_group":"", + "button_export_group":"", + "button_backup":"", + "button_import_bak":"", + "button_import_merge_bak":"", + "button_export_bak":"", + "button_load_bak1":"", + "button_load_bak2":"", + "button_load_bak3":"", + "button_folders":"", + "button_new_folder":"", + "button_remove_folder":"", + "button_edit_folder":"", + "menu_expand_all":"", + "menu_collapse_all":"", + "menu_expand_tree":"", + "menu_collapse_tree":"", + "menu_new_tab":"", + "menu_new_pin":"", + "menu_duplicate_tab":"", + "menu_detach_tab":"", + "menu_reload_tab":"", + "menu_pin_tab":"", + "menu_mute_tab":"", + "menu_mute_tree":"", + "menu_unmute_tree":"", + "menu_unmute_tab":"", + "menu_mute_other":"", + "menu_unmute_other":"", + "menu_unpin_tab":"", + "menu_close_tree":"", + "menu_close":"", + "menu_close_other":"", + "menu_undo_close_tab":"", + "menu_treetabs_settings":"", + "menu_unload":"", + "menu_bookmark_tree":"", + "menu_new_folder":"", + "menu_rename_folder":"", + "menu_delete_folder":"", + "menu_new_group":"", + "menu_rename_group":"", + "menu_delete_group":"", + "menu_delete_group_tabs_close":"", + "menu_groups_unload":"", + "menu_bookmark_group":"", + "menu_groups_hibernate":"", + "menu_group_tabs_close":"", + "status_bar_rearranging_tabs":"", + "status_bar_rearranging_finished":"", + "status_bar_loaded_tree_structure":"", + "status_bar_finding_ref_tabs":"", + "status_bar_finding_other_windows":"", + "status_bar_all_done":"", + "status_bar_autosave":"", + "status_bar_quick_check_recreate_structure":"", + "options_vivaldi":"", + "opt_url_for_web_panel":"", + "options_pinned":"", + "options_pin_list_multi_row":"", + "option_allow_pin_close":"", + "option_pin_attention_blinking":"", + "option_audio_blinking":"", + "options_tabs":"", + "options_syncro_tabbar_tabs_order":"", + "options_switch_with_scroll":"", + "options_tab_group_regex":"", + "option_tab_match":"", + "option_tab_group":"", + "options_orphaned_tabs_to_ungrouped":"", + "options_move_on_url_change":"", + "options_move_on_url_change_never":"", + "options_move_on_url_change_from_empty":"", + "options_move_on_url_change_from_empty_b":"", + "options_move_on_url_change_all_new":"", + "options_move_on_url_change_always":"", + "options_always_show_close":"", + "options_never_show_close":"", + "options_collapse_other_trees":"", + "options_open_tree_on_hover":"", + "options_promote_children":"", + "options_promote_children_in_first_child":"", + "options_skip_load":"", + "options_midclick_tab":"", + "options_dbclick_tab":"", + "options_action_tab_none":"", + "options_action_tab_new":"", + "options_action_tab_expand_collapse":"", + "options_action_tab_close":"", + "options_action_tab_reload":"", + "options_action_tab_unload":"", + "options_action_tab_activate_previous_active":"", + "options_action_tab_undo_close":"", + "options_midclick_group":"", + "options_dbclick_group":"", + "options_action_group_none":"", + "options_action_group_new":"", + "options_action_group_activate_previous_active":"", + "options_action_group_undo_close_tab":"", + "options_append_pinned_tab":"", + "options_append_pinned_tab_first":"", + "options_append_pinned_tab_after":"", + "options_append_pinned_tab_last":"", + "options_append_child_tab":"", + "options_append_child_tab_top":"", + "options_append_child_tab_bottom":"", + "options_append_child_tab_after":"", + "options_append_orphan_tab":"", + "options_append_orphan_tab_top":"", + "options_append_orphan_tab_after_active":"", + "options_append_orphan_tab_bottom":"", + "options_append_orphan_tab_as_child":"", + "options_append_orphan_tab_active_parent_top":"", + "options_append_orphan_tab_active_parent_bottom":"", + "options_toolbar_new_tab":"", + "options_toolbar_new_tab_as_regular_orphan":"", + "options_toolbar_new_tab_root_of_group":"", + "options_after_closing_active_tab":"", + "options_after_closing_active_tab_go_up":"", + "options_after_closing_active_tab_go_down":"", + "options_after_closing_active_tab_go_up_seek_in_parent":"", + "options_after_closing_active_tab_go_down_seek_in_parent":"", + "options_after_closing_active_tab_go_browser":"", + "options_append_child_tab_after_limit":"", + "options_append_child_tab_after_limit_top":"", + "options_append_child_tab_after_limit_after":"", + "options_append_child_tab_after_limit_bottom":"", + "options_show_counter_tabs":"", + "options_show_counter_tabs_hints":"", + "options_max_tree_depth":"", + "options_max_tree_drag_drop":"", + "options_groups":"", + "options_show_counter_groups":"", + "options_groups_toolbar_default":"", + "options_syncro_tabbar_groups_tabs_order":"", + "options_hide_other_groups_tabs_firefox":"", + "options_folders":"", + "options_midclick_folder":"", + "options_dbclick_folder":"", + "options_action_folder_none":"", + "options_action_folder_rename":"", + "options_action_folder_new_folder":"", + "options_action_folder_new_tab":"", + "options_action_folder_expand_collapse":"", + "options_action_folder_close":"", + "options_action_folder_unload":"", + "options_global":"", + "options_theme":"", + "options_rename_theme_button":"", + "options_add_theme_button":"", + "options_remove_theme_button":"", + "options_import_theme_button":"", + "options_export_theme_button":"", + "options_share_theme_link":"", + "options_toolbar":"", + "options_available_buttons":"", + "options_reset_toolbar_button":"", + "options_export_debug":"", + "options_print_debug":"", + "options_toolbar_look":"", + "hint_orphan_tab":"", + "hint_ctrl_t":"", + "hint_from_pin":"", + "hint_from_bookmark":"", + "hint_from_external_link":"", + "hint_from_popup":"", + "hint_explained_new_tab_settings":"", + "hint_explained_orphan_after_active_settings":"", + "button_background":"", + "button_hover_background":"", + "button_on_background":"", + "button_icons":"", + "button_icons_hover":"", + "button_on_icons":"", + "button_border":"", + "button_hover_border":"", + "filter_box_font":"", + "filter_box_background":"", + "filter_box_border":"", + "filter_clear_icon":"", + "toolbar_background":"", + "toolbar_shelf_background":"", + "toolbar_border_bottom":"", + "button_shelf_background":"", + "button_shelf_hover_background":"", + "button_shelf_icons":"", + "button_shelf_icons_hover":"", + "button_shelf_border":"", + "button_shelf_hover_border":"", + "options_theme_tabs":"", + "options_tabs_margin_overlap":"", + "options_tabs_margin_0":"", + "options_tabs_margin_1":"", + "options_tab_list_scrollbar_width_down":"", + "options_tab_list_scrollbar_width_up":"", + "options_tab_list_scrollbar_height_down":"", + "options_tab_list_scrollbar_height_up":"", + "options_tabs_indentation_down":"", + "options_tabs_indentation_up":"", + "options_tabs_roundness_down":"", + "options_tabs_roundness_up":"", + "options_tabs_size_down":"", + "options_tabs_size_up":"", + "options_theme_tabs_sample_text_normal":"", + "options_theme_tabs_sample_text_normal_hover":"", + "options_theme_tabs_sample_text_normal_selected":"", + "options_theme_tabs_sample_text_normal_selected_hover":"", + "options_theme_tabs_sample_text_active":"", + "options_theme_tabs_sample_text_active_hover":"", + "options_theme_tabs_sample_text_active_selected":"", + "options_theme_tabs_sample_text_active_selected_hover":"", + "options_theme_tabs_sample_text_discarded":"", + "options_theme_tabs_sample_text_discarded_hover":"", + "options_theme_tabs_sample_text_discarded_selected":"", + "options_theme_tabs_sample_text_discarded_selected_hover":"", + "options_theme_tabs_sample_text_search_result":"", + "options_theme_tabs_sample_text_search_result_hover":"", + "options_theme_tabs_sample_text_search_result_active":"", + "options_theme_tabs_sample_text_search_result_active_hover":"", + "options_theme_tabs_sample_text_search_result_selected":"", + "options_theme_tabs_sample_text_search_result_selected_hover":"", + "options_theme_tabs_sample_text_search_result_selected_active":"", + "options_theme_tabs_sample_text_search_result_selected_active_hover":"", + "options_theme_tabs_sample_text_search_result_highlighted":"", + "options_theme_tabs_sample_text_search_result_highlighted_hover":"", + "options_theme_tabs_sample_text_search_result_highlighted_active":"", + "options_theme_tabs_sample_text_search_result_highlighted_active_hover":"", + "options_theme_tabs_sample_text_search_result_highlighted_selected":"", + "options_theme_tabs_sample_text_search_result_highlighted_selected_hover":"", + "options_theme_tabs_sample_text_search_result_highlighted_selected_active":"", + "options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":"", + "attention_background":"", + "attention_border":"", + "pin_list_border_bottom":"", + "pin_list_background":"", + "folder_icon_open":"", + "folder_icon_closed":"", + "folder_icon_hover":"", + "expand_open_background":"", + "expand_closed_background":"", + "expand_hover_background":"", + "group_list_button_hover_background":"", + "group_list_borders":"", + "group_list_default_font_color":"", + "group_list_background":"", + "tab_list_background":"", + "drag_indicator":"", + "close_x":"", + "close_hover_x":"", + "close_hover_border":"", + "close_hover_background":"", + "scrollbar_thumb":"", + "scrollbar_thumb_hover":"", + "scrollbar_track":"", + "options_example_menu_item":"", + "options_menu":"", + "tabs_menu_hover_border":"", + "tabs_menu_hover_background":"", + "tabs_menu_separator":"", + "tabs_menu_font":"", + "tabs_menu_border":"", + "tabs_menu_background":"", + "options_there_is_a_theme_with_this_name":"", + "options_theme_name_cannot_be_empty":"", + "options_no_theme_to_export":"", + "options_loaded_theme_older_version":"", + "options_loaded_theme_newer_version":"", + "options_vivaldi_copied_url":"", + "options_copied_wallet_address":"", + "options_clear_data":"", + "options_development":"", + "options_debug":"", + "group_edit_button_cancel":"", + "group_edit_button_confirm":"", + "folder_edit_button_cancel":"", + "folder_edit_button_confirm":"", + "manager_window_button_label_import_group":"", + "manager_window_button_label_import_session":"", + "manager_window_button_label_save_current_session":"", + "caption_ungrouped_group":"", + "caption_noname_group":"", + "caption_clear_filter":"", + "caption_loading":"", + "caption_searchbox":"", + "manager_window_header_title":"", + "menu_manager_window":"", + "button_manager_window":"", + "manager_window_groups_button":"", + "manager_window_sessions_button":"", + "manager_window_autosave_button":"", + "manager_window_button_label_hibernate_group":"", + "manager_window_autosessions_maximum_saves_label":"", + "manager_window_autosessions_save_timer_label":"", + "manager_window_delete_icon":"", + "manager_window_savetofile_icon":"", + "manager_window_merge_icon":"", + "manager_window_load_icon":"", + "options_Remove_button":"", + "add_tab_group_regex":"", + "menu_unload_tree":"", + "status_bar_running_in_safe_mode":"", + "status_bar_ready":"" +}; let translator = { @@ -32,30 +340,30 @@ let translator = { } document.getElementById("load_translation").onclick = function(event) { if (event.which == 1) { - translator.File_OpenFile(); + translator.File.OpenFile(); } } document.getElementById("export_translation").onclick = function(event) { if (event.which == 1) { - translator.File_SaveFile(); + translator.File.SaveFile(); } } }, textBox: class { constructor(p) { - + let textValue = chrome.i18n.getMessage(p.id); let OriginalText = document.createElement("div"); OriginalText.classList = "original"; OriginalText.id = p.id; - OriginalText.innerHTML = p.message; + OriginalText.innerHTML = textValue; body.appendChild(OriginalText); this.OriginalText = OriginalText; let TextBox = document.createElement("textarea"); TextBox.classList = "translated"; TextBox.id = p.id; TextBox.style.width = "100%"; - TextBox.value = ""; + TextBox.value = textValue; TextBox.style.whiteSpace = "normal"; TextBox.style.marginBottom = "10px"; body.appendChild(TextBox); @@ -117,5 +425,3 @@ let translator = { translator.init(); - -