Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into feat/preview-bar-cleanup

# Conflicts:
#	src/content.ts
#	src/js-components/previewBar.ts
This commit is contained in:
Ajay Ramachandran
2020-12-24 12:41:40 -05:00
52 changed files with 1128 additions and 1591 deletions

View File

@@ -20,10 +20,8 @@ module.exports = {
plugins: ["react", "@typescript-eslint"], plugins: ["react", "@typescript-eslint"],
rules: { rules: {
// TODO: Remove warn rules when not needed anymore // TODO: Remove warn rules when not needed anymore
"@typescript-eslint/no-this-alias": "warn", "no-self-assign": "off",
"no-self-assign": "warn", "@typescript-eslint/no-empty-interface": "off",
"@typescript-eslint/no-empty-interface": "warn",
"@typescript-eslint/ban-types": "warn",
}, },
settings: { settings: {
react: { react: {

View File

@@ -1,7 +1,7 @@
{ {
"name": "__MSG_fullName__", "name": "__MSG_fullName__",
"short_name": "SponsorBlock", "short_name": "SponsorBlock",
"version": "2.0.9", "version": "2.0.10.1",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_Description__", "description": "__MSG_Description__",
"content_scripts": [{ "content_scripts": [{

1195
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@
"ts-jest": "^26.2.0", "ts-jest": "^26.2.0",
"ts-loader": "^6.2.1", "ts-loader": "^6.2.1",
"typescript": "~3.7.3", "typescript": "~3.7.3",
"web-ext": "^5.0.0", "web-ext": "^5.4.1",
"webpack": "~4.41.2", "webpack": "~4.41.2",
"webpack-cli": "~3.3.10", "webpack-cli": "~3.3.10",
"webpack-merge": "~4.2.2" "webpack-merge": "~4.2.2"

View File

@@ -70,9 +70,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Сегментът Свършва Сега" "message": "Сегментът Свършва Сега"
}, },
"noVideoID": {
"message": "Не е намерено YouTube видео в този раздел. Ако сте сигурни, че това е YouTube раздел, затворете този изскачащ прозорец и го отворете отново. Ако това не проработи, опитайте се да презаредите раздела."
},
"success": { "success": {
"message": "Успешно!" "message": "Успешно!"
}, },
@@ -91,18 +88,6 @@
"submitCheck": { "submitCheck": {
"message": "Сигурни ли сте, че искате да подадете това?" "message": "Сигурни ли сте, че искате да подадете това?"
}, },
"whitelistChannel": {
"message": "Добавяне на канала към Whitelist"
},
"removeFromWhitelist": {
"message": "Премахване на канала от Whitelist"
},
"savedPeopleFrom": {
"message": "Вие сте помогнали на хора да пропуснат "
},
"viewLeaderboard": {
"message": "Вижте leaderboard-а"
},
"here": { "here": {
"message": "тук" "message": "тук"
}, },

View File

@@ -86,7 +86,7 @@
"message": "Segment nyní končí" "message": "Segment nyní končí"
}, },
"noVideoID": { "noVideoID": {
"message": "Na této záložce nebylo nalezeno žádné YouTube video. Pokud jste si jistí, že tato záložka je YouTube, zavřete toto vyskakovací okno a znovu jej otevřete. Pokud to nepomůže, zkuste záložku znovu načíst." "message": "Nebylo nalezeno žádné YouTube video.\nPokud je to nesprávně, obnovte záložku."
}, },
"success": { "success": {
"message": "Úspěch!" "message": "Úspěch!"
@@ -121,32 +121,30 @@
"submitCheck": { "submitCheck": {
"message": "Opravdu to chcete odeslat?" "message": "Opravdu to chcete odeslat?"
}, },
"whitelistChannel": {
"message": "Přidat kanál do výjimek"
},
"removeFromWhitelist": {
"message": "Odebrat kanál z výjimek"
},
"voteOnTime": { "voteOnTime": {
"message": "Hlasovat pro segment" "message": "Hlasovat pro segment"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "Zatím jste přidali" "message": "Příspěvky"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Lidem jste ušetřili " "message": "Ušetřili jste lidem "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Zobrazit žebříček" "message": "Žebříček"
}, },
"here": { "here": {
"message": "zde" "message": "zde"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Stiskněte tlačítko níže, když segment začne a skončí, k nahrání a uložení do databáze." "message": "Odeslat"
},
"submissionEditHint": {
"message": "Úpravy sekcí se objeví po odeslání",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Tip: Pokud je video aktivní, stiskněte středník pro nahlášení začátku/konce segmentu, a apostrof pro odeslání. (Klávesy lze změnit v nastavení)" "message": "Tip: V možnostech můžete nastavit klávesové zkratky pro odeslání"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Vymazat časy" "message": "Vymazat časy"
@@ -157,6 +155,9 @@
"publicStats": { "publicStats": {
"message": "Toto se používá ve veřejném žebříčku k ukázání jak moc jste přispěli. Podívejte se na něj" "message": "Toto se používá ve veřejném žebříčku k ukázání jak moc jste přispěli. Podívejte se na něj"
}, },
"Username": {
"message": "Uživatelské jméno"
},
"setUsername": { "setUsername": {
"message": "Nastavit uživatelské jméno" "message": "Nastavit uživatelské jméno"
}, },
@@ -253,10 +254,10 @@
"message": "Vypršel časový limit připojení. Zkontrolujte vaše připojení k internetu. Pokud váš internet funguje, server je nejspíš přetížený nebo spadnul." "message": "Vypršel časový limit připojení. Zkontrolujte vaše připojení k internetu. Pokud váš internet funguje, server je nejspíš přetížený nebo spadnul."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Zakázat SponsorBlock" "message": "Přeskakování je povoleno"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Povolit SponsorBlock" "message": "Přeskakování je zakázáno"
}, },
"yourWork": { "yourWork": {
"message": "Vaše práce", "message": "Vaše práce",
@@ -317,7 +318,7 @@
"message": "Ušetřili jste lidem" "message": "Ušetřili jste lidem"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " jejich života." "message": " jejich života"
}, },
"statusReminder": { "statusReminder": {
"message": "Podívejte se na status.sponsor.ajay.app pro stav serverů." "message": "Podívejte se na status.sponsor.ajay.app pro stav serverů."
@@ -634,5 +635,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Odeslat upozornění, když opustíte video s nenahranými segmenty" "message": "Odeslat upozornění, když opustíte video s nenahranými segmenty"
},
"help": {
"message": "Nápověda"
} }
} }

View File

@@ -86,7 +86,7 @@
"message": "Segment endet jetzt" "message": "Segment endet jetzt"
}, },
"noVideoID": { "noVideoID": {
"message": "Keine YouTube-Videos in diesem Tab gefunden. Wenn dies ein Youtube-Tab ist, schließe dieses Pop-up und öffne es erneut. Wenn das nicht hilft, versuche den Tab neu zu laden." "message": "Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisieren Sie den Tab."
}, },
"success": { "success": {
"message": "Geschafft!" "message": "Geschafft!"
@@ -121,33 +121,12 @@
"submitCheck": { "submitCheck": {
"message": "Bist du sicher, dass du dies übermitteln willst?" "message": "Bist du sicher, dass du dies übermitteln willst?"
}, },
"whitelistChannel": {
"message": "Kanal zur Whitelist hinzufügen"
},
"removeFromWhitelist": {
"message": "Kanal von der Whitelist entfernen"
},
"voteOnTime": { "voteOnTime": {
"message": "Über ein Segment abstimmen" "message": "Über ein Segment abstimmen"
}, },
"soFarUHSubmited": {
"message": "Von dir bisher gemeldet:"
},
"savedPeopleFrom": {
"message": "\nDamit hast du anderen Nutzer folgendes erspart:"
},
"viewLeaderboard": {
"message": "Wirf einen Blick auf die Rangliste:"
},
"here": { "here": {
"message": "hier" "message": "hier"
}, },
"recordTimesDescription": {
"message": "Klicke beim Start und am Ende des Segments auf den Knopf unten, um es in die Datenbank zu übermitteln."
},
"popupHint": {
"message": "Hinweis: Du kannst auch alternativ eine Taste in den Optionen festlegen, welche du drücken kannst, während du das Video guckst, um die Start- und Endpunkte des Segments zu markieren."
},
"clearTimesButton": { "clearTimesButton": {
"message": "Zeiten löschen" "message": "Zeiten löschen"
}, },
@@ -252,12 +231,6 @@
"0": { "0": {
"message": "Zeitüberschreibung. Überprüfe deine Internetverbindung. Bist du mit dem Internet verbunden, ist der Server wahrscheinlich offline." "message": "Zeitüberschreibung. Überprüfe deine Internetverbindung. Bist du mit dem Internet verbunden, ist der Server wahrscheinlich offline."
}, },
"disableSkipping": {
"message": "SponsorBlock deaktivieren"
},
"enableSkipping": {
"message": "SponsorBlock aktivieren"
},
"yourWork": { "yourWork": {
"message": "Deine Statistik", "message": "Deine Statistik",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +268,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Diese Zeit wird in Klammern neben der kompletten Videodauer im YouTube-Videoplayer angezeigt. Dies betrifft auch Segmente, die als \"In Suchleiste anzeigen\" markiert sind." "message": "Diese Zeit wird in Klammern neben der kompletten Videodauer im YouTube-Videoplayer angezeigt. Dies betrifft auch Segmente, die als \"In Suchleiste anzeigen\" markiert sind."
}, },
"youHaveSkipped": {
"message": "Du übersprangst bisher "
},
"youHaveSaved": { "youHaveSaved": {
"message": " und erspartest dir damit " "message": " und erspartest dir damit "
}, },
@@ -313,12 +283,6 @@
"hoursLower": { "hoursLower": {
"message": "Stunden" "message": "Stunden"
}, },
"youHaveSavedTime": {
"message": "\nAndere haben dank dir"
},
"youHaveSavedTimeEnd": {
"message": " ihrer wertvollen Zeit gespart."
},
"statusReminder": { "statusReminder": {
"message": "Du kannst den Serverstatus auf https://status.sponsor.ajay.app überprüfen." "message": "Du kannst den Serverstatus auf https://status.sponsor.ajay.app überprüfen."
}, },

View File

@@ -122,10 +122,10 @@
"message": "Are you sure you want to submit this?" "message": "Are you sure you want to submit this?"
}, },
"whitelistChannel": { "whitelistChannel": {
"message": "Add to whitelist" "message": "Whitelist channel"
}, },
"removeFromWhitelist": { "removeFromWhitelist": {
"message": "Remove from whitelist" "message": "Remove channel from whitelist"
}, },
"voteOnTime": { "voteOnTime": {
"message": "Vote On A Segment" "message": "Vote On A Segment"
@@ -581,6 +581,10 @@
"chooseACategory": { "chooseACategory": {
"message": "Choose a Category" "message": "Choose a Category"
}, },
"enableThisCategoryFirst": {
"message": "To submit segments with the category of \"{0}\", you must enable it in the options. You will be redirected to the options now.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": { "youMustSelectACategory": {
"message": "You must select a category for all segments you are submitting!" "message": "You must select a category for all segments you are submitting!"
}, },

View File

@@ -86,7 +86,7 @@
"message": "El segmento termina ahora" "message": "El segmento termina ahora"
}, },
"noVideoID": { "noVideoID": {
"message": "Ningún video de YouTube se encontró en esta pestaña. Si sabes que esto es una pestaña de YouTube, cierra esta ventana y ábrela otra vez. Si eso no funciona, intenta recargar la pestaña." "message": "No se encontró vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña."
}, },
"success": { "success": {
"message": "¡Completado!" "message": "¡Completado!"
@@ -121,32 +121,30 @@
"submitCheck": { "submitCheck": {
"message": "¿Estás seguro de que quieres enviar esto?" "message": "¿Estás seguro de que quieres enviar esto?"
}, },
"whitelistChannel": {
"message": "Permitir Canal"
},
"removeFromWhitelist": {
"message": "Parar De Permitir Canal"
},
"voteOnTime": { "voteOnTime": {
"message": "Vote En Un Segmento" "message": "Vote En Un Segmento"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "Hasta ahora, has enviado" "message": "Solicitudes"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Has salvado personas de " "message": "Has salvado a gente de "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Ver la tabla de clasificación" "message": "Tablas de clasificación"
}, },
"here": { "here": {
"message": "aquí" "message": "aquí"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Haga clic en el botón de abajo cuando el segmento comience y termine para grabarlo y enviarlo a la base de datos." "message": "Enviar"
},
"submissionEditHint": {
"message": "La edición de la sección aparecerá después de hacer clic en enviar",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Pista: Presione la tecla de punto y coma mientras está enfocado en un video para indicar el comienzo/final de un segmento y citación para enviarlo. (Esto puede cambiarse en opciones)" "message": "Sugerencia: puede configurar los teclas para enviar en las opciones"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Eliminar Tiempos" "message": "Eliminar Tiempos"
@@ -157,6 +155,9 @@
"publicStats": { "publicStats": {
"message": "Esto se utiliza en la página de estadísticas públicas para mostrar cuánto has contribuido. Véala" "message": "Esto se utiliza en la página de estadísticas públicas para mostrar cuánto has contribuido. Véala"
}, },
"Username": {
"message": "Nombre de usario"
},
"setUsername": { "setUsername": {
"message": "Escoger Nombre De Usuario" "message": "Escoger Nombre De Usuario"
}, },
@@ -253,10 +254,10 @@
"message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado." "message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Desactivar SponsorBlock" "message": "Saltar está activado"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Activar SponsorBlock" "message": "Saltar está desactivado"
}, },
"yourWork": { "yourWork": {
"message": "Tu trabajo", "message": "Tu trabajo",
@@ -296,7 +297,7 @@
"message": "Esta duración aparece entre paréntesis junto al tiempo actual del video, debajo de la barra de navegación. Esta muestra la duración total del vídeo menos cualquier segmento eliminado. Esto incluye los segmentos marcados como solo \"Mostrar en la barra de navegación\"." "message": "Esta duración aparece entre paréntesis junto al tiempo actual del video, debajo de la barra de navegación. Esta muestra la duración total del vídeo menos cualquier segmento eliminado. Esto incluye los segmentos marcados como solo \"Mostrar en la barra de navegación\"."
}, },
"youHaveSkipped": { "youHaveSkipped": {
"message": "Has omitido " "message": "Lo has saltado "
}, },
"youHaveSaved": { "youHaveSaved": {
"message": "Te has ahorrado " "message": "Te has ahorrado "
@@ -314,10 +315,10 @@
"message": "horas" "message": "horas"
}, },
"youHaveSavedTime": { "youHaveSavedTime": {
"message": "Has ahorrado a otras personas" "message": "Has salvado personas"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " de sus vidas." "message": " de sus vidas"
}, },
"statusReminder": { "statusReminder": {
"message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor." "message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor."
@@ -634,5 +635,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Envía una notificación cuando dejas un vídeo con segmentos que no se suben" "message": "Envía una notificación cuando dejas un vídeo con segmentos que no se suben"
},
"help": {
"message": "Ayuda"
} }
} }

View File

@@ -99,24 +99,9 @@
"submitCheck": { "submitCheck": {
"message": "مطمئن هستید که میخواهید این را ثبت کنید؟" "message": "مطمئن هستید که میخواهید این را ثبت کنید؟"
}, },
"whitelistChannel": {
"message": "قرار دادن کانال در لیست سفید"
},
"removeFromWhitelist": {
"message": "حذف کانال از لیست سفید"
},
"voteOnTime": { "voteOnTime": {
"message": "رأی دهی به یک بخش" "message": "رأی دهی به یک بخش"
}, },
"soFarUHSubmited": {
"message": "شما تا اینجا، ثبت کرده اید"
},
"savedPeopleFrom": {
"message": "شما دیگران را نجات دادید از "
},
"viewLeaderboard": {
"message": "نمایش لیست امتیاز ها"
},
"here": { "here": {
"message": "اینجا" "message": "اینجا"
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Segmentti Päättyy Nyt" "message": "Segmentti Päättyy Nyt"
}, },
"noVideoID": {
"message": "Välilehdeltä ei löytynyt YouTube-videota. Jos olet varma, että tämä on YouTube-välilehti, sulje tämä ponnahdusikkuna ja avaa se uudelleen. Jos sekään ei toimi, yritä ladata välilehti uudelleen."
},
"success": { "success": {
"message": "Onnistui!" "message": "Onnistui!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Haluatko varmasti lähettää tämän?" "message": "Haluatko varmasti lähettää tämän?"
}, },
"whitelistChannel": {
"message": "Lisää kanava valkoiselle listalle"
},
"removeFromWhitelist": {
"message": "Poista kanava valkoiselta listalta"
},
"voteOnTime": { "voteOnTime": {
"message": "Äänestä Segmenttiä" "message": "Äänestä Segmenttiä"
}, },
"soFarUHSubmited": {
"message": "Tähän mennessä, olet lähettänyt"
},
"savedPeopleFrom": {
"message": "Olet säästänyt ihmisiltä "
},
"viewLeaderboard": {
"message": "Näytä tulostaulukko"
},
"here": { "here": {
"message": "tässä" "message": "tässä"
}, },
"recordTimesDescription": {
"message": "Napsauta alla olevaa painiketta, kun segmentti alkaa ja päättyy tallentaaksesi ja lähettääksesi sen tietokantaan."
},
"popupHint": {
"message": "Vihje: Paina puolipisteen näppäintä kun video on kohdennettu ilmoittaaksesi segmentin alku/loppu ja viesti lähetettäväksi. (Tämän voi muuttaa asetuksissa)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Tyhjennä ajat" "message": "Tyhjennä ajat"
}, },
@@ -233,12 +209,6 @@
"0": { "0": {
"message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla." "message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla."
}, },
"disableSkipping": {
"message": "Poista Sponsorblock käytöstä"
},
"enableSkipping": {
"message": "Ota SponsorBlock käyttöön"
},
"yourWork": { "yourWork": {
"message": "Sinun työsi", "message": "Sinun työsi",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -267,9 +237,6 @@
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "Ääni-ilmoitus ohittaessa toistaa äänen kun segmentti ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta." "message": "Ääni-ilmoitus ohittaessa toistaa äänen kun segmentti ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta."
}, },
"youHaveSkipped": {
"message": "Olet ohittanut "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Olet säästänyt itseltäsi " "message": "Olet säästänyt itseltäsi "
}, },
@@ -285,12 +252,6 @@
"hoursLower": { "hoursLower": {
"message": "tuntia" "message": "tuntia"
}, },
"youHaveSavedTime": {
"message": "Olet säästänyt ihmisiltä"
},
"youHaveSavedTimeEnd": {
"message": " heidän elämästään."
},
"statusReminder": { "statusReminder": {
"message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app." "message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app."
}, },

View File

@@ -86,7 +86,7 @@
"message": "Fin du segment" "message": "Fin du segment"
}, },
"noVideoID": { "noVideoID": {
"message": "Ceci n'est pas un onglet YouTube, ou vous avez cliqué trop tôt. \n Si vous êtes sûr(e) que c'est un onglet YouTube, fermez cette fenêtre et réessayez." "message": "Aucune vidéo Youtube trouvée.\nActualisez l'onglet si il est censé y en avoir une."
}, },
"success": { "success": {
"message": "Succès !" "message": "Succès !"
@@ -121,33 +121,12 @@
"submitCheck": { "submitCheck": {
"message": "Êtes-vous sûr de vouloir soumettre ces segments?" "message": "Êtes-vous sûr de vouloir soumettre ces segments?"
}, },
"whitelistChannel": {
"message": "Ajouter la chaîne à la liste blanche"
},
"removeFromWhitelist": {
"message": "Supprimer la chaîne de la liste blanche"
},
"voteOnTime": { "voteOnTime": {
"message": "Voter pour un segment" "message": "Voter pour un segment"
}, },
"soFarUHSubmited": {
"message": "Vous avez soumis jusqu'à présent"
},
"savedPeopleFrom": {
"message": "Vous avez permis aux autres de passer "
},
"viewLeaderboard": {
"message": "Consulter le classement"
},
"here": { "here": {
"message": "ici" "message": "ici"
}, },
"recordTimesDescription": {
"message": "Cliquez sur le bouton ci-dessous quand le segment commence puis quand il finit pour l'enregistrer et le soumettre à la base de données."
},
"popupHint": {
"message": "Astuce : utilisez la touche point-virgule lorsque la vidéo est sélectionnée pour enregistrer le début et la fin d'un segment commercial; utilisez la touche guillemet pour le soumettre. (Les touches peuvent être modifiées dans les options)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Supprimer les temps" "message": "Supprimer les temps"
}, },
@@ -157,6 +136,9 @@
"publicStats": { "publicStats": {
"message": "Votre pseudo est inscrit dans le classement public pour afficher vos contributions. Le consulter" "message": "Votre pseudo est inscrit dans le classement public pour afficher vos contributions. Le consulter"
}, },
"Username": {
"message": "Pseudonyme"
},
"setUsername": { "setUsername": {
"message": "Choisir un pseudonyme" "message": "Choisir un pseudonyme"
}, },
@@ -252,12 +234,6 @@
"0": { "0": {
"message": "Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service." "message": "Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service."
}, },
"disableSkipping": {
"message": "Désactiver SponsorBlock"
},
"enableSkipping": {
"message": "Activer SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Votre travail", "message": "Votre travail",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -313,12 +289,6 @@
"hoursLower": { "hoursLower": {
"message": "heures" "message": "heures"
}, },
"youHaveSavedTime": {
"message": "Vous avez économisé"
},
"youHaveSavedTimeEnd": {
"message": " aux autres."
},
"statusReminder": { "statusReminder": {
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur." "message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Isječak završava sada" "message": "Isječak završava sada"
}, },
"noVideoID": {
"message": "YouTube video nije pronađen na ovoj kartici. Ako si siguran da je ovo YouTube kartica, zatvori ovaj okvir i ponovno ga otvori. Ako to ne radi, probaj ponovno učitati karticu."
},
"success": { "success": {
"message": "Uspjeh!" "message": "Uspjeh!"
}, },
@@ -118,33 +115,12 @@
"submitCheck": { "submitCheck": {
"message": "Jesi li siguran da želiš unijeti ovo?" "message": "Jesi li siguran da želiš unijeti ovo?"
}, },
"whitelistChannel": {
"message": "Dodaj kanal na popis dopuštenih"
},
"removeFromWhitelist": {
"message": "Makni kanal s popisa dopuštenih"
},
"voteOnTime": { "voteOnTime": {
"message": "Glasaj za isječak" "message": "Glasaj za isječak"
}, },
"soFarUHSubmited": {
"message": "Do sada si podnio"
},
"savedPeopleFrom": {
"message": "Sačuvao si ljude od "
},
"viewLeaderboard": {
"message": "Pregledaj tablicu bodova"
},
"here": { "here": {
"message": "ovdje" "message": "ovdje"
}, },
"recordTimesDescription": {
"message": "Klikni gumb ispod kada isječak započinje i završava kako bi ga zabilježio i unio u bazu podataka."
},
"popupHint": {
"message": "Savjet: Pritisni tipku točka-zarez dok si fokusiran na video kako bi zabilježio početak i kraj isječka te podnio isječak. (Ovo se može promijeniti u postavkama)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Očisti vremena" "message": "Očisti vremena"
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Szegmens vége" "message": "Szegmens vége"
}, },
"noVideoID": {
"message": "Nem található YouTube videó ezen a fülön. Ha ez biztosan egy YouTube fül, csukja be ezt az ablakot, és nyissa meg újra. Amennyiben nem működik, próbája újratölteni a fület."
},
"success": { "success": {
"message": "Siker!" "message": "Siker!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Biztosan be akarja küldeni?" "message": "Biztosan be akarja küldeni?"
}, },
"whitelistChannel": {
"message": "Csatorna engedélyezőlistára helyezése"
},
"removeFromWhitelist": {
"message": "Csatorna eltávolítása az engedélyezőlistáról"
},
"voteOnTime": { "voteOnTime": {
"message": "Szavazzon a szegmensről" "message": "Szavazzon a szegmensről"
}, },
"soFarUHSubmited": {
"message": "Eddig beküldött"
},
"savedPeopleFrom": {
"message": "Megspórolt másoknak "
},
"viewLeaderboard": {
"message": "Ranglista megtekintése"
},
"here": { "here": {
"message": "itt" "message": "itt"
}, },
"recordTimesDescription": {
"message": "Kattintson az alábbi gombra a szegmens kezdeténél és végénél megjelöléshez, és adja hozzá az adatbázishoz."
},
"popupHint": {
"message": "Tipp: Nyomja le a pontosvessző gombot, hogy megjelölje egy szegmens kezdetét/végét és beküldhesse. (Változtatható a beállításokban)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Időpontok törlése" "message": "Időpontok törlése"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Kapcsolati időtúllépés. Ellenőrizze az internetkapcsolatot. Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt." "message": "Kapcsolati időtúllépés. Ellenőrizze az internetkapcsolatot. Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt."
}, },
"disableSkipping": {
"message": "SponsorBlock kikapcsolása"
},
"enableSkipping": {
"message": "SponsorBlock bekapcsolása"
},
"yourWork": { "yourWork": {
"message": "Te munkád", "message": "Te munkád",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is." "message": "Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is."
}, },
"youHaveSkipped": {
"message": "Ön átugrott "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Megtakarított magának " "message": "Megtakarított magának "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "óra" "message": "óra"
}, },
"youHaveSavedTime": {
"message": "Megspórolt másoknak"
},
"youHaveSavedTimeEnd": {
"message": " az életükből."
},
"statusReminder": { "statusReminder": {
"message": "A szerver állapotához tekintse meg a status.sponsor.ajay.app oldalt." "message": "A szerver állapotához tekintse meg a status.sponsor.ajay.app oldalt."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Segmen Berakhir Sekarang" "message": "Segmen Berakhir Sekarang"
}, },
"noVideoID": {
"message": "Tidak ada video YouTube yang ditemukan di tab ini. Jika anda tahu ini merupakan tab YouTube, tutup popup ini dan buka lagi. Jika masih tidak berfungsi, coba muat ulang tab."
},
"success": { "success": {
"message": "Sukses!" "message": "Sukses!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Apakah anda yakin ingin mengirim ini?" "message": "Apakah anda yakin ingin mengirim ini?"
}, },
"whitelistChannel": {
"message": "Daftar-putihkan Channel"
},
"removeFromWhitelist": {
"message": "Hapus Channel Dari Daftar Putih"
},
"voteOnTime": { "voteOnTime": {
"message": "Beri Segmen Vote" "message": "Beri Segmen Vote"
}, },
"soFarUHSubmited": {
"message": "Sejauh ini, anda sudah mengirim"
},
"savedPeopleFrom": {
"message": "Anda sudah menghemat waktu orang dari "
},
"viewLeaderboard": {
"message": "Lihat papan peringkat"
},
"here": { "here": {
"message": "disini" "message": "disini"
}, },
"recordTimesDescription": {
"message": "Klik tombol dibawah saat segmen dimulai dan berakhir untuk direkam lalu dikirim ke basis data."
},
"popupHint": {
"message": "Petunjuk: Tekan tombol titik koma saat terfokus pada video untuk melaporkan awal/akhir dari segmen untuk dikirim. (Bisa diganti di pengaturan)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Hapus Waktu" "message": "Hapus Waktu"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Koneksi Timeout. Cek koneksi internet anda. Jika internet anda berfungsi, server mungkin kewalahan atau down." "message": "Koneksi Timeout. Cek koneksi internet anda. Jika internet anda berfungsi, server mungkin kewalahan atau down."
}, },
"disableSkipping": {
"message": "Nonaktifkan SponsorBlock"
},
"enableSkipping": {
"message": "Aktifkan SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Hasil Kerja Anda", "message": "Hasil Kerja Anda",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Waktu ini muncul di dalam kurung disamping waktu asli di bilah waktu. Ini menunjukkan durasi total video yang tidak termasuk segmen apapun. Ini termasuk segmen yang ditandai hanya \"Tampilkan Di Bilah Waktu\"." "message": "Waktu ini muncul di dalam kurung disamping waktu asli di bilah waktu. Ini menunjukkan durasi total video yang tidak termasuk segmen apapun. Ini termasuk segmen yang ditandai hanya \"Tampilkan Di Bilah Waktu\"."
}, },
"youHaveSkipped": {
"message": "Anda sudah melewati "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Anda sudah menghemat waktu " "message": "Anda sudah menghemat waktu "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "jam" "message": "jam"
}, },
"youHaveSavedTime": {
"message": "Anda sudah menghemat waktu orang lain"
},
"youHaveSavedTimeEnd": {
"message": " dari hidup mereka."
},
"statusReminder": { "statusReminder": {
"message": "Cek status.sponsor.ajay.app untuk status server." "message": "Cek status.sponsor.ajay.app untuk status server."
}, },

