瀏覽代碼

feat: autoScrollToActiveSongMode (#132)

Sv443 1 月之前
父節點
當前提交
ad0640f53a

+ 6 - 2
assets/translations/de-DE.json

@@ -208,6 +208,9 @@
   "color_lightness_darker": "Dunkler",
   "color_lightness_normal": "Normal",
   "color_lightness_lighter": "Heller",
+  "auto_scroll_to_active_song_mode_never": "Nie",
+  "auto_scroll_to_active_song_mode_initial_page_load": "Beim initialen Laden der Seite",
+  "auto_scroll_to_active_song_mode_video_change": "Bei jedem Video",
 
   "plugin_list_title": "Plugin-Liste",
   "plugin_list_no_plugins": "Derzeit sind keine Plugins installiert.\nBesuche %1diese Seite%2 für mehr Informationen.",
@@ -288,8 +291,9 @@
   "feature_desc_deleteFromQueueButton": "Füge einen Knopf zu jedem Song in einer Liste hinzu, um ihn schnell zu entfernen",
   "feature_desc_listButtonsPlacement": "Wo sollen die Listen-Knöpfe erscheinen?",
   "feature_helptext_listButtonsPlacement": "Es gibt verschiedene Songlisten auf der Seite wie Albumseiten, Playlists und die aktuelle Wiedergabeliste.\nMit dieser Option kannst du wählen, wo die Listen-Knöpfe erscheinen sollen.",
-  "feature_desc_scrollToActiveSongBtn": "Füge einen Knopf über der Wiedergabeliste hinzu, um zum aktuell abgespielten Song zu scrollen",
+  "feature_desc_scrollToActiveSongBtn": "Füge einen Knopf über der Wiedergabeliste hinzu, um zum aktuell spielenden Song zu scrollen",
   "feature_desc_clearQueueBtn": "Füge einen Knopf über der Wiedergabeliste hinzu, um sie schnell zu leeren",
+  "feature_desc_aboveQueueBtnsSticky": "Positioniere das Element, in dem die Knöpfe über der Wiedergabeliste sind, immer am oberen Rand",
 
   "feature_desc_disableBeforeUnloadPopup": "Verhindere das Erscheinen des Bestätigungs-Popup beim Verlassen der Seite, während ein Song läuft",
   "feature_helptext_disableBeforeUnloadPopup": "Wenn du versuchst, die Seite zu verlassen, während ein Song läuft, erscheint ein Popup, das dich fragt, ob du die Seite wirklich verlassen möchtest. Es könnte etwas in der Art von \"Du hast ungespeicherte Daten\" oder \"Diese Seite fragt, ob du sie schließen möchtest\" sein.\nDiese Funktion deaktiviert dieses Popup vollständig.",
@@ -303,7 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "Wie viele Sekunden abgezogen werden sollen, wenn ein gespeicherter Song wiederhergestellt wird",
   "feature_helptext_rememberSongTimeReduction": "Wenn die Zeit eines Songs, die gespeichert wurde, wiederhergestellt wird, wird diese Anzahl von Sekunden von der gespeicherten Zeit abgezogen, damit du den Teil, der unterbrochen wurde, erneut hören kannst.",
   "feature_desc_rememberSongTimeMinPlayTime": "Mindestanzahl an Sekunden, die ein Song gespielt werden muss, damit die Zeit gespeichert wird",
-  "feature_desc_aboveQueueBtnsSticky": "Positioniere das Element, in dem die Knöpfe über der Wiedergabeliste sind, immer am oberen Rand",
+  "feature_desc_autoScrollToActiveSongMode": "Ob und wann zu dem aktuell spielenden Song in der Wiedergabeliste gescrollt werden soll",
 
   "feature_desc_arrowKeySupport": "Benutze die Pfeiltasten um vor- und zurückzuspulen",
   "feature_helptext_arrowKeySupport": "Normalerweise kannst du nur in 10 Sekunden Schritten vor- und zurückspulen, indem du die Tasten \"H\" und \"L\" benutzt. Diese Funktion ermöglicht es dir, auch die Pfeiltasten zu benutzen.\nUm die Anzahl der Sekunden zu ändern, um die gespult werden soll, benutze die Option unten.",

+ 6 - 1
assets/translations/en-US.json

@@ -209,6 +209,10 @@
   "color_lightness_normal": "Normal",
   "color_lightness_lighter": "Lighter",
 
+  "auto_scroll_to_active_song_mode_never": "Never",
+  "auto_scroll_to_active_song_mode_initial_page_load": "On first page load only",
+  "auto_scroll_to_active_song_mode_video_change": "On every new video",
+
   "plugin_list_title": "Plugin List",
   "plugin_list_no_plugins": "No plugins are currently installed.\nVisit %1this page%2 for more information.",
   "plugin_list_no_plugins_tooltip": "No plugins are currently installed.",
@@ -290,6 +294,7 @@
   "feature_helptext_listButtonsPlacement": "There are various song lists on the site like album pages, playlists and the currently playing queue.\nWith this option you can choose where the list buttons should show up.",
   "feature_desc_scrollToActiveSongBtn": "Add a button above the queue to scroll to the currently playing song",
   "feature_desc_clearQueueBtn": "Add a button above the currently playing queue or playlist to quickly clear it",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "Prevent the confirmation popup that appears when trying to leave the site while a song is playing",
   "feature_helptext_disableBeforeUnloadPopup": "When trying to leave the site while a few seconds into a song that is actively playing, a popup will appear asking you to confirm that you want to leave the site. It might say something along the lines of \"you have unsaved data\" or \"this site is asking if you want to close it\".\nThis feature disables that popup entirely.",
@@ -303,7 +308,7 @@
   "feature_desc_rememberSongTimeReduction": "How many seconds to subtract when restoring the time of a remembered song",
   "feature_helptext_rememberSongTimeReduction": "When restoring the time of a song that was remembered, this amount of seconds will be subtracted from the remembered time so you have more context when listening to the part that was interrupted again.",
   "feature_desc_rememberSongTimeMinPlayTime": "Minimum amount of seconds a song needs to be played for its time to be remembered",
-  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
+  "feature_desc_autoScrollToActiveSongMode": "Whether and when to scroll to the currently playing song in the queue",
 
   "feature_desc_arrowKeySupport": "Use arrow keys to skip forwards and backwards in the currently playing song",
   "feature_helptext_arrowKeySupport": "Normally you can only skip forwards and backwards by a fixed 10 second interval with the keys \"H\" and \"L\". This feature allows you to use the arrow keys too.\nTo change the amount of seconds to skip, use the option below.",

+ 20 - 0
assets/translations/es-ES.json

@@ -39,6 +39,7 @@
   "import_success": "Datos importados correctamente",
   "import_success_confirm_reload": "Los datos se importaron correctamente.\n¿Desea recargar la página ahora para aplicar los cambios?",
   "reset_config_confirm": "¿Realmente quieres restablecer todos los ajustes a sus valores predeterminados?\nLa página se volverá a cargar automáticamente.",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "Copiar",
   "copy_to_clipboard": "Copiar al portapapeles",
   "copy_to_clipboard_error": "No se pudo copiar el texto al portapapeles. Cópielo manualmente desde aquí:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "Avanzado",
   "experimental_feature": "Función experimental",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "Ingrese el título de la canción y el artista para buscar la letra:",
   "lyrics_loading": "Cargando URL de letras...",
   "lyrics_rate_limited-1": "Se está limitando la velocidad.\nEspere unos segundos antes de solicitar más letras.",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "Más oscuro",
   "color_lightness_normal": "Normal",
   "color_lightness_lighter": "Más claro",
+  "auto_scroll_to_active_song_mode_never": "Nunca",
+  "auto_scroll_to_active_song_mode_initial_page_load": "Solo en la primera carga de la página",
+  "auto_scroll_to_active_song_mode_video_change": "En cada nuevo video",
 
   "plugin_list_title": "Lista de plugins",
   "plugin_list_no_plugins": "Actualmente no hay plugins instalados.\nVisite %1esta página%2 para obtener más información.",
@@ -217,13 +223,21 @@
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
 
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "Este plugin puede leer la configuración de la función",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "Este plugin puede escribir en la configuración de la función",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "Este plugin tiene acceso a valores de configuración ocultos",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "Este plugin puede escribir en la caché de letras",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "Este plugin puede agregar nuevas traducciones y sobrescribir las existentes",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "Este plugin puede crear diálogos modales",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "Este plugin puede leer datos de me gusta automático",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "Este plugin puede escribir en datos de me gusta automático",
 
   "plugin_validation_error_no_property": "No hay ninguna propiedad '%1' con el tipo '%2'",
@@ -279,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "Hay varias listas de canciones en el sitio como páginas de álbumes, listas de reproducción y la cola de reproducción actual.\nCon esta opción, puede elegir dónde deben aparecer los botones de la lista.",
   "feature_desc_scrollToActiveSongBtn": "Agregue un botón para desplazarse hasta la canción que se está reproduciendo actualmente",
   "feature_desc_clearQueueBtn": "Agregue un botón para borrar rápidamente la cola de reproducción o la lista de reproducción actual",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "Evite la ventana emergente de confirmación que aparece al intentar salir del sitio mientras se reproduce una canción",
   "feature_helptext_disableBeforeUnloadPopup": "Cuando intenta salir del sitio mientras está reproduciendo una canción que lleva unos segundos, aparecerá una ventana emergente que le pedirá que confirme que desea salir del sitio. Podría decir algo así como \"tiene datos no guardados\" o \"este sitio está preguntando si desea cerrarlo\".\nEsta función deshabilita completamente esa ventana emergente.",
@@ -292,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "Cuántos segundos restar al restaurar el tiempo de una canción recordada",
   "feature_helptext_rememberSongTimeReduction": "Al restaurar el tiempo de una canción que se recordó, se restarán esta cantidad de segundos del tiempo recordado para que pueda volver a escuchar la parte que se interrumpió.",
   "feature_desc_rememberSongTimeMinPlayTime": "Cantidad mínima de segundos que una canción debe reproducirse para recordar su tiempo",
+  "feature_desc_autoScrollToActiveSongMode": "¿Cuándo y si desplazarse automáticamente a la canción que se está reproduciendo actualmente?",
 
   "feature_desc_arrowKeySupport": "Use las teclas de flecha para saltar hacia adelante y hacia atrás en la canción que se está reproduciendo actualmente",
   "feature_helptext_arrowKeySupport": "Normalmente solo puede saltar hacia adelante y hacia atrás en un intervalo fijo de 10 segundos con las teclas \"H\" y \"L\". Esta función le permite usar las teclas de flecha también.\nPara cambiar la cantidad de segundos para saltar, use la opción a continuación.",
@@ -336,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "Si la extensión ThemeSong está instalada pero esta función está desactivada (o viceversa), es posible que notes un estilo roto en el sitio.\n\n¡Asegúrate siempre de que esta función refleje si la extensión está instalada o no!",
   "feature_desc_themeSongLightness": "¿Qué tan claro deben ser los colores de acento derivados del tema actual de ThemeSong?",
   "feature_helptext_themeSongLightness": "Dependiendo de la configuración que hayas elegido para la extensión ThemeSong, esta función te permite ajustar la claridad de los colores de acento que se derivan del tema actual.\n\nEsta función no tendrá efecto si la extensión ThemeSong no está instalada.",
+
   "feature_desc_openPluginList": "Abrir la lista de plugins que tienes instalados",
   "feature_btn_openPluginList": "Abrir lista",
   "feature_btn_openPluginList_running": "Abriendo...",
@@ -357,6 +374,9 @@
   "feature_desc_resetConfig": "Restablecer todas las configuraciones a sus valores predeterminados",
   "feature_btn_resetConfig": "Restablecer configuraciones",
   "feature_btn_resetConfig_running": "Restableciendo...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "Mostrar configuración avanzada (recarga el menú)",
   "feature_helptext_advancedMode": "Después de habilitar esto, el menú se recargará y mostrará configuraciones avanzadas que están ocultas de forma predeterminada.\nEsto es útil si desea personalizar más profundamente el comportamiento del script y no le importa un menú abarrotado."
 }

