Compare commits

..

30 Commits

Author SHA1 Message Date
Ajay Ramachandran
2a3a04a504 Increase version number 2021-07-30 12:32:11 -04:00
Ajay Ramachandran
13ad7516c2 New Crowdin updates (#854) 2021-07-30 12:30:17 -04:00
Ajay Ramachandran
bcb981ae3d Fix type issue 2021-07-29 21:25:49 -04:00
Ajay Ramachandran
8d83076ea1 Fix popup on firefox 2021-07-29 21:25:16 -04:00
Ajay Ramachandran
17437870e7 Add context to string 2021-07-29 20:49:16 -04:00
Ajay Ramachandran
2373b34067 Merge pull request #862 from ajayyy/warning-chat
Add chat box when getting a warning
2021-07-29 20:20:24 -04:00
Ajay Ramachandran
839dd4613c Get username for warning chat 2021-07-29 19:29:34 -04:00
Ajay Ramachandran
c84a951acc Add chat for warnings after voting 2021-07-29 19:16:18 -04:00
Ajay Ramachandran
d0949452da Add close button 2021-07-29 18:34:31 -04:00
Ajay Ramachandran
1a855a6993 Add basic chat box when getting a warning 2021-07-29 18:16:44 -04:00
Ajay Ramachandran
1656fae2d4 Merge pull request #859 from rakleed/dark-scrollbar
Make dark scroll bar in Chromium-based browsers
2021-07-27 15:09:28 -04:00
Ajay Ramachandran
22be10d33f Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-07-27 13:21:05 -04:00
Ajay Ramachandran
324c28b867 remove log 2021-07-27 13:21:03 -04:00
Ajay Ramachandran
d56637cb14 Don't affect inline popup 2021-07-27 13:20:40 -04:00
Pavel Moiseenko
e720acc674 Make dark scroll bar in Chromium-based browsers 2021-07-27 16:37:43 +03:00
Ajay Ramachandran
c396d1690d New Crowdin updates (#825) 2021-07-21 13:12:52 -04:00
Ajay Ramachandran
2f5d4dfe03 Increase version number 2021-07-21 11:49:13 -04:00
Ajay Ramachandran
821c45a6b6 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-07-21 11:48:21 -04:00
Ajay Ramachandran
ff44016003 Remove unlisted experiment 2021-07-21 11:48:19 -04:00
Ajay Ramachandran
b11d99a196 Cleanup help page a bit 2021-07-21 02:26:15 -04:00
Ajay Ramachandran
6f548987a3 Update db link in help page 2021-07-21 02:21:00 -04:00
Ajay Ramachandran
c6438872e2 Add github link 2021-07-20 12:28:02 -04:00
Ajay Ramachandran
caae61a6a8 Clear all skip notices when changing videos
Closes https://github.com/ajayyy/SponsorBlock/issues/726
2021-07-18 15:05:47 -04:00
Ajay Ramachandran
777f3a2769 Only show refresh button in popup if segments are found 2021-07-16 12:37:38 -04:00
Ajay Ramachandran
797c9d67e4 Switch back to es6 2021-07-15 14:09:10 -04:00
Ajay Ramachandran
528b475429 Fix quotations not working in localisation 2021-07-14 15:28:38 -04:00
Ajay Ramachandran
e39b441c16 Fix unused import 2021-07-13 18:23:14 -04:00
Ajay Ramachandran
b8cbedbc4d Add animation to copy button
Closes https://github.com/ajayyy/SponsorBlock/issues/796
2021-07-13 18:22:56 -04:00
Ajay Ramachandran
76b78ef132 Add animation to refresh segments
Closes https://github.com/ajayyy/SponsorBlock/issues/839
2021-07-13 18:12:45 -04:00
Ajay Ramachandran
572fee265d Handle / in channel URL
Fixes https://github.com/ajayyy/SponsorBlock/issues/766
2021-07-11 22:12:08 -04:00
40 changed files with 881 additions and 561 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,3 @@
github: ajayyy-org
patreon: ajayyy
custom: [sponsor.ajay.app/donate]

View File

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

View File

@@ -97,6 +97,9 @@
"hideButtons": {
"message": "Скриване на бутоните в YouTube Player-а"
},
"autoSkip": {
"message": "Автоматично пропускане"
},
"to": {
"message": "до",
"description": "Used between segments. Example: 1:20 to 1:30"
@@ -110,12 +113,27 @@
"category_selfpromo_description": {
"message": "Подобно на \"спонсорство\", но е неплатено. Това включва merchandise, дарения или информация с кого каналът има сътрудничество."
},
"category_interaction": {
"message": "Напомняне за действие (Абониране)"
},
"category_interaction_description": {
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или заради нещо специфично, трябва да е под \"само-реклама\"."
},
"category_intro": {
"message": "Пауза/Начална анимация"
},
"category_outro": {
"message": "Крайни картички/Заслуги"
},
"category_preview": {
"message": "Предварително изявление/Обобщение"
},
"category_music_offtopic": {
"message": "Музика: Част без музика"
},
"category_music_offtopic_short": {
"message": "Без музика"
},
"category_livestream_messages": {
"message": "Поточно предаване: Четене на съобщения/дарения"
},
@@ -134,9 +152,20 @@
"colorFormatIncorrect": {
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен hex код с \"#\" в началото."
},
"previewColor": {
"message": "Цвят на неизпратен сегмент",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Цвят на лентата за превъртане"
},
"category": {
"message": "Категория"
},
"skipOption": {
"message": "Метод за пропускане",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"downvoteDescription": {
"message": "Грешно/Неправилно Време"
},
@@ -151,5 +180,12 @@
},
"categoryUpdate1": {
"message": "Категориите са тук!"
},
"warningChatInfo": {
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Гласуването е отхвърлено поради предупреждение. Щракнете, за да отворите чат и да го разрешите, или се върнете по-късно, когато имате време.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte záložku."
},
"refreshSegments": {
"message": "Aktualizovat segmenty"
},
"success": {
"message": "Úspěch!"
},
@@ -666,12 +669,6 @@
"help": {
"message": "Nápověda"
},
"experimentUnlistedTitle": {
"message": "Pomozte zabránit zmizení tohoto"
},
"experimentUnlistedText": {
"message": "Toto video bylo detekováno jako neuvedené a bylo nahráno před rokem 2017\nStará neuvedená videa budou nastavena příští měsíc na soukromá\nSbíráme *veřejná* videa pro zálohu\nChtěli byste nám anonymně poslat toto video?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Odhlásit se ze všech budoucích experimentů",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -66,5 +66,56 @@
},
"Unknown": {
"message": "Der skete en fejl da du prøvede at indsende dine reklame tider, prøv lige igen."
},
"sponsorFound": {
"message": "Denne video har segmenter i databasen!"
},
"sponsor404": {
"message": "Ingen segmenter fundet"
},
"sponsorStart": {
"message": "Segment Begynder Nu"
},
"sponsorEnd": {
"message": "Segment Slutter Nu"
},
"sponsorCancel": {
"message": "Annuller Oprettelse Af Segment"
},
"noVideoID": {
"message": "Ingen YouTube-video fundet.\nHvis dette er forkert, så genindlæs siden."
},
"refreshSegments": {
"message": "Opdater segmenter"
},
"success": {
"message": "Succes!"
},
"voted": {
"message": "Stemt!"
},
"serverDown": {
"message": "Det ser ud til at serveren er nede. Kontakt udvikleren straks."
},
"connectionError": {
"message": "Der opstod en forbindelsesfejl. Fejlkode: "
},
"clearTimes": {
"message": "Ryd Segmenter"
},
"openPopup": {
"message": "Åbn SponsorBloker Pop-op"
},
"closePopup": {
"message": "Luk Pop-op"
},
"SubmitTimes": {
"message": "Indsend Segmenter"
},
"submitCheck": {
"message": "Er du sikker på, at du vil indsende dette?"
},
"voteOnTime": {
"message": "Stem På Et Segment"
}
}

View File

@@ -643,5 +643,12 @@
},
"categoryUpdate2": {
"message": "Öffne die Optionen um das Verhalten bei Intros, Outros, Merchandising (Fanartikel) usw. einzustellen."
},
"warningChatInfo": {
"message": "Du wurdest ermahnt und kannst zur Zeit keine Segmente einreichen. Uns ist nämlich aufgefallen, dass du ein paar gängige Fehler machst, die nicht bösartig sind. Um die Regeln klarzustellen laden wir dich zu einem kurzem Gespräch auf discord.gg/SponsorBlock oder matrix.to/#/+sponsor:ajay.app ein"
},
"voteRejectedWarning": {
"message": "Abstimmung wegen einer Warnung abgelehnt. Um über sie zu reden, klicke hier, oder schreibe uns später.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}

View File

@@ -669,17 +669,18 @@
"help": {
"message": "Help"
},
"experimentUnlistedTitle": {
"message": "Help prevent this from disappearing"
},
"experimentUnlistedText": {
"message": "This video is detected as unlisted and uploaded before 2017\nOld unlisted videos are being set to private next month\nWe are collecting *public* videos to back up\nWould you like to anonymously send this video to us?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Opt-out of all future experiments",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Hide forever"
},
"warningChatInfo": {
"message": "You got a warning and cannot submit segments temporarily. This means that we noticed you were making some common mistakes that are not malicious, and we just want to clarify the rules. You can also join this chat using discord.gg/SponsorBlock or matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Vote rejected due to a warning. Click to open a chat to resolve it, or come back later when you have time.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "No se encontró vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña."
},
"refreshSegments": {
"message": "Actualizar segmentos"
},
"success": {
"message": "¡Completado!"
},
@@ -612,7 +615,7 @@
"message": "El ID del canal no está cargado todavía. Si está usando un vídeo incrustado, intente usar la página de inicio de YouTube en su lugar. Esto también podría ser causado por cambios en el diseño de YouTube, si lo cree, haga un comentario aquí:"
},
"videoInfoFetchFailed": {
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de video, Por favor, vea https://github.com/ajayyy/SponsorBlock/issues/741 para más información."
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de video. Por favor, vea https://github.com/ajayyy/SponsorBlock/issues/741 para más información."
},
"youtubePermissionRequest": {
"message": "Parece que SponsorBlock no puede acceder a la API de YouTube. Para solucionarlo, acepte el aviso de permiso que aparecerá a continuación, espera unos segundos y vuelve a cargar la página."
@@ -666,17 +669,18 @@
"help": {
"message": "Ayuda"
},
"experimentUnlistedTitle": {
"message": "Ayude a evitar que esto desaparezca"
},
"experimentUnlistedText": {
"message": "Este vídeo se detecta como oculto y subido antes de 2017\nLos vídeos ocultos antiguos se pondrán como privados el próximo mes\nEstamos recopilando vídeos *públicos* para respaldar\n¿Quisiera enviarnos este vídeo de forma anónima?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "No participar en futuros experimentos",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Ocultar para siempre"
},
"warningChatInfo": {
"message": "Ha recibido una advertencia y no puede enviar segmentos temporalmente. Esto significa que hemos notado de que estaba cometiendo algunos errores comunes que no son maliciosos, y solo queremos aclarar las reglas. Puedes unirte a este chat usando discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Voto rechazado debido a una advertencia. Haga clic aquí para abrir un chat para resolverlo, o vuelva más tarde cuando tenga tiempo.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "YouTube'i videot ei leitud.\nKui see ei vasta tõele, laadi kaart uuesti."
},
"refreshSegments": {
"message": "Värskenda segmendid"
},
"success": {
"message": "Õnnestus!"
},
@@ -666,12 +669,6 @@
"help": {
"message": "Abi"
},
"experimentUnlistedTitle": {
"message": "Aita video kadumist vältida"
},
"experimentUnlistedText": {
"message": "See video tuvastati kui registriväline ning see laaditi üles enne 2017. aastat.\nVanad registrivälised videod muudetakse järgmisel kuul privaatseks.\nMe kogume varundamiseks *avalikke* videoid, \nkas sooviksid anonüümselt selle video meile saata?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Keeldu kõigist tulevikus tehtavatatest eksperimentidest",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -17,7 +17,7 @@
"message": "Tämä on jo lähetetty aiemmin"
},
"channelWhitelisted": {
"message": "Kanava lisätty valkoiselle listalle!"
"message": "Kanava lisätty valkolistalle!"
},
"Segment": {
"message": "segmentti"
@@ -41,7 +41,7 @@
"message": "Ladataan..."
},
"Hide": {
"message": "Älä Näytä Koskaan"
"message": "Älä näytä koskaan"
},
"hitGoBack": {
"message": "Paina 'älä ohita' mennäksesi takaisin kohtaan jossa olit."
@@ -77,14 +77,17 @@
"message": "Segmentti alkaa nyt"
},
"sponsorEnd": {
"message": "Segmentti Päättyy Nyt"
"message": "Segmentti päättyy nyt"
},
"sponsorCancel": {
"message": "Peruuta Segmentin Luominen"
"message": "Peruuta segmentin luominen"
},
"noVideoID": {
"message": "YouTube-videota ei löytynyt.\nJos tämä on väärässä, päivitä välilehti."
},
"refreshSegments": {
"message": "Päivitä segmentit"
},
"success": {
"message": "Onnistui!"
},
@@ -101,16 +104,16 @@
"message": "Haluatko lähettää segmentit videotunnukselle"
},
"clearTimes": {
"message": "Tyhjennä Segmentit"
"message": "Tyhjennä segmentit"
},
"openPopup": {
"message": "Avaa SponsorBlock-ponnahdusikkuna"
},
"closePopup": {
"message": "Sulje Ponnahdusikkuna"
"message": "Sulje ponnahdusikkuna"
},
"SubmitTimes": {
"message": "Lähetä Segmentit"
"message": "Lähetä segmentit"
},
"submitCheck": {
"message": "Haluatko varmasti lähettää tämän?"
@@ -122,7 +125,7 @@
"message": "Poista kanava valkolistalta"
},
"voteOnTime": {
"message": "Äänestä Segmenttiä"
"message": "Äänestä segmenttiä"
},
"Submissions": {
"message": "Lähetykset"
@@ -137,7 +140,7 @@
"message": "Lähetä"
},
"submissionEditHint": {
"message": "Osien muokkaus ilmestyy sen jälkeen, kun klikkaat lähetä-nappia",
"message": "Osien muokkaus ilmestyy sen jälkeen, kun klikkaat lähetä-painiketta",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
@@ -159,7 +162,7 @@
"message": "Aseta käyttäjänimi"
},
"discordAdvert": {
"message": "Liity mukaan viralliseen discord-palvelimeen, jotta voit antaa ehdotuksia ja palautetta!"
"message": "Liity mukaan viralliselle Discord-palvelimelle, jotta voit antaa ehdotuksia ja palautetta!"
},
"hideThis": {
"message": "Piilota tämä"
@@ -168,7 +171,7 @@
"message": "Asetukset"
},
"showButtons": {
"message": "Näytä Painikkeet YouTuben Soittimessa"
"message": "Näytä painikkeet YouTuben soittimessa"
},
"hideButtons": {
"message": "Piilota painikkeet YouTuben soittimessa"
@@ -177,7 +180,7 @@
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
},
"showInfoButton": {
"message": "Näytä Info-Painike YouTuben Soittimessa"
"message": "Näytä info-painike YouTuben soittimessa"
},
"hideInfoButton": {
"message": "Piilota info-painike YouTuben soittimessa"
@@ -192,25 +195,25 @@
"message": "Piilota poista-painike YouTuben soittimessa"
},
"showDeleteButton": {
"message": "Näytä Poista-Painike YouTuben Soittimessa"
"message": "Näytä poista-painike YouTuben soittimessa"
},
"whatDeleteButton": {
"message": "Tämä on YouTuben soittimen painike, joka poistaa kaikki kyseisen videon sponsorointikohdat, joita et ole vielä lähettänyt."
},
"enableViewTracking": {
"message": "Ota Ohitusten Lukumäärän Seuranta Käyttöön"
"message": "Ota ohitusten lukumäärän seuranta käyttöön"
},
"whatViewTracking": {
"message": "Tämä toiminto seuraa, mitä segmenttejä olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina, kun ohitat segmentin. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)"
},
"enableViewTrackingInPrivate": {
"message": "Ota Ohitusten Lukumäärän Seuranta Käyttöön Yksityis-/Incognito-välilehdissä"
"message": "Ota ohitusten lukumäärän seuranta käyttöön yksityis-/incognito-välilehdissä"
},
"enableQueryByHashPrefix": {
"message": "Kysely Tiiviste-etuliittellä"
"message": "Kysely tiiviste-etuliittellä"
},
"whatQueryByHashPrefix": {
"message": "Kokonaisen videon ID:n lähettämisen sijaan ID:n hashin 4 ensimmäistä merkkiä lähetetään. Palvelin lähettää takaisin dataa kaikista videoista, joilla on vastaavat hashit."
"message": "Sen sijaan, että videoID:tä käyttäen pyydettäisiin segmenttejä palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Tämä palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet."
},
"enableRefetchWhenNotFound": {
"message": "Hae segmentit uudelleen uusissa videoissa"
@@ -219,10 +222,10 @@
"message": "Jos video on uusi, eikä segmenttejä löydy, niitä haetaan uudelleen muutaman minuutin välein katsoessasi."
},
"showNotice": {
"message": "Näytä Huomautus Uudelleen"
"message": "Näytä ilmoitus uudelleen"
},
"longDescription": {
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää sponsoroitujen ja muiden Youtube-videoiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
"description": "Full description of the extension on the store pages."
},
"website": {
@@ -248,13 +251,13 @@
"message": "Aseta pikanäppäin segmentin aloittamiseen/lopettamiseen"
},
"setSubmitKeybind": {
"message": "Aseta näppäin tietojen lähetykseen"
"message": "Aseta pikanäppäin tietojen lähetykseen"
},
"keybindDescription": {
"message": "Valitse näppäin painamalla sitä"
},
"keybindDescriptionComplete": {
"message": "Näppäinmääritys on asetettu näppäimeen: "
"message": "Pikanäppäin on asetettu näppäimeen: "
},
"0": {
"message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla."
@@ -266,7 +269,7 @@
"message": "Ohitus on poistettu käytöstä"
},
"yourWork": {
"message": "Sinun työsi",
"message": "Työsi",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
@@ -291,7 +294,7 @@
"message": "Ota automaattinen ohitus käyttöön"
},
"audioNotification": {
"message": "Äänellinen Ilmoitus Ohitettaessa"
"message": "Ääni-ilmoitus ohitettaessa"
},
"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."
@@ -309,13 +312,13 @@
"message": "Olet säästänyt itseltäsi "
},
"minLower": {
"message": "minuutti"
"message": "minuutin"
},
"minsLower": {
"message": "minuuttia"
},
"hourLower": {
"message": "tunti"
"message": "tunnin"
},
"hoursLower": {
"message": "tuntia"
@@ -330,7 +333,7 @@
"message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app."
},
"changeUserID": {
"message": "Tuo/vie sinun UserID:si"
"message": "Tuo/vie UserID:si"
},
"whatChangeUserID": {
"message": "Tämä tulisi pitää yksityisenä. Tämä on kuin salasana eikä sitä pitäisi jakaa kenellekään. Jos joku saa tämän, hän voi esiintyä sinuna."
@@ -345,29 +348,29 @@
"message": "Luonut"
},
"autoSkip": {
"message": "Ohita Automaattisesti"
"message": "Ohita automaattisesti"
},
"showSkipNotice": {
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
},
"keybindCurrentlySet": {
"message": ". Tällä hetkellä se on asetettu:"
"message": ". Tällä hetkellä se on asetettu näppäimeen:"
},
"supportOtherSites": {
"message": "Tue Kolmansien Osapuolien YouTube-sivustoja"
"message": "Tue kolmansien osapuolien YouTube-sivustoja"
},
"supportOtherSitesDescription": {
"message": "Tue kolmannen osapuolen YouTube-asiakasohjelmia. Jotta voit ottaa käyttöön tuen, sinun täytyy hyväksyä lisäkäyttöoikeudet. Tämä EI toimi incognitossa Chromessa ja muissa Chromium varianteissa.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Tuetut Sivustot: "
"message": "Tuetut sivustot: "
},
"optionsInfo": {
"message": "Ota käyttöön Invidious tuki, poista käytöstä automaattinen ohitus, piilota painikkeet ja muuta."
},
"addInvidiousInstance": {
"message": "Lisää Kolmannen Osapuolen Asiakasohjelmainstanssi"
"message": "Lisää kolmannen osapuolen asiakasohjelmainstanssi"
},
"addInvidiousInstanceDescription": {
"message": "Lisää mukautettu instanssi. Tämän täytyy olla formatoitu VAIN verkkotunnuksella. Esimerkki: invidious.ajay.app"
@@ -400,7 +403,7 @@
"message": "Ohitusimoitus pysyy näytöllä ainakin näin kauan.\nManuaalisella ohituksella se saattaa pysyä pitempäänkin."
},
"shortCheck": {
"message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"
"message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty, ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"
},
"showUploadButton": {
"message": "Näytä lähetä-painike"
@@ -409,7 +412,7 @@
"message": "Tämä painike ilmestyy YouTube-soittimeen, kun olet valinnut aikaleiman ja olet valmis lähettämään sen."
},
"customServerAddress": {
"message": "SponsorBlock Palvelimen Osoite"
"message": "SponsorBlock-palvelimen osoite"
},
"customServerAddressDescription": {
"message": "Osoite, jota SponsorBlock käyttää lähettääkseen kutsuja palvelimelle.\nEllei sinulla ole omaa palvelininstanssia, tätä ei pitäisi muuttaa."
@@ -445,10 +448,10 @@
"message": "Tämä JSON ei ole muotoiltu oikein. Asetuksiasi ei ole muutettu."
},
"confirmNoticeTitle": {
"message": "Lähetä kohta"
"message": "Lähetä segmentti"
},
"submit": {
"message": "Jatka"
"message": "Lähetä"
},
"cancel": {
"message": "Peruuta"
@@ -469,7 +472,7 @@
"message": "Muokkaa"
},
"copyDebugInformation": {
"message": "Kopioi Vianetsintätiedot Leikepöydälle"
"message": "Kopioi vianetsintätiedot leikepöydälle"
},
"copyDebugInformationFailed": {
"message": "Kirjoittaminen leikepöydälle epäonnistui"
@@ -497,7 +500,7 @@
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai huikkauksille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
},
"category_selfpromo": {
"message": "Maksamaton/Itsensä Mainostus"
"message": "Maksamaton/Itsensä mainostus"
},
"category_selfpromo_description": {
"message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
@@ -533,19 +536,19 @@
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
},
"category_music_offtopic": {
"message": "Musiikki: Ei-Musiikki-Osio"
"message": "Musiikki: Musiikiton osa"
},
"category_music_offtopic_description": {
"message": "Vain musiikkivideoille. Tätä tulee käyttää vain musiikkivideoiden osissa, jotka eivät jo kuulu toiseen kategoriaan."
},
"category_music_offtopic_short": {
"message": "Ei-Musiikki"
"message": "Musiikiton"
},
"category_livestream_messages": {
"message": "Livestream: lahjoituksen/viestin lukeminen"
"message": "Livestream: lahjoitusten/viestien lukeminen"
},
"category_livestream_messages_short": {
"message": "Viestin Lukeminen"
"message": "Viestien lukeminen"
},
"disable": {
"message": "Poista käytöstä"
@@ -554,17 +557,17 @@
"message": "Manuaalinen ohitus"
},
"showOverlay": {
"message": "Näytä Liukusäätimessä"
"message": "Näytä liukusäätimessä"
},
"colorFormatIncorrect": {
"message": "Väriformaattisi on muotoiltu väärin. Sen pitäisi olla 3 tai 6 numeroinen hex-koodi, jossa on # alussa."
},
"previewColor": {
"message": "Lähettämättömien Väri",
"message": "Lähettämättömien väri",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Siirtymispalkin Väri"
"message": "Siirtymispalkin väri"
},
"category": {
"message": "Kategoria"
@@ -592,14 +595,14 @@
"message": "Valitse kategoria"
},
"enableThisCategoryFirst": {
"message": "Lähettääksesi segmenttejä kategorialla \"{0}\", sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
"message": "Lähettääksesi segmenttejä \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
"message": "Sinun täytyy valita kategoria kaikille segmenteille, jota olet lähettämässä!"
"message": "Sinun täytyy valita kategoria kaikille segmenteille, joita olet lähettämässä!"
},
"bracketEnd": {
"message": "(Päättyy)"
"message": "(Loppu)"
},
"hiddenDueToDownvote": {
"message": "piilotettu: miinusääniä"
@@ -630,13 +633,13 @@
"message": "Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Pakota kanavan tarkistus ennen ohittamista', koska SponsorBlock ei pysty noutamaan tämän videon kanavatietoja"
},
"forceChannelCheck": {
"message": "Pakota Kanavan Tarkistus Ennen Ohittamista"
"message": "Pakota kanavan tarkistus ennen ohittamista"
},
"whatForceChannelCheck": {
"message": "Oletuksena segmentit ohitetaan heti ennen kuin kanava tiedetään. Oletuksena jotkut segmentit videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys."
},
"forceChannelCheckPopup": {
"message": "Harkitse \"Pakota Kanavan Tarkistus Ennen Ohittamista\" käyttöön ottaminen"
"message": "Harkitse asetuksen \"Pakota kanavan tarkistus ennen ohittamista\" käyttöön ottaminen"
},
"downvoteDescription": {
"message": "Virheellinen/väärä aika"
@@ -645,16 +648,16 @@
"message": "Väärä kategoria"
},
"nonMusicCategoryOnMusic": {
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on sen sijaan \"musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue ohjeistus, jos on lisää kysyttävää."
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."
},
"multipleSegments": {
"message": "Useita kohtia"
"message": "Useita segmenttejä"
},
"guidelines": {
"message": "Säännökset"
"message": "Säännöt"
},
"readTheGuidelines": {
"message": "Lue Säännökset!!",
"message": "Lue säännöt!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
@@ -666,17 +669,18 @@
"help": {
"message": "Ohje"
},
"experimentUnlistedTitle": {
"message": "Auta estämään tätä katoamasta"
},
"experimentUnlistedText": {
"message": "Tämä video on havaittu piilotetuksi ja se on ladattu YouTubeen ennen vuotta 2017\nVanhat piilotetut videot asetetaan yksityisiksi ensi kuussa\nKeräämme *julkisia* videoita varmuuskopioitavaksi\nHaluaisitko anonyymisti lähettää tämän videon meille?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Jättäydy pois kaikista tulevista kokeiluista",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Piilota ikuisesti"
},
"warningChatInfo": {
"message": "Sait varoituksen ja et voi lähettää segmenttejä väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, ja haluamme vain selventää säännöt. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Ääni hylättiin varoituksen takia. Klikkaa avataksesi chatin sen ratkaisemiseksi, tai tule takaisin myöhemmin kun sinulla on siihen aikaa.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet si il est censé y en avoir une."
},
"refreshSegments": {
"message": "Rafraîchir les segments"
},
"success": {
"message": "Succès !"
},
@@ -185,6 +188,9 @@
"whatInfoButton": {
"message": "Il s'agit du bouton qui ouvre l'encart sur la page YouTube."
},
"autoHideInfoButton": {
"message": "Masquer Automatiquement Le Button Info"
},
"hideDeleteButton": {
"message": "Cacher le bouton Supprimer sur le lecteur YouTube"
},
@@ -204,13 +210,13 @@
"message": "Activer le suivi du nombre de sauts dans les onglets privés/incognito"
},
"enableQueryByHashPrefix": {
"message": "Requête avec seulement le début du hash"
"message": "Requête par préfixe du hash"
},
"whatQueryByHashPrefix": {
"message": "Au lieu de demander des segments au serveur à l'aide de l'identifiant de la vidéo, les 4 premiers caractères du hash de l'identifiant de la vidéo sont envoyés. Ce serveur renverra les données pour toutes les vidéos ayant des hash similaires."
},
"enableRefetchWhenNotFound": {
"message": "Re-récupérer les segments sur les nouvelles vidéos"
"message": "Récupérer les segments sur les nouvelles vidéos"
},
"whatRefetchWhenNotFound": {
"message": "Si la vidéo est nouvelle et qu'aucun segment n'a été trouvé, ils seront réactualisés toutes les quelques minutes pendant le visionnage."
@@ -350,6 +356,13 @@
"keybindCurrentlySet": {
"message": ". Il est actuellement réglé sur :"
},
"supportOtherSites": {
"message": "Support de YouTube-Sites tierces"
},
"supportOtherSitesDescription": {
"message": "Support de clients YouTube tierces. Pour habiliter le support, vous devez accepter les autorisations supplémentaires. Cela ne fonctionne PAS en incognito sur Chrome et d'autres variantes de Chromium.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Sites pris en charge : "
},
@@ -359,6 +372,9 @@
"addInvidiousInstance": {
"message": "Ajouter une instance de client tiers"
},
"addInvidiousInstanceDescription": {
"message": "Ajouter une instance personnalisée. Elle doit être formaté avec SEULEMENT le domaine. Exemple: invidious.ajay.app"
},
"add": {
"message": "Ajouter"
},
@@ -380,6 +396,12 @@
"minDurationDescription": {
"message": "Les segments plus courts que la valeur fixée ne seront pas sautés ou affichés dans le lecteur."
},
"skipNoticeDuration": {
"message": "Durée du saut de segment (secondes):"
},
"skipNoticeDurationDescription": {
"message": "L'avis du saut restera à l'écran pendant au moins aussi longtemps. Pour passer manuellement, il peut être visible plus longtemps."
},
"shortCheck": {
"message": "Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il est déjà soumis, et just ignoré par cette option. Êtes-vous sûr de vouloir soumettre ?"
},
@@ -510,6 +532,9 @@
"category_preview": {
"message": "Aperçu/Résumé"
},
"category_preview_description": {
"message": "Résumé rapide des épisodes précédents, ou aperçu de ce qui se passera plus tard dans la vidéo en cours. Pour les plans collectifs édités, pas pour les résumés parlés."
},
"category_music_offtopic": {
"message": "Musique : Segment non musical"
},
@@ -643,5 +668,12 @@
},
"help": {
"message": "Aide"
},
"experiementOptOut": {
"message": "Se désinscrire de toutes les futures expériences",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Cacher pour toujours"
}
}