View File

@@ -86,7 +86,7 @@
"message": "Il Segmento Termina Ora" "message": "Il Segmento Termina Ora"
}, },
"noVideoID": { "noVideoID": {
"message": "Probabilmente questa non è una scheda di YouTube, oppure hai cliccato troppo presto. \nSe sei sicuro di essere in una scheda di YouTube,\n riapri questo popup." "message": "Nessun video YouTube trovato.\nSe questo non è corretto, ricarica la scheda."
}, },
"success": { "success": {
"message": "Successo!" "message": "Successo!"
@@ -121,32 +121,30 @@
"submitCheck": { "submitCheck": {
"message": "Sei sicuro di volerlo inviare?" "message": "Sei sicuro di volerlo inviare?"
}, },
"whitelistChannel": {
"message": "Aggiungi Canale alla Whitelist"
},
"removeFromWhitelist": {
"message": "Rimuovi Canale dalla Whitelist"
},
"voteOnTime": { "voteOnTime": {
"message": "Vota un Segmento" "message": "Vota un Segmento"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "Fino ad ora hai inviato" "message": "Iscrizioni"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Hai salvato le persone da " "message": "Hai salvato le persone da "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Guarda la classifica" "message": "Classifica"
}, },
"here": { "here": {
"message": "qui" "message": "qui"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Premi il pulsante in basso quando il segmento inizia e finisce per registrarlo ed inviarlo al database." "message": "Invia"
},
"submissionEditHint": {
"message": "La modifica della sezione comparirà dopo aver cliccato Iscriviti",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Suggerimento: Premi il pulsante 'punto e virgola' mentre sei concentrato su un video, per segnalare l'inizio e la fine di un segmento e la relativa citazione da inviare. (Questo può essere modificato nelle opzioni)" "message": "Suggerimento: Puoi configurare combinazioni di tasti per l'inserimento nelle opzioni"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Cancella Minutaggi" "message": "Cancella Minutaggi"
@@ -157,6 +155,9 @@
"publicStats": { "publicStats": {
"message": "Viene utilizzato nelle pagine delle statistiche pubbliche che mostrano quanto hai contribuito. Vedi" "message": "Viene utilizzato nelle pagine delle statistiche pubbliche che mostrano quanto hai contribuito. Vedi"
}, },
"Username": {
"message": "Nome Utente"
},
"setUsername": { "setUsername": {
"message": "Imposta Username" "message": "Imposta Username"
}, },
@@ -206,13 +207,13 @@
"message": "Ricerca tramite prefisso hash" "message": "Ricerca tramite prefisso hash"
}, },
"whatQueryByHashPrefix": { "whatQueryByHashPrefix": {
"message": "Invece di richiedere i segmenti dal server usando il videoID, i primi 4 caratteri dell'hash del videoID sono inviati. Questo server reinvierà i dati per tutti i video con hash simili." "message": "Invece di richiedere segmenti dal server utilizzando l'Id video, vengono inviati i primi 4 caratteri dell'hash dell'ID video. Questo server invierà i dati per tutti i video con hash simili."
}, },
"enableRefetchWhenNotFound": { "enableRefetchWhenNotFound": {
"message": "Riprendi Segmenti Sui Nuovi Video" "message": "Ricarica I Segmenti Su Nuovi Video"
}, },
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Se il video è nuovo e non ci sono segmenti al suo interno, continuerà a recuperare ogni qualche minuto mentre lo guardi." "message": "Se il video è nuovo, e non risultano esserci segmenti, questi continueranno ad essere ricaricati dopo pochi minuti mentre guardi il video."
}, },
"showNotice": { "showNotice": {
"message": "Mostra di Nuovo l'Avviso" "message": "Mostra di Nuovo l'Avviso"
@@ -253,10 +254,10 @@
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù." "message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Disabilita SponsorBlock" "message": "Salta abilitato"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Abilita SponsorBlock" "message": "Salta disabilitato"
}, },
"yourWork": { "yourWork": {
"message": "Il Tuo Lavoro", "message": "Il Tuo Lavoro",
@@ -314,10 +315,10 @@
"message": "ore" "message": "ore"
}, },
"youHaveSavedTime": { "youHaveSavedTime": {
"message": "Hai salvato alle persone" "message": "Hai salvato le persone"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " delle loro vite." "message": " delle loro vite"
}, },
"statusReminder": { "statusReminder": {
"message": "Controlla status.sponsor.ajay.app per lo stato del server." "message": "Controlla status.sponsor.ajay.app per lo stato del server."
@@ -634,5 +635,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Invia una notifica quando lasci un video con segmenti non caricati" "message": "Invia una notifica quando lasci un video con segmenti non caricati"
},
"help": {
"message": "Aiuto"
} }
} }