+ 20 - 0
assets/translations/fr-FR.json

@@ -39,6 +39,7 @@
   "import_success": "Données importées avec succès",
   "import_success_confirm_reload": "Les données ont été importées avec succès.\nVoulez-vous recharger la page maintenant pour appliquer les modifications?",
   "reset_config_confirm": "Voulez-vous vraiment réinitialiser tous les paramètres à leurs valeurs par défaut?\nLa page sera automatiquement rechargée.",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "Copier",
   "copy_to_clipboard": "Copier dans le presse-papiers",
   "copy_to_clipboard_error": "Impossible de copier le texte dans le presse-papiers. Veuillez le copier manuellement d'ici:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "Avancé",
   "experimental_feature": "Fonctionnalité expérimentale",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "Entrez le titre de la chanson et l'artiste pour rechercher les paroles:",
   "lyrics_loading": "Chargement de l'URL des paroles...",
   "lyrics_rate_limited-1": "Vous êtes limité par le taux.\nVeuillez patienter quelques secondes avant de demander plus de paroles.",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "Plus foncé",
   "color_lightness_normal": "Normal",
   "color_lightness_lighter": "Plus clair",
+  "auto_scroll_to_active_song_mode_never": "Jamais",
+  "auto_scroll_to_active_song_mode_initial_page_load": "Au premier chargement de la page uniquement",
+  "auto_scroll_to_active_song_mode_video_change": "À chaque nouvelle vidéo",
 
   "plugin_list_title": "Liste des plugins",
   "plugin_list_no_plugins": "Aucun plugin n'est actuellement installé.\nVisitez %1cette page%2 pour plus d'informations.",