View File

@@ -79,9 +79,15 @@
"sponsorEnd": {
"message": "Szegmens vége"
},
"sponsorCancel": {
"message": "Szegmens Készítés Visszavonása"
},
"noVideoID": {
"message": "Nem találtunk YouTube videót.\nHa ez helytelen, frissítsd a lapot."
},
"refreshSegments": {
"message": "Szegmensek frissítése"
},
"success": {
"message": "Siker!"
},
@@ -124,12 +130,22 @@
"Submissions": {
"message": "Beküldések"
},
"savedPeopleFrom": {
"message": "Megspóroltál másoknak "
},
"viewLeaderboard": {
"message": "Ranglista"
},
"recordTimesDescription": {
"message": "Küldés"
},
"submissionEditHint": {
"message": "A szegmens szerkesztés azután fog megjelenni miután a közzétételre kattintasz",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Tipp: A beállításokban készíthetsz gyorsbillentyűket a közzétetelhez"
},
"clearTimesButton": {
"message": "Időpontok törlése"
},
@@ -172,6 +188,9 @@
"whatInfoButton": {
"message": "Ez a gomb felhoz egy felugró dobozt a YouTube oldalon."
},
"autoHideInfoButton": {
"message": "Automatikus elrejtése az Információ Gombnak"
},
"hideDeleteButton": {
"message": "Törlés gomb elrejtése a YouTube lejátszón"
},
@@ -222,6 +241,9 @@
"message": "Ha még mindig nem tetszik, kattintson a ne mutassa többé gombra.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "Billentyű beállítása szegmens átugráshoz"
},
"setSubmitKeybind": {
"message": "Billentyű beállítása a beküldés gombhoz"
},
@@ -277,6 +299,9 @@
"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."
},
"youHaveSkipped": {
"message": "Átugrottál "
},
"youHaveSaved": {
"message": "Megtakarított magának "
},
@@ -292,6 +317,9 @@
"hoursLower": {
"message": "óra"
},
"youHaveSavedTime": {
"message": "Megspóroltál másoknak"
},
"youHaveSavedTimeEnd": {
"message": " az életükből"
},
@@ -322,6 +350,9 @@
"keybindCurrentlySet": {
"message": ". Jelenleg erre van állítva:"
},
"supportOtherSites": {
"message": "Harmadik fél Youtube oldalainak támogatása"
},
"optionsInfo": {
"message": "Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több."
},
@@ -530,6 +561,9 @@
"hiddenDueToDuration": {
"message": "elrejtve: túl rövid"
},
"acceptPermission": {
"message": "Engedély jóváhagyása"
},
"forceChannelCheck": {
"message": "Csatorna ellenőrzése átugrás előtt"
},
@@ -563,5 +597,8 @@
},
"categoryUpdate2": {
"message": "Nyissa meg a beállításokat, hogy átugorhasson introkat, outrokat stb."
},
"help": {
"message": "Segítség"
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Nessun video YouTube trovato.\nSe è un errore, ricarica la scheda."
},
"refreshSegments": {
"message": "Ricarica i segmenti"
},
"success": {
"message": "Successo!"
},
@@ -141,7 +144,7 @@
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Suggerimento: Puoi configurare dei comandi rapidi per l'inserimento nelle opzioni"
"message": "Suggerimento: puoi configurare dei comandi rapidi nelle opzioni"
},
"clearTimesButton": {
"message": "Cancella Minutaggi"
@@ -185,6 +188,9 @@
"whatInfoButton": {
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
},
"autoHideInfoButton": {
"message": "Nascondi in automatico il Pulsante di Informazioni"
},
"hideDeleteButton": {
"message": "Nascondi il Pulsante Elimina nel Lettore di YouTube"
},
@@ -257,10 +263,10 @@
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
},
"disableSkipping": {
"message": "Saltare è abilitato"
"message": "Abilitato"
},
"enableSkipping": {
"message": "Saltare è disabilitato"
"message": "Disabilitato"
},
"yourWork": {
"message": "Il Tuo Lavoro",
@@ -390,6 +396,12 @@
"minDurationDescription": {
"message": "I segmenti più brevi del valore impostato non verranno saltati o visualizzati nel lettore."
},
"skipNoticeDuration": {
"message": "Salta durata avviso (secondi):"
},
"skipNoticeDurationDescription": {
"message": "L'avviso salta rimarrà sullo schermo per almeno questo tempo. Per saltarlo manualmente, potrebbe esser visibile più a lungo."
},
"shortCheck": {
"message": "Il seguente contributo è più breve della tua opzione di durata minima. Ciò potrebbe significare che questo è già stato inviato e viene semplicemente ignorato a causa di questa opzione. Sei sicuro di voler inviare?"
},
@@ -657,6 +669,10 @@
"help": {
"message": "Aiuto"
},
"experiementOptOut": {
"message": "Disiscriviti dagli esperimenti futuri",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Nascondi per sempre"
}

View File

@@ -23,16 +23,16 @@
"message": "セグメント"
},
"Segments": {
"message": "区域"
"message": "セグメント"
},
"upvoteButtonInfo": {
"message": "この提案を支持する"
"message": "この提案を支持"
},
"reportButtonTitle": {
"message": "報告"
},
"reportButtonInfo": {
"message": "この提案が正しくないことを報告する。"
"message": "この提案が正しくないと報告"
},
"Dismiss": {
"message": "無視"
@@ -44,10 +44,10 @@
"message": "非表示"
},
"hitGoBack": {
"message": "元の場所に戻るには「スキップを取り消す」をクリックしてください。"
"message": "スキップ解除を押すと元の場所へ戻ります"
},
"unskip": {
"message": "スキップを取り消す"
"message": "スキップ解除"
},
"reskip": {
"message": "再スキップ"
@@ -85,6 +85,9 @@
"noVideoID": {
"message": "YouTube動画が見つかりませんでした。\nこれが正しくない場合は、タブを再読み込みしてください。"
},
"refreshSegments": {
"message": "区域を更新"
},
"success": {
"message": "成功しました!"
},
@@ -95,7 +98,7 @@
"message": "サーバーがダウンしているようです。今すぐ開発者にお知らせください。"
},
"connectionError": {
"message": "接続エラーが発生しました。エラーコード: "
"message": "接続エラーが発生しました。 エラーコード: "
},
"wantToSubmit": {
"message": "次の動画IDで提出します:"
@@ -116,22 +119,22 @@
"message": "本当に提出してよろしいですか?"
},
"whitelistChannel": {
"message": "許可表にある番組"
"message": "ホワイトリストのチャンネル"
},
"removeFromWhitelist": {
"message": "許可表から番組を削除"
"message": "ホワイトリストからチャンネルを削除"
},
"voteOnTime": {
"message": "セグメントに投票"
},
"Submissions": {
"message": "提数"
"message": "提数"
},
"savedPeopleFrom": {
"message": "次のセグメント数から人々を救いました: "
},
"viewLeaderboard": {
"message": "投票結果"
"message": "リーダーボード"
},
"recordTimesDescription": {
"message": "送信"
@@ -141,7 +144,7 @@
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "心得: 利用者設定で,提出用の鍵盤束縛を設定できます"
"message": "ヒント: オプションから提出時のキーバインドを設定できます"
},
"clearTimesButton": {
"message": "時間をクリア"
@@ -153,10 +156,10 @@
"message": "これは公開の統計ページであなたがどれだけ貢献したかを示すために使用され、ここで確認することができます: "
},
"Username": {
"message": "利用者名"
"message": "ユーザー名"
},
"setUsername": {
"message": "利用者名を設定"
"message": "ユーザー名を設定"
},
"discordAdvert": {
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください"
@@ -192,19 +195,19 @@
"message": "YouTube プレイヤーから削除ボタンを隠す"
},
"showDeleteButton": {
"message": "YouTube プレヤーから削除ボタンを表示する"
"message": "YouTubeプレヤー削除ボタンを表示"
},
"whatDeleteButton": {
"message": "これはYouTube再生画面上のUIで現在の動画から未提出の区域を全て消去します。"
"message": "これはYouTubeプレーヤー上のボタンで、現在の動画から未提出のセグメントを全て消去します。"
},
"enableViewTracking": {
"message": "スキップ回数の統計を有効にする"
},
"whatViewTracking": {
"message": "この機能は、あなたが飛び越した区域を追跡して、当該区域がどれだけ役に立ったかを他の利用者に知らせることで、不正な情報が情報集合体に紛れないようにするための評価基準として使用されます。あなたが区域を飛び越すたびに、拡張機能はサーバーに通報を送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
"message": "この機能は、あなたがスキップしたセグメントを追跡して、そのセグメントがどれだけ役に立ったかを他のユーザーに知らせることで、スパムがデータベースに紛れないようにするための評価基準として使用されます。あなたがセグメントをスキップするたびに、拡張機能はサーバーにメッセージを送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
},
"enableViewTrackingInPrivate": {
"message": "匿名閲覧状態で計数追跡を飛び越す"
"message": "プライベート/シークレット タブでスキップカウントトラッキングを有効にする"
},
"enableQueryByHashPrefix": {
"message": "ハッシュプレフィックスを使って要求"
@@ -216,7 +219,7 @@
"message": "新しい動画ではセグメントを再取得する"
},
"whatRefetchWhenNotFound": {
"message": "動画がまだ新しく区域が見つからない場合は、動画を視聴している間、数分おきに区域を検索し続けます。"
"message": "動画がまだ新しくセグメントが見つからない場合は、動画を視聴している間、数分おきにセグメントを検索し続けます。"
},
"showNotice": {
"message": "再度通知を表示する"
@@ -245,32 +248,32 @@
"message": "セグメントをスキップするキーを設定"
},
"setStartSponsorShortcut": {
"message": "セグメント開始するキーを設定"
"message": "セグメント開始/停止キーのバインドを設定"
},
"setSubmitKeybind": {
"message": "投稿する鍵束縛を設定"
"message": "提案キーのバインドを設定"
},
"keybindDescription": {
"message": "選択する鍵束縛を打鍵してください"
"message": "キーを入力して設定します"
},
"keybindDescriptionComplete": {
"message": "鍵束縛を次の通り設定しました: "
"message": "キーバインドは次のように設定されました: "
},
"0": {
"message": "接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。"
},
"disableSkipping": {
"message": "スキップ有効です"
"message": "スキップ有効"
},
"enableSkipping": {
"message": "スキップ無効です"
"message": "スキップ無効"
},
"yourWork": {
"message": "あなたの貢献",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "サーバーが混雑中です。数秒後にもう一度お試しください。"
"message": "サーバー側で問題が起きているようです。時間をおいて再び試しください。"
},
"errorCode": {
"message": "エラーコード: "
@@ -291,10 +294,10 @@
"message": "自動スキップを有効にする"
},
"audioNotification": {
"message": "オーディオ通知をスキップ"
"message": "スキップ時に通知音を鳴らす"
},
"audioNotificationDescription": {
"message": "スキップ時の音声通知は、セグメントがスキップされる毎に音を鳴らす機能です。無効 (または自動スキップが無効) の場合、音は再生されません。"
"message": "セグメントがスキップされた時に音を鳴らします。 無効 (もしくは自動スキップが無効) の場合、音は再生されません。"
},
"showTimeWithSkips": {
"message": "スキップした分を除いた時間を表示する"
@@ -330,19 +333,19 @@
"message": "サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。"
},
"changeUserID": {
"message": "利用者IDの読み込み・書き出し"
"message": "ユーザーIDのインポート/エクスポート"
},
"whatChangeUserID": {
"message": "これを公開してはいけません。これは暗証語のようなものであり,誰とも共有するべきではありません。これを持っている人はあなたになりすませてしまいます。"
"message": "ユーザーIDは公開しないでください。これはパスワードのようなもので誰とも共有するべきではありません。 他の誰かが知った場合、あなたになりすます可能性があります。"
},
"setUserID": {
"message": "利用者IDを設定"
"message": "ユーザーIDを設定"
},
"userIDChangeWarning": {
"message": "警告: 利用者IDの変更は恒久的です。本当に実行しますか 念のため,旧ID控えておいてください。"
"message": "警告: ユーザーIDの変更は恒久的です。本当に実行しますか? 念のため以前のユーザーID控えておいてください。"
},
"createdBy": {
"message": "作成者"
"message": "作成者:"
},
"autoSkip": {
"message": "自動スキップ"
@@ -367,7 +370,7 @@
"message": "Invidious対応を有効にし自動飛越を無効にしGUIを非表示にします。"
},
"addInvidiousInstance": {
"message": "第三者製クライアントの実体を追加"
"message": "サードパーティーのクライアントインスタンスを追加"
},
"addInvidiousInstanceDescription": {
"message": "任意のインスタンスを追加できます。ドメイン名だけを記入してください。例: invidious.ajay.app"
@@ -388,7 +391,7 @@
"message": "現在のインスタンス:"
},
"minDuration": {
"message": "飛越す最短の時間(秒):"
"message": "最小持続時間(秒):"
},
"minDurationDescription": {
"message": "設定値より短いセグメントはスキップされず、プレーヤーにも表示されません。"
@@ -406,7 +409,7 @@
"message": "アップロードボタンを表示"
},
"whatUploadButton": {
"message": "時刻印を選択し提出準備が整ったあとにYouTube再生機上に表示されます。"
"message": "このボタンはタイムスタンプを選択して投稿の準備ができた後にYouTubeプレーヤーに表示されます。"
},
"customServerAddress": {
"message": "SponsorBlock サーバーアドレス"
@@ -436,7 +439,7 @@
"message": "JSON形式の個人設定全体です。利用者IDが含まれているので共有するときは注意してください。"
},
"setOptions": {
"message": "設定する"
"message": "オプション設定"
},
"exportOptionsWarning": {
"message": "警告: 設定の変更は恒久的で,本拡張機能を破壊する可能性があります。本当に実行しますか? 念のため,旧設定を控えておいてください。"
@@ -469,7 +472,7 @@
"message": "編集"
},
"copyDebugInformation": {
"message": "詳細情報をクリップボードに写す"
"message": "デバッグ情報をクリップボードにコピー"
},
"copyDebugInformationFailed": {
"message": "クリップボードに書き込めませんでした"
@@ -481,10 +484,10 @@
"message": "診断用情報がクリップボードに複製されました。共有したくない情報があればそこから削除できます。これをファイルに保存したり,不具合報告に貼り付けてください。"
},
"theKey": {
"message": "鍵束縛"
"message": "キー"
},
"keyAlreadyUsed": {
"message": "はの動作に割り当て済みです。違う鍵を設定してください。"
"message": "はの動作に割り当てられています。異なったキーを選択してください。"
},
"to": {
"message": "",
@@ -533,10 +536,10 @@
"message": "前回の粗筋,または動画の後半内容の予告。音声による要約ではなく,編集された映像を指します。"
},
"category_music_offtopic": {
"message": "音楽: 音楽ではない区間"
"message": "音楽: 音楽以外のセクション"
},
"category_music_offtopic_description": {
"message": "MVでの使用できます。MVにおける飛び越したい場面のうち他の範疇に該当しないものです。"
"message": "ミュージックビデオでの使用に限ります。他のカテゴリーに含まれていないミュージックビデオのセクションにのみ使用してください。"
},
"category_music_offtopic_short": {
"message": "音楽以外の部分"
@@ -557,7 +560,7 @@
"message": "シークバーに表示"
},
"colorFormatIncorrect": {
"message": "色の書式が正しくありません。井桁記号に続く3桁あるいは6桁の16進数である必要があります。"
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
},
"previewColor": {
"message": "未確定の色",
@@ -570,7 +573,7 @@
"message": "カテゴリ"
},
"skipOption": {
"message": "飛び越し設定",
"message": "スキップ設定",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
@@ -621,16 +624,16 @@
"message": "許可を承認する"
},
"permissionRequestSuccess": {
"message": "許可要求が成功しました"
"message": "許可リクエストが成功しました"
},
"permissionRequestFailed": {
"message": "権限要求に失敗しました。承認を拒否しましたか?"
"message": "権限要求に失敗しました。拒否をクリックしましたか?"
},
"adblockerIssueWhitelist": {
"message": "これを解決できない場合は,「飛び越し前に強制的に番組を検査する」を無効にしてください。SponsorBlockはこの動画の番組情報を取得できませんでした。"
"message": "これを解決できない場合は、設定「スキップする前にチャンネルチェックを強制」を無効にしてください。 SponsorBlockはこのビデオのチャンネル情報を取得できません。"
},
"forceChannelCheck": {
"message": "飛び越し前に強制的に番組を検査する"
"message": "スキップする前にチャンネルチェックを強制する"
},
"whatForceChannelCheck": {
"message": "デフォルト設定では、チャンネル情報を取得する前にセグメントをスキップします。デフォルト設定では、ホワイトリストに追加されているチャンネルでも動画の先頭部分にあるセグメントがスキップされる場合があります。この設定を有効にするとこの挙動が回避されますが、channelIDの取得に時間がかかるため、すべてのスキップに遅延が発生します。高速なインターネット回線を使用している場合は気にならないかもしれません。"
@@ -664,13 +667,7 @@
"message": "導入画面・終了画面・商品紹介などを飛び越す個人設定を開きます。"
},
"help": {
"message": "手引き"
},
"experimentUnlistedTitle": {
"message": "これが消えないようにできます。"
},
"experimentUnlistedText": {
"message": "この動画は2017年以前の限定公開動画のようです。\n古い限定公開動画は来月中に非公開にされます。\nSponsorBlockでは**公開されている**動画の情報を収集しています。\nこの動画をSponsorBlockに匿名で送信していただけますか\n参考: https://support.google.com/youtube/answer/9230970"
"message": "ヘルプ"
},
"experiementOptOut": {
"message": "実験的機能をすべて無効にする",

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "유튜브 동영상을 찾을 수 없습니다.\n오류라면, 탭을 새로고침해보세요."
},
"refreshSegments": {
"message": "구간 새로고침"
},
"success": {
"message": "성공!"
},
@@ -666,6 +669,10 @@
"help": {
"message": "도움"
},
"experiementOptOut": {
"message": "향후 모든 실험 기능 비활성화",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "다시 보지 않음"
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is."
},
"refreshSegments": {
"message": "Segmenten vernieuwen"
},
"success": {
"message": "Gelukt!"
},
@@ -666,12 +669,6 @@
"help": {
"message": "Help"
},
"experimentUnlistedTitle": {
"message": "Helpen voorkomen dat dit verdwijnt"
},
"experimentUnlistedText": {
"message": "Deze video is gedetecteerd als niet-genoteerd en geüpload voor 2017.\nOude niet-genoteerde video's worden volgende maand op privé gezet.\nWe zijn *publieke* video's aan het verzamelen om te backuppen.\nWilt u deze video anoniem naar ons toesturen?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Uitschrijven van alle toekomstige experimenten",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -666,12 +666,6 @@
"help": {
"message": "Pomoc"
},
"experimentUnlistedTitle": {
"message": "Pomóż zapobiec zniknięciu tego"
},
"experimentUnlistedText": {
"message": "Ten film jest wykryty jako nienotowany i przesłany przed 2017 r.\nStare filmy nienotowane są ustawione na prywatne w przyszłym miesiącu\nZbieramy *publiczne* filmy do kopii zapasowej\nCzy chcesz anonimowo wysłać do nas ten film?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Wyłączenie wszystkich przyszłych eksperymentów",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Nenhum vídeo do YouTube encontrado.\nSe isto estiver incorreto, atualize a aba."
},
"refreshSegments": {
"message": "Atualizar segmentos"
},
"success": {
"message": "Sucesso!"
},
@@ -185,6 +188,9 @@
"whatInfoButton": {
"message": "Este é o botão que abre o popup na pagina do Youtube."
},
"autoHideInfoButton": {
"message": "Esconder automaticamente botão de informação"
},
"hideDeleteButton": {
"message": "Esconder botão de Apagar no player do Youtube"
},
@@ -200,6 +206,9 @@
"whatViewTracking": {
"message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e é usado como métrica, juntamente com votos positivos para garantir que spam não entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)"
},
"enableViewTrackingInPrivate": {
"message": "Ativar Pular Contagem de Rastreamento em abas Privadas/Incógnito"
},
"enableQueryByHashPrefix": {
"message": "Consulta Por Prefixo Hash"
},
@@ -347,9 +356,25 @@
"keybindCurrentlySet": {
"message": ". Atualmente, está definido para:"
},
"supportOtherSites": {
"message": "Suporte a Sites do YouTube de terceiros"
},
"supportOtherSitesDescription": {
"message": "Apoie clientes de terceiros do YouTube. Para habilitar o suporte, você deve aceitar as permissões extras. Isso NÃO funciona em incógnito no Chrome e outras variantes do Chromium.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Sites Suportados: "
},
"optionsInfo": {
"message": "Ativar apoio ao Invidious, desabilitar pular automaticamente, ocultar botões e mais."
},
"addInvidiousInstance": {
"message": "Adicionar Instância de Cliente de Terceiros"
},
"addInvidiousInstanceDescription": {
"message": "Adicione uma instância personalizada. Isso deve ser formatado com APENAS o domínio. Exemplo: invidious.ajay.app"
},
"add": {
"message": "Adicionar"
},
@@ -371,6 +396,12 @@
"minDurationDescription": {
"message": "Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."
},
"skipNoticeDuration": {
"message": "Duração do aviso prévio de pular (segundos):"
},
"skipNoticeDurationDescription": {
"message": "O aviso de pular ficará na tela por pelo menos este tempo. Para o pular manual, pode ser visível por mais tempo."
},
"shortCheck": {
"message": "A seguinte submissão é mais curta do que sua opção de duração mínima. Isto significa que já foi enviada e que está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"
},
@@ -431,6 +462,9 @@
"preview": {
"message": "Pré-visualizar"
},
"unsubmitted": {
"message": "Não enviado"
},
"inspect": {
"message": "Inspecionar"
},
@@ -495,6 +529,12 @@
"category_outro_description": {
"message": "Créditos ou quando os cards finais do YouTube aparecem. Não deve ser usado para conclusões informativas."
},
"category_preview": {
"message": "Pré-visualização/Recapitulação"
},
"category_preview_description": {
"message": "Recapitulação rápida de episódios anteriores, ou uma prévia do que está chegando mais tarde no vídeo atual. Destinado a clipes editados juntos, não para resumos falados."
},
"category_music_offtopic": {
"message": "Música: Seção sem música"
},
@@ -522,6 +562,10 @@
"colorFormatIncorrect": {
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma tralha / hashtag no início."
},
"previewColor": {
"message": "Cor Não Enviada",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Cor da barra"
},
@@ -621,5 +665,15 @@
},
"categoryUpdate2": {
"message": "Abra as opções para ignorar as introduções, outros, promoção de mercadoria, etc."
},
"help": {
"message": "Ajuda"
},
"experiementOptOut": {
"message": "Optar por sair de todos os experimentos futuros",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Ocultar para sempre"
}
}

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Видео YouTube не найдено.\nЕсли это не так, обновите вкладку."
},
"refreshSegments": {
"message": "Обновить сегменты"
},
"success": {
"message": "Успех!"
},
@@ -527,7 +530,7 @@
"message": "Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео."
},
"category_preview": {
"message": "Предварительный просмотр/краткое содержание"
"message": "Предпросмотр/краткое содержание"
},
"category_preview_description": {
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
@@ -666,12 +669,6 @@
"help": {
"message": "Помощь"
},
"experimentUnlistedTitle": {
"message": "Помогите архивировать это видео"
},
"experimentUnlistedText": {
"message": "Это видео было загружено до 2017 и имеет доступ по ссылке\nДля всех подобных видео в следующем месяце будет установлен ограниченный доступ\nМы собираем *публичные* видео для резервного копирования\nВы хотели бы анонимно отправить нам это видео?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Отказаться от всех будущих экспериментов",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Nenašlo sa žiadne YouTube video.\nAk je to chyba, obnovte záložku."
},
"refreshSegments": {
"message": "Znova načítať segmenty"
},
"success": {
"message": "Hotovo!"
},
@@ -666,12 +669,6 @@
"help": {
"message": "Pomocník"
},
"experimentUnlistedTitle": {
"message": "Pomôžte zamedziť zmiznutiu tohto videa"
},
"experimentUnlistedText": {
"message": "Toto video bolo nahraté pred r. 2007 a je nezverejnené.\nTakéto videá budú o mesiac zmenené na súkromné.\nZbierame a zálohujeme *verejné*.\nChceli by ste nám toto video anonymne poslať?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Odmietnuť všetky budúce experimenty",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -8,7 +8,7 @@
"description": "Description of the extension."
},
"400": {
"message": "Felaktigt anrop enligt servern"
"message": "Servern sa att denna begäran var ogiltig"
},
"429": {
"message": "Du har rapporterat för många sponsormeddelanden för den här videon, är du säker att det finns så många?"
@@ -65,7 +65,7 @@
"message": "Är du säker på att du vill rensa detta?\n\n"
},
"Unknown": {
"message": "Ett fel uppstod vid rapportering av sponsorsegment, försök igen senare."
"message": "Ett fel uppstod vid rapportering av sponsormeddelandet, försök igen senare."
},
"sponsorFound": {
"message": "Denna video har segment i databasen!"
@@ -80,11 +80,14 @@
"message": "Segmentet slutar nu"
},
"sponsorCancel": {
"message": "Avbryt skapandet av segmentet"
"message": "Avbryt skapande av segment"
},
"noVideoID": {
"message": "Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt."
},
"refreshSegments": {
"message": "Uppdatera segment"
},
"success": {
"message": "Klart!"
},
@@ -168,13 +171,13 @@
"message": "Alternativ"
},
"showButtons": {
"message": "Visa Knappar På YouTube-spelaren"
"message": "Visa knappar på YouTube-spelaren"
},
"hideButtons": {
"message": "Dölj Knappar På YouTube-spelaren"
},
"hideButtonsDescription": {
"message": "Detta döljer knapparna på YouTube-spelaren som du kan rapportera sponsormeddelanden med. Jag förstår att det kan se störande ut för en del. Istället för att ha knappen där kan den här popup-rutan användas för att rapportera sponsormeddelanden. För att dölja notisen som dyker upp, tryck på knappen som syns på notisen som säger \"Visa inte det här igen\". Du kan alltid slå på dessa inställningar igen senare."
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
},
"showInfoButton": {
"message": "Visa Infoknapp På YouTube-spelaren"
@@ -192,16 +195,16 @@
"message": "Dölj \"Ta Bort\"-knappen På YouTube-spelaren"
},
"showDeleteButton": {
"message": "Visa \"Ta Bort\"-knappen På YouTube-spelaren"
"message": "Visa knappen ta bort på YouTube-spelaren"
},
"whatDeleteButton": {
"message": "Denna knappen tar bort alla sponsormeddelanden på YouTube-spelaren."
"message": "Den här knappen på YouTube-spelaren rensar bort alla segment som ej har skickats in på aktuell video."
},
"enableViewTracking": {
"message": "Aktivera spåra antalet hoppa över"
},
"whatViewTracking": {
"message": "Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid en användare har sparat andra och tillsammans med användarnas röster säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar inte folk den här inställningen så statistiken hålls tillförlitlig. :)"
"message": "Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid en användare har sparat andra och tillsammans med användarnas röster säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar de flesta inte den här inställningen så statistiken hålls tillförlitlig. :)"
},
"enableViewTrackingInPrivate": {
"message": "Aktivera spåra antalet hoppa över i privata/inkognitoflikar"
@@ -216,7 +219,7 @@
"message": "Uppdatera segment på nya videor"
},
"whatRefetchWhenNotFound": {
"message": "Om videon är ny och inga segment hittades då kommer den att uppdatera med några minuter mellanrum medan du tittar på videon."
"message": "Om videon är ny och inga segment hittades då kommer den att uppdateras med några minuters mellanrum medan du tittar på videon."
},
"showNotice": {
"message": "Visa Notisen Igen"
@@ -248,7 +251,7 @@
"message": "Ange den genväg som ska fungera som start-/stopptangent för ett segment"
},
"setSubmitKeybind": {
"message": "Välj knapp att koppla till rapportering av sponsormeddelande"
"message": "Ange den tangent som ska fungera som inskickningstangent"
},
"keybindDescription": {
"message": "Ange tangent genom att trycka på den"
@@ -291,7 +294,7 @@
"message": "Aktivera Hoppa Över Automatiskt"
},
"audioNotification": {
"message": "Ljudeffekt vid hopp"
"message": "Ljudavisering vid hoppa över"
},
"audioNotificationDescription": {
"message": "Ljudavisering vid hoppa över kommer att spela upp ett ljud när ett segment hoppas över. Om inaktiverad (eller om hoppa över automatiskt är inaktiverat), kommer inget ljud att spelas upp."
@@ -333,7 +336,7 @@
"message": "Importera/Exportera Ditt AnvändarID"
},
"whatChangeUserID": {
"message": "Detta bör hållas hemligt. Det fungerar som ett lösenord och borde inte delas vidare med någon. Om någon kommer över detta kan den personen utge sig för att vara dig."
"message": "Denna ska hållas privat. Den fungerar som ett lösenord och ska inte delas med någon. Om någon får tag i den kan de utge sig för att vara dig."
},
"setUserID": {
"message": "Ange AnvändarID"
@@ -345,7 +348,7 @@
"message": "Skapad av"
},
"autoSkip": {
"message": "Hoppa Över Automatiskt"
"message": "Hoppa över automatiskt"
},
"showSkipNotice": {
"message": "Visa ett meddelande efter att ett segment har hoppats över"
@@ -357,14 +360,14 @@
"message": "Stöd för tredjeparts YouTube-webbplatser"
},
"supportOtherSitesDescription": {
"message": "Stöd tredje parts YouTube-klienter. För att aktivera support måste du acceptera de extra behörigheterna. Detta fungerar INTE i inkognito på Chrome och andra Chromium-varianter.",
"message": "Stöd tredjeparts YouTube-klienter. För att aktivera support måste du acceptera de extra behörigheterna. Detta fungerar INTE i inkognito på Chrome och andra Chromium-varianter.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Webbplatser som stöds: "
},
"optionsInfo": {
"message": "Aktivera Invidious stöd, inaktivera hoppa över automatiskt, dölj knappar och mer."
"message": "Aktivera stöd för Invidious, inaktivera hoppa över automatiskt, dölj knappar och mer."
},
"addInvidiousInstance": {
"message": "Lägg till tredjepartsklientinstans"
@@ -376,7 +379,7 @@
"message": "Lägg till"
},
"addInvidiousInstanceError": {
"message": "Detta är en individuell domän. Den måste ENBART inkludera domändelen. Exempelvis: invidious.ajay.app"
"message": "Detta är en ogiltig domän. Den ska ENDAST inkludera domändelen. Exempelvis: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Rensa Invidious instanslista"
@@ -403,16 +406,16 @@
"message": "Följande rapport är kortare än ditt minstavärde i inställningarna. Det skulle kunna betyda att det redan är rapporterat och bara ignorerat på grund av denna inställning. Är du säker på att du vill rapportera?"
},
"showUploadButton": {
"message": "Visa Uppladdningsknapp"
"message": "Visa uppladdningsknapp"
},
"whatUploadButton": {
"message": "Denna knapp visas på YouTube-spelaren efter att du har valt en tidpunkt och är redo att rapportera."
},
"customServerAddress": {
"message": "SponsorBlock Serveradress"
"message": "Serveradress för SponsorBlock"
},
"customServerAddressDescription": {
"message": "Adressen SponsorBlock använder för att prata med servern.\nOm du inte har din egen serverinstans ska den här inställningen inte ändras."
"message": "Adressen SponsorBlock använder för att kommunicera med servern.\nOm du inte har din egen serverinstans ska den här inställningen inte ändras."
},
"save": {
"message": "Spara"
@@ -433,7 +436,7 @@
"message": "Importera/Exportera alla alternativen"
},
"whatExportOptions": {
"message": "Detta är alla dina alternativ i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar datan."
"message": "Detta är alla dina alternativ i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar informationen."
},
"setOptions": {
"message": "Ange alternativ"
@@ -551,10 +554,10 @@
"message": "Inaktivera"
},
"manualSkip": {
"message": "Hoppa Över Manuellt"
"message": "Hoppa över manuellt"
},
"showOverlay": {
"message": "Visa Lager Ovanpå Spelare"
"message": "Visa i sökfältet"
},
"colorFormatIncorrect": {
"message": "Din färg är felaktigt formaterad. Det ska vara en 3- eller 6-siffrig hex-kod med en siffra i början."
@@ -580,7 +583,7 @@
"message": "Dina rapporter och röster KOMMER INTE RÄKNAS mot huvudservern. Använd endast detta för testning."
},
"testingServerWarning": {
"message": "Alla rapporter och röster KOMMER INTE RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att avaktivera detta när du vill rapportera ett riktigt sponsormeddelande."
"message": "Alla inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att inaktivera detta när du vill skicka in riktiga inskickningar."
},
"bracketNow": {
"message": "(Nu)"
@@ -633,7 +636,7 @@
"message": "Tvinga kontroll av kanalen innan hoppa över"
},
"whatForceChannelCheck": {
"message": "Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det göra att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling."
"message": "Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det gör att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling."
},
"forceChannelCheckPopup": {
"message": "Överväg att aktivera \"Tvinga kontroll av kanalen innan hoppa över\""
@@ -666,12 +669,6 @@
"help": {
"message": "Hjälp"
},
"experimentUnlistedTitle": {
"message": "Hjälp till att förhindra att detta försvinner"
},
"experimentUnlistedText": {
"message": "Detta är en olistad videon som laddades upp före 2017.\nGamla olistade videor kommer att bli ändrade till privata nästa månad.\nVi samlar in *offentliga* videor för att säkerhetskopiera.\nVill du anonymt skicka den här videon till oss?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Hoppa av alla framtida experiment",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -71,7 +71,7 @@
"message": "Bu videonun kısımları veri tabanımızda mevut"
},
"sponsor404": {
"message": "Kısımlar bulunamadı"
"message": "Kısım bulunamadı"
},
"sponsorStart": {
"message": "Kısım Şimdi Başlıyor"
@@ -85,6 +85,9 @@
"noVideoID": {
"message": "YouTube videosu bulunamadı.\nHatalı olduğunu düşünüyorsanız sayfayı yenileyin."
},
"refreshSegments": {
"message": "Kısımları tazele"
},
"success": {
"message": "Başarılı!"
},
@@ -666,12 +669,6 @@
"help": {
"message": "Yardım"
},
"experimentUnlistedTitle": {
"message": "Bunun kaybolmasını önlemeye yardımcı ol"
},
"experimentUnlistedText": {
"message": "Bu video liste dışı ve 2017'den önce yüklenmiş\nListe dışı eski videolar önümüzdeki aydan itibaren gizli hâle getirilecek\n*Herkese açık* videoları derleyerek yedekliyoruz\nBu videoyu bize anonim kalarak göndermek ister misiniz?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Gelecekteki deneylerin hiçbirine katılma",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -654,12 +654,6 @@
"categoryUpdate2": {
"message": "Відкрийте налаштування, щоб пропускати початкові і кінцеві заставки, саморекламу та інше."
},
"experimentUnlistedTitle": {
"message": "Допоможіть цьому не зникнути"
},
"experimentUnlistedText": {
"message": "Це відео приховане і завантажено до 2017.\nСтарі приховані відео стануть приватними наступного місяця\nМи збираємо загальнодоступні відео для резервного копіювання\nЧи ви хочете анонімно надіслати це відео нам?\nhttps://support.google.com/youtube/answer/9230970"
},
"experiementOptOut": {
"message": "Відмова від усіх майбутніх експериментів",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Không tìm thấy video nào.\nNếu sai, hãy thử tải lại thẻ này."
},
"refreshSegments": {
"message": "Làm mới segments"
},
"success": {
"message": "Thành công!"
},
@@ -393,6 +396,12 @@
"minDurationDescription": {
"message": "Đoạn quảng cáo ngắn hơn giá trị được đặt sẽ không bị bỏ qua hoặc hiển thị trong trình chạy video."
},
"skipNoticeDuration": {
"message": "Thời gian tự động đóng bảng thông báo phân đoạn (giây):"
},
"skipNoticeDurationDescription": {
"message": "Đặt thời gian hiển thị bảng thông báo phân đoạn. Nếu như bạn tự nhấn nút bỏ qua, nó sẽ hiện lâu hơn 1 chút."
},
"shortCheck": {
"message": "Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?"
},
@@ -494,7 +503,7 @@
"message": "Quảng cáo không trả công/Tự quảng cáo"
},
"category_selfpromo_description": {
"message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác với."
"message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác cùng."
},
"category_interaction": {
"message": "Nhắc tương tác (Đăng ký)"
@@ -524,7 +533,7 @@
"message": "Xem trước/Tóm tắt"
},
"category_preview_description": {
"message": "Tóm tắt nhanh về tập trước/tập sau trong 1 chuỗi video (series) dài (hoặc cũng có thể là tóm tắt trước về video sắp chiếu)."
"message": "Tóm tắt nhanh các tập trước, hoặc xem trước những gì sẽ xảy ra sau video hiện tại. Dùng cho các đoạn clip gắn kèm với nhau, không phải cho tóm tắt bằng lời."
},
"category_music_offtopic": {
"message": "Nhạc: Phần không nhạc"
@@ -553,8 +562,12 @@
"colorFormatIncorrect": {
"message": "Mã màu sai định dạng. Mã màu phải có 3 hoặc 6 ký tự hệ hex và có dấu thăng ở đầu."
},
"previewColor": {
"message": "Màu khi chưa được gửi đi",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Màu của thanh xem trước"
"message": "Màu của thanh tìm kiếm"
},
"category": {
"message": "Thể loại"
@@ -597,6 +610,18 @@
"hiddenDueToDuration": {
"message": "đã bị ẩn: quá ngắn"
},
"youtubePermissionRequest": {
"message": "Có vẻ như SponsorBlock không thể truy cập API YouTube. Để khắc phục điều này, hãy chấp nhận lời nhắc cấp quyền sẽ xuất hiện tiếp theo, đợi vài giây rồi tải lại trang."
},
"acceptPermission": {
"message": "Cho phép truy cập"
},
"permissionRequestSuccess": {
"message": "Đã có quyền truy cập!"
},
"permissionRequestFailed": {
"message": "Truy cập bị từ chối, bạn đã nhấp vào từ chối à?"
},
"forceChannelCheck": {
"message": "Bắt buộc kiểm tra kênh trước khi bỏ qua"
},

View File

@@ -85,6 +85,9 @@
"noVideoID": {
"message": "找不到 YouTube 影片。\n如果這是不正確的重新整理此分頁"
},
"refreshSegments": {
"message": "重新載入片段"
},
"success": {
"message": "成功!"
},
@@ -185,6 +188,9 @@
"whatInfoButton": {
"message": "這個按鈕可用來在 YouTube 頁面打開彈出視窗"
},
"autoHideInfoButton": {
"message": "自動隱藏資訊按鈕"
},
"hideDeleteButton": {
"message": "在 YouTube 播放器上隱藏刪除按鈕"
},
@@ -387,6 +393,9 @@
"minDurationDescription": {
"message": "小於設定值的片段不會被跳過或在播放器中顯示"
},
"skipNoticeDurationDescription": {
"message": "跳過片段提示的顯示時間將會以上列時間長度為準(單位:秒);手動跳過的時候會顯示較長於上面的時間"
},
"shortCheck": {
"message": "以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?"
},
@@ -517,9 +526,15 @@
"category_preview": {
"message": "預覽/摘要"
},
"category_preview_description": {
"message": "係指影片的前情提要或內容預告等刻意編輯過的內容"
},
"category_music_offtopic": {
"message": "音樂:非音樂部分"
},
"category_music_offtopic_description": {
"message": "此功能僅供音樂影片使用。本功能僅應該用於音樂錄影帶中並未包含其他類別的段落。"
},
"category_music_offtopic_short": {
"message": "非音樂"
},
@@ -590,10 +605,10 @@
"message": "隱藏:太短"
},
"videoInfoFetchFailed": {
"message": "似乎有東西在阻止 SponsorBlock 取影片資料。請查看 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
"message": "似乎有東西在阻止 SponsorBlock 取影片資料。請 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
},
"youtubePermissionRequest": {
"message": "SponsorBlock 貌似無法存取 YouTube API。若要解決請同意稍後出現的權限提示等待幾秒鐘然後重新載入頁面。"
"message": "SponsorBlock 貌似無法存取 YouTube API。若要解決此問題,請同意稍後出現的權限提示,等待幾秒鐘,然後重新載入頁面。"
},
"acceptPermission": {
"message": "允許權限"
@@ -642,7 +657,7 @@
"message": "開啟選項以跳過開場、結尾、工商等。"
},
"help": {
"message": "幫助"
"message": "說明"
},
"experiementOptOut": {
"message": "關閉所有未來的實驗性功能",

View File

@@ -121,8 +121,19 @@
margin-left: 5px;
}
.sbChatNotice {
min-width: 350px;
height: 70%;
position: absolute;
right: 5px;
bottom: 100px;
right: 10px;
}
.sponsorSkipNotice {
min-width: 350px;
max-width: 50%;
background-color: rgba(28, 28, 28, 0.9);
position: absolute;
right: 5px;
@@ -445,4 +456,15 @@ input::-webkit-inner-spin-button {
}
.helpButton:hover {
filter: brightness(80%);
}
.sbChatNotice iframe {
height: 32px;
cursor: pointer;
height: 100%;
}
.sbChatClose {
height: 14px;
cursor: pointer;
}

View File

@@ -19,18 +19,18 @@
<p class="createdBy">Created By <a href="https://ajay.app">Ajay Ramachandran</a> <img src="https://ajay.app/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
<p>
Thanks for installing SponsorBlock. Here are some quick tips for getting started. Feel free to contact me if you have any questions. By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
Thanks for installing SponsorBlock. By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
</p>
<p class="projectPreview">
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
Come contribute, make some suggestions and help out on <a href="https://discord.gg/QnmVMpU">Discord</a> or on <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org">Matrix</a>.
</p>
<p style="margin-bottom: 0" class="bigText center">Please review the options below</p>
<p>
Many features are disabled by default. If you want to skip Intros, outros, use Invidious, please enable the specific options. These can be enabled or disabled at any time.
You can also hide/show all UI elements added to the YouTube page.
Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below.
You can also hide/show UI elements.
</p>
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
@@ -59,12 +59,12 @@
<img src="https://i.imgur.com/A1ilk6x.gif">
</span>
Submitting can either be done in the popup by hitting the "Sponsorship Starts Now" button or in the video player with the buttons on the player.
Submitting can either be done in the popup by hitting the "Segment Starts Now" button or in the video player with the buttons on the player.
<br/>
<br/>
Clicking the play button indicated the start of a sponsorship section and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete.
Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete.
</p>
<h1>Editing</h1>
@@ -74,27 +74,21 @@
<img src="https://i.imgur.com/DZHqbsx.gif">
</span>
If you messed up, you can edit or delete your sponsor times in the popup or in the info menu (by hitting the info icon).
If you messed up, you can edit or delete your segments in the popup or in the info menu (by hitting the info icon).
</p>
<h1>This is too slow</h1>
<p>
There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit.
There are hotkeys if you want to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit.
These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding.
</p>
<h1>I hate these buttons, they are so ugly</h1>
<p>
All player buttons can be hidden in the options.
</p>
<h1>Can I get a copy of the Database? What happens if you disappear?</h1>
<p>
The database is public and available at <a href="https://sponsor.ajay.app/database.db">https://sponsor.ajay.app/database.db</a>. The source code is freely available. So, even if something happens to me, your submissions are not lost.
The database is public and available at <a href="https://sponsor.ajay.app/database">https://sponsor.ajay.app/database</a> and the source code is freely available. So, even if something happens to me, your submissions are not lost.
</p>
<h1>News and how it is made</h1>
@@ -103,12 +97,6 @@
See <a href="https://sponsor.ajay.app/news">https://sponsor.ajay.app/news</a>.
</p>
<h1>I want more features!</h1>
<p>
Ask on Discord or make an Issue on GitHub. I am happy to hear suggestions or improvements you want. You may also contribute code or graphics if you would like.
</p>
<h1>Where can I get the source code?</h1>
<h4 style="display: inline">Client:</h4>

View File

@@ -1,3 +1,7 @@
html {
color-scheme: dark;
}
.bigText {
font-size: 50px;
}

View File

@@ -1,4 +1,8 @@
/* Options page CSS */
html {
color-scheme: dark;
}
body {
font-family: sans-serif;
}

View File

@@ -1,4 +1,8 @@
/* Options page CSS */
html {
color-scheme: dark;
}
body {
font-family: sans-serif;
}

View File

@@ -6,6 +6,10 @@
--sb-green-bg: #077B27;
}
#sponsorBlockPopupHTML {
color-scheme: dark;
}
#sponsorBlockPopupBody .hidden {
display: none !important;
}
@@ -28,6 +32,8 @@
margin: auto;
width: 374px;
background: var(--sb-main-bg-color);
color-scheme: dark;
}
#sponsorblockPopup {