View File

@@ -39,12 +39,6 @@
"closePopup": { "closePopup": {
"message": "ポップアップを閉じる" "message": "ポップアップを閉じる"
}, },
"removeFromWhitelist": {
"message": "ホワイトリストからチャンネルを削除"
},
"viewLeaderboard": {
"message": "リーダーボードを表示"
},
"here": { "here": {
"message": "こちら" "message": "こちら"
}, },
@@ -71,12 +65,6 @@
"message": "ソースコード", "message": "ソースコード",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
}, },
"disableSkipping": {
"message": "SponsorBlock を無効にする"
},
"enableSkipping": {
"message": "SponsorBlock を有効にする"
},
"errorCode": { "errorCode": {
"message": "エラーコード: " "message": "エラーコード: "
}, },
@@ -98,9 +86,6 @@
"audioNotification": { "audioNotification": {
"message": "オーディオ通知をスキップ" "message": "オーディオ通知をスキップ"
}, },
"youHaveSkipped": {
"message": "スキップしました "
},
"minLower": { "minLower": {
"message": "分" "message": "分"
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "광고 구간 끝" "message": "광고 구간 끝"
}, },
"noVideoID": {
"message": "현재 페이지에서 YouTube 영상을 찾지 못하였습니다. 이 페이지에 YouTube 영상이 있는 경우, 이 팝업을 닫고 다시 열어주세요. 그래도 이 팝업이 바뀌지 않는 경우, 페이지를 새로고침하세요."
},
"success": { "success": {
"message": "성공!" "message": "성공!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "정말로 제출하시겠습니까?" "message": "정말로 제출하시겠습니까?"
}, },
"whitelistChannel": {
"message": "채널을 화이트리스트에 추가하기"
},
"removeFromWhitelist": {
"message": "채널을 화이트리스트에서 삭제하기"
},
"voteOnTime": { "voteOnTime": {
"message": "구간 투표" "message": "구간 투표"
}, },
"soFarUHSubmited": {
"message": "지금까지 제출한 구간:"
},
"savedPeopleFrom": {
"message": "사람을 다음에서 구했습니다 "
},
"viewLeaderboard": {
"message": "리더보드 보기"
},
"here": { "here": {
"message": "링크" "message": "링크"
}, },
"recordTimesDescription": {
"message": "구간이 시작 및 종료될 때 아래의 버튼을 눌러 구간을 기록하고 데이터베이스에 제출하세요."
},
"popupHint": {
"message": "참고: 영상 내에서 쉼표 키를 눌러서 초점을 맞추어서 시작/끝을 제보하고 따옴표로 제출하세요. (설정에서 변경 가능)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "시간 초기화" "message": "시간 초기화"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "연결 타임아웃 오류입니다. 인터넷이 연결되어 있는지 확인해주세요. 인터넷이 연결되어 있는 경우, 서버가 과부하되어 있거나 다운되어 있어서 오류가 발생하는 것일 수도 있습니다." "message": "연결 타임아웃 오류입니다. 인터넷이 연결되어 있는지 확인해주세요. 인터넷이 연결되어 있는 경우, 서버가 과부하되어 있거나 다운되어 있어서 오류가 발생하는 것일 수도 있습니다."
}, },
"disableSkipping": {
"message": "SponsorBlock 비활성화"
},
"enableSkipping": {
"message": "SponsorBlock 활성화"
},
"yourWork": { "yourWork": {
"message": "지금까지 한 일", "message": "지금까지 한 일",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "이 시간은 탐색 막대 아래의 현재 시간 옆에 있는 괄호 안에 표시되며 부분을 제외한 총 동영상 길이를 보여줍니다. 여기에는 \"슬라이드바에 표시\"로만 표시된 부분도 포함됩니다." "message": "이 시간은 탐색 막대 아래의 현재 시간 옆에 있는 괄호 안에 표시되며 부분을 제외한 총 동영상 길이를 보여줍니다. 여기에는 \"슬라이드바에 표시\"로만 표시된 부분도 포함됩니다."
}, },
"youHaveSkipped": {
"message": "지금까지 스킵한 구간: "
},
"youHaveSaved": { "youHaveSaved": {
"message": "지금까지 절약한 시간: " "message": "지금까지 절약한 시간: "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "시간" "message": "시간"
}, },
"youHaveSavedTime": {
"message": "사람들"
},
"youHaveSavedTimeEnd": {
"message": "의 시간을 아꼈습니다."
},
"statusReminder": { "statusReminder": {
"message": "Status.sponsor.ajay.app 사이트를 확인하여 서버 상태를 확인하세요." "message": "Status.sponsor.ajay.app 사이트를 확인하여 서버 상태를 확인하세요."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "സെഗ്മെന്റ് ഇപ്പോൾ അവസാനിക്കുന്നു" "message": "സെഗ്മെന്റ് ഇപ്പോൾ അവസാനിക്കുന്നു"
}, },
"noVideoID": {
"message": "ഈ ടാബിൽ YouTube വീഡിയോകളൊന്നും കണ്ടെത്തിയില്ല. ഇതൊരു YouTube ടാബാണെന്ന് നിങ്ങൾക്കറിയാമെങ്കിൽ, ഈ പോപ്പ്അപ്പ് അടച്ച് വീണ്ടും തുറക്കുക. അത് പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ, ടാബ് വീണ്ടും ലോഡുചെയ്യാൻ ശ്രമിക്കുക."
},
"success": { "success": {
"message": "വിജയം!" "message": "വിജയം!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "ഇത് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?" "message": "ഇത് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
}, },
"whitelistChannel": {
"message": "വൈറ്റ്‌ലിസ്റ്റ് ചാനൽ"
},
"removeFromWhitelist": {
"message": "വൈറ്റ്‌ലിസ്റ്റിൽ നിന്ന് ചാനൽ നീക്കംചെയ്യുക"
},
"voteOnTime": { "voteOnTime": {
"message": "ഒരു സെഗ്‌മെന്റിൽ വോട്ടുചെയ്യുക" "message": "ഒരു സെഗ്‌മെന്റിൽ വോട്ടുചെയ്യുക"
}, },
"soFarUHSubmited": {
"message": "ഇതുവരെ, നിങ്ങൾ സമർപ്പിച്ചു"
},
"savedPeopleFrom": {
"message": "നിങ്ങൾ ആളുകളെ രക്ഷിച്ചു "
},
"viewLeaderboard": {
"message": "ലീഡർബോർഡ് കാണുക"
},
"here": { "here": {
"message": "ഇവിടെ" "message": "ഇവിടെ"
}, },
"recordTimesDescription": {
"message": "സെഗ്‌മെന്റ് ആരംഭിച്ച് അവസാനിക്കുമ്പോൾ ചുവടെയുള്ള ബട്ടൺ ക്ലിക്കുചെയ്‌ത് റെക്കോർഡുചെയ്‌ത് ഡാറ്റാബേസിൽ സമർപ്പിക്കുക."
},
"popupHint": {
"message": "സൂചന: ഒരു സെഗ്‌മെന്റിന്റെ ആരംഭം / അവസാനം റിപ്പോർട്ടുചെയ്യുന്നതിന് ഒരു വീഡിയോയിൽ ഫോക്കസ് ചെയ്യുമ്പോൾ അർദ്ധവിരാമ കീ അമർത്തുക, സമർപ്പിക്കാനുള്ള ഉദ്ധരണി. (ഓപ്ഷനുകളിൽ ഇത് മാറ്റാം)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "ടൈംസ് മായ്‌ക്കുക" "message": "ടൈംസ് മായ്‌ക്കുക"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "കണക്ഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. നിങ്ങളുടെ ഇൻറർനെറ്റ് പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, സെർവർ ഓവർലോഡ് അല്ലെങ്കിൽ ഡ. ൺ ആയിരിക്കാം." "message": "കണക്ഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. നിങ്ങളുടെ ഇൻറർനെറ്റ് പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, സെർവർ ഓവർലോഡ് അല്ലെങ്കിൽ ഡ. ൺ ആയിരിക്കാം."
}, },
"disableSkipping": {
"message": "സ്പോൺസർബ്ലോക്ക് അപ്രാപ്തമാക്കുക"
},
"enableSkipping": {
"message": "സ്പോൺസർബ്ലോക്ക് പ്രാപ്തമാക്കുക"
},
"yourWork": { "yourWork": {
"message": "നിങ്ങളുടെ ജോലി", "message": "നിങ്ങളുടെ ജോലി",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "സീക്ക്ബാറിന് താഴെയുള്ള നിലവിലെ സമയത്തിന് അടുത്തുള്ള ബ്രാക്കറ്റുകളിൽ ഈ സമയം ദൃശ്യമാകുന്നു. ഏത് സെഗ്‌മെന്റുകളുടെയും മൈനസ് മൊത്തം വീഡിയോ ദൈർഘ്യം ഇത് കാണിക്കുന്നു. \"സീക്ക്ബാറിൽ കാണിക്കുക\" എന്ന് മാത്രം അടയാളപ്പെടുത്തിയ സെഗ്‌മെന്റുകൾ ഇതിൽ ഉൾപ്പെടുന്നു." "message": "സീക്ക്ബാറിന് താഴെയുള്ള നിലവിലെ സമയത്തിന് അടുത്തുള്ള ബ്രാക്കറ്റുകളിൽ ഈ സമയം ദൃശ്യമാകുന്നു. ഏത് സെഗ്‌മെന്റുകളുടെയും മൈനസ് മൊത്തം വീഡിയോ ദൈർഘ്യം ഇത് കാണിക്കുന്നു. \"സീക്ക്ബാറിൽ കാണിക്കുക\" എന്ന് മാത്രം അടയാളപ്പെടുത്തിയ സെഗ്‌മെന്റുകൾ ഇതിൽ ഉൾപ്പെടുന്നു."
}, },
"youHaveSkipped": {
"message": "നിങ്ങൾ ഒഴിവാക്കി "
},
"youHaveSaved": { "youHaveSaved": {
"message": "നിങ്ങൾ സ്വയം രക്ഷിച്ചു " "message": "നിങ്ങൾ സ്വയം രക്ഷിച്ചു "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "മണിക്കൂറുകൾ" "message": "മണിക്കൂറുകൾ"
}, },
"youHaveSavedTime": {
"message": "നിങ്ങൾ ആളുകളെ രക്ഷിച്ചു"
},
"youHaveSavedTimeEnd": {
"message": " അവരുടെ ജീവിതത്തിന്റെ."
},
"statusReminder": { "statusReminder": {
"message": "സെർവർ നിലയ്ക്കായി status.sponsor.ajay.app പരിശോധിക്കുക." "message": "സെർവർ നിലയ്ക്കായി status.sponsor.ajay.app പരിശോധിക്കുക."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Segmen Berakhir Sekarang" "message": "Segmen Berakhir Sekarang"
}, },
"noVideoID": {
"message": "Tidak terdapat video YouTube di tab ini. Sekiranya anda tahu ini adalah tab YouTube, tutup pop timbul ini dan buka lagi. Sekiranya tidak berjaya, cuba muat semula tab."
},
"success": { "success": {
"message": "Berjaya!" "message": "Berjaya!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Adakah anda pasti mahu menghantarnya?" "message": "Adakah anda pasti mahu menghantarnya?"
}, },
"whitelistChannel": {
"message": "Saluran Senarai Putih"
},
"removeFromWhitelist": {
"message": "Alih keluar Saluran Dari Senarai Putih"
},
"voteOnTime": { "voteOnTime": {
"message": "Undi Segmen" "message": "Undi Segmen"
}, },
"soFarUHSubmited": {
"message": "Setakat ini, anda telah menghantar"
},
"savedPeopleFrom": {
"message": "Anda telah menyelamatkan orang dari "
},
"viewLeaderboard": {
"message": "Lihat papan pendahulu"
},
"here": { "here": {
"message": "di sini" "message": "di sini"
}, },
"recordTimesDescription": {
"message": "Klik butang di bawah apabila segmen bermula dan berakhir untuk merekod dan menyerahkannya ke pangkalan data."
},
"popupHint": {
"message": "Petunjuk: Tekan kekunci titik koma sambil fokus pada video untuk melaporkan permulaan / akhir segmen dan petikan untuk dihantar. (Ini boleh diubah dalam pilihan)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Jelas Masa" "message": "Jelas Masa"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi." "message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi."
}, },
"disableSkipping": {
"message": "Lumpuhkan SponsorBlock"
},
"enableSkipping": {
"message": "Dayakan SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Kerja awak", "message": "Kerja awak",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Kali ini muncul dalam tanda kurung di sebelah waktu semasa di bawah bar carian. Ini menunjukkan jumlah durasi video tolak segmen mana pun. Ini merangkumi segmen yang ditandai sebagai \"Show In Seekbar\" sahaja." "message": "Kali ini muncul dalam tanda kurung di sebelah waktu semasa di bawah bar carian. Ini menunjukkan jumlah durasi video tolak segmen mana pun. Ini merangkumi segmen yang ditandai sebagai \"Show In Seekbar\" sahaja."
}, },
"youHaveSkipped": {
"message": "Anda telah melangkau "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Anda telah menyelamatkan diri " "message": "Anda telah menyelamatkan diri "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "jam" "message": "jam"
}, },
"youHaveSavedTime": {
"message": "Anda telah menyelamatkan orang"
},
"youHaveSavedTimeEnd": {
"message": " kehidupan mereka."
},
"statusReminder": { "statusReminder": {
"message": "Periksa status.sponsor.ajay.app untuk status pelayan." "message": "Periksa status.sponsor.ajay.app untuk status pelayan."
}, },

View File

@@ -86,7 +86,7 @@
"message": "Segment eindigt nu" "message": "Segment eindigt nu"
}, },
"noVideoID": { "noVideoID": {
"message": "Er is geen YouTube-video gevonden op dit tabblad. Als u weet dat dit een YouTube-tabblad is, sluit dan deze pop-up en open hem opnieuw. Als dat niet werkt, probeer dan het tabblad opnieuw te laden." "message": "Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is."
}, },
"success": { "success": {
"message": "Gelukt!" "message": "Gelukt!"
@@ -130,23 +130,27 @@
"voteOnTime": { "voteOnTime": {
"message": "Stemmen op een segment" "message": "Stemmen op een segment"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "Tot nu toe heeft u ingediend:" "message": "Inzendingen"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "U heeft mensen geholpen met het vermijden van " "message": "U heeft mensen gered van "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Bekijk de ranglijst" "message": "Ranglijst"
}, },
"here": { "here": {
"message": "hier" "message": "hier"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Klik op de knop hieronder wanneer het segment begint en eindigt om het te registreren en te verzenden naar de database." "message": "Indienen"
},
"submissionEditHint": {
"message": "Sectiebewerking verschijnt nadat u op verzenden hebt geklikt",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Tip: druk op de puntkomma-toets terwijl een video in focus is om het begin/einde van een segment te registreren en op de aanhalingsteken-toets om het in te dienen (dit kan worden gewijzigd in de opties)." "message": "Tip: u kunt sneltoetsen voor het indienen instellen in de opties"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Tijdstippen wissen" "message": "Tijdstippen wissen"
@@ -157,6 +161,9 @@
"publicStats": { "publicStats": {
"message": "Dit wordt gebruikt op de publieke statistiekenpagina om te laten zien hoeveel u heeft bijgedragen. Bekijk het" "message": "Dit wordt gebruikt op de publieke statistiekenpagina om te laten zien hoeveel u heeft bijgedragen. Bekijk het"
}, },
"Username": {
"message": "Gebruikersnaam"
},
"setUsername": { "setUsername": {
"message": "Gebruikersnaam instellen" "message": "Gebruikersnaam instellen"
}, },
@@ -253,10 +260,10 @@
"message": "Time-out van de verbinding. Controleer uw internetverbinding. Als uw internet werkt, is de server waarschijnlijk overbelast of offline." "message": "Time-out van de verbinding. Controleer uw internetverbinding. Als uw internet werkt, is de server waarschijnlijk overbelast of offline."
}, },
"disableSkipping": { "disableSkipping": {
"message": "SponsorBlock uitschakelen" "message": "Overslaan is ingeschakeld"
}, },
"enableSkipping": { "enableSkipping": {
"message": "SponsorBlock inschakelen" "message": "Overslaan is uitgeschakeld"
}, },
"yourWork": { "yourWork": {
"message": "Uw werk", "message": "Uw werk",
@@ -314,10 +321,10 @@
"message": "uren" "message": "uren"
}, },
"youHaveSavedTime": { "youHaveSavedTime": {
"message": "U heeft andere mensen bespaard:" "message": "U heeft mensen bespaard:"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " van hun leven." "message": " van hun leven"
}, },
"statusReminder": { "statusReminder": {
"message": "Controleer status.sponsor.ajay.app voor de serverstatus." "message": "Controleer status.sponsor.ajay.app voor de serverstatus."
@@ -634,5 +641,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Een melding sturen wanneer u een video verlaat met segmenten die niet zijn geüpload" "message": "Een melding sturen wanneer u een video verlaat met segmenten die niet zijn geüpload"
},
"help": {
"message": "Help"
} }
} }