@@ -217,13 +223,21 @@
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
 
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "Ce plugin peut lire la configuration de la fonctionnalité",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "Ce plugin peut écrire dans la configuration de la fonctionnalité",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "Ce plugin a accès à des valeurs de configuration cachées",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "Ce plugin peut écrire dans le cache des paroles",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "Ce plugin peut ajouter de nouvelles traductions et écraser les existantes",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "Ce plugin peut créer des boîtes de dialogue modales",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "Ce plugin peut lire les données d'auto-aimer",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "Ce plugin peut écrire dans les données d'auto-aimer",
 
   "plugin_validation_error_no_property": "Aucune propriété '%1' avec le type '%2'",
@@ -279,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "Il existe diverses listes de chansons sur le site comme les pages d'album, les listes de lecture et la file d'attente en cours de lecture.\nAvec cette option, vous pouvez choisir où les boutons de liste doivent apparaître.",
   "feature_desc_scrollToActiveSongBtn": "Ajouter un bouton au-dessus de la file d'attente pour faire défiler jusqu'à la chanson en cours de lecture",
   "feature_desc_clearQueueBtn": "Ajouter un bouton au-dessus de la file d'attente ou de la liste de lecture en cours pour la vider rapidement",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "Empêcher la fenêtre contextuelle de confirmation qui apparaît lors de la tentative de quitter le site pendant qu'une chanson est en cours de lecture",
   "feature_helptext_disableBeforeUnloadPopup": "Lorsque vous essayez de quitter le site alors que vous êtes quelques secondes dans une chanson qui est en cours de lecture, une fenêtre contextuelle apparaîtra pour vous demander de confirmer que vous voulez quitter le site. Elle pourrait dire quelque chose comme \"vous avez des données non enregistrées\" ou \"ce site demande si vous voulez le fermer\".\nCette fonctionnalité désactive complètement cette fenêtre contextuelle.",
@@ -292,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "De combien de secondes réduire le temps de la chanson mémorisée lors de sa restauration",
   "feature_helptext_rememberSongTimeReduction": "Lors de la restauration du temps d'une chanson qui a été mémorisée, ce nombre de secondes sera soustrait du temps mémorisé pour que vous puissiez réécouter la partie qui a été interrompue.",
   "feature_desc_rememberSongTimeMinPlayTime": "Temps minimum en secondes que la chanson doit être lue pour que son temps soit mémorisé",
+  "feature_desc_autoScrollToActiveSongMode": "Quand et si faire défiler jusqu'à la chanson en cours de lecture",
 
   "feature_desc_arrowKeySupport": "Utilisez les touches fléchées pour avancer et reculer dans la chanson en cours de lecture",
   "feature_helptext_arrowKeySupport": "Normalement, vous ne pouvez avancer et reculer que par intervalles fixes de 10 secondes avec les touches \"H\" et \"L\". Cette fonctionnalité vous permet d'utiliser aussi les touches fléchées.\nPour changer le nombre de secondes à sauter, utilisez l'option ci-dessous.",
@@ -336,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "Si l'extension ThemeSong est installée mais que cette fonctionnalité est désactivée (ou vice versa), vous pourriez remarquer des problèmes de style sur le site.\n\nAssurez-vous toujours que cette fonctionnalité reflète si l'extension est installée ou non!",
   "feature_desc_themeSongLightness": "À quel point les couleurs d'accentuation dérivées du thème actuel de ThemeSong doivent-elles être claires",
   "feature_helptext_themeSongLightness": "En fonction des paramètres que vous avez choisis pour l'extension ThemeSong, cette fonctionnalité vous permet d'ajuster la clarté des couleurs d'accentuation dérivées du thème actuel.\n\nCette fonctionnalité n'aura aucun effet si l'extension ThemeSong n'est pas installée.",
+
   "feature_desc_openPluginList": "Ouvrir la liste des plugins que vous avez installés",
   "feature_btn_openPluginList": "Ouvrir la liste",
   "feature_btn_openPluginList_running": "Ouverture...",
@@ -357,6 +374,9 @@
   "feature_desc_resetConfig": "Réinitialiser tous les paramètres à leurs valeurs par défaut",
   "feature_btn_resetConfig": "Réinitialiser les paramètres",
   "feature_btn_resetConfig_running": "Réinitialisation...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "Afficher les paramètres avancés (cela recharge le menu)",
   "feature_helptext_advancedMode": "Après avoir activé cela, le menu se rechargera et affichera les paramètres avancés qui sont masqués par défaut.\nCela est utile si vous souhaitez personnaliser plus en profondeur le comportement du script et que vous ne vous souciez pas d'un menu surchargé."
 }

+ 20 - 0
assets/translations/hi-IN.json

@@ -39,6 +39,7 @@
   "import_success": "डेटा सफलतापूर्वक आयात किया गया",
   "import_success_confirm_reload": "डेटा सफलतापूर्वक आयात किया गया है।\nक्या आप परिवर्तन लागू करने के लिए पृष्ठ को अब पुनः लोड करना चाहते हैं?",
   "reset_config_confirm": "क्या आप वास्तव में सभी सेटिंग्स को उनके डिफ़ॉल्ट मानों पर रीसेट करना चाहते हैं?\nपृष्ठ स्वचालित रूप से पुनः लोड हो जाएगा।",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "कॉपी",
   "copy_to_clipboard": "क्लिपबोर्ड पर कॉपी करें",
   "copy_to_clipboard_error": "टेक्स्ट को क्लिपबोर्ड पर कॉपी नहीं किया जा सका। कृपया इसे यहां से मैन्युअल रूप से कॉपी करें:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "उन्नत",
   "experimental_feature": "प्रायोगिक सुविधा",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "बोल खोजने के लिए गीत का शीर्षक और कलाकार दर्ज करें:",
   "lyrics_loading": "बोल लोड हो रहे हैं...",
   "lyrics_rate_limited-1": "आपको रेट सीमित किया जा रहा है।\nकृपया अधिक बोल का अनुरोध करने से पहले कुछ सेकंड प्रतीक्षा करें।",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "गहरे",
   "color_lightness_normal": "सामान्य",
   "color_lightness_lighter": "हल्का",