View File

@@ -1,152 +1,154 @@
<head>
<title>__MSG_openPopup__</title>
<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">
<html id="sponsorBlockPopupHTML">
<head>
<title>__MSG_openPopup__</title>
<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">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body id="sponsorBlockPopupBody">
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
<div class="logoText bottomSpace">
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
<p>SponsorBlock</p>
</div>
<div id="videoInfo" class="bottomSpace">
<div class="bottomSpace">
<!-- Loading text -->
<p id="loadingIndicator">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound"></p>
<button class="sbSlimButton" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img id="refreshSegments" src="/icons/refresh.svg"/>
</button>
<body id="sponsorBlockPopupBody">
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
<div class="logoText bottomSpace">
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
<p>SponsorBlock</p>
</div>
<div id="issueReporterContainer">
<div id="issueReporterTimeButtons"></div>
<div id="videoInfo" class="bottomSpace">
<div class="bottomSpace">
<!-- Loading text -->
<p id="loadingIndicator">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound"></p>
<button class="sbSlimButton hidden" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img id="refreshSegments" src="/icons/refresh.svg"/>
</button>
</div>
<div id="issueReporterContainer">
<div id="issueReporterTimeButtons"></div>
</div>
</div>
</div>
<div class="sidebyside">
<div id="disableExtension">
<!--github: mbledkowski/toggle-switch-->
<label for="toggleSwitch" class="toggleSwitchContainer">
<input type="checkbox" style="display:none;" id="toggleSwitch" checked>
<span class="switchBg shadow"></span>
<span class="switchBg white"></span>
<span class="switchBg green"></span>
<span class="switchDot"></span>
</label>
<p id="disableSkipping">__MSG_disableSkipping__</p>
<p id="enableSkipping" style="display: none">__MSG_enableSkipping__</p>
</div>
<div id="additionalButtons">
<!-- grayedOut until loading complete -->
<div id="whitelistButton" class="hidden bottomSpace" title="__MSG_forceChannelCheckPopup__">
<input type="checkbox" style="display:none;" id="whitelistToggle">
<label for="whitelistToggle" class="whitelistToggleText">
<div class="SBWhitelistIconContainer">
<svg viewBox="0 0 24 24" width="16" height="16" class="SBWhitelistIcon">
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
</svg>
</div>
<p id="whitelistChannel">__MSG_whitelistChannel__</p>
<p id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</p>
<div class="sidebyside">
<div id="disableExtension">
<!--github: mbledkowski/toggle-switch-->
<label for="toggleSwitch" class="toggleSwitchContainer">
<input type="checkbox" style="display:none;" id="toggleSwitch" checked>
<span class="switchBg shadow"></span>
<span class="switchBg white"></span>
<span class="switchBg green"></span>
<span class="switchDot"></span>
</label>
<p id="disableSkipping">__MSG_disableSkipping__</p>
<p id="enableSkipping" style="display: none">__MSG_enableSkipping__</p>
</div>
<button id="optionsButton" title="__MSG_optionsInfo__">
<img src="/icons/settings.svg" alt="Settings icon" width="16" height="16" id="sbPopupIconSettings">
__MSG_Options__
</button>
</div>
</div>
<div id="whitelistForceCheck" class="hidden">
__MSG_forceChannelCheckPopup__
</div>
<div id="mainControls" style="display: none">
<p class="sbHeader sbSubHeader">
__MSG_recordTimesDescription__
</p>
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
<div>
<button id="sponsorStart" class="mediumButton">__MSG_sponsorStart__</button>
</div>
<div id="submissionSection" style="display: none">
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
<div id="submitTimesContainer" style="margin-top: 12px;">
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
</div>
</div>
</div>
<h1 class="recordingSubtitle sbHeader sbSubHeader">__MSG_yourWork__</h1>
<div class="sidebyside">
<div id="usernameElement">
<div>
<p>__MSG_Username__:</p>
<div id="setUsernameContainer">
<p id="usernameValue"></p>
<button id="setUsernameButton" title="__MSG_setUsername__">
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
</button>
<div id="additionalButtons">
<!-- grayedOut until loading complete -->
<div id="whitelistButton" class="hidden bottomSpace" title="__MSG_forceChannelCheckPopup__">
<input type="checkbox" style="display:none;" id="whitelistToggle">
<label for="whitelistToggle" class="whitelistToggleText">
<div class="SBWhitelistIconContainer">
<svg viewBox="0 0 24 24" width="16" height="16" class="SBWhitelistIcon">
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
</svg>
</div>
<p id="whitelistChannel">__MSG_whitelistChannel__</p>
<p id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</p>
</label>
</div>
<div id="setUsername" style="display: none">
<div id="setUsernameStatusContainer" style="display: none">
<p id="setUsernameStatus"></p>
<button id="optionsButton" title="__MSG_optionsInfo__">
<img src="/icons/settings.svg" alt="Settings icon" width="16" height="16" id="sbPopupIconSettings">
__MSG_Options__
</button>
</div>
</div>
<div id="whitelistForceCheck" class="hidden">
__MSG_forceChannelCheckPopup__
</div>
<div id="mainControls" style="display: none">
<p class="sbHeader sbSubHeader">
__MSG_recordTimesDescription__
</p>
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
<div>
<button id="sponsorStart" class="mediumButton">__MSG_sponsorStart__</button>
</div>
<div id="submissionSection" style="display: none">
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
<div id="submitTimesContainer" style="margin-top: 12px;">
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
</div>
</div>
</div>
<h1 class="recordingSubtitle sbHeader sbSubHeader">__MSG_yourWork__</h1>
<div class="sidebyside">
<div id="usernameElement">
<div>
<p>__MSG_Username__:</p>
<div id="setUsernameContainer">
<p id="usernameValue"></p>
<button id="setUsernameButton" title="__MSG_setUsername__">
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
</button>
</div>
<input id="usernameInput" hint="Username"></input>
<button id="submitUsername">
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
</button>
<div id="setUsername" style="display: none">
<div id="setUsernameStatusContainer" style="display: none">
<p id="setUsernameStatus"></p>
</div>
<input id="usernameInput" hint="Username"></input>
<button id="submitUsername">
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
</button>
</div>
</div>
</div>
<div id="sponsorTimesContributionsContainer" class="hidden">
<div>
<p>__MSG_Submissions__:</p>
<span id="sponsorTimesContributionsDisplay">
0
</span>
</div>
</div>
</div>
<div id="sponsorTimesContributionsContainer" class="hidden">
<div>
<p>__MSG_Submissions__:</p>
<span id="sponsorTimesContributionsDisplay">
<span id="sponsorTimesViewsContainer" style="display: none">
__MSG_savedPeopleFrom__
<b><span id="sponsorTimesViewsDisplay">
0
</span></b>
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
<br>
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
<span>__MSG_youHaveSavedTimeEnd__</span>).
</span>
<div id="sponsorTimesSkipsDoneContainer" style="display: none">
__MSG_youHaveSkipped__
<b><span id="sponsorTimesSkipsDoneDisplay">
0
</span></b>
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
(<b><span id="sponsorTimeSavedDisplay">
0
</span>
</div>
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
</div>
</div>
<footer id="sbFooter">
<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://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<br/>
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
</footer>
<span id="sponsorTimesViewsContainer" style="display: none">
__MSG_savedPeopleFrom__
<b><span id="sponsorTimesViewsDisplay">
0
</span></b>
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
<br>
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
<span>__MSG_youHaveSavedTimeEnd__</span>).
</span>
<div id="sponsorTimesSkipsDoneContainer" style="display: none">
__MSG_youHaveSkipped__
<b><span id="sponsorTimesSkipsDoneDisplay">
0
</span></b>
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
(<b><span id="sponsorTimeSavedDisplay">
0
</span>
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
</div>
<footer id="sbFooter">
<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://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<br/>
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
</footer>
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
</div>
<!-- Scripts that need to load after the html -->
<script src="./js/vendor.js" async></script>
<script src="./js/popup.js" async></script>
</body>
<!-- Scripts that need to load after the html -->
<script src="./js/vendor.js" async></script>
<script src="./js/popup.js" async></script>
</body>
</html>

View File

@@ -164,11 +164,7 @@ async function asyncRequestToServer(type: string, address: string, data = {}) {
async function sendRequestToCustomServer(type: string, url: string, data = {}) {
// If GET, convert JSON to parameters
if (type.toLowerCase() === "get") {
for (const key in data) {
const seperator = url.includes("?") ? "&" : "?";
const value = (typeof(data[key]) === "string") ? data[key]: JSON.stringify(data[key]);
url += seperator + key + "=" + value;
}
url = utils.objectToURI(url, data, true);
data = null;
}

View File

@@ -313,11 +313,15 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
for (let i = 0; i < this.state.messages.length; i++) {
elements.push(
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
text={this.state.messages[i]}
onClick={this.state.messageOnClick}
key={i}>
</NoticeTextSelectionComponent>
<tr>
<td>
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
text={this.state.messages[i]}
onClick={this.state.messageOnClick}
key={i + "_messageBox"}>
</NoticeTextSelectionComponent>
</td>
</tr>
)
}

View File

@@ -39,7 +39,6 @@ interface SBConfig {
testingServer: boolean,
refetchWhenNotFound: boolean,
ytInfoPermissionGranted: boolean,
askAboutUnlistedVideos: boolean,
allowExpirements: boolean,
autoHideInfoButton: boolean,
@@ -179,7 +178,6 @@ const Config: SBObject = {
testingServer: false,
refetchWhenNotFound: true,
ytInfoPermissionGranted: false,
askAboutUnlistedVideos: true,
allowExpirements: true,
autoHideInfoButton: true,
@@ -345,6 +343,10 @@ function fetchConfig(): Promise<void> {
}
function migrateOldFormats(config: SBConfig) {
if (config["askAboutUnlistedVideos"]) {
chrome.storage.sync.remove("askAboutUnlistedVideos");
}
// Adding preview category
if (!config["previewCategoryUpdate"]) {
config["previewCategoryUpdate"] = true;

View File

@@ -1,6 +1,6 @@
import Config from "./config";
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, FetchResponse, VideoInfo, StorageChangesObject, ChannelIDInfo, ChannelIDStatus, SponsorSourceType } from "./types";
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, ChannelIDInfo, ChannelIDStatus, SponsorSourceType } from "./types";
import { ContentContainer } from "./types";
import Utils from "./utils";
@@ -13,7 +13,7 @@ import SkipNotice from "./render/SkipNotice";
import SkipNoticeComponent from "./components/SkipNoticeComponent";
import SubmissionNotice from "./render/SubmissionNotice";
import { Message, MessageResponse } from "./messageTypes";
import GenericNotice from "./render/GenericNotice";
import * as Chat from "./js-components/chat";
// Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
@@ -179,7 +179,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
submitSponsorTimes();
break;
case "refreshSegments":
sponsorsLookup(sponsorVideoID, false);
sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({}));
break;
}
}
@@ -240,6 +240,10 @@ function resetValues() {
// Reset advert playing flag
isAdPlaying = false;
for (let i = 0; i < skipNotices.length; i++) {
skipNotices.pop().close();
}
}
async function videoIDChange(id) {
@@ -277,9 +281,6 @@ async function videoIDChange(id) {
// Update whitelist data when the video data is loaded
whitelistCheck();
// Temporary expirement
unlistedCheck();
//setup the preview bar
if (previewBar === null) {
if (onMobileYouTube) {
@@ -594,81 +595,81 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
// Check for hashPrefix setting
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
categories
}).then(async (response: FetchResponse) => {
if (response?.ok) {
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
?.filter((video) => video.videoID === id)
?.map((video) => video.segments)[0];
if (!recievedSegments || !recievedSegments.length) {
// return if no video found
retryFetch();
return;
}
sponsorDataFound = true;
// Check if any old submissions should be kept
if (sponsorTimes !== null && keepOldSubmissions) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].source === SponsorSourceType.Local) {
// This is a user submission, keep it
recievedSegments.push(sponsorTimes[i]);
}
}
}
const oldSegments = sponsorTimes || [];
sponsorTimes = recievedSegments;
// Hide all submissions smaller than the minimum duration
if (Config.config.minDuration !== 0) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration) {
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
}
}
}
if (keepOldSubmissions) {
for (const segment of oldSegments) {
const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID);
if (otherSegment) {
// If they downvoted it, or changed the category, keep it
otherSegment.hidden = segment.hidden;
otherSegment.category = segment.category;
}
}
}
startSkipScheduleCheckingForStartSponsors();
//update the preview bar
//leave the type blank for now until categories are added
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
//set it now
//otherwise the listener can handle it
updatePreviewBar();
}
sponsorLookupRetries = 0;
} else if (response?.status === 404) {
retryFetch();
} else if (sponsorLookupRetries < 15 && !recheckStarted) {
recheckStarted = true;
//TODO lower when server becomes better (back to 1 second)
//some error occurred, try again in a second
setTimeout(() => {
if (sponsorVideoID && sponsorTimes?.length === 0) {
sponsorsLookup(sponsorVideoID);
}
}, 5000 + Math.random() * 15000 + 5000 * sponsorLookupRetries);
sponsorLookupRetries++;
}
});
if (response?.ok) {
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
?.filter((video) => video.videoID === id)
?.map((video) => video.segments)[0];
if (!recievedSegments || !recievedSegments.length) {
// return if no video found
retryFetch();
return;
}
sponsorDataFound = true;
// Check if any old submissions should be kept
if (sponsorTimes !== null && keepOldSubmissions) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].source === SponsorSourceType.Local) {
// This is a user submission, keep it
recievedSegments.push(sponsorTimes[i]);
}
}
}
const oldSegments = sponsorTimes || [];
sponsorTimes = recievedSegments;
// Hide all submissions smaller than the minimum duration
if (Config.config.minDuration !== 0) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration) {
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
}
}
}
if (keepOldSubmissions) {
for (const segment of oldSegments) {
const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID);
if (otherSegment) {
// If they downvoted it, or changed the category, keep it
otherSegment.hidden = segment.hidden;
otherSegment.category = segment.category;
}
}
}
startSkipScheduleCheckingForStartSponsors();
//update the preview bar
//leave the type blank for now until categories are added
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
//set it now
//otherwise the listener can handle it
updatePreviewBar();
}
sponsorLookupRetries = 0;
} else if (response?.status === 404) {
retryFetch();
} else if (sponsorLookupRetries < 15 && !recheckStarted) {
recheckStarted = true;
//TODO lower when server becomes better (back to 1 second)
//some error occurred, try again in a second
setTimeout(() => {
if (sponsorVideoID && sponsorTimes?.length === 0) {
sponsorsLookup(sponsorVideoID);
}
}, 5000 + Math.random() * 15000 + 5000 * sponsorLookupRetries);
sponsorLookupRetries++;
}
}
function retryFetch(): void {
@@ -852,7 +853,7 @@ async function whitelistCheck() {
channelIDInfo = {
status: ChannelIDStatus.Found,
id: getChannelID()
id: getChannelID().match(/^\/?([^\s/]+)/)[0]
}
} catch (e) {
channelIDInfo = {
@@ -864,7 +865,8 @@ async function whitelistCheck() {
}
//see if this is a whitelisted channel
if (whitelistedChannels != undefined && whitelistedChannels.includes(getChannelID())) {
if (whitelistedChannels != undefined &&
channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) {
channelWhitelisted = true;
}
@@ -872,66 +874,6 @@ async function whitelistCheck() {
if (Config.config.forceChannelCheck && sponsorTimes?.length > 0) startSkipScheduleCheckingForStartSponsors();
}
async function unlistedCheck() {
if (!Config.config.allowExpirements || !Config.config.askAboutUnlistedVideos) return;
try {
await utils.wait(() => !!videoInfo && !!document.getElementById("info-text")
&& !!document.querySelector(".ytd-video-primary-info-renderer > .badge > yt-icon > svg"), 6000, 1000);
const isUnlisted = document.querySelector(".ytd-video-primary-info-renderer > .badge > yt-icon > svg > g > path")
?.getAttribute("d")?.includes("M3.9 12c0-1.71 1.39-3.1 3.1-3.1h"); // Icon of unlisted badge
const yearMatches = document.querySelector("#info-text > #info-strings > yt-formatted-string")
?.innerHTML?.match(/20[0-9]{2}/);
const year = yearMatches ? parseInt(yearMatches[0]) : -1;
const isOld = !isNaN(year) && year < 2017 && year > 2004;
const views = parseInt(videoInfo?.videoDetails?.viewCount);
const isHighViews = views > 15000;
if (isUnlisted && isOld && isHighViews && (!sponsorTimes || sponsorTimes.length <= 0)) {
// Ask if they want to submit this videoID
const notice = new GenericNotice(skipNoticeContentContainer, "unlistedWarning", {
title: chrome.i18n.getMessage("experimentUnlistedTitle"),
textBoxes: chrome.i18n.getMessage("experimentUnlistedText").split("\n"),
buttons: [
{
name: chrome.i18n.getMessage("experiementOptOut"),
listener: () => {
Config.config.allowExpirements = false;
notice.close();
}
},
{
name: chrome.i18n.getMessage("hideForever"),
listener: () => {
Config.config.askAboutUnlistedVideos = false;
notice.close();
}
},
{
name: "Submit",
listener: () => {
utils.asyncRequestToServer("POST", "/api/unlistedVideo", {
videoID: sponsorVideoID,
year,
views,
channelID: channelIDInfo.status === ChannelIDStatus.Found ? channelIDInfo.id : undefined
});
notice.close();
}
}
]
});
}
} catch (e) {
return;
}
}
/**
* Returns info about the next upcoming sponsor skip
*/
@@ -1375,9 +1317,11 @@ function openInfoMenu() {
let htmlData = xmlhttp.responseText;
// Hack to replace head data (title, favicon)
htmlData = htmlData.replace(/<head>[\S\s]*<\/head>/gi, "");
// Hack to replace body tag with div
// Hack to replace body and html tag with div
htmlData = htmlData.replace(/<body/gi, "<div");
htmlData = htmlData.replace(/<\/body/gi, "</div");
htmlData = htmlData.replace(/<html/gi, "<div");
htmlData = htmlData.replace(/<\/html/gi, "</div");
popup.innerHTML = htmlData;
@@ -1513,7 +1457,15 @@ function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNo
//success (treat rate limits as a success)
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
} else if (response.successType == -1) {
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode, response.responseText))
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a warning from a moderator.")) {
skipNotice.setNoticeInfoMessageWithOnClick.bind(skipNotice)(() => {
Chat.openWarningChat(response.responseText);
skipNotice.closeListener.call(skipNotice);
}, chrome.i18n.getMessage("voteRejectedWarning"));
} else {
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode, response.responseText))
}
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
}
}
@@ -1556,7 +1508,7 @@ function submitSponsorTimes() {
async function sendSubmitMessage() {
// Add loading animation
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker.svg");
playerButtons.submit.button.style.animation = "rotate 1s 0s infinite";
const stopAnimation = utils.applyLoadingAnimation(playerButtons.submit.button, 1, () => updateEditButtonsOnPlayer());
//check if a sponsor exceeds the duration of the video
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
@@ -1588,22 +1540,7 @@ async function sendSubmitMessage() {
});
if (response.status === 200) {
// Handle submission success
const submitButton = playerButtons.submit.button;
// Make the animation finite
submitButton.style.animation = "rotate 1s";
// When the animation is over, hide the button
const animationEndListener = () => {
updateEditButtonsOnPlayer();
submitButton.style.animation = "none";
submitButton.removeEventListener("animationend", animationEndListener);
};
submitButton.addEventListener("animationend", animationEndListener);
stopAnimation();
// Remove segments from storage since they've already been submitted
Config.config.segmentTimes.delete(sponsorVideoID);
@@ -1637,7 +1574,11 @@ async function sendSubmitMessage() {
playerButtons.submit.button.style.animation = "unset";
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
alert(utils.getErrorMessage(response.status, response.responseText));
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a warning from a moderator.")) {
Chat.openWarningChat(response.responseText);
} else {
alert(utils.getErrorMessage(response.status, response.responseText));
}
}
}