View File

@@ -86,7 +86,7 @@
"message": "Koniec segmentu" "message": "Koniec segmentu"
}, },
"noVideoID": { "noVideoID": {
"message": "Nie znaleziono filmu na tej karcie. Jeśli wiesz, że to karta YouTube'a, zamknij to okienko i otwórz je ponownie. Jeśli to nie zadziała, spróbuj odśwież stronę." "message": "Nie znaleziono filmu YouTube.\nJeśli jest to niepoprawne, odśwież stronę."
}, },
"success": { "success": {
"message": "Sukces!" "message": "Sukces!"
@@ -130,23 +130,27 @@
"voteOnTime": { "voteOnTime": {
"message": "Oceń segment" "message": "Oceń segment"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "Do tej pory zgłosiłeś" "message": "Zgłoszenia"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Ocaliłeś ludzi przed " "message": "Oszczędziłeś innym "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Zobacz ranking użytkowników" "message": "Ranking"
}, },
"here": { "here": {
"message": "tutaj" "message": "tutaj"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Kliknij przycisk poniżej, gdy segment zaczyna się i kończy, by oznaczyć go i przesłać do bazy danych." "message": "Wyślij"
},
"submissionEditHint": {
"message": "Edycja sekcji pojawi się po kliknięciu wyślij",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Podpowiedź: Wciśnij średnik, koncentrując się na filmie, aby oznaczyć początek/koniec segmentu, i cudzysłów, by go wysłać. (Klawisze można zmienić w opcjach)" "message": "Wskazówka: Możesz skonfigurować skróty klawiszowe do zatwierdzania w opcjach"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Usuń czasy" "message": "Usuń czasy"
@@ -157,6 +161,9 @@
"publicStats": { "publicStats": {
"message": "Ten dane są używane na naszej stronie żeby pokazać twój wkład. Zobacz to" "message": "Ten dane są używane na naszej stronie żeby pokazać twój wkład. Zobacz to"
}, },
"Username": {
"message": "Nazwa użytkownika"
},
"setUsername": { "setUsername": {
"message": "Ustaw nazwę użytkownika" "message": "Ustaw nazwę użytkownika"
}, },
@@ -253,10 +260,10 @@
"message": "Połączenie przerwane z powodu braku odpowiedzi. Sprawdź swoje połączenie z internetem. Jeśli wszystko z nim w porządku oznacza to, że serwer jest prawdopodobnie przeciążony lub nie działa." "message": "Połączenie przerwane z powodu braku odpowiedzi. Sprawdź swoje połączenie z internetem. Jeśli wszystko z nim w porządku oznacza to, że serwer jest prawdopodobnie przeciążony lub nie działa."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Wyłącz SponsorBlock" "message": "Pomijanie jest włączone"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Włącz SponsorBlock" "message": "Pomijanie jest wyłączone"
}, },
"yourWork": { "yourWork": {
"message": "Twój wkład", "message": "Twój wkład",
@@ -317,7 +324,7 @@
"message": "Oszczędziłeś ludziom" "message": "Oszczędziłeś ludziom"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " czasu." "message": " ich życia"
}, },
"statusReminder": { "statusReminder": {
"message": "Sprawdź status serwera na status.sponsor.ajay.app" "message": "Sprawdź status serwera na status.sponsor.ajay.app"
@@ -634,5 +641,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Wyślij powiadomienie po opuszczeniu filmu z segmentami, które nie zostały przesłane" "message": "Wyślij powiadomienie po opuszczeniu filmu z segmentami, które nie zostały przesłane"
},
"help": {
"message": "Pomoc"
} }
} }

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "O segmento termina agora" "message": "O segmento termina agora"
}, },
"noVideoID": {
"message": "Nenhum vídeo do YouTube foi encontrado nesta aba. Se você sabe que esta é uma aba do YouTube, feche este pop-up e abra-o novamente. Se isso não funcionar, tente recarregar a aba."
},
"success": { "success": {
"message": "Sucesso!" "message": "Sucesso!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Você tem certeza que deseja enviar isto?" "message": "Você tem certeza que deseja enviar isto?"
}, },
"whitelistChannel": {
"message": "Colocar canal na lista branca"
},
"removeFromWhitelist": {
"message": "Remover canal da lista branca"
},
"voteOnTime": { "voteOnTime": {
"message": "Votar Em Um Segmento" "message": "Votar Em Um Segmento"
}, },
"soFarUHSubmited": {
"message": "Até agora, você já enviou"
},
"savedPeopleFrom": {
"message": "Poupaste a outros de "
},
"viewLeaderboard": {
"message": "Ver a leaderboard"
},
"here": { "here": {
"message": "aqui" "message": "aqui"
}, },
"recordTimesDescription": {
"message": "Clique no botão abaixo quando o segmento começa e termina para gravar e enviá-lo para o banco de dados."
},
"popupHint": {
"message": "Dica: Aperte a tecla ponto e vírgula com a janela focada em um vídeo para reportar o começo/fim de um segmento e aspas para enviar. (Esta configuração pode ser mudada nas opções)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Limpar Intervalos" "message": "Limpar Intervalos"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Tempo limite de conexão excedida. Cheque a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está sobrecarregado ou fora do ar." "message": "Tempo limite de conexão excedida. Cheque a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está sobrecarregado ou fora do ar."
}, },
"disableSkipping": {
"message": "Desativar SponsorBlock"
},
"enableSkipping": {
"message": "Ativar SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Suas submissões", "message": "Suas submissões",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Esta vez aparece em parênteses ao lado da hora atual abaixo da barra de procura. Isto mostra a duração total do vídeo menos qualquer segmento. Isto inclui segmentos marcados como apenas \"Mostrar em Seekbar\"." "message": "Esta vez aparece em parênteses ao lado da hora atual abaixo da barra de procura. Isto mostra a duração total do vídeo menos qualquer segmento. Isto inclui segmentos marcados como apenas \"Mostrar em Seekbar\"."
}, },
"youHaveSkipped": {
"message": "Você pulou "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Você poupou " "message": "Você poupou "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "horas" "message": "horas"
}, },
"youHaveSavedTime": {
"message": "Você poupou outros"
},
"youHaveSavedTimeEnd": {
"message": " de suas vidas."
},
"statusReminder": { "statusReminder": {
"message": "Verifique status.sponsor.ajay.app para o status do servidor." "message": "Verifique status.sponsor.ajay.app para o status do servidor."
}, },

View File

@@ -54,9 +54,6 @@
"Unknown": { "Unknown": {
"message": "Erro ao enviar os seus segmentos, tente novamente mais tarde." "message": "Erro ao enviar os seus segmentos, tente novamente mais tarde."
}, },
"noVideoID": {
"message": "Isto provavelmente não é uma tab do YouTube, ou pode ter clicado muito cedo. \n Se sabe que é uma tab do YouTube,\n feche este popup e abra de novo."
},
"success": { "success": {
"message": "Sucesso!" "message": "Sucesso!"
}, },
@@ -72,21 +69,6 @@
"submitCheck": { "submitCheck": {
"message": "Tem a certeza que pretende submeter?" "message": "Tem a certeza que pretende submeter?"
}, },
"whitelistChannel": {
"message": "Meter canal na Whitelist"
},
"removeFromWhitelist": {
"message": "Remover canal da Whitelist"
},
"soFarUHSubmited": {
"message": "Até agora submeteu"
},
"savedPeopleFrom": {
"message": "Poupaste a outros de "
},
"viewLeaderboard": {
"message": "Ver a leaderboard"
},
"here": { "here": {
"message": "aqui" "message": "aqui"
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Segmentul se termină acum" "message": "Segmentul se termină acum"
}, },
"noVideoID": {
"message": "Nu există niciun videoclip YouTube în aceast tab. Dacă știți că acesta este un tab YouTube, închideți acest popup și deschideți-l din nou. Daca nici asta nu merge, încercați să reîncărcați pagina."
},
"success": { "success": {
"message": "Succes!" "message": "Succes!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Sunteți sigur că doriți să trimiteți asta?" "message": "Sunteți sigur că doriți să trimiteți asta?"
}, },
"whitelistChannel": {
"message": "Adaugă Canalul La Excepții"
},
"removeFromWhitelist": {
"message": "Șterge Canalul De La Excepții"
},
"voteOnTime": { "voteOnTime": {
"message": "Votează pe un Segment" "message": "Votează pe un Segment"
}, },
"soFarUHSubmited": {
"message": "Până acum, ai trimis"
},
"savedPeopleFrom": {
"message": "Ai salvat alte persoane de la "
},
"viewLeaderboard": {
"message": "Vezi clasamentul"
},
"here": { "here": {
"message": "aici" "message": "aici"
}, },
"recordTimesDescription": {
"message": "Faceţi clic pe butonul de mai jos atunci când segmentul începe şi se termină pentru a înregistra şi trimite-l în baza de date."
},
"popupHint": {
"message": "Indiciu: Apasă pe tasta punct și virgulă în timp ce ești centrat pe videoclip pentru a raporta începutul/finalul unei sponsorizări și apasă pe ghilimele pentru a o trimite. (Acest lucru poate fi schimbat din opțiuni)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Șterge Timpii" "message": "Șterge Timpii"
}, },
@@ -227,12 +203,6 @@
"0": { "0": {
"message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut." "message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut."
}, },
"disableSkipping": {
"message": "Dezactivează SponsorBlock"
},
"enableSkipping": {
"message": "Activează SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Munca Ta", "message": "Munca Ta",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -246,9 +216,6 @@
"skip": { "skip": {
"message": "Sari" "message": "Sari"
}, },
"skip_category": {
"message": "Sari {0}?"
},
"skipped": { "skipped": {
"message": "Sărit" "message": "Sărit"
}, },
@@ -267,9 +234,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Acest timp apare în paranteze lângă ora curentă sub bara de progres. Aceasta arată durata totală a videoclipului minus orice segment. Aceasta include segmente marcate doar ca \"Afișare în Seekbar\"." "message": "Acest timp apare în paranteze lângă ora curentă sub bara de progres. Aceasta arată durata totală a videoclipului minus orice segment. Aceasta include segmente marcate doar ca \"Afișare în Seekbar\"."
}, },
"youHaveSkipped": {
"message": "Ai sărit peste "
},
"youHaveSaved": { "youHaveSaved": {
"message": "V-ați salvat " "message": "V-ați salvat "
}, },
@@ -285,12 +249,6 @@
"hoursLower": { "hoursLower": {
"message": "ore" "message": "ore"
}, },
"youHaveSavedTime": {
"message": "Ai salvat alte persoane"
},
"youHaveSavedTimeEnd": {
"message": " din viața lor."
},
"statusReminder": { "statusReminder": {
"message": "Verificați status.sponsor.ajay.app pentru starea serverului." "message": "Verificați status.sponsor.ajay.app pentru starea serverului."
}, },

View File

@@ -86,7 +86,7 @@
"message": "Сегмент заканчивается здесь" "message": "Сегмент заканчивается здесь"
}, },
"noVideoID": { "noVideoID": {
"message": "Видео YouTube не найдено на этой вкладке. Если вы уверены, что это вкладка YouTube, закройте это всплывающее окно и откройте его снова. Если это не поможет, перезагрузите вкладку." "message": "Видео YouTube не найдено.\nЕсли это не так, обновите вкладку."
}, },
"success": { "success": {
"message": "Успех!" "message": "Успех!"
@@ -121,32 +121,30 @@
"submitCheck": { "submitCheck": {
"message": "Вы уверены, что хотите отправить эту информацию?" "message": "Вы уверены, что хотите отправить эту информацию?"
}, },
"whitelistChannel": {
"message": "Добавить канал в белый список"
},
"removeFromWhitelist": {
"message": "Удалить канал из белого списка"
},
"voteOnTime": { "voteOnTime": {
"message": "Проголосовать за сегмент" "message": "Проголосовать за сегмент"
}, },
"soFarUHSubmited": { "Submissions": {
"message": "На данный момент Вы отправили" "message": "Отправлено сегментов"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Вы помогли людям пропустить " "message": "Вы помогли людям пропустить "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Посмотреть доску почёта" "message": "Доска почёта"
}, },
"here": { "here": {
"message": "здесь" "message": "здесь"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Нажмите кнопку ниже, когда сегмент начинается и заканчивается, чтобы записать и отправить его в базу." "message": "Отправить"
},
"submissionEditHint": {
"message": "Редактирование сегментов появится после нажатия на кнопку \"Отправить\"",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
}, },
"popupHint": { "popupHint": {
"message": "Подсказка: нажмите на кнопку \"Ж\" во время воспроизведения, чтобы сообщить о начале/конце сегмента, и \"Э\", чтобы отправить его. (Это можно изменить в настройках)" "message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в опциях"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Очистить время" "message": "Очистить время"
@@ -157,6 +155,9 @@
"publicStats": { "publicStats": {
"message": "Оно используется на публичной странице статистики, чтобы показать Ваш вклад. Её можно посмотреть " "message": "Оно используется на публичной странице статистики, чтобы показать Ваш вклад. Её можно посмотреть "
}, },
"Username": {
"message": "Имя пользователя"
},
"setUsername": { "setUsername": {
"message": "Установить имя пользователя" "message": "Установить имя пользователя"
}, },
@@ -253,10 +254,10 @@
"message": "Таймаут подключения. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или лежит." "message": "Таймаут подключения. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или лежит."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Отключить SponsorBlock" "message": "Пропуск включен"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Включить SponsorBlock" "message": "Пропуск выключен"
}, },
"yourWork": { "yourWork": {
"message": "Ваша работа", "message": "Ваша работа",
@@ -317,7 +318,7 @@
"message": "Вы сэкономили людям" "message": "Вы сэкономили людям"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " их жизней." "message": " их жизней"
}, },
"statusReminder": { "statusReminder": {
"message": "Смотрите состояние сервера на status.sponsor.ajay.app." "message": "Смотрите состояние сервера на status.sponsor.ajay.app."
@@ -634,5 +635,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Отправлять уведомление, когда вы уходите со страницы видео, сегменты к которому Вы не отправили" "message": "Отправлять уведомление, когда вы уходите со страницы видео, сегменты к которому Вы не отправили"
},
"help": {
"message": "Помощь"
} }
} }

View File