+  "auto_scroll_to_active_song_mode_never": "कभी नहीं",
+  "auto_scroll_to_active_song_mode_initial_page_load": "पहले पृष्ठ लोड पर केवल",
+  "auto_scroll_to_active_song_mode_video_change": "हर नए वीडियो पर",
 
   "plugin_list_title": "प्लगइन सूची",
   "plugin_list_no_plugins": "कोई प्लगइन वर्तमान में स्थापित नहीं हैं।\nअधिक जानकारी के लिए %1इस पृष्ठ%2 पर जाएं।",
@@ -217,13 +223,21 @@
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
 
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "यह प्लगइन फीचर कॉन्फ़िगरेशन को पढ़ सकता है",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "यह प्लगइन फीचर कॉन्फ़िगरेशन में लिख सकता है",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "इस प्लगइन में छिपे हुए कॉन्फ़िगरेशन मानों तक पहुंच है",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "यह प्लगइन गीत कैश में लिख सकता है",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "यह प्लगइन नए अनुवाद जोड़ सकता है और मौजूदा अनुवादों को अधिलेखित कर सकता है",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "यह प्लगइन मोडल डायलॉग बना सकता है",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "यह प्लगइन ऑटो-पसंद डेटा पढ़ सकता है",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "यह प्लगइन ऑटो-पसंद डेटा में लिख सकता है",
 
   "plugin_validation_error_no_property": "कोई गुण '%1' जिसके पास '%2' प्रकार है नहीं है",
@@ -279,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "साइट पर विभिन्न गीत सूचियाँ हैं जैसे एल्बम पेज, प्लेलिस्ट और वर्तमान में चल रही कतार।\nइस विकल्प के साथ आप यह चुन सकते हैं कि बटन कहाँ दिखाएं।",
   "feature_desc_scrollToActiveSongBtn": "कतार में वर्तमान गीत के ऊपर स्क्रॉल करने के लिए एक बटन जोड़ें",
   "feature_desc_clearQueueBtn": "वर्तमान में चल रही कतार या प्लेलिस्ट के ऊपर त्वरित रूप से इसे साफ करने के लिए एक बटन जोड़ें",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "एक गीत चल रहे होने पर साइट छोड़ने का प्रयास करने पर आने वाली पुष्टि पॉपअप को रोकें",
   "feature_helptext_disableBeforeUnloadPopup": "जब आप वेबसाइट छोड़ने की कोशिश करते हैं जब आप एक गीत को थोड़े समय के लिए सुन रहे होते हैं, तो एक पॉपअप आता है जो आपसे पुष्टि करता है कि क्या आप वाकई साइट छोड़ना चाहते हैं। यह कुछ इस प्रकार का हो सकता है \"आपके पास असहेज डेटा है\" या \"यह साइट आपसे पूछ रही है कि क्या आप इसे बंद करना चाहते हैं\"।\nयह सुविधा इस पॉपअप को पूरी तरह से अक्षम करती है।",
@@ -292,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "याद रखे गए गीत के समय को बहाल करते समय कितने सेकंड कम करें?",
   "feature_helptext_rememberSongTimeReduction": "जब याद किए गए गीत का समय बहाल किया जाता है, तो याद किए गए समय से यह संख्या घटाई जाएगी ताकि आप उस भाग को फिर से सुन सकें जिसे रोक दिया गया था।",
   "feature_desc_rememberSongTimeMinPlayTime": "गीत को याद रखने के लिए न्यूनतम समय (सेकंड) जिसे गीत को खेलना चाहिए",
+  "feature_desc_autoScrollToActiveSongMode": "वर्तमान में चल रहे गीत में ऑटो-स्क्रॉल करने का मोड",
 
   "feature_desc_arrowKeySupport": "वर्तमान में चल रहे गीत के मीडिया नियंत्रणों में एक बटन जो एरो कुंजियों का समर्थन करता है",
   "feature_helptext_arrowKeySupport": "सामान्य रूप से आप केवल बाएं और दाएं तीर कुंजियों का उपयोग करके एक निश्चित 10 सेकंड के अंतराल में छोड़ सकते हैं। इस सुविधा की मदद से आप तीर कुंजियों का उपयोग कर सकते हैं।\nछोड़ने के लिए सेकंडों की मात्रा बदलने के लिए, नीचे दिए गए विकल्प का उपयोग करें।",
@@ -336,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "यदि थीमसॉंग एक्सटेंशन इंस्टॉल किया गया है लेकिन यह सुविधा बंद है (या उम्मीद है कि इसे बंद किया गया है), तो आप साइट पर टूटी हुई स्टाइलिंग देख सकते हैं।\n\nकृपया हमेशा सुनिश्चित करें कि यह सुविधा यह दर्शाती है कि एक्सटेंशन इंस्टॉल किया गया है या नहीं!",
   "feature_desc_themeSongLightness": "वर्तमान थीमसॉंग थीम से निकले एक्सेंट रंगों को कितना हल्का होना चाहिए",
   "feature_helptext_themeSongLightness": "थीमसॉंग एक्सटेंशन के लिए आपने जो सेटिंग्स चुनी हैं, उन एक्सेंट रंगों की हल्काई को समायोजित करने की अनुमति देती है।\n\nयदि थीमसॉंग एक्सटेंशन इंस्टॉल नहीं है, तो इस सुविधा का कोई प्रभाव नहीं होगा।",
+
   "feature_desc_openPluginList": "आपके द्वारा इंस्टॉल किए गए प्लगइनों की सूची खोलें",
   "feature_btn_openPluginList": "सूची खोलें",
   "feature_btn_openPluginList_running": "खोल रहा है...",
@@ -357,6 +374,9 @@
   "feature_desc_resetConfig": "सभी सेटिंग्स को उनके डिफ़ॉल्ट मानों पर रीसेट करें",
   "feature_btn_resetConfig": "सेटिंग्स रीसेट करें",
   "feature_btn_resetConfig_running": "रीसेट कर रहा है...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "उन्नत सेटिंग्स दिखाएं (मेनू को फिर से लोड करता है)",
   "feature_helptext_advancedMode": "इसे सक्षम करने के बाद, मेनू फिर से लोड होगा और डिफ़ॉल्ट रूप से छिपे हुए उन्नत सेटिंग्स दिखाएंगे।\nयह उपयोगी है यदि आप स्क्रिप्ट के व्यवहार को और गहराई से अनुकूलित करना चाहते हैं और एक अधिक भरा हुआ मेनू के बारे में चिंता नहीं करते।"
 }