44
src/js-components/chat.ts Normal file
View File

@@ -0,0 +1,44 @@
import Config from "../config";
import Utils from "../utils";
const utils = new Utils();
export interface ChatConfig {
displayName: string,
composerInitialValue?: string,
customDescription?: string
}
export function openChat(config: ChatConfig): void {
const chat = document.createElement("div");
chat.classList.add("sbChatNotice");
chat.style.zIndex = "2000";
const iframe= document.createElement("iframe");
iframe.src = "https://chat.sponsor.ajay.app/#" + utils.objectToURI("", config, false);
chat.appendChild(iframe);
const closeButton = document.createElement("img");
closeButton.classList.add("sbChatClose");
closeButton.src = chrome.extension.getURL("icons/close.png");
closeButton.addEventListener("click", () => {
chat.remove();
closeButton.remove();
});
chat.appendChild(closeButton);
const referenceNode = utils.findReferenceNode();
referenceNode.prepend(chat);
}
export async function openWarningChat(warningMessage: string): Promise<void> {
const userNameData = await utils.asyncRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID);
const userName = userNameData.ok ? JSON.parse(userNameData.responseText).userName : "";
const publicUserID = await utils.getHash(Config.config.userID);
openChat({
displayName: `${userName ? `${userName} | `: ``}${userName !== publicUserID ? publicUserID : ``}`,
composerInitialValue: `I got a warning and want to know what I need to do to improve. ` +
`Warning reason: ${warningMessage.match(/Warning reason: '(.+)'/)[1]}`,
customDescription: chrome.i18n.getMessage("warningChatInfo")
});
}