@@ -101,12 +101,6 @@
"0": { "0": {
"message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak váš internet funguje, server je pravdepodobne preťažený alebo nefunkčný." "message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak váš internet funguje, server je pravdepodobne preťažený alebo nefunkčný."
}, },
"disableSkipping": {
"message": "Vypnúť SponsorBlock"
},
"enableSkipping": {
"message": "Zapnúť SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Vaša Práca", "message": "Vaša Práca",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."

View File

@@ -86,7 +86,7 @@
"message": "Segmentet slutar nu" "message": "Segmentet slutar nu"
}, },
"noVideoID": { "noVideoID": {
"message": "Kunde inte hitta någon YouTube-video i denna tab. Om du är säker på att detta är en Youtube-flik, stäng den här rutan och öppna den igen. Ladda om fliken om inte det funkar." "message": "Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt."
}, },
"success": { "success": {
"message": "Lyckades!" "message": "Lyckades!"
@@ -121,32 +121,20 @@
"submitCheck": { "submitCheck": {
"message": "Är du säker på att du vill rapportera detta?" "message": "Är du säker på att du vill rapportera detta?"
}, },
"whitelistChannel": {
"message": "Vitlista Kanal"
},
"removeFromWhitelist": {
"message": "Ta bort kanal från vitlistan"
},
"voteOnTime": { "voteOnTime": {
"message": "Rösta på ett segment" "message": "Rösta på ett segment"
}, },
"soFarUHSubmited": {
"message": "Hitills har du rapporterat"
},
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Du har sparat andra " "message": "Du har sparat andra från "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Se leaderboarden" "message": "Topplista"
}, },
"here": { "here": {
"message": "här" "message": "här"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Klicka på knappen nedan när segmentet startar och slutar för att spela in och skicka in det till databasen." "message": "Skicka"
},
"popupHint": {
"message": "Tips: Tryck på tangenten semikolon medan du fokuserar på en video för att rapportera början/slutet av ett segment för att skicka in. (Detta kan ändras i alternativen)"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Rensa Tider" "message": "Rensa Tider"
@@ -157,6 +145,9 @@
"publicStats": { "publicStats": {
"message": "Detta kommer att användas på den publika statistiksidan för att visa hur mycket du har bidragit. Spana in den" "message": "Detta kommer att användas på den publika statistiksidan för att visa hur mycket du har bidragit. Spana in den"
}, },
"Username": {
"message": "Användarnamn"
},
"setUsername": { "setUsername": {
"message": "Ange Användarnamn" "message": "Ange Användarnamn"
}, },
@@ -244,10 +235,10 @@
"message": "Anslutningsfel. Se över din internetanslutning. Om du kan komma åt internet så är servern förmodligen överbelastad eller nere." "message": "Anslutningsfel. Se över din internetanslutning. Om du kan komma åt internet så är servern förmodligen överbelastad eller nere."
}, },
"disableSkipping": { "disableSkipping": {
"message": "Avaktivera SponsorBlock" "message": "Hoppa över är aktiverat"
}, },
"enableSkipping": { "enableSkipping": {
"message": "Aktivera SponsorBlock" "message": "Hoppa över är inaktiverat"
}, },
"yourWork": { "yourWork": {
"message": "Ditt Bidrag", "message": "Ditt Bidrag",
@@ -308,7 +299,7 @@
"message": "Du har sparat andra" "message": "Du har sparat andra"
}, },
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " av deras liv." "message": " av deras liv"
}, },
"statusReminder": { "statusReminder": {
"message": "Gå till status.sponsor.ajay.app för serverstatus." "message": "Gå till status.sponsor.ajay.app för serverstatus."
@@ -592,5 +583,8 @@
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Visa en avisering när du lämnar en video med segment som inte har laddats upp" "message": "Visa en avisering när du lämnar en video med segment som inte har laddats upp"
},
"help": {
"message": "Hjälp"
} }
} }

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "பிரிவு இப்போது முடிகிறது" "message": "பிரிவு இப்போது முடிகிறது"
}, },
"noVideoID": {
"message": "இந்த தாவலில் YouTube வீடியோ எதுவும் இல்லை. இது ஒரு YouTube தாவல் என்று உங்களுக்குத் தெரிந்தால், இந்த பாப்அப்பை மூடிவிட்டு மீண்டும் திறக்கவும். அது வேலை செய்யவில்லை என்றால், தாவலை மீண்டும் ஏற்ற முயற்சிக்கவும்."
},
"success": { "success": {
"message": "வெற்றி!" "message": "வெற்றி!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "இதை நிச்சயமாக சமர்ப்பிக்க விரும்புகிறீர்களா?" "message": "இதை நிச்சயமாக சமர்ப்பிக்க விரும்புகிறீர்களா?"
}, },
"whitelistChannel": {
"message": "அனுமதிப்பட்டியல் சேனல்"
},
"removeFromWhitelist": {
"message": "அனுமதிப்பட்டியலில் இருந்து சேனலை அகற்று"
},
"voteOnTime": { "voteOnTime": {
"message": "ஒரு பிரிவில் வாக்களியுங்கள்" "message": "ஒரு பிரிவில் வாக்களியுங்கள்"
}, },
"soFarUHSubmited": {
"message": "இதுவரை, நீங்கள் சமர்ப்பித்தீர்கள்"
},
"savedPeopleFrom": {
"message": "நீங்கள் மக்களை காப்பாற்றியுள்ளீர்கள் "
},
"viewLeaderboard": {
"message": "லீடர்போர்டைக் காண்க"
},
"here": { "here": {
"message": "இங்கே" "message": "இங்கே"
}, },
"recordTimesDescription": {
"message": "பிரிவு துவங்கி முடிவடையும் போது கீழே உள்ள பொத்தானைக் கிளிக் செய்து பதிவுசெய்து தரவுத்தளத்தில் சமர்ப்பிக்கவும்."
},
"popupHint": {
"message": "குறிப்பு: ஒரு பிரிவின் தொடக்க / முடிவைப் புகாரளிக்க ஒரு வீடியோவில் கவனம் செலுத்துகையில் அரைக்காற்பகுதி விசையை அழுத்தி சமர்ப்பிக்க மேற்கோள். (இதை விருப்பங்களில் மாற்றலாம்)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "நேரங்களை அழி" "message": "நேரங்களை அழி"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்." "message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."
}, },
"disableSkipping": {
"message": "ஸ்பான்சர் பிளாக் முடக்கு"
},
"enableSkipping": {
"message": "ஸ்பான்சர் பிளாக் இயக்கவும்"
},
"yourWork": { "yourWork": {
"message": "உங்கள் வேலை", "message": "உங்கள் வேலை",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "இந்த நேரம் தற்போதைய நேரத்திற்கு அடுத்த அடைப்புக்குறிக்குள் தோன்றும். இது எந்தவொரு வீடியோவிற்கும் கழித்த மொத்த வீடியோ கால அளவைக் காட்டுகிறது. இதில் \"சீக்பாரில் காண்பி\" என்று மட்டுமே குறிக்கப்பட்ட பகுதிகள் அடங்கும்." "message": "இந்த நேரம் தற்போதைய நேரத்திற்கு அடுத்த அடைப்புக்குறிக்குள் தோன்றும். இது எந்தவொரு வீடியோவிற்கும் கழித்த மொத்த வீடியோ கால அளவைக் காட்டுகிறது. இதில் \"சீக்பாரில் காண்பி\" என்று மட்டுமே குறிக்கப்பட்ட பகுதிகள் அடங்கும்."
}, },
"youHaveSkipped": {
"message": "நீங்கள் தவிர்த்துவிட்டீர்கள் "
},
"youHaveSaved": { "youHaveSaved": {
"message": "உங்களை நீங்களே காப்பாற்றிக் கொண்டீர்கள் " "message": "உங்களை நீங்களே காப்பாற்றிக் கொண்டீர்கள் "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "மணி" "message": "மணி"
}, },
"youHaveSavedTime": {
"message": "நீங்கள் மக்களைக் காப்பாற்றியுள்ளீர்கள்"
},
"youHaveSavedTimeEnd": {
"message": " அவர்களின் வாழ்க்கையில்."
},
"statusReminder": { "statusReminder": {
"message": "சேவையக நிலைக்கு status.sponsor.ajay.app ஐச் சரிபார்க்கவும்." "message": "சேவையக நிலைக்கு status.sponsor.ajay.app ஐச் சரிபார்க்கவும்."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "సెగ్మెంట్ ఇప్పుడు ముగుస్తుంది" "message": "సెగ్మెంట్ ఇప్పుడు ముగుస్తుంది"
}, },
"noVideoID": {
"message": "ఈ ట్యాబ్‌లో YouTube వీడియో ఏదీ కనుగొనబడలేదు. ఇది యూట్యూబ్ ట్యాబ్ అని మీకు తెలిస్తే, ఈ పాపప్‌ను మూసివేసి మళ్ళీ తెరవండి. అది పని చేయకపోతే, టాబ్‌ను మళ్లీ లోడ్ చేయడానికి ప్రయత్నించండి."
},
"success": { "success": {
"message": "విజయం!" "message": "విజయం!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "మీరు దీన్ని ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?" "message": "మీరు దీన్ని ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?"
}, },
"whitelistChannel": {
"message": "వైట్‌లిస్ట్ ఛానల్"
},
"removeFromWhitelist": {
"message": "వైట్లిస్ట్ నుండి ఛానెల్ తొలగించండి"
},
"voteOnTime": { "voteOnTime": {
"message": "ఒక విభాగంలో ఓటు వేయండి" "message": "ఒక విభాగంలో ఓటు వేయండి"
}, },
"soFarUHSubmited": {
"message": "ఇప్పటివరకు, మీరు సమర్పించారు"
},
"savedPeopleFrom": {
"message": "మీరు ప్రజలను రక్షించారు "
},
"viewLeaderboard": {
"message": "లీడర్‌బోర్డ్‌ను చూడండి"
},
"here": { "here": {
"message": "ఇక్కడ" "message": "ఇక్కడ"
}, },
"recordTimesDescription": {
"message": "సెగ్మెంట్ ప్రారంభమైనప్పుడు మరియు రికార్డ్ చేయడానికి ముగిసినప్పుడు క్రింది బటన్‌ను క్లిక్ చేసి డేటాబేస్కు సమర్పించండి."
},
"popupHint": {
"message": "సూచన: ఒక సెగ్మెంట్ యొక్క ప్రారంభ / ముగింపును నివేదించడానికి వీడియోపై దృష్టి కేంద్రీకరించినప్పుడు సెమికోలన్ కీని నొక్కండి మరియు సమర్పించడానికి కోట్ చేయండి. (దీన్ని ఎంపికలలో మార్చవచ్చు)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "టైమ్స్ క్లియర్" "message": "టైమ్స్ క్లియర్"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "అనుసంధాన సమయం సమాప్తం. మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి. మీ ఇంటర్నెట్ పనిచేస్తుంటే, సర్వర్ ఓవర్‌లోడ్ లేదా డౌన్ అయి ఉండవచ్చు." "message": "అనుసంధాన సమయం సమాప్తం. మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి. మీ ఇంటర్నెట్ పనిచేస్తుంటే, సర్వర్ ఓవర్‌లోడ్ లేదా డౌన్ అయి ఉండవచ్చు."
}, },
"disableSkipping": {
"message": "స్పాన్సర్బ్లాక్‌ను ఆపివేయి"
},
"enableSkipping": {
"message": "స్పాన్సర్బ్లాక్‌ని ప్రారంభించండి"
},
"yourWork": { "yourWork": {
"message": "నీ పని", "message": "నీ పని",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "ఈ సమయం సీక్ బార్ క్రింద ప్రస్తుత సమయం పక్కన బ్రాకెట్లలో కనిపిస్తుంది. ఇది మొత్తం వీడియో వ్యవధి మైనస్ ఏదైనా విభాగాలను చూపుతుంది. ఇందులో \"సీక్బార్లో చూపించు\" అని మాత్రమే గుర్తించబడిన విభాగాలు ఉన్నాయి." "message": "ఈ సమయం సీక్ బార్ క్రింద ప్రస్తుత సమయం పక్కన బ్రాకెట్లలో కనిపిస్తుంది. ఇది మొత్తం వీడియో వ్యవధి మైనస్ ఏదైనా విభాగాలను చూపుతుంది. ఇందులో \"సీక్బార్లో చూపించు\" అని మాత్రమే గుర్తించబడిన విభాగాలు ఉన్నాయి."
}, },
"youHaveSkipped": {
"message": "మీరు దాటవేశారు "
},
"youHaveSaved": { "youHaveSaved": {
"message": "మీరు మీరే రక్షించుకున్నారు " "message": "మీరు మీరే రక్షించుకున్నారు "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "గంటలు" "message": "గంటలు"
}, },
"youHaveSavedTime": {
"message": "మీరు ప్రజలను రక్షించారు"
},
"youHaveSavedTimeEnd": {
"message": " వారి జీవితాల."
},
"statusReminder": { "statusReminder": {
"message": "సర్వర్ స్థితి కోసం status.sponsor.ajay.app ని తనిఖీ చేయండి." "message": "సర్వర్ స్థితి కోసం status.sponsor.ajay.app ని తనిఖీ చేయండి."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Kısım Şimdi Bitiyor" "message": "Kısım Şimdi Bitiyor"
}, },
"noVideoID": {
"message": "Bu sekmede YouTube videosu bulunamadı. Bu sekmenin bir YouTube sekmesi olduğundan eminseniz, bu pencereyi kapatıp, tekrar açın. Eğer o da işe yaramazsa, sekmeyi yenilemeyi deneyin."
},
"success": { "success": {
"message": "Başarılı!" "message": "Başarılı!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Bunu göndermek istediğinize emin misiniz?" "message": "Bunu göndermek istediğinize emin misiniz?"
}, },
"whitelistChannel": {
"message": "Kanalı Beyazlisteye Ekle"
},
"removeFromWhitelist": {
"message": "Kanalı Beyazlisteden Kaldır"
},
"voteOnTime": { "voteOnTime": {
"message": "Bir Kısmı Oyla" "message": "Bir Kısmı Oyla"
}, },
"soFarUHSubmited": {
"message": "Şu an kadar yolladığınız"
},
"savedPeopleFrom": {
"message": "İnsanların şu kadar vaktini kurtardınız "
},
"viewLeaderboard": {
"message": "Liderlik tablosunu görüntüle"
},
"here": { "here": {
"message": "burada" "message": "burada"
}, },
"recordTimesDescription": {
"message": "Kısmın başladığı ve bittiği yeri kaydetmek ve veri tabanına göndermek için aşağıdaki butona tıklayın."
},
"popupHint": {
"message": "İpucu: Bir kısmın başlangıcını / sonunu seçmek ve göndermek için bir videoyu izlerken noktalı virgül tuşuna basın. (Bu, ayarlardan değiştirilebilir)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Süreleri Temizle" "message": "Süreleri Temizle"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir." "message": "Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir."
}, },
"disableSkipping": {
"message": "SponsorBlock'u Devredışı Bırak"
},
"enableSkipping": {
"message": "SponsorBlock'u Devreye Sok"
},
"yourWork": { "yourWork": {
"message": "Çalışmalarınız", "message": "Çalışmalarınız",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Bu süre, video ilerleme çubuğunun altındaki geçerli zamanın yanında parantez içinde görüntülenir. Bu, videodaki kısımların silinmiş toplam video süresini gösterir. Bu, yalnızca \"Video İlerleme Çubuğunda Göster\" olarak işaretlenen kısımları içerir." "message": "Bu süre, video ilerleme çubuğunun altındaki geçerli zamanın yanında parantez içinde görüntülenir. Bu, videodaki kısımların silinmiş toplam video süresini gösterir. Bu, yalnızca \"Video İlerleme Çubuğunda Göster\" olarak işaretlenen kısımları içerir."
}, },
"youHaveSkipped": {
"message": "Bunu atladınız "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Şu kadar süre kazandınız " "message": "Şu kadar süre kazandınız "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "saat" "message": "saat"
}, },
"youHaveSavedTime": {
"message": "İnsanların"
},
"youHaveSavedTimeEnd": {
"message": " kadar vaktini kurtardınız."
},
"statusReminder": { "statusReminder": {
"message": "Sunucu durumu için status.sponsor.ajay.app kontrol edin." "message": "Sunucu durumu için status.sponsor.ajay.app kontrol edin."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Сегмент закінчується тут" "message": "Сегмент закінчується тут"
}, },
"noVideoID": {
"message": "Можливо, це не вкладка YouTube, або Ви натиснули занадто рано.\n  Якщо це вкладка YouTube,\n  закрийте це спливаюче вікно і відкрийте його знову."
},
"success": { "success": {
"message": "Успіх!" "message": "Успіх!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Ви впевнені, що хочете надіслати цю інформацію?" "message": "Ви впевнені, що хочете надіслати цю інформацію?"
}, },
"whitelistChannel": {
"message": "Додати канал в білий список"
},
"removeFromWhitelist": {
"message": "Видалити канал з білого списку"
},
"voteOnTime": { "voteOnTime": {
"message": "Проголосувати за сегмент" "message": "Проголосувати за сегмент"
}, },
"soFarUHSubmited": {
"message": "На даний момент Ви надіслали"
},
"savedPeopleFrom": {
"message": "Ви допомогли людям заощадити "
},
"viewLeaderboard": {
"message": "Подивитися дошку пошани"
},
"here": { "here": {
"message": "тут" "message": "тут"
}, },
"recordTimesDescription": {
"message": "Натисніть кнопку нижче, коли сегмент починається і закінчується, щоб записати і Надіслати його в базу."
},
"popupHint": {
"message": "Підказка: натисніть на кнопку \"Ж\" під час відтворення, щоб повідомити про початок / кінці сегмента, і \"Е\", щоб надіслати його. (Це можна змінити в налаштуваннях)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Очистити час" "message": "Очистити час"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить." "message": "Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить."
}, },
"disableSkipping": {
"message": "Відключити SponsorBlock"
},
"enableSkipping": {
"message": "Увімкнути SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Ваша робота", "message": "Ваша робота",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -295,9 +265,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Ця тривалість відображається в дужках поруч з фактичної під смугою прокрутки. Показує тривалість відео без сегментів. Включає сегменти, для яких вибрано \"Відображати в смузі прокрутки\"." "message": "Ця тривалість відображається в дужках поруч з фактичної під смугою прокрутки. Показує тривалість відео без сегментів. Включає сегменти, для яких вибрано \"Відображати в смузі прокрутки\"."
}, },
"youHaveSkipped": {
"message": "Ви пропустили "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Ви заощадили " "message": "Ви заощадили "
}, },
@@ -313,12 +280,6 @@
"hoursLower": { "hoursLower": {
"message": "годин" "message": "годин"
}, },
"youHaveSavedTime": {
"message": "Ви заощадили людям"
},
"youHaveSavedTimeEnd": {
"message": " їх життя."
},
"statusReminder": { "statusReminder": {
"message": "Дивіться стан сервера на status.sponsor.ajay.app." "message": "Дивіться стан сервера на status.sponsor.ajay.app."
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Đoạn quảng cáo kết thúc vào lúc này" "message": "Đoạn quảng cáo kết thúc vào lúc này"
}, },
"noVideoID": {
"message": "Không tìm thấy video Youtube trong tab này. Nếu bạn chắc chắn đây là tab Youtube, hãy đóng bảng popup này rồi mở lại. Nếu vẫn không được, hãy thử tải lại tab."
},
"success": { "success": {
"message": "Thành công!" "message": "Thành công!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "Bạn có chắc là muốn đăng không?" "message": "Bạn có chắc là muốn đăng không?"
}, },
"whitelistChannel": {
"message": "Không chặn kênh này"
},
"removeFromWhitelist": {
"message": "Bỏ kênh này khỏi danh sách không chặn"
},
"voteOnTime": { "voteOnTime": {
"message": "Bầu chọn một đoạn quảng cáo" "message": "Bầu chọn một đoạn quảng cáo"
}, },
"soFarUHSubmited": {
"message": "Cho tới giờ, bạn đã đăng"
},
"savedPeopleFrom": {
"message": "Bạn đã giúp mọi người bỏ qua "
},
"viewLeaderboard": {
"message": "Xem bảng xếp hạng"
},
"here": { "here": {
"message": "ở đây" "message": "ở đây"
}, },
"recordTimesDescription": {
"message": "Nhấn nút phía dưới khi đoạn quảng cáo bắt đầu và kết thúc để ghi lại và đăng lên kho dữ liệu."
},
"popupHint": {
"message": "Gợi ý: Nhấn phím dấu chấm phẩy khi đang xem video để báo cáo lúc quảng cáo bắt đầu/kết thúc, và nhấn phím ngoặc kép để đăng. (Có thể thay đổi phím trong phần tùy chọn)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "Xóa thời gian" "message": "Xóa thời gian"
}, },
@@ -243,12 +219,6 @@
"0": { "0": {
"message": "Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động." "message": "Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động."
}, },
"disableSkipping": {
"message": "Tắt SponsorBlock"
},
"enableSkipping": {
"message": "Bật SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "Thành quả của bạn", "message": "Thành quả của bạn",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -286,9 +256,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "Độ dài này được hiển thị trong ngoặc đơn, bên cạnh độ dài hiện tại, phía dưới thanh tiến trình video. Con số này là độ dài video trừ đi các đoạn quảng cáo, bao gồm cả những đoạn được đánh dấu là chỉ \"Hiển thị trong thanh tiến trình video\"." "message": "Độ dài này được hiển thị trong ngoặc đơn, bên cạnh độ dài hiện tại, phía dưới thanh tiến trình video. Con số này là độ dài video trừ đi các đoạn quảng cáo, bao gồm cả những đoạn được đánh dấu là chỉ \"Hiển thị trong thanh tiến trình video\"."
}, },
"youHaveSkipped": {
"message": "Bạn đã bỏ qua "
},
"youHaveSaved": { "youHaveSaved": {
"message": "Bạn đã tiết kiệm cho mình " "message": "Bạn đã tiết kiệm cho mình "
}, },
@@ -304,12 +271,6 @@
"hoursLower": { "hoursLower": {
"message": "giờ" "message": "giờ"
}, },
"youHaveSavedTime": {
"message": "Bạn đã giúp người khác tiết kiệm"
},
"youHaveSavedTimeEnd": {
"message": " của đời họ."
},
"statusReminder": { "statusReminder": {
"message": "Truy cập trang status.sponsor.ajay.app để biết tình trạng máy chủ." "message": "Truy cập trang status.sponsor.ajay.app để biết tình trạng máy chủ."
}, },