+ 21 - 0
assets/translations/ja-JP.json

@@ -39,6 +39,7 @@
   "import_success": "データのインポートに成功しました",
   "import_success_confirm_reload": "データを正常にインポートしました。\n変更を適用するにはページを再読み込みしますか?",
   "reset_config_confirm": "すべての設定をデフォルト値にリセットしてもよろしいですか?\nページは自動的に再読み込みされます。",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "コピー",
   "copy_to_clipboard": "クリップボードにコピー",
   "copy_to_clipboard_error": "テキストをクリップボードにコピーできませんでした。ここから手動でコピーしてください:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "詳細モード",
   "experimental_feature": "実験的な機能",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "歌詞を検索するには曲名とアーティスト名を入力してください:",
   "lyrics_loading": "歌詞 URL を読み込んでいます...",
   "lyrics_rate_limited-1": "レート制限されています。\nもう少し待ってから歌詞をリクエストしてください。",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "暗い",
   "color_lightness_normal": "通常",
   "color_lightness_lighter": "明るい",
+  "auto_scroll_to_active_song_mode_never": "しない",
+  "auto_scroll_to_active_song_mode_initial_page_load": "初回のみ",
+  "auto_scroll_to_active_song_mode_video_change": "新しいビデオごと",
 
   "plugin_list_title": "プラグインリスト",
   "plugin_list_no_plugins": "現在インストールされているプラグインはありません。\n詳細については %1このページ%2 をご覧ください。",
@@ -216,13 +222,22 @@
   "plugin_link_type_bug": "バグを報告",
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
+
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "このプラグインは機能構成を読み取ることができます",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "このプラグインは機能構成に書き込むことができます",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "このプラグインは隠し構成値にアクセスできます",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "このプラグインは歌詞キャッシュに書き込むことができます",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "このプラグインは新しい翻訳を追加し、既存の翻訳を上書きできます",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "このプラグインはモーダルダイアログを作成できます",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "このプラグインは自動的に好きなデータを読み取ることができます",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "このプラグインは自動的に好きなデータに書き込むことができます",
 
   "plugin_validation_error_no_property": "タイプ '%2' のプロパティ '%1' がありません",
@@ -278,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "サイトにはアルバムページ、プレイリスト、現在再生中のキューなど、さまざまな曲リストがあります。\nこのオプションを使用すると、リストボタンを表示する場所を選択できます。",
   "feature_desc_scrollToActiveSongBtn": "現在再生中の曲にスクロールするボタンをキューの上に追加する",
   "feature_desc_clearQueueBtn": "現在再生中のキューまたはプレイリストの上にボタンを追加して、すばやくクリアする",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "曲が再生されている間にサイトを離れようとすると表示される確認ポップアップを防止する",
   "feature_helptext_disableBeforeUnloadPopup": "曲が再生されている間にサイトを離れようとすると、数秒後にポップアップが表示され、サイトを離れるかどうかを確認するように求められます。それは「保存されていないデータがあります」とか「このサイトを閉じるかどうかを尋ねています」とかのようなことが書かれているかもしれません。\nこの機能はそのポップアップを完全に無効にします。",
@@ -291,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "記憶された曲の時間を復元するときに減算する秒数",
   "feature_helptext_rememberSongTimeReduction": "記憶された曲の時間を復元するときに、記憶された時間からこの秒数が減算され、中断された部分を再度聞くことができます。",
   "feature_desc_rememberSongTimeMinPlayTime": "曲の時間を記憶するために再生する必要のある最小秒数",
+  "feature_desc_autoScrollToActiveSongMode": "現在再生中の曲にスクロールするかどうか、およびそのタイミング",
 
   "feature_desc_arrowKeySupport": "現在再生中の曲で前後にスキップするには矢印キーを使用する",
   "feature_helptext_arrowKeySupport": "通常、キー \"H\" と \"L\" を使用して 10 秒間隔で前後にスキップすることができます。この機能を使用すると、矢印キーも使用できます。\nスキップする秒数を変更するには、以下のオプションを使用してください。",
@@ -335,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "ThemeSong 拡張機能がインストールされている場合、この機能を有効にすると、サイトのスタイリングに問題が発生するのを防ぐためにいくつかの修正が行われます。\n\nこの機能は拡張機能がインストールされていない場合には効果がありませんので、その場合は有効にしたままにしておくことができます。",
   "feature_desc_themeSongLightness": "現在の ThemeSong テーマから派生したアクセントカラーの明るさ",
   "feature_helptext_themeSongLightness": "ThemeSong 拡張機能の設定に応じて、この機能を使用して、現在のテーマから派生したアクセントカラーの明るさを調整できます。\n\nThemeSong 拡張機能がインストールされていない場合、この機能は効果がありません。",
+
   "feature_desc_openPluginList": "インストールされているプラグインのリストを開く",
   "feature_btn_openPluginList": "リストを開く",
   "feature_btn_openPluginList_running": "開いています...",
@@ -356,6 +374,9 @@
   "feature_desc_resetConfig": "すべての設定をデフォルト値にリセットする",
   "feature_btn_resetConfig": "設定をリセット",
   "feature_btn_resetConfig_running": "リセット中...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "詳細設定を表示する(メニューを再読み込み)",
   "feature_helptext_advancedMode": "これを有効にすると、メニューが再読み込まれ、デフォルトで非表示になっている詳細設定が表示されます。\nこれは、スクリプトの動作をより深くカスタマイズしたい場合に便利です。メニューが過密になっていることを気にしない場合に役立ちます。"
 }

+ 20 - 0
assets/translations/pt-BR.json

@@ -39,6 +39,7 @@
   "import_success": "Os dados foram importados com sucesso",
   "import_success_confirm_reload": "Os dados foram importados com sucesso.\nVocê deseja recarregar a página agora para aplicar as alterações?",
   "reset_config_confirm": "Você realmente deseja redefinir todas as configurações para seus valores padrão?\nA página será recarregada automaticamente.",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "Copiar",
   "copy_to_clipboard": "Copiar para a área de transferência",
   "copy_to_clipboard_error": "Não foi possível copiar o texto para a área de transferência. Por favor, copie manualmente daqui:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "Avançado",
   "experimental_feature": "Recurso experimental",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "Digite o título da música e o artista para pesquisar as letras:",
   "lyrics_loading": "Carregando URL das letras...",
   "lyrics_rate_limited-1": "Você está sendo limitado.\nAguarde alguns segundos antes de solicitar mais letras.",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "Mais escuro",
   "color_lightness_normal": "Normal",
   "color_lightness_lighter": "Mais claro",