View File

@@ -53,5 +53,6 @@ export type MessageResponse =
| GetVideoIdResponse
| GetChannelIDResponse
| SponsorStartResponse
| IsChannelWhitelistedResponse;
| IsChannelWhitelistedResponse
| Record<string, never>;

View File

@@ -241,6 +241,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
function onTabs(tabs) {
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
console.log(result)
if (result !== undefined && result.videoID) {
currentVideoID = result.videoID;
creatingSegment = result.creatingSegment;
@@ -292,10 +293,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (request.found) {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
PageElements.refreshSegmentsButton.classList.remove("hidden");
displayDownloadedSponsorTimes(request);
} else {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
PageElements.refreshSegmentsButton.classList.add("hidden");
}
}
@@ -416,13 +419,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
upvoteButton.className = "voteButton";
upvoteButton.src = chrome.extension.getURL("icons/thumbs_up.svg");
upvoteButton.src = chrome.runtime.getURL("icons/thumbs_up.svg");
upvoteButton.addEventListener("click", () => vote(1, UUID));
const downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
downvoteButton.className = "voteButton";
downvoteButton.src = chrome.extension.getURL("icons/thumbs_down.svg");
downvoteButton.src = chrome.runtime.getURL("icons/thumbs_down.svg");
downvoteButton.addEventListener("click", () => vote(0, UUID));
//uuid button
@@ -430,8 +433,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const uuidButton = document.createElement("img");
uuidButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
uuidButton.className = "voteButton";
uuidButton.src = chrome.extension.getURL("icons/clipboard.svg");
uuidButton.addEventListener("click", () => navigator.clipboard.writeText(UUID));
uuidButton.src = chrome.runtime.getURL("icons/clipboard.svg");
uuidButton.addEventListener("click", () => {
navigator.clipboard.writeText(UUID);
const stopAnimation = utils.applyLoadingAnimation(uuidButton, 0.3);
stopAnimation();
});
//add thumbs up, thumbs down and uuid copy buttons to the container
voteButtonsContainer.appendChild(upvoteButton);
@@ -679,13 +686,16 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
function refreshSegments() {
const stopAnimation = utils.applyLoadingAnimation(PageElements.refreshSegmentsButton, 0.3);
messageHandler.query({
active: true,
currentWindow: true
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'refreshSegments'}
{message: 'refreshSegments'},
() => stopAnimation()
)}
);
}