View File

@@ -63,9 +63,6 @@
"Unknown": { "Unknown": {
"message": "提交您的赞助商广告时间时出错。请稍后再试。" "message": "提交您的赞助商广告时间时出错。请稍后再试。"
}, },
"noVideoID": {
"message": "在此标签页未找到 Youtube 视频。如果您确定这是一个 Youtube 页面,请关闭此弹窗并重新打开。如果那没用,请尝试重新加载页面。"
},
"success": { "success": {
"message": "成功 " "message": "成功 "
}, },
@@ -84,21 +81,6 @@
"submitCheck": { "submitCheck": {
"message": "您确定要提交它吗?" "message": "您确定要提交它吗?"
}, },
"whitelistChannel": {
"message": "白名单频道"
},
"removeFromWhitelist": {
"message": "将频道移出白名单"
},
"soFarUHSubmited": {
"message": "您目前已提交"
},
"savedPeopleFrom": {
"message": "您已为人们节省了 "
},
"viewLeaderboard": {
"message": "查看排行榜"
},
"here": { "here": {
"message": "这里" "message": "这里"
}, },
@@ -181,12 +163,6 @@
"0": { "0": {
"message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。" "message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。"
}, },
"disableSkipping": {
"message": "禁用 SponsorBlock"
},
"enableSkipping": {
"message": "启用 SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "您的成果", "message": "您的成果",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -200,9 +176,6 @@
"skip": { "skip": {
"message": "跳过" "message": "跳过"
}, },
"skip_category": {
"message": "跳过 {0}?"
},
"skipped": { "skipped": {
"message": "跳过" "message": "跳过"
}, },
@@ -215,9 +188,6 @@
"audioNotification": { "audioNotification": {
"message": "跳过时音频通知" "message": "跳过时音频通知"
}, },
"youHaveSkipped": {
"message": "您已跳过 "
},
"youHaveSaved": { "youHaveSaved": {
"message": "您为自己节省了 " "message": "您为自己节省了 "
}, },
@@ -233,12 +203,6 @@
"hoursLower": { "hoursLower": {
"message": "小时" "message": "小时"
}, },
"youHaveSavedTime": {
"message": "您为人们节省了"
},
"youHaveSavedTimeEnd": {
"message": " 的生命。"
},
"statusReminder": { "statusReminder": {
"message": "在 status.sponsor.ajay.app 检查服务器状态。" "message": "在 status.sponsor.ajay.app 检查服务器状态。"
}, },

View File

@@ -85,9 +85,6 @@
"sponsorEnd": { "sponsorEnd": {
"message": "片段現在結束" "message": "片段現在結束"
}, },
"noVideoID": {
"message": "未在這個分頁找到任何YouTube影片。 如果您知道這是個YouTube分頁的話關閉這個彈出視窗並重新開啟它。如果還是不管用嘗試重新載入分頁"
},
"success": { "success": {
"message": "成功!" "message": "成功!"
}, },
@@ -121,33 +118,12 @@
"submitCheck": { "submitCheck": {
"message": "您確定要提交這個嗎?" "message": "您確定要提交這個嗎?"
}, },
"whitelistChannel": {
"message": "將頻道列入白名單"
},
"removeFromWhitelist": {
"message": "將頻道從白名單移除"
},
"voteOnTime": { "voteOnTime": {
"message": "為分段投票" "message": "為分段投票"
}, },
"soFarUHSubmited": {
"message": "您目前已提交"
},
"savedPeopleFrom": {
"message": "您已為大家節省 "
},
"viewLeaderboard": {
"message": "查看排行榜"
},
"here": { "here": {
"message": "這裡" "message": "這裡"
}, },
"recordTimesDescription": {
"message": "點擊下方的按鈕來錄製分段的始與末"
},
"popupHint": {
"message": "小提醒:在聚焦於影片時按下分號鍵來記錄分段的始與末然後按下冒號鍵來提交(您可以透過選項來更改這項設定)"
},
"clearTimesButton": { "clearTimesButton": {
"message": "清除時間" "message": "清除時間"
}, },
@@ -252,12 +228,6 @@
"0": { "0": {
"message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線" "message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線"
}, },
"disableSkipping": {
"message": "停用 SponsorBlock"
},
"enableSkipping": {
"message": "啟用 SponsorBlock"
},
"yourWork": { "yourWork": {
"message": "您的成果", "message": "您的成果",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
@@ -271,9 +241,6 @@
"skip": { "skip": {
"message": "略過" "message": "略過"
}, },
"skip_category": {
"message": "略過 {0}?"
},
"skipped": { "skipped": {
"message": "已跳過" "message": "已跳過"
}, },
@@ -295,9 +262,6 @@
"showTimeWithSkipsDescription": { "showTimeWithSkipsDescription": {
"message": "這個時間會出現在現在時間旁邊的括號內。這會顯示總影片長度減掉任何片段後的結果。這只會包含標為\"在時間條中顯示\"的片段" "message": "這個時間會出現在現在時間旁邊的括號內。這會顯示總影片長度減掉任何片段後的結果。這只會包含標為\"在時間條中顯示\"的片段"
}, },
"youHaveSkipped": {
"message": "您已跳過 "
},
"youHaveSaved": { "youHaveSaved": {
"message": "您為自己節省了 " "message": "您為自己節省了 "
}, },
@@ -313,12 +277,6 @@
"hoursLower": { "hoursLower": {
"message": "小時" "message": "小時"
}, },
"youHaveSavedTime": {
"message": "您已為大家節省"
},
"youHaveSavedTimeEnd": {
"message": " 的生命。"
},
"statusReminder": { "statusReminder": {
"message": "在 status.sponsor.ajay.app 檢查伺服器狀態" "message": "在 status.sponsor.ajay.app 檢查伺服器狀態"
}, },

View File

@@ -10,6 +10,18 @@
display: none !important; display: none !important;
} }
@media only screen and (max-width: 600px) {
#sponsorBlockPopupBody {
width: 100%;
}
}
#sponsorBlockPopupBody {
margin: auto;
width: 374px;
background: var(--sb-main-bg-color);
}
#sponsorblockPopup { #sponsorblockPopup {
color: var(--sb-main-fg-color); color: var(--sb-main-fg-color);
font-family: 'Source Sans Pro', sans-serif; font-family: 'Source Sans Pro', sans-serif;
@@ -18,7 +30,7 @@
flex-flow: column nowrap; flex-flow: column nowrap;
align-items: center; align-items: center;
width: 330px; width: 330px;
margin: 22px; padding: 22px;
text-align: center; text-align: center;
} }
@@ -27,7 +39,7 @@
color: var(--sb-main-fg-color); color: var(--sb-main-fg-color);
background: none; background: none;
border: none; border: none;
padding: 10px 8px; padding: 7px;
outline: none; outline: none;
cursor: pointer; cursor: pointer;

View File

@@ -2,9 +2,11 @@
<title>__MSG_openPopup__</title> <title>__MSG_openPopup__</title>
<link id="sponsorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css"> <link id="sponsorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css">
<link id="sponsorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css"> <link id="sponsorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head> </head>
<body style="margin: 0; min-width: 320px; background: var(--sb-main-bg-color);"> <body id="sponsorBlockPopupBody">
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload"> <div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
<div class="logoText bottomSpace"> <div class="logoText bottomSpace">
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo"> <img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
@@ -129,13 +131,13 @@
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>). <span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
</div> </div>
<footer id="sbFooter"> <footer id="sbFooter">
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">Website</a> | <a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a> |
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> | <a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a> <a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<br/> <br/>
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> | <a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
<a href="https://matrix.to/#/+sponsorblock:ajay.app" target="_blank" rel="noopener">Matrix</a> | <a href="https://matrix.to/#/+sponsorblock:ajay.app" target="_blank" rel="noopener">Matrix</a> |
<a id="helpButton" href="#">__MSG_help__</a> <a id="helpButton" style="cursor: pointer;">__MSG_help__</a>
</footer> </footer>
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button> <button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>

View File