+  "auto_scroll_to_active_song_mode_never": "Nunca",
+  "auto_scroll_to_active_song_mode_initial_page_load": "Apenas na primeira carga da página",
+  "auto_scroll_to_active_song_mode_video_change": "Em cada novo vídeo",
 
   "plugin_list_title": "Lista de plugins",
   "plugin_list_no_plugins": "Nenhum plugin está atualmente instalado.\nVisite %1esta página%2 para mais informações.",
@@ -217,13 +223,21 @@
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
 
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "Este plugin pode ler a configuração do recurso",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "Este plugin pode escrever na configuração do recurso",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "Este plugin tem acesso a valores de configuração ocultos",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "Este plugin pode escrever no cache de letras",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "Este plugin pode adicionar novas traduções e sobrescrever as existentes",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "Este plugin pode criar diálogos modais",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "Este plugin pode ler dados de auto-curtir",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "Este plugin pode escrever em dados de auto-curtir",
 
   "plugin_validation_error_no_property": "Nenhuma propriedade '%1' com o tipo '%2'",
@@ -279,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "Existem várias listas de músicas no site, como páginas de álbuns, listas de reprodução e a fila de reprodução atual.\nCom esta opção, você pode escolher onde os botões da lista devem aparecer.",
   "feature_desc_scrollToActiveSongBtn": "Adicione um botão acima da fila para rolar para a música que está tocando atualmente",
   "feature_desc_clearQueueBtn": "Adicione um botão acima da fila de reprodução ou lista de reprodução atual para limpar rapidamente",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "Evite a janela de confirmação que aparece ao tentar sair do site enquanto uma música está tocando",
   "feature_helptext_disableBeforeUnloadPopup": "Ao tentar sair do site enquanto uma música está tocando, uma janela de confirmação pode aparecer, pedindo que você confirme que deseja sair do site. Pode dizer algo como \"você tem dados não salvos\" ou \"este site está perguntando se você deseja fechá-lo\".\nEste recurso desativa completamente essa janela de confirmação.",
@@ -292,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "Quantos segundos subtrair ao restaurar o tempo de uma música lembrada",
   "feature_helptext_rememberSongTimeReduction": "Ao restaurar o tempo de uma música que foi lembrada, este valor de segundos será subtraído do tempo lembrado para que você possa reouvir a parte que foi interrompida.",
   "feature_desc_rememberSongTimeMinPlayTime": "Quantidade mínima de segundos que uma música precisa ser reproduzida para que seu tempo seja lembrado",
+  "feature_desc_autoScrollToActiveSongMode": "Se e quando rolar para a música que está tocando atualmente na fila",
 
   "feature_desc_arrowKeySupport": "Use as teclas de seta para pular para a próxima ou anterior música na fila",
   "feature_helptext_arrowKeySupport": "Normalmente, você só pode pular para frente e para trás por um intervalo fixo de 10 segundos com as teclas \"H\" e \"L\". Este recurso permite que você use as teclas de seta também.\nPara alterar a quantidade de segundos a pular, use a opção abaixo.",
@@ -336,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "Se a extensão ThemeSong estiver instalada, este recurso fará algumas correções no layout do site para evitar problemas que possam ocorrer.\n\nEste recurso não terá efeito se a extensão não estiver instalada e pode ser deixado ativado nesse caso.",
   "feature_desc_themeSongLightness": "Quão claro os acentos derivados do tema atual do ThemeSong devem ser",
   "feature_helptext_themeSongLightness": "Dependendo das configurações que você escolheu para a extensão ThemeSong, este recurso permite ajustar a claridade das cores de destaque que são derivadas do tema atual.\n\nEste recurso não terá efeito se a extensão ThemeSong não estiver instalada.",
+
   "feature_desc_openPluginList": "Abrir a lista de plugins que você instalou",
   "feature_btn_openPluginList": "Abrir lista",
   "feature_btn_openPluginList_running": "Abrindo...",
@@ -357,6 +374,9 @@
   "feature_desc_resetConfig": "Redefinir todas as configurações para seus valores padrão",
   "feature_btn_resetConfig": "Redefinir configurações",
   "feature_btn_resetConfig_running": "Redefinindo...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "Mostrar configurações avançadas (isso recarrega o menu)",
   "feature_helptext_advancedMode": "Depois de ativar isso, o menu recarregará e mostrará configurações avançadas que estão ocultas por padrão.\nIsso é útil se você deseja personalizar mais profundamente o comportamento do script e não se importa com um menu lotado."
 }

+ 20 - 0
assets/translations/zh-CN.json

@@ -39,6 +39,7 @@
   "import_success": "成功导入数据",
   "import_success_confirm_reload": "成功导入数据。\n您是否要重新加载页面以应用更改?",
   "reset_config_confirm": "您是否确实要将所有设置重置为默认值?\n页面将自动重新加载。",
+  "reset_everything_confirm": "Do you really want to reset all stored data to the default values?\nThe page will be automatically reloaded.",
   "copy": "复制",
   "copy_to_clipboard": "复制到剪贴板",
   "copy_to_clipboard_error": "无法将文本复制到剪贴板。请手动从这里复制:\n%1",
@@ -93,6 +94,8 @@
   "advanced_mode_short": "高级",
   "experimental_feature": "实验性功能",
 
+  "open_current_lyrics": "Open the current song's lyrics in a new tab - shift-click to open in a new window or ctrl-click to open manual search",
+  "open_lyrics": "Open this song's lyrics in a new tab - ctrl-click to open manual search",
   "open_lyrics_search_prompt": "输入歌曲标题和艺术家以搜索歌词:",
   "lyrics_loading": "正在加载歌词 URL...",
   "lyrics_rate_limited-1": "您的请求正在被限制。\n请等待几秒钟再请求更多歌词。",
@@ -205,6 +208,9 @@
   "color_lightness_darker": "更暗",
   "color_lightness_normal": "正常",
   "color_lightness_lighter": "更亮",
+  "auto_scroll_to_active_song_mode_never": "从不",
+  "auto_scroll_to_active_song_mode_initial_page_load": "仅在第一次加载页面时",
+  "auto_scroll_to_active_song_mode_video_change": "在每个新视频上",
 
   "plugin_list_title": "插件列表",
   "plugin_list_no_plugins": "当前未安装任何插件。\n访问 %1此页面%2 以获取更多信息。",
@@ -217,13 +223,21 @@
   "plugin_link_type_greasyfork": "GreasyFork",
   "plugin_link_type_openuserjs": "OpenUserJS",
 