View File

@@ -158,6 +158,31 @@ export default class Utils {
});
}
/**
* Starts a spinning animation and returns a function to be called when it should be stopped
* The callback will be called when the animation is finished
* It waits until a full rotation is complete
*/
applyLoadingAnimation(element: HTMLElement, time: number, callback?: () => void): () => void {
element.style.animation = `rotate ${time}s 0s infinite`;
return () => {
// Make the animation finite
element.style.animation = `rotate ${time}s`;
// When the animation is over, hide the button
const animationEndListener = () => {
if (callback) callback();
element.style.animation = "none";
element.removeEventListener("animationend", animationEndListener);
};
element.addEventListener("animationend", animationEndListener);
}
}
/**
* Merges any overlapping timestamp ranges into single segments and returns them as a new array.
*/
@@ -244,7 +269,8 @@ export default class Utils {
getLocalizedMessage(text: string): string | false {
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
return v1 ? chrome.i18n.getMessage(v1).replace("\n", "<br/>") : "";
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "&#60;")
.replace(/"/g, "&quot;").replace(/\n/g, "<br/>") : "";
});
if(valNewH != text) {
@@ -389,6 +415,19 @@ export default class Utils {
return referenceNode;
}
objectToURI<T>(url: string, data: T, includeQuestionMark: boolean): string {
let counter = 0;
for (const key in data) {
const seperator = (url.includes("?") || counter > 0) ? "&" : (includeQuestionMark ? "?" : "");
const value = (typeof(data[key]) === "string") ? data[key] as unknown as string : JSON.stringify(data[key]);
url += seperator + encodeURIComponent(key) + "=" + encodeURIComponent(value);
counter++;
}
return url;
}
getFormattedTime(seconds: number, precise?: boolean): string {
const hours = Math.floor(seconds / 60 / 60);
const minutes = Math.floor(seconds / 60) % 60;
@@ -453,14 +492,13 @@ export default class Utils {
async getHash(value: string, times = 5000): Promise<string> {
if (times <= 0) return "";
let hashBuffer = new TextEncoder().encode(value).buffer;
let hashHex = value;
for (let i = 0; i < times; i++) {
hashBuffer = await crypto.subtle.digest('SHA-256', hashBuffer);
}
const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(hashHex).buffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
const hashArray = Array.from(new Uint8Array(hashBuffer));
hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
return hashHex;
}