@@ -2,8 +2,10 @@ import * as CompileConfig from "../config.json";
import Config from "./config"; import Config from "./config";
import { Registration } from "./types"; import { Registration } from "./types";
// Make the config public for debugging purposes // Make the config public for debugging purposes
(<any> window).SB = Config;
window.SB = Config;
import Utils from "./utils"; import Utils from "./utils";
const utils = new Utils({ const utils = new Utils({
@@ -33,7 +35,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
chrome.runtime.openOptionsPage(); chrome.runtime.openOptionsPage();
return; return;
case "openHelp": case "openHelp":
window.open(chrome.runtime.getURL('help/index_en.html')); chrome.tabs.create({url: chrome.runtime.getURL('help/index_en.html')});
return; return;
case "sendRequest": case "sendRequest":
sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => { sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => {
@@ -70,7 +72,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
}); });
//add help page on install //add help page on install
chrome.runtime.onInstalled.addListener(function (object) { chrome.runtime.onInstalled.addListener(function () {
// This let's the config sync to run fully before checking. // This let's the config sync to run fully before checking.
// This is required on Firefox // This is required on Firefox
setTimeout(function() { setTimeout(function() {

View File

@@ -1,6 +1,5 @@
import * as React from "react"; import * as React from "react";
import Config from "../config"
import * as CompileConfig from "../../config.json"; import * as CompileConfig from "../../config.json";
import CategorySkipOptionsComponent from "./CategorySkipOptionsComponent"; import CategorySkipOptionsComponent from "./CategorySkipOptionsComponent";

View File

@@ -2,9 +2,6 @@ import * as React from "react";
import Config from "../config" import Config from "../config"
import { CategorySkipOption } from "../types"; import { CategorySkipOption } from "../types";
import Utils from "../utils";
const utils = new Utils();
export interface CategorySkipOptionsProps { export interface CategorySkipOptionsProps {
category: string; category: string;

View File

@@ -28,7 +28,7 @@ export interface NoticeState {
class NoticeComponent extends React.Component<NoticeProps, NoticeState> { class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
countdownInterval: NodeJS.Timeout; countdownInterval: NodeJS.Timeout;
idSuffix: any; idSuffix: string;
amountOfPreviousNotices: number; amountOfPreviousNotices: number;

View File

@@ -3,7 +3,7 @@ import * as React from "react";
export interface NoticeTextSelectionProps { export interface NoticeTextSelectionProps {
text: string, text: string,
idSuffix: string, idSuffix: string,
onClick?: (event: React.MouseEvent) => any onClick?: (event: React.MouseEvent) => unknown
} }
export interface NoticeTextSelectionState { export interface NoticeTextSelectionState {

View File

@@ -2,10 +2,6 @@ import * as React from "react";
import * as CompileConfig from "../../config.json"; import * as CompileConfig from "../../config.json";
import Config from "../config" import Config from "../config"
import { ContentContainer, SponsorHideType, SponsorTime } from "../types"; import { ContentContainer, SponsorHideType, SponsorTime } from "../types";
import Utils from "../utils";
const utils = new Utils();
import NoticeComponent from "./NoticeComponent"; import NoticeComponent from "./NoticeComponent";
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent"; import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
@@ -42,7 +38,7 @@ export interface SkipNoticeState {
downvoting: boolean; downvoting: boolean;
choosingCategory: boolean; choosingCategory: boolean;
thanksForVotingText: boolean; //null until the voting buttons should be hidden thanksForVotingText: string; //null until the voting buttons should be hidden
actionState: SkipNoticeAction; actionState: SkipNoticeAction;
} }
@@ -447,25 +443,21 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}); });
} }
getUnskippedModeInfo(index: number, buttonText: string) { getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
const self = this; const maxCountdownTime = () => {
const maxCountdownTime = function() { const sponsorTime = this.segments[index];
const sponsorTime = self.segments[index]; const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
const duration = Math.round((sponsorTime.segment[1] - self.contentContainer().v.currentTime) * (1 / self.contentContainer().v.playbackRate));
return Math.max(duration, 4); return Math.max(duration, 4);
}; };
return { return {
unskipText: buttonText, unskipText: buttonText,
unskipCallback: (index) => this.reskip(index), unskipCallback: (index) => this.reskip(index),
// change max duration to however much of the sponsor is left
//change max duration to however much of the sponsor is left
maxCountdownTime: maxCountdownTime, maxCountdownTime: maxCountdownTime,
countdownTime: maxCountdownTime() countdownTime: maxCountdownTime()
} } as SkipNoticeState;
} }
reskip(index: number): void { reskip(index: number): void {
@@ -508,7 +500,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
} }
} }
setNoticeInfoMessageWithOnClick(onClick: (event: React.MouseEvent) => any, ...messages: string[]): void { setNoticeInfoMessageWithOnClick(onClick: (event: React.MouseEvent) => unknown, ...messages: string[]): void {
this.setState({ this.setState({
messages, messages,
messageOnClick: (event) => onClick(event) messageOnClick: (event) => onClick(event)
@@ -521,7 +513,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}); });
} }
addVoteButtonInfo(message): void { addVoteButtonInfo(message: string): void {
this.setState({ this.setState({
thanksForVotingText: message thanksForVotingText: message
}); });

View File

@@ -23,6 +23,8 @@ export interface SponsorTimeEditState {
sponsorTimeEdits: [string, string]; sponsorTimeEdits: [string, string];
} }
const DEFAULT_CATEGORY = "chooseACategory";
class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, SponsorTimeEditState> { class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, SponsorTimeEditState> {
idSuffix: string; idSuffix: string;
@@ -217,27 +219,17 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
getCategoryOptions(): React.ReactElement[] { getCategoryOptions(): React.ReactElement[] {
const elements = [( const elements = [(
<option value={"chooseACategory"} <option value={DEFAULT_CATEGORY}
key={"chooseACategory"}> key={DEFAULT_CATEGORY}>
{chrome.i18n.getMessage("chooseACategory")} {chrome.i18n.getMessage(DEFAULT_CATEGORY)}
</option> </option>
)]; )];
for (const category of Config.config.categorySelections) { for (const category of CompileConfig.categoryList) {
elements.push( elements.push(
<option value={category.name} <option value={category}
key={category.name}> key={category}>
{chrome.i18n.getMessage("category_" + category.name)} {chrome.i18n.getMessage("category_" + category)}
</option>
);
}
if (elements.length < CompileConfig.categoryList.length) {
// Add show more button
elements.push(
<option value={"moreCategories"}
key={"moreCategories"}>
{chrome.i18n.getMessage("moreCategories")}
</option> </option>
); );
} }
@@ -247,12 +239,17 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void { categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
// See if show more categories was pressed // See if show more categories was pressed
if (event.target.value === "moreCategories") { if (!Config.config.categorySelections.some((category) => category.name === event.target.value)) {
const chosenCategory = event.target.value;
event.target.value = DEFAULT_CATEGORY;
// Alert that they have to enable this category first
if (confirm(chrome.i18n.getMessage("enableThisCategoryFirst")
.replace("{0}", chrome.i18n.getMessage("category_" + chosenCategory)))) {
// Open options page // Open options page
chrome.runtime.sendMessage({"message": "openConfig"}); chrome.runtime.sendMessage({"message": "openConfig"});
}
// Reset option to previous
event.target.value = this.props.contentContainer().sponsorTimesSubmitting[this.props.index].category;
return; return;
} }

View File

@@ -1,5 +1,5 @@
import * as CompileConfig from "../config.json"; import * as CompileConfig from "../config.json";
import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime } from "./types"; import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime, StorageChangesObject } from "./types";
import Utils from "./utils"; import Utils from "./utils";
const utils = new Utils(); const utils = new Utils();
@@ -58,8 +58,8 @@ interface SBConfig {
} }
} }
interface SBObject { export interface SBObject {
configListeners: Array<Function>; configListeners: Array<(changes: StorageChangesObject) => unknown>;
defaults: SBConfig; defaults: SBConfig;
localConfig: SBConfig; localConfig: SBConfig;
config: SBConfig; config: SBConfig;
@@ -275,8 +275,8 @@ function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, SponsorTime
return data; return data;
} }
function configProxy(): any { function configProxy(): SBConfig {
chrome.storage.onChanged.addListener((changes, namespace) => { chrome.storage.onChanged.addListener((changes: {[key: string]: chrome.storage.StorageChange}) => {
for (const key in changes) { for (const key in changes) {
Config.localConfig[key] = decodeStoredItem(key, changes[key].newValue); Config.localConfig[key] = decodeStoredItem(key, changes[key].newValue);
} }
@@ -286,8 +286,8 @@ function configProxy(): any {
} }
}); });
const handler: ProxyHandler<any> = { const handler: ProxyHandler<SBConfig> = {
set(obj, prop, value) { set<K extends keyof SBConfig>(obj: SBConfig, prop: K, value: SBConfig[K]) {
Config.localConfig[prop] = value; Config.localConfig[prop] = value;
chrome.storage.sync.set({ chrome.storage.sync.set({
@@ -297,13 +297,13 @@ function configProxy(): any {
return true; return true;
}, },
get(obj, prop): any { get<K extends keyof SBConfig>(obj: SBConfig, prop: K): SBConfig[K] {
const data = Config.localConfig[prop]; const data = Config.localConfig[prop];
return obj[prop] || data; return obj[prop] || data;
}, },
deleteProperty(obj, prop) { deleteProperty(obj: SBConfig, prop: keyof SBConfig) {
chrome.storage.sync.remove(<string> prop); chrome.storage.sync.remove(<string> prop);
return true; return true;
@@ -311,11 +311,11 @@ function configProxy(): any {
}; };
return new Proxy({handler}, handler); return new Proxy<SBConfig>({handler} as unknown as SBConfig, handler);
} }
function fetchConfig(): Promise<void> { function fetchConfig(): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve) => {
chrome.storage.sync.get(null, function(items) { chrome.storage.sync.get(null, function(items) {
Config.localConfig = <SBConfig> <unknown> items; // Data is ready Config.localConfig = <SBConfig> <unknown> items; // Data is ready
resolve(); resolve();
@@ -439,11 +439,6 @@ async function setupConfig() {
Config.config = config; Config.config = config;
} }
// Reset config
function resetConfig() {
Config.config = Config.defaults;
}
function convertJSON(): void { function convertJSON(): void {
Object.keys(Config.localConfig).forEach(key => { Object.keys(Config.localConfig).forEach(key => {
Config.localConfig[key] = decodeStoredItem(key, Config.localConfig[key]); Config.localConfig[key] = decodeStoredItem(key, Config.localConfig[key]);

View File

@@ -1,6 +1,6 @@
import Config from "./config"; import Config from "./config";
import { SponsorTime, CategorySkipOption, CategorySelection, VideoID, SponsorHideType, FetchResponse } from "./types"; import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, FetchResponse, VideoInfo, StorageChangesObject } from "./types";
import { ContentContainer } from "./types"; import { ContentContainer } from "./types";
import Utils from "./utils"; import Utils from "./utils";
@@ -12,6 +12,7 @@ import PreviewBar, {PreviewBarSegment} from "./js-components/previewBar";
import SkipNotice from "./render/SkipNotice"; import SkipNotice from "./render/SkipNotice";
import SkipNoticeComponent from "./components/SkipNoticeComponent"; import SkipNoticeComponent from "./components/SkipNoticeComponent";
import SubmissionNotice from "./render/SubmissionNotice"; import SubmissionNotice from "./render/SubmissionNotice";
import { Message, MessageResponse } from "./messageTypes";
// Hack to get the CSS loaded on permission-based sites (Invidious) // Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS); utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
@@ -25,9 +26,9 @@ let sponsorTimes: SponsorTime[] = null;
let sponsorVideoID: VideoID = null; let sponsorVideoID: VideoID = null;
// JSON video info // JSON video info
let videoInfo: any = null; let videoInfo: VideoInfo = null;
//the channel this video is about //the channel this video is about
let channelID; let channelID: string;
// Skips are scheduled to ensure precision. // Skips are scheduled to ensure precision.
// Skips are rescheduled every seeking event. // Skips are rescheduled every seeking event.
@@ -53,6 +54,9 @@ let durationListenerSetUp = false;
// Is the video currently being switched // Is the video currently being switched
let switchingVideos = null; let switchingVideos = null;
// Made true every videoID change
let firstEvent = false;
// Used by the play and playing listeners to make sure two aren't // Used by the play and playing listeners to make sure two aren't
// called at the same time // called at the same time
let lastCheckTime = 0; let lastCheckTime = 0;
@@ -112,7 +116,7 @@ const skipNoticeContentContainer: ContentContainer = () => ({
//get messages from the background script and the popup //get messages from the background script and the popup
chrome.runtime.onMessage.addListener(messageListener); chrome.runtime.onMessage.addListener(messageListener);
function messageListener(request: any, sender: any, sendResponse: (response: any) => void): void { function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void {
//messages from popup script //messages from popup script
switch(request.message){ switch(request.message){
case "update": case "update":
@@ -145,27 +149,6 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
videoID: sponsorVideoID videoID: sponsorVideoID
}); });
break;
case "getVideoDuration":
sendResponse({
duration: video.duration
});
break;
case "skipToTime":
video.currentTime = request.time;
// Unpause the video if needed
if (video.paused){
video.play();
}
return;
case "getCurrentTime":
sendResponse({
currentTime: getRealCurrentTime()
});
break; break;
case "getChannelID": case "getChannelID":
sendResponse({ sendResponse({
@@ -190,7 +173,6 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
break; break;
case "submitTimes": case "submitTimes":
submitSponsorTimes(); submitSponsorTimes();
break; break;
} }
} }
@@ -200,7 +182,7 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
* *
* @param {String} changes * @param {String} changes
*/ */
function contentConfigUpdateListener(changes) { function contentConfigUpdateListener(changes: StorageChangesObject) {
for (const key in changes) { for (const key in changes) {
switch(key) { switch(key) {
case "hideVideoPlayerControls": case "hideVideoPlayerControls":
@@ -265,6 +247,8 @@ function resetValues() {
switchingVideos = true; switchingVideos = true;
} }
firstEvent = true;
// Reset advert playing flag // Reset advert playing flag
isAdPlaying = false; isAdPlaying = false;
} }
@@ -309,12 +293,18 @@ async function videoIDChange(id) {
if (onMobileYouTube) { if (onMobileYouTube) {
// Mobile YouTube workaround // Mobile YouTube workaround
const observer = new MutationObserver(handleMobileControlsMutations); const observer = new MutationObserver(handleMobileControlsMutations);
let controlsContainer = null;
utils.wait(() => {
controlsContainer = document.getElementById("player-control-container")
return controlsContainer !== null
}).then(() => {
observer.observe(document.getElementById("player-control-container"), { observer.observe(document.getElementById("player-control-container"), {
attributes: true, attributes: true,
childList: true, childList: true,
subtree: true subtree: true
}); });
}).catch();
} else { } else {
utils.wait(getControls).then(createPreviewBar); utils.wait(getControls).then(createPreviewBar);
} }
@@ -368,18 +358,6 @@ async function videoIDChange(id) {
} }
function handleMobileControlsMutations(): void { function handleMobileControlsMutations(): void {
updateVisibilityOfPlayerControlsButton().then((createdButtons) => {
if (createdButtons) {
if (sponsorTimesSubmitting != null && sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length >= 2) {
changeStartSponsorButton(true, true);
} else if (sponsorTimesSubmitting != null && sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length < 2) {
changeStartSponsorButton(false, true);
} else {
changeStartSponsorButton(true, false);
}
}
});
if (previewBar !== null) { if (previewBar !== null) {
if (document.body.contains(previewBar.container)) { if (document.body.contains(previewBar.container)) {
const progressBarBackground = document.querySelector<HTMLElement>(".progress-bar-background"); const progressBarBackground = document.querySelector<HTMLElement>(".progress-bar-background");
@@ -433,7 +411,7 @@ function createPreviewBar(): void {
* Triggered every time the video duration changes. * Triggered every time the video duration changes.
* This happens when the resolution changes or at random time to clear memory. * This happens when the resolution changes or at random time to clear memory.
*/ */
function durationChangeListener() { function durationChangeListener(): void {
updateAdFlag(); updateAdFlag();
updatePreviewBar(); updatePreviewBar();
} }
@@ -568,6 +546,12 @@ async function sponsorsLookup(id: string) {
video.addEventListener('play', () => { video.addEventListener('play', () => {
switchingVideos = false; switchingVideos = false;
// If it is not the first event, then the only way to get to 0 is if there is a seek event
// This check makes sure that changing the video resolution doesn't cause the extension to think it
// gone back to the begining
if (!firstEvent && video.currentTime === 0) return;
firstEvent = false;
// Check if an ad is playing // Check if an ad is playing
updateAdFlag(); updateAdFlag();
@@ -601,6 +585,8 @@ async function sponsorsLookup(id: string) {
} }
}); });
video.addEventListener('ratechange', () => startSponsorSchedule()); video.addEventListener('ratechange', () => startSponsorSchedule());
// Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740)
video.addEventListener('videoSpeed_ratechange', () => startSponsorSchedule());
video.addEventListener('pause', () => { video.addEventListener('pause', () => {
// Reset lastCheckVideoTime // Reset lastCheckVideoTime
lastCheckVideoTime = -1; lastCheckVideoTime = -1;
@@ -762,10 +748,11 @@ function startSkipScheduleCheckingForStartSponsors() {
/** /**
* Get the video info for the current tab from YouTube * Get the video info for the current tab from YouTube
*/ */
function getVideoInfo() { async function getVideoInfo(): Promise<void> {
sendRequestToCustomServer('GET', "https://www.youtube.com/get_video_info?video_id=" + sponsorVideoID, function(xmlhttp, error) { const result = await utils.asyncRequestToCustomServer("GET", "https://www.youtube.com/get_video_info?video_id=" + sponsorVideoID);
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
const decodedData = decodeURIComponent(xmlhttp.responseText).match(/player_response=([^&]*)/)[1]; if (result.ok) {
const decodedData = decodeURIComponent(result.responseText).match(/player_response=([^&]*)/)[1];
if (!decodedData) { if (!decodedData) {
console.error("[SB] Failed at getting video info from YouTube."); console.error("[SB] Failed at getting video info from YouTube.");
return; return;
@@ -773,7 +760,6 @@ function getVideoInfo() {
videoInfo = JSON.parse(decodedData); videoInfo = JSON.parse(decodedData);
} }
});
} }
function getYouTubeVideoID(url: string) { function getYouTubeVideoID(url: string) {
@@ -827,7 +813,7 @@ function updatePreviewBarPositionMobile(parent: HTMLElement) {
} }
} }
function updatePreviewBar() { function updatePreviewBar(): void {
if (previewBar === null) return; if (previewBar === null) return;
if (isAdPlaying) { if (isAdPlaying) {
@@ -1074,6 +1060,8 @@ function unskipSponsorTime(segment: SponsorTime) {
function reskipSponsorTime(segment: SponsorTime) { function reskipSponsorTime(segment: SponsorTime) {
video.currentTime = segment.segment[1]; video.currentTime = segment.segment[1];
startSponsorSchedule(true, segment.segment[1], false);
} }
function createButton(baseID, title, callback, imageName, isDraggable=false): boolean { function createButton(baseID, title, callback, imageName, isDraggable=false): boolean {
@@ -1086,7 +1074,7 @@ function createButton(baseID, title, callback, imageName, isDraggable=false): bo
newButton.classList.add("playerButton"); newButton.classList.add("playerButton");
newButton.classList.add("ytp-button"); newButton.classList.add("ytp-button");
newButton.setAttribute("title", chrome.i18n.getMessage(title)); newButton.setAttribute("title", chrome.i18n.getMessage(title));
newButton.addEventListener("click", (event: Event) => { newButton.addEventListener("click", () => {
callback(); callback();
}); });
@@ -1153,6 +1141,7 @@ async function updateVisibilityOfPlayerControlsButton(): Promise<boolean> {
if (!sponsorVideoID) return false; if (!sponsorVideoID) return false;
const createdButtons = await createButtons(); const createdButtons = await createButtons();
if (!createdButtons) return;
if (Config.config.hideVideoPlayerControls || onInvidious) { if (Config.config.hideVideoPlayerControls || onInvidious) {
document.getElementById("startSponsorButton").style.display = "none"; document.getElementById("startSponsorButton").style.display = "none";
@@ -1203,6 +1192,7 @@ function startSponsorClicked() {
if (sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length < 2) { if (sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length < 2) {
//it is an end time //it is an end time
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRealCurrentTime(); sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRealCurrentTime();
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));
} else { } else {
//it is a start time //it is a start time
sponsorTimesSubmitting.push({ sponsorTimesSubmitting.push({
@@ -1244,8 +1234,8 @@ function updateSponsorTimesSubmitting(getFromConfig = true) {
} }
} }
async function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) { async function changeStartSponsorButton(showStartSponsor: boolean, uploadButtonVisible: boolean): Promise<boolean> {
if(!sponsorVideoID) return false; if(!sponsorVideoID || onMobileYouTube) return false;
//if it isn't visible, there is no data //if it isn't visible, there is no data
const shouldHide = (uploadButtonVisible && !(Config.config.hideDeleteButtonPlayerControls || onInvidious)) ? "unset" : "none" const shouldHide = (uploadButtonVisible && !(Config.config.hideDeleteButtonPlayerControls || onInvidious)) ? "unset" : "none"
@@ -1445,7 +1435,7 @@ function dontShowNoticeAgain() {
closeAllSkipNotices(); closeAllSkipNotices();
} }
function sponsorMessageStarted(callback) { function sponsorMessageStarted(callback: (response: MessageResponse) => void) {
video = document.querySelector('video'); video = document.querySelector('video');
//send back current time //send back current time
@@ -1470,8 +1460,6 @@ function submitSponsorTimes() {
//it can't update to this info yet //it can't update to this info yet
closeInfoMenu(); closeInfoMenu();
const currentVideoID = sponsorVideoID;
if (sponsorTimesSubmitting !== undefined && sponsorTimesSubmitting.length > 0) { if (sponsorTimesSubmitting !== undefined && sponsorTimesSubmitting.length > 0) {
submissionNotice = new SubmissionNotice(skipNoticeContentContainer, sendSubmitMessage); submissionNotice = new SubmissionNotice(skipNoticeContentContainer, sendSubmitMessage);
} }
@@ -1618,7 +1606,7 @@ function sendRequestToCustomServer(type, fullAddress, callback) {
callback(xmlhttp, false); callback(xmlhttp, false);
}; };
xmlhttp.onerror = function(ev) { xmlhttp.onerror = function() {
callback(xmlhttp, true); callback(xmlhttp, true);
}; };
} }
@@ -1630,7 +1618,7 @@ function sendRequestToCustomServer(type, fullAddress, callback) {
/** /**
* Update the isAdPlaying flag and hide preview bar/controls if ad is playing * Update the isAdPlaying flag and hide preview bar/controls if ad is playing
*/ */
function updateAdFlag() { function updateAdFlag(): void {
const wasAdPlaying = isAdPlaying; const wasAdPlaying = isAdPlaying;
isAdPlaying = document.getElementsByClassName('ad-showing').length > 0; isAdPlaying = document.getElementsByClassName('ad-showing').length > 0;

19
src/globals.d.ts vendored Normal file
View File

@@ -0,0 +1,19 @@
import { SBObject } from "./config";
declare global {
interface Window { SB: SBObject; }
// Remove this once the API becomes stable and types are shipped in @types/chrome
namespace chrome {
namespace declarativeContent {
export interface RequestContentScriptOptions {
allFrames?: boolean;
css?: string[];
instanceType?: "declarativeContent.RequestContentScript";
js?: string[];
matchAboutBlanck?: boolean;
}
export class RequestContentScript {
constructor(options: RequestContentScriptOptions);
}
}
}
}

63
src/messageTypes.ts Normal file
View File

@@ -0,0 +1,63 @@
//
// Message and Response Types
//
import { SponsorTime } from "./types";
interface BaseMessage {
from?: string;
}
interface DefaultMessage {
message:
"update"
| "sponsorStart"
| "sponsorDataChanged"
| "isInfoFound"
| "getVideoID"
| "getChannelID"
| "isChannelWhitelisted"
| "submitTimes";
}
interface BoolValueMessage {
message: "whitelistChange";
value: boolean;
}
interface ChangeStartSponsorButtonMessage {
message: "changeStartSponsorButton";
showStartSponsor: boolean;
uploadButtonVisible: boolean;
}
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | ChangeStartSponsorButtonMessage);
interface IsInfoFoundMessageResponse {
found: boolean;
sponsorTimes: SponsorTime[];
}
interface GetVideoIdResponse {
videoID: string;
}
interface GetChannelIDResponse {
channelID: string;
}
interface SponsorStartResponse {
time: number;
}
interface IsChannelWhitelistedResponse {
value: boolean;
}
export type MessageResponse =
IsInfoFoundMessageResponse
| GetVideoIdResponse
| GetChannelIDResponse
| SponsorStartResponse
| IsChannelWhitelistedResponse;

View File

@@ -2,7 +2,7 @@ import Config from "./config";
import * as CompileConfig from "../config.json"; import * as CompileConfig from "../config.json";
// Make the config public for debugging purposes // Make the config public for debugging purposes
(<any> window).SB = Config; window.SB = Config;
import Utils from "./utils"; import Utils from "./utils";
import CategoryChooser from "./render/CategoryChooser"; import CategoryChooser from "./render/CategoryChooser";
@@ -107,7 +107,7 @@ async function init() {
// Permission needed on Firefox // Permission needed on Firefox
if (utils.isFirefox()) { if (utils.isFirefox()) {
const permissionSuccess = await new Promise((resolve, reject) => { const permissionSuccess = await new Promise((resolve) => {
chrome.permissions.request({ chrome.permissions.request({
origins: [textChangeInput.value + "/"], origins: [textChangeInput.value + "/"],
permissions: [] permissions: []
@@ -202,7 +202,7 @@ async function init() {
* *
* @param {String} element * @param {String} element
*/ */
function optionsConfigUpdateListener(changes) { function optionsConfigUpdateListener() {
const optionsContainer = document.getElementById("options"); const optionsContainer = document.getElementById("options");
const optionsElements = optionsContainer.querySelectorAll("*"); const optionsElements = optionsContainer.querySelectorAll("*");
@@ -243,7 +243,7 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
const button = element.querySelector(".trigger-button"); const button = element.querySelector(".trigger-button");
const setButton = element.querySelector(".text-change-set"); const setButton = element.querySelector(".text-change-set");
setButton.addEventListener("click", async function(e) { setButton.addEventListener("click", async function() {
if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http")) { if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http")) {
alert(chrome.i18n.getMessage("addInvidiousInstanceError")); alert(chrome.i18n.getMessage("addInvidiousInstanceError"));
} else { } else {
@@ -269,7 +269,7 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
}); });
const resetButton = element.querySelector(".invidious-instance-reset"); const resetButton = element.querySelector(".invidious-instance-reset");
resetButton.addEventListener("click", function(e) { resetButton.addEventListener("click", function() {
if (confirm(chrome.i18n.getMessage("resetInvidiousInstanceAlert"))) { if (confirm(chrome.i18n.getMessage("resetInvidiousInstanceAlert"))) {
// Set to a clone of the default // Set to a clone of the default
Config.config[option] = Config.defaults[option].slice(0); Config.config[option] = Config.defaults[option].slice(0);
@@ -536,7 +536,7 @@ function copyDebugOutputToClipboard() {
.then(() => { .then(() => {
alert(chrome.i18n.getMessage("copyDebugInformationComplete")); alert(chrome.i18n.getMessage("copyDebugInformationComplete"));
}) })
.catch((err) => { .catch(() => {
alert(chrome.i18n.getMessage("copyDebugInformationFailed")); alert(chrome.i18n.getMessage("copyDebugInformationFailed"));
}); });
} }

View File

@@ -2,10 +2,11 @@ import Config from "./config";
import Utils from "./utils"; import Utils from "./utils";
import { SponsorTime, SponsorHideType } from "./types"; import { SponsorTime, SponsorHideType } from "./types";
import { Message, MessageResponse } from "./messageTypes";
const utils = new Utils(); const utils = new Utils();
interface MessageListener { interface MessageListener {
(request: any, sender: any, callback: (response: any) => void): void; (request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void;
} }
class MessageHandler { class MessageHandler {
@@ -15,7 +16,7 @@ class MessageHandler {
this.messageListener = messageListener; this.messageListener = messageListener;
} }
sendMessage(id: number, request, callback?) { sendMessage(id: number, request: Message, callback?) {
if (this.messageListener) { if (this.messageListener) {
this.messageListener(request, null, callback); this.messageListener(request, null, callback);
} else { } else {
@@ -37,6 +38,8 @@ class MessageHandler {
} }
} }
//make this a function to allow this to run on the content page //make this a function to allow this to run on the content page
async function runThePopup(messageListener?: MessageListener): Promise<void> { async function runThePopup(messageListener?: MessageListener): Promise<void> {
const messageHandler = new MessageHandler(messageListener); const messageHandler = new MessageHandler(messageListener);
@@ -45,7 +48,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
await utils.wait(() => Config.config !== null); await utils.wait(() => Config.config !== null);
const PageElements: any = {}; type InputPageElements = {
whitelistToggle?: HTMLInputElement,
toggleSwitch?: HTMLInputElement,
usernameInput?: HTMLInputElement,
};
type PageElements = { [key: string]: HTMLElement } & InputPageElements
const PageElements: PageElements = {};
[ [
"sponsorblockPopup", "sponsorblockPopup",
@@ -375,7 +385,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const sponsorTimeButton = document.createElement("button"); const sponsorTimeButton = document.createElement("button");
sponsorTimeButton.className = "segmentTimeButton popupElement"; sponsorTimeButton.className = "segmentTimeButton popupElement";
const prefix = chrome.i18n.getMessage("category_" + segmentTimes[i].category) + ": "; const prefix = utils.shortCategoryName(segmentTimes[i].category) + ": ";
let extraInfo = ""; let extraInfo = "";
if (segmentTimes[i].hidden === SponsorHideType.Downvoted) { if (segmentTimes[i].hidden === SponsorHideType.Downvoted) {
@@ -715,25 +725,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
hiddenButton.style.display = "none"; hiddenButton.style.display = "none";
} }
//converts time in seconds to minutes
function getTimeInMinutes(seconds) {
const minutes = Math.floor(seconds / 60);
return minutes;
}
//converts time in seconds to seconds past the last minute
function getTimeInFormattedSeconds(seconds) {
const minutes = seconds % 60;
let secondsFormatted = minutes.toFixed(3);
if (minutes < 10) {
secondsFormatted = "0" + secondsFormatted;
}
return secondsFormatted;
}
/** /**
* Converts time in hours to 5h 25.1 * Converts time in hours to 5h 25.1
* If less than 1 hour, just returns minutes * If less than 1 hour, just returns minutes

View File

@@ -3,7 +3,7 @@ import SkipNoticeComponent from "./components/SkipNoticeComponent";
interface ContentContainer { interface ContentContainer {
(): { (): {
vote: (type: any, UUID: any, category?: string, skipNotice?: SkipNoticeComponent) => void, vote: (type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) => void,
dontShowNoticeAgain: () => void, dontShowNoticeAgain: () => void,
unskipSponsorTime: (segment: SponsorTime) => void, unskipSponsorTime: (segment: SponsorTime) => void,
sponsorTimes: SponsorTime[], sponsorTimes: SponsorTime[],
@@ -15,9 +15,9 @@ interface ContentContainer {
onMobileYouTube: boolean, onMobileYouTube: boolean,
sponsorSubmissionNotice: SubmissionNotice, sponsorSubmissionNotice: SubmissionNotice,
resetSponsorSubmissionNotice: () => void, resetSponsorSubmissionNotice: () => void,
changeStartSponsorButton: (showStartSponsor: any, uploadButtonVisible: any) => Promise<boolean>, changeStartSponsorButton: (showStartSponsor: boolean, uploadButtonVisible: boolean) => Promise<boolean>,
previewTime: (time: number, unpause?: boolean) => void, previewTime: (time: number, unpause?: boolean) => void,
videoInfo: any, videoInfo: VideoInfo,
getRealCurrentTime: () => number getRealCurrentTime: () => number
} }
} }
@@ -78,8 +78,86 @@ interface BackgroundScriptContainer {
unregisterFirefoxContentScript: (id: string) => void unregisterFirefoxContentScript: (id: string) => void
} }
interface VideoInfo {
responseContext: {
serviceTrackingParams: Array<{service: string, params: Array<{key: string, value: string}>}>,
webResponseContextExtensionData: {
hasDecorated: boolean
}
},
playabilityStatus: {
status: string,
playableInEmbed: boolean,
miniplayer: {
miniplayerRenderer: {
playbackMode: string
}
}
};
streamingData: unknown;
playbackTracking: unknown;
videoDetails: {
videoId: string,
title: string,
lengthSeconds: string,
keywords: string[],
channelId: string,
isOwnerViewing: boolean,
shortDescription: string,
isCrawlable: boolean,
thumbnail: {
thumbnails: Array<{url: string, width: number, height: number}>
},
averageRating: number,
allowRatings: boolean,
viewCount: string,
author: string,
isPrivate: boolean,
isUnpluggedCorpus: boolean,
isLiveContent: boolean,
};
playerConfig: unknown;
storyboards: unknown;
microformat: {
playerMicroformatRenderer: {
thumbnail: {
thumbnails: Array<{url: string, width: number, height: number}>
},
embed: {
iframeUrl: string,
flashUrl: string,
width: number,
height: number,
flashSecureUrl: string,
},
title: {
simpleText: string,
},
description: {
simpleText: string,
},
lengthSeconds: string,
ownerProfileUrl: string,
externalChannelId: string,
availableCountries: string[],
isUnlisted: boolean,
hasYpcMetadata: boolean,
viewCount: string,
category: string,
publishDate: string,
ownerChannelName: string,
uploadDate: string,
}
};
trackingParams: string;
attestation: unknown;
messages: unknown;
}
type VideoID = string; type VideoID = string;
type StorageChangesObject = { [key: string]: chrome.storage.StorageChange };
export { export {
FetchResponse, FetchResponse,
VideoDurationResponse, VideoDurationResponse,
@@ -91,5 +169,7 @@ export {
SponsorHideType, SponsorHideType,
PreviewBarOption, PreviewBarOption,
Registration, Registration,
BackgroundScriptContainer BackgroundScriptContainer,
VideoInfo,
StorageChangesObject,
}; };

View File

@@ -56,16 +56,14 @@ class Utils {
let permissions = ["declarativeContent"]; let permissions = ["declarativeContent"];
if (this.isFirefox()) permissions = []; if (this.isFirefox()) permissions = [];
const self = this;
chrome.permissions.request({ chrome.permissions.request({
origins: this.getInvidiousInstancesRegex(), origins: this.getInvidiousInstancesRegex(),
permissions: permissions permissions: permissions
}, async function (granted) { }, async (granted) => {
if (granted) { if (granted) {
self.setupExtraSiteContentScripts(); this.setupExtraSiteContentScripts();
} else { } else {
self.removeExtraSiteRegistration(); this.removeExtraSiteRegistration();
} }
callback(granted); callback(granted);
@@ -80,7 +78,6 @@ class Utils {
* For now, it is just SB.config.invidiousInstances. * For now, it is just SB.config.invidiousInstances.
*/ */
setupExtraSiteContentScripts(): void { setupExtraSiteContentScripts(): void {
const self = this;
if (this.isFirefox()) { if (this.isFirefox()) {
const firefoxJS = []; const firefoxJS = [];
@@ -107,9 +104,9 @@ class Utils {
chrome.runtime.sendMessage(registration); chrome.runtime.sendMessage(registration);
} }
} else { } else {
chrome.declarativeContent.onPageChanged.removeRules(["invidious"], function() { chrome.declarativeContent.onPageChanged.removeRules(["invidious"], () => {
const conditions = []; const conditions = [];
for (const regex of self.getInvidiousInstancesRegex()) { for (const regex of this.getInvidiousInstancesRegex()) {
conditions.push(new chrome.declarativeContent.PageStateMatcher({ conditions.push(new chrome.declarativeContent.PageStateMatcher({
pageUrl: { urlMatches: regex } pageUrl: { urlMatches: regex }
})); }));
@@ -119,11 +116,10 @@ class Utils {
const rule = { const rule = {
id: "invidious", id: "invidious",
conditions, conditions,
// This API is experimental and not visible by the TypeScript compiler actions: [new chrome.declarativeContent.RequestContentScript({
actions: [new (<any> chrome.declarativeContent).RequestContentScript({
allFrames: true, allFrames: true,
js: self.js, js: this.js,
css: self.css css: this.css
})] })]
}; };
@@ -243,7 +239,7 @@ class Utils {
getLocalizedMessage(text: string): string | false { getLocalizedMessage(text: string): string | false {
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) { const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
return v1 ? chrome.i18n.getMessage(v1) : ""; return v1 ? chrome.i18n.getMessage(v1).replace("\n", "<br/>") : "";
}); });
if(valNewH != text) { if(valNewH != text) {