+  "plugin_intent_name_ReadFeatureConfig": "Read Feature Config",
   "plugin_intent_description_ReadFeatureConfig": "此插件可以读取功能配置",
+  "plugin_intent_name_WriteFeatureConfig": "Write Feature Config",
   "plugin_intent_description_WriteFeatureConfig": "此插件可以写入功能配置",
+  "plugin_intent_name_SeeHiddenConfigValues": "See Hidden Config Values",
   "plugin_intent_description_SeeHiddenConfigValues": "此插件可以访问隐藏的配置值",
+  "plugin_intent_name_WriteLyricsCache": "Write Lyrics Cache",
   "plugin_intent_description_WriteLyricsCache": "此插件可以写入歌词缓存",
+  "plugin_intent_name_WriteTranslations": "Write Translations",
   "plugin_intent_description_WriteTranslations": "此插件可以添加新的翻译并覆盖现有的翻译",
+  "plugin_intent_name_CreateModalDialogs": "Create Modal Dialogs",
   "plugin_intent_description_CreateModalDialogs": "此插件可以创建模态对话框",
+  "plugin_intent_name_ReadAutoLikeData": "Read Auto-Like Data",
   "plugin_intent_description_ReadAutoLikeData": "此插件可以读取自动喜欢的数据",
+  "plugin_intent_name_WriteAutoLikeData": "Write Auto-Like Data",
   "plugin_intent_description_WriteAutoLikeData": "此插件可以写入自动喜欢的数据",
 
   "plugin_validation_error_no_property": "没有类型为 '%2' 的属性 '%1'",
@@ -279,6 +293,7 @@
   "feature_helptext_listButtonsPlacement": "网站上有各种歌曲列表,如专辑页面、播放列表和当前播放队列。\n使用此选项,您可以选择列表按钮应该显示在哪里。",
   "feature_desc_scrollToActiveSongBtn": "在队列中添加一个按钮,以滚动到当前播放的歌曲",
   "feature_desc_clearQueueBtn": "在当前播放的队列或播放列表上方添加一个按钮,以快速清除它",
+  "feature_desc_aboveQueueBtnsSticky": "Always position the element containing the buttons above the queue at the top of the list",
 
   "feature_desc_disableBeforeUnloadPopup": "防止在播放歌曲时尝试离开网站时出现的确认弹出窗口",
   "feature_helptext_disableBeforeUnloadPopup": "当尝试在正在播放的歌曲中几秒钟后离开网站时,将出现一个弹出窗口,询问您是否要离开网站。它可能会说类似于 \"您有未保存的数据\" 或 \"此网站正在询问您是否要关闭它\"。\n此功能完全禁用了该弹出窗口。",
@@ -292,6 +307,7 @@
   "feature_desc_rememberSongTimeReduction": "恢复记住的歌曲时间时要减去多少秒",
   "feature_helptext_rememberSongTimeReduction": "当恢复记住的时间时,将从记住的时间中减去这么多秒,以便您可以重新听到被中断的部分。",
   "feature_desc_rememberSongTimeMinPlayTime": "歌曲需要播放多少秒才能记住其时间",
+  "feature_desc_autoScrollToActiveSongMode": "是否以及何时滚动到队列中当前播放的歌曲",
 
   "feature_desc_arrowKeySupport": "使用箭头键在当前播放的歌曲中前进和后退",
   "feature_helptext_arrowKeySupport": "通常,您只能使用 \"H\" 和 \"L\" 键以固定的 10 秒间隔前进和后退。此功能允许您也使用箭头键。\n要更改要跳过的秒数,请使用下面的选项。",
@@ -336,6 +352,7 @@
   "feature_helptext_themeSongIntegration": "如果安装了 ThemeSong 扩展但此功能已关闭(反之亦然),您可能会注意到网站上的样式损坏。\n\n请始终确保此功能反映了扩展程序是否已安装!",
   "feature_desc_themeSongLightness": "从当前 ThemeSong 主题派生的强调颜色应该有多亮",
   "feature_helptext_themeSongLightness": "根据您为 ThemeSong 扩展选择的设置,此功能允许您调整从当前主题派生的强调颜色的亮度。\n\n如果未安装 ThemeSong 扩展,此功能将不起作用。",
+
   "feature_desc_openPluginList": "打开您安装的插件列表",
   "feature_btn_openPluginList": "打开列表",
   "feature_btn_openPluginList_running": "正在打开...",
@@ -357,6 +374,9 @@
   "feature_desc_resetConfig": "重置所有设置为默认值",
   "feature_btn_resetConfig": "重置设置",
   "feature_btn_resetConfig_running": "正在重置...",
+  "feature_desc_resetEverything": "Reset all stored data to the default values",
+  "feature_btn_resetEverything": "Reset everything",
+  "feature_btn_resetEverything_running": "Resetting...",
   "feature_desc_advancedMode": "显示高级设置(重新加载菜单)",
   "feature_helptext_advancedMode": "启用此功能后,菜单将重新加载并显示默认情况下隐藏的高级设置。\n如果您想更深入地定制脚本的行为并不在意过于拥挤的菜单,这将很有用。"
 }

+ 3 - 3
src/config.ts

@@ -9,7 +9,7 @@ import type { FeatureConfig, FeatureKey, NumberLengthFormat } from "./types.js";
 import { showPrompt } from "./dialogs/prompt.js";
 
 /** If this number is incremented, the features object data will be migrated to the new format */
-export const formatVersion = 9;
+export const formatVersion = 10;
 
 export const defaultData = pureObj(
   (Object.keys(featInfo) as (keyof typeof featInfo)[])
@@ -135,9 +135,9 @@ export const migrations: DataMigrationsDict = {
       // "autoLikePlayerBarToggleBtn",
     ]);
   },
-  // 9 -> 10 (v2.2.1)
+  // 9 -> 10 (v2.3.0)
   10: (oldData: FeatureConfig) => useDefaultConfig(oldData, [
-    "aboveQueueBtnsSticky",
+    "aboveQueueBtnsSticky", "autoScrollToActiveSongMode",
   ]),
 } as const satisfies DataMigrationsDict;
 

+ 16 - 1
src/features/behavior.ts

@@ -1,8 +1,9 @@
 import { clamp, interceptWindowEvent, isDomLoaded, pauseFor } from "@sv443-network/userutils";
-import { error, getDomain, getVideoTime, getWatchId, info, log, waitVideoElementReady, clearNode, getCurrentMediaType, getVideoElement } from "../utils/index.js";
+import { error, getDomain, getVideoTime, getWatchId, info, log, waitVideoElementReady, clearNode, getCurrentMediaType, getVideoElement, scrollToCurrentSongInQueue } from "../utils/index.js";
 import { getFeature } from "../config.js";
 import { addSelectorListener } from "../observers.js";
 import { initialParams } from "../constants.js";
+import { siteEvents } from "../siteEvents.js";
 import { LogLevel } from "../types.js";
 
 //#region beforeunload popup
@@ -74,6 +75,20 @@ export async function initAutoCloseToasts() {
   log("Initialized automatic toast closing");
 }
 
+//#region auto scroll to active
+
+let initialAutoScrollToActiveSong = true;
+
+/** Initializes the autoScrollToActiveSong feature */
+export async function initAutoScrollToActiveSong() {
+  siteEvents.on("watchIdChanged", () => getFeature("autoScrollToActiveSongMode") === "videoChange" && scrollToCurrentSongInQueue());
+
+  if(getFeature("autoScrollToActiveSongMode") !== "never" && initialAutoScrollToActiveSong) {
+    initialAutoScrollToActiveSong = false;
+    waitVideoElementReady().then(() => scrollToCurrentSongInQueue());
+  }
+}
+
 //#region remember song time
 
 interface RemVidObj {

+ 12 - 0
src/features/index.ts

@@ -477,6 +477,18 @@ export const featInfo = {
     reloadRequired: false,
     enable: noop,
   },
+  autoScrollToActiveSongMode: {
+    type: "select",
+    category: "behavior",
+    options: () => [
+      { value: "never", label: t("auto_scroll_to_active_song_mode_never") },
+      { value: "initialPageLoad", label: t("auto_scroll_to_active_song_mode_initial_page_load") },
+      { value: "videoChange", label: t("auto_scroll_to_active_song_mode_video_change") },
+    ],
+    default: "initialPageLoad",
+    reloadRequired: false,
+    enable: noop,
+  },
 
   //#region cat:input
   arrowKeySupport: {

+ 2 - 12
src/features/layout.ts

@@ -2,7 +2,7 @@ import { addParent, autoPlural, debounce, fetchAdvanced, isDomLoaded, pauseFor }
 import { getFeature, getFeatures } from "../config.js";
 import { siteEvents } from "../siteEvents.js";
 import { addSelectorListener } from "../observers.js";
-import { error, getResourceUrl, log, warn, t, onInteraction, openInTab, getBestThumbnailUrl, getDomain, getCurrentMediaType, waitVideoElementReady, addStyleFromResource, fetchVideoVotes, getWatchId, tp, getVideoTime, setInnerHtml, formatNumber, resourceAsString } from "../utils/index.js";
+import { error, getResourceUrl, log, warn, t, onInteraction, openInTab, getBestThumbnailUrl, getDomain, getCurrentMediaType, waitVideoElementReady, addStyleFromResource, fetchVideoVotes, getWatchId, tp, getVideoTime, setInnerHtml, formatNumber, resourceAsString, scrollToCurrentSongInQueue } from "../utils/index.js";
 import { mode, scriptInfo } from "../constants.js";
 import { openCfgMenu } from "../menu/menu_old.js";
 import { showPrompt } from "../dialogs/prompt.js";
@@ -380,17 +380,7 @@ export async function initAboveQueueBtns() {
       id: "scroll-to-active",
       resourceName: "icon-skip_to",
       titleKey: "scroll_to_playing",
-      async interaction(evt: KeyboardEvent | MouseEvent) {
-        const activeItem = document.querySelector<HTMLElement>("#side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"loading\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"playing\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"paused\"]");
-        if(!activeItem)
-          return;
-
-        activeItem.scrollIntoView({
-          behavior: evt.shiftKey ? "instant" : "smooth",
-          block: evt.ctrlKey || evt.altKey ? "start" : "center",
-          inline: "center",
-        });
-      },
+      interaction: async (evt: KeyboardEvent | MouseEvent) => scrollToCurrentSongInQueue(evt),
     },
     {
       condition: clearQueueBtn,

+ 3 - 0
src/index.ts

@@ -23,6 +23,7 @@ import {
   // behavior
   initBeforeUnloadHook, enableDiscardBeforeUnload,
   initAutoCloseToasts, initRememberSongTime,
+  initAutoScrollToActiveSong,
   // input
   initArrowKeySkip, initSiteSwitch,
   addAnchorImprovements, initNumKeysSkip,
@@ -215,6 +216,8 @@ async function onDomLoad() {
       if(feats.closeToastsTimeout > 0)
         ftInit.push(["autoCloseToasts", initAutoCloseToasts()]);
 
+      ftInit.push(["autoScrollToActiveSongMode", initAutoScrollToActiveSong()]);
+
       //#region (ytm) input
 
       ftInit.push(["arrowKeySkip", initArrowKeySkip()]);

+ 2 - 0
src/types.ts

@@ -579,6 +579,8 @@ export interface FeatureConfig {
   rememberSongTimeMinPlayTime: number;
   /** Whether the above queue button container should use sticky positioning */
   aboveQueueBtnsSticky: boolean;
+  /** Whether and when to automatically scroll to the active song in the queue */
+  autoScrollToActiveSongMode: "never" | "initialPageLoad" | "videoChange";
 
   //#region input
   /** Arrow keys skip forwards and backwards */

+ 13 - 7
src/utils/misc.ts

@@ -251,13 +251,19 @@ export function isStringGen(val: unknown): val is StringGen {
     || val instanceof Promise;
 }
 
-/**
- * Turns the passed object into a pure object without a prototype chain and without default properties like `toString`, `__defineGetter__`, etc.  
- * This makes the object immune to prototype pollution attacks and allows for cleaner object literals, at the cost of being harder to work with in some cases.  
- * It also effectively transforms a `Stringifiable` value into one that will throw a TypeError when stringified instead of defaulting to `[object Object]`
- */
-export function pureObj<TObj extends object>(obj: TObj): TObj {
-  return Object.assign(Object.create(null), obj);
+/** Scrolls to the current song in the queue if it's available */
+export function scrollToCurrentSongInQueue(evt?: MouseEvent | KeyboardEvent) {
+  const activeItem = document.querySelector<HTMLElement>("#side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"loading\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"playing\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"paused\"]");
+  if(!activeItem)
+    return false;
+
+  activeItem.scrollIntoView({
+    behavior: evt?.shiftKey ? "instant" : "smooth",
+    block: evt?.ctrlKey || evt?.altKey ? "start" : "center",
+    inline: "center",
+  });
+
+  return true;
 }
 
 //#region resources