From 38b1dda20bfeb4b6058ba98615866f450921c42c Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 18 Oct 2021 19:51:44 -0400 Subject: [PATCH 01/25] Add support for required segment parameter --- src/content.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 5a4415c6..7a064561 100644 --- a/src/content.ts +++ b/src/content.ts @@ -676,12 +676,25 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) { categories.push(categorySelection.name); } + const extraRequestData: Record = {}; + const windowHash = window.location.hash.substr(1); + if (windowHash) { + const params: Record = windowHash.split('&').reduce((acc, param) => { + const [key, value] = param.split('='); + acc[key] = value; + return acc; + }, {}); + + if (params.requiredSegment) extraRequestData.requiredSegment = params.requiredSegment; + } + // Check for hashPrefix setting const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4); const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, { categories, actionTypes: Config.config.muteSegments ? [ActionType.Skip, ActionType.Mute] : [ActionType.Skip], - userAgent: `${chrome.runtime.id}` + userAgent: `${chrome.runtime.id}`, + ...extraRequestData }); if (response?.ok) { From 95fe1eef6f6fdb6fefd25b459a9e67f8385567bd Mon Sep 17 00:00:00 2001 From: FlorianZahn Date: Tue, 19 Oct 2021 21:38:44 +0200 Subject: [PATCH 02/25] Makes rectangleTooltip fontSize bigger --- src/components/SponsorTimeEditComponent.tsx | 7 +++++-- src/render/RectangleTooltip.tsx | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index 371228dd..ae185b58 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -288,11 +288,14 @@ class SponsorTimeEditComponent extends React.Component {Config.config.scrollToEditTimeUpdate = true} + buttonFunction: () => {Config.config.scrollToEditTimeUpdate = true}, + fontSize: "14px", + maxHeight: "200px" + }); } } diff --git a/src/render/RectangleTooltip.tsx b/src/render/RectangleTooltip.tsx index d08e260e..1887cbbc 100644 --- a/src/render/RectangleTooltip.tsx +++ b/src/render/RectangleTooltip.tsx @@ -13,6 +13,7 @@ export interface RectangleTooltipProps { maxHeight?: string, maxWidth?: string, backgroundColor?: string, + fontSize?: string, buttonFunction?: () => void; } @@ -29,6 +30,7 @@ export class RectangleTooltip { props.maxWidth ??= "300px"; props.backgroundColor ??= "rgba(28, 28, 28, 0.7)"; this.text = props.text; + props.fontSize ??= "10px"; this.container = document.createElement('div'); props.htmlId ??= props.text; @@ -51,7 +53,8 @@ export class RectangleTooltip { left: props.leftOffset, maxHeight: props.maxHeight, maxWidth: props.maxWidth, - backgroundColor: props.backgroundColor}} + backgroundColor: props.backgroundColor, + fontSize: props.fontSize}} className="sponsorBlockRectangleTooltip" >
Date: Tue, 19 Oct 2021 19:00:30 -0400 Subject: [PATCH 03/25] Fix start time in preview bar in wrong place --- src/js-components/previewBar.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index c515ec85..5ef5f822 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -199,7 +199,9 @@ class PreviewBar { bar.style.position = "absolute"; const duration = segment[1] - segment[0]; if (segment[1] - segment[0] > 0) bar.style.width = this.timeToPercentage(segment[1] - segment[0]); - bar.style.left = this.timeToPercentage(Math.min(this.videoDuration - Math.max(0, duration), segment[0])); + + const time = segment[1] ? Math.min(this.videoDuration - Math.max(0, duration), segment[0]) : segment[0]; + bar.style.left = this.timeToPercentage(time); return bar; } From 14018798f7f52dacc0b3bb49e50558aa91c1162b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 19 Oct 2021 19:10:27 -0400 Subject: [PATCH 04/25] Add wiki links to options --- src/components/CategorySkipOptionsComponent.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/CategorySkipOptionsComponent.tsx b/src/components/CategorySkipOptionsComponent.tsx index f7baad46..2d18000a 100644 --- a/src/components/CategorySkipOptionsComponent.tsx +++ b/src/components/CategorySkipOptionsComponent.tsx @@ -1,6 +1,7 @@ import * as React from "react"; import Config from "../config" +import * as CompileConfig from "../../config.json"; import { Category, CategorySkipOption } from "../types"; import { getCategoryActionType } from "../utils/categoryUtils"; @@ -93,6 +94,10 @@ class CategorySkipOptionsComponent extends React.Component {chrome.i18n.getMessage("category_" + this.props.category + "_description")} + {' '} + + {`${chrome.i18n.getMessage("LearnMore")}`} + From 1e8b176c69704f96f25702afdc1bcd18e60ea575 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 19 Oct 2021 22:57:46 -0400 Subject: [PATCH 05/25] Allow finer tuned previewing --- src/components/SponsorTimeEditComponent.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index 371228dd..d67d9d83 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -212,7 +212,7 @@ class SponsorTimeEditComponent extends React.Component + onClick={(e) => this.previewTime(e.ctrlKey, e.shiftKey)}> {chrome.i18n.getMessage("preview")} ): ""} @@ -436,13 +436,17 @@ class SponsorTimeEditComponent extends React.Component Date: Wed, 20 Oct 2021 19:28:00 -0400 Subject: [PATCH 06/25] Hide submissions on mobile --- src/content.ts | 3 ++- src/messageTypes.ts | 3 ++- src/popup.ts | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/content.ts b/src/content.ts index 7a064561..94379f00 100644 --- a/src/content.ts +++ b/src/content.ts @@ -151,7 +151,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo //send the sponsor times along with if it's found sendResponse({ found: sponsorDataFound, - sponsorTimes: sponsorTimes + sponsorTimes: sponsorTimes, + onMobileYouTube }); if (!request.updating && popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) { diff --git a/src/messageTypes.ts b/src/messageTypes.ts index 49a5ad92..4989c741 100644 --- a/src/messageTypes.ts +++ b/src/messageTypes.ts @@ -31,9 +31,10 @@ interface IsInfoFoundMessage { export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage); -interface IsInfoFoundMessageResponse { +export interface IsInfoFoundMessageResponse { found: boolean; sponsorTimes: SponsorTime[]; + onMobileYouTube: boolean; } interface GetVideoIdResponse { diff --git a/src/popup.ts b/src/popup.ts index 5a75c8ba..41bf1062 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -2,7 +2,7 @@ import Config from "./config"; import Utils from "./utils"; import { SponsorTime, SponsorHideType, CategoryActionType } from "./types"; -import { Message, MessageResponse } from "./messageTypes"; +import { Message, MessageResponse, IsInfoFoundMessageResponse } from "./messageTypes"; import { showDonationLink } from "./utils/configUtils"; import { getCategoryActionType } from "./utils/categoryUtils"; const utils = new Utils(); @@ -278,7 +278,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { }, (tabs) => onTabs(tabs, updating)); } - function infoFound(request: { found: boolean, sponsorTimes: SponsorTime[] }) { + function infoFound(request: IsInfoFoundMessageResponse) { if (chrome.runtime.lastError) { //This page doesn't have the injected content script, or at least not yet displayNoVideo(); @@ -289,6 +289,7 @@ async function runThePopup(messageListener?: MessageListener): Promise { if (request != undefined) { //remove loading text PageElements.mainControls.style.display = "flex"; + if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden"); PageElements.whitelistButton.classList.remove("hidden"); PageElements.loadingIndicator.style.display = "none"; From d1e6421e5b1a36e7fe81a5355ecaa5442a0aef93 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 20 Oct 2021 19:33:48 -0400 Subject: [PATCH 07/25] Fix type errors --- src/content.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content.ts b/src/content.ts index 94379f00..271ba1d9 100644 --- a/src/content.ts +++ b/src/content.ts @@ -192,7 +192,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo case "refreshSegments": sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({ found: sponsorDataFound, - sponsorTimes: sponsorTimes + sponsorTimes: sponsorTimes, + onMobileYouTube })); return true; From 9dda9a583d5226f532ad620518c702e3598342f1 Mon Sep 17 00:00:00 2001 From: FlorianZahn Date: Thu, 21 Oct 2021 03:14:45 +0200 Subject: [PATCH 08/25] unsubmitted segments are initialized rounded to 3 digits --- src/components/SponsorTimeEditComponent.tsx | 11 ++++++++++- src/content.ts | 5 +++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index 371228dd..ea09ec6a 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -38,6 +38,9 @@ class SponsorTimeEditComponent extends React.Component void; + previousSkipType: CategoryActionType; + timeBeforeChangingToPOI: number; // Initialized when first selecting POI + constructor(props: SponsorTimeEditProps) { super(props); @@ -46,6 +49,7 @@ class SponsorTimeEditComponent extends React.Component segment.category === event.target.value && i !== this.props.index)) { alert(chrome.i18n.getMessage("poiOnlyOneSegment")); } + } else if (getCategoryActionType(event.target.value as Category) === CategoryActionType.Skippable && this.previousSkipType === CategoryActionType.POI) { + this.setTimeTo(1, this.timeBeforeChangingToPOI); } - + + this.previousSkipType = getCategoryActionType(event.target.value as Category); this.saveEditTimes(); } diff --git a/src/content.ts b/src/content.ts index 7eeed429..679f5847 100644 --- a/src/content.ts +++ b/src/content.ts @@ -1459,9 +1459,10 @@ function getRealCurrentTime(): number { } function startOrEndTimingNewSegment() { + const roundedTime = Math.round((getRealCurrentTime() + Number.EPSILON) * 1000) / 1000; if (!isSegmentCreationInProgress()) { sponsorTimesSubmitting.push({ - segment: [getRealCurrentTime()], + segment: [roundedTime], UUID: null, category: Config.config.defaultCategory, actionType: ActionType.Skip, @@ -1471,7 +1472,7 @@ function startOrEndTimingNewSegment() { // Finish creating the new segment const existingSegment = getIncompleteSegment(); const existingTime = existingSegment.segment[0]; - const currentTime = getRealCurrentTime(); + const currentTime = roundedTime; // Swap timestamps if the user put the segment end before the start existingSegment.segment = [Math.min(existingTime, currentTime), Math.max(existingTime, currentTime)]; From 95f45312e139858151365b0f452415f5eade6fec Mon Sep 17 00:00:00 2001 From: FlorianZahn Date: Thu, 21 Oct 2021 04:19:26 +0200 Subject: [PATCH 09/25] support for multiple poi categories --- src/components/SponsorTimeEditComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index ea09ec6a..98c00616 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -344,7 +344,7 @@ class SponsorTimeEditComponent extends React.Component Date: Thu, 21 Oct 2021 01:30:52 -0400 Subject: [PATCH 10/25] Add skip to highlight to mobile --- public/content.css | 24 +++++++++- src/content.ts | 29 +++--------- src/js-components/skipButtonControlBar.ts | 55 ++++++++++++++++++----- src/utils/pageUtils.ts | 20 +++++++++ 4 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 src/utils/pageUtils.ts diff --git a/public/content.css b/public/content.css index 4751d293..b5c01e01 100644 --- a/public/content.css +++ b/public/content.css @@ -526,9 +526,27 @@ input::-webkit-inner-spin-button { .skipButtonControlBarContainer { cursor: pointer; display: flex; + color: white; } -.skipButtonControlBarContainer.hidden { +.skipButtonControlBarContainer.mobile { + bottom: 30%; + margin-left: 5px; + position: absolute; + height: 20px; + + background-color: #00000030; + opacity: 0.5; + border-radius: 10px; + padding: 4px; +} + +.skipButtonControlBarContainer.mobile > div { + margin: auto; + margin-left: 5px; +} + +.skipButtonControlBarContainer.hidden, .skipButtonControlBarContainer.mobile .hidden { display: none !important; } @@ -540,6 +558,10 @@ input::-webkit-inner-spin-button { margin: auto; } +.mobile #sbSkipIconControlBarImage { + height: 100%; +} + .sponsorBlockTooltip { position: absolute; background-color: rgba(28, 28, 28, 0.7); diff --git a/src/content.ts b/src/content.ts index 271ba1d9..24267ec6 100644 --- a/src/content.ts +++ b/src/content.ts @@ -17,6 +17,7 @@ import { getCategoryActionType } from "./utils/categoryUtils"; import { SkipButtonControlBar } from "./js-components/skipButtonControlBar"; import { Tooltip } from "./render/Tooltip"; import { getStartTimeFromUrl } from "./utils/urlParser"; +import { getControls } from "./utils/pageUtils"; // Hack to get the CSS loaded on permission-based sites (Invidious) utils.wait(() => Config.config !== null, 5000, 10).then(addCSS); @@ -338,6 +339,8 @@ async function videoIDChange(id) { function handleMobileControlsMutations(): void { updateVisibilityOfPlayerControlsButton(); + skipButtonControlBar?.updateMobileControls(); + if (previewBar !== null) { if (document.body.contains(previewBar.container)) { const progressBarBackground = document.querySelector(".progress-bar-background"); @@ -652,7 +655,8 @@ function setupSkipButtonControlBar() { skippingSegments: [segment], openNotice: true, forceAutoSkip: true - }) + }), + onMobileYouTube }); } @@ -1249,6 +1253,7 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u && skippingSegments.length === 1 && getCategoryActionType(skippingSegments[0].category) === CategoryActionType.POI) { skipButtonControlBar.enable(skippingSegments[0], !Config.config.highlightCategoryUpdate ? 15 : 0); + if (onMobileYouTube) skipButtonControlBar.setShowKeybindHint(false); if (!Config.config.highlightCategoryUpdate) { new Tooltip({ @@ -1269,6 +1274,7 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u //send out the message saying that a sponsor message was skipped if (!Config.config.dontShowNotice || !autoSkip) { const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime); + if (onMobileYouTube) newSkipNotice.setShowKeybindHint(false); skipNotices.push(newSkipNotice); activeSkipKeybindElement?.setShowKeybindHint(false); @@ -1356,27 +1362,6 @@ function shouldSkip(segment: SponsorTime): boolean { (Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic")); } -function getControls(): HTMLElement | false { - const controlsSelectors = [ - // YouTube - ".ytp-right-controls", - // Mobile YouTube - ".player-controls-top", - // Invidious/videojs video element's controls element - ".vjs-control-bar", - ]; - - for (const controlsSelector of controlsSelectors) { - const controls = document.querySelectorAll(controlsSelector); - - if (controls && controls.length > 0) { - return controls[controls.length - 1]; - } - } - - return false; -} - /** Creates any missing buttons on the YouTube player if possible. */ async function createButtons(): Promise { if (onMobileYouTube) return; diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index a3e47362..4f5f3877 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -7,6 +7,7 @@ const utils = new Utils(); export interface SkipButtonControlBarProps { skip: (segment: SponsorTime) => void; + onMobileYouTube: boolean; } export class SkipButtonControlBar { @@ -18,6 +19,9 @@ export class SkipButtonControlBar { segment: SponsorTime; showKeybindHint = true; + onMobileYouTube: boolean; + + enabled = false; timeout: NodeJS.Timeout; duration = 0; @@ -26,10 +30,12 @@ export class SkipButtonControlBar { constructor(props: SkipButtonControlBarProps) { this.skip = props.skip; + this.onMobileYouTube = props.onMobileYouTube; this.container = document.createElement("div"); this.container.classList.add("skipButtonControlBarContainer"); this.container.classList.add("hidden"); + if (this.onMobileYouTube) this.container.classList.add("mobile"); this.skipIcon = document.createElement("img"); this.skipIcon.src = chrome.runtime.getURL("icons/skipIcon.svg"); @@ -50,21 +56,34 @@ export class SkipButtonControlBar { } attachToPage(): void { - const leftControlsContainer = document.querySelector(".ytp-left-controls"); + const mountingContainer = this.getMountingContainer(); this.chapterText = document.querySelector(".ytp-chapter-container"); - if (leftControlsContainer && !leftControlsContainer.contains(this.container)) { - leftControlsContainer.insertBefore(this.container, this.chapterText); - - if (Config.config.autoHideInfoButton) { - utils.setupAutoHideAnimation(this.skipIcon, leftControlsContainer, false, false); + if (mountingContainer && !mountingContainer.contains(this.container)) { + if (this.onMobileYouTube) { + mountingContainer.appendChild(this.container); + } else { + mountingContainer.insertBefore(this.container, this.chapterText); } + + if (Config.config.autoHideInfoButton && !this.onMobileYouTube) { + utils.setupAutoHideAnimation(this.skipIcon, mountingContainer, false, false); + } + } + } + + private getMountingContainer(): HTMLElement { + if (!this.onMobileYouTube) { + return document.querySelector(".ytp-left-controls"); + } else { + return document.getElementById("player-container-id"); } } enable(segment: SponsorTime, duration?: number): void { if (duration) this.duration = duration; this.segment = segment; + this.enabled = true; this.refreshText(); this.textContainer?.classList?.remove("hidden"); @@ -97,12 +116,14 @@ export class SkipButtonControlBar { this.timeout = setTimeout(() => this.disableText(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000); } - disable(): void { + disable(keepActive = false): void { this.container.classList.add("hidden"); this.textContainer?.classList?.remove("hidden"); this.chapterText?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("hidden"); + + if (!keepActive) this.enabled = false; } toggleSkip(): void { @@ -110,12 +131,13 @@ export class SkipButtonControlBar { this.disableText(); } - disableText(): void { - if (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls) { - this.disable(); + disableText(forceNotDisable = false): void { + if (!forceNotDisable && (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls || this.onMobileYouTube)) { + this.disable(this.onMobileYouTube); return; } + this.container.classList.remove("hidden"); this.textContainer?.classList?.add("hidden"); this.chapterText?.classList?.remove("hidden"); @@ -124,6 +146,19 @@ export class SkipButtonControlBar { utils.enableAutoHideAnimation(this.skipIcon); } + updateMobileControls(): void { + const overlay = document.getElementById("player-control-overlay"); + + if (overlay && this.enabled) { + if (overlay?.classList?.contains("pointer-events-off")) { + this.disable(true); + } else { + this.disableText(true); + this.skipIcon.classList.remove("hidden"); + } + } + } + private getTitle(): string { return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : ""); } diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts new file mode 100644 index 00000000..e88f7cc9 --- /dev/null +++ b/src/utils/pageUtils.ts @@ -0,0 +1,20 @@ +export function getControls(): HTMLElement | false { + const controlsSelectors = [ + // YouTube + ".ytp-right-controls", + // Mobile YouTube + ".player-controls-top", + // Invidious/videojs video element's controls element + ".vjs-control-bar", + ]; + + for (const controlsSelector of controlsSelectors) { + const controls = document.querySelectorAll(controlsSelector); + + if (controls && controls.length > 0) { + return controls[controls.length - 1]; + } + } + + return false; +} \ No newline at end of file From 0647576d6f60b5a9ea7dc90493b361e78d930026 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 21 Oct 2021 21:58:43 -0400 Subject: [PATCH 11/25] Add animation for skip to highlight on mobile --- public/content.css | 14 +++++--- src/js-components/skipButtonControlBar.ts | 28 +++++++++++----- src/utils.ts | 40 ++++++++++++++--------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/public/content.css b/public/content.css index b5c01e01..6e98a1c5 100644 --- a/public/content.css +++ b/public/content.css @@ -1,3 +1,7 @@ +.hidden { + display: none; +} + #previewbar { overflow: visible; padding: 0; @@ -541,15 +545,16 @@ input::-webkit-inner-spin-button { padding: 4px; } +.skipButtonControlBarContainer.mobile.textDisabled { + padding: 0; + background-color: transparent; +} + .skipButtonControlBarContainer.mobile > div { margin: auto; margin-left: 5px; } -.skipButtonControlBarContainer.hidden, .skipButtonControlBarContainer.mobile .hidden { - display: none !important; -} - #sbSkipIconControlBarImage { height: 60%; top: 0px; @@ -560,6 +565,7 @@ input::-webkit-inner-spin-button { .mobile #sbSkipIconControlBarImage { height: 100%; + width: 20px; } .sponsorBlockTooltip { diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index 4f5f3877..36ecb0c0 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -28,6 +28,10 @@ export class SkipButtonControlBar { skip: (segment: SponsorTime) => void; + // Used if on mobile page + hideButton: () => void; + showButton: () => void; + constructor(props: SkipButtonControlBarProps) { this.skip = props.skip; this.onMobileYouTube = props.onMobileYouTube; @@ -68,6 +72,10 @@ export class SkipButtonControlBar { if (Config.config.autoHideInfoButton && !this.onMobileYouTube) { utils.setupAutoHideAnimation(this.skipIcon, mountingContainer, false, false); + } else { + const { hide, show } = utils.setupCustomHideAnimation(this.skipIcon, mountingContainer, false, false); + this.hideButton = hide; + this.showButton = show; } } } @@ -116,14 +124,14 @@ export class SkipButtonControlBar { this.timeout = setTimeout(() => this.disableText(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000); } - disable(keepActive = false): void { + disable(): void { this.container.classList.add("hidden"); this.textContainer?.classList?.remove("hidden"); this.chapterText?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("hidden"); - if (!keepActive) this.enabled = false; + this.enabled = false; } toggleSkip(): void { @@ -131,19 +139,22 @@ export class SkipButtonControlBar { this.disableText(); } - disableText(forceNotDisable = false): void { - if (!forceNotDisable && (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls || this.onMobileYouTube)) { - this.disable(this.onMobileYouTube); + disableText(): void { + if (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls) { + this.disable(); return; } - this.container.classList.remove("hidden"); + this.container.classList.add("textDisabled"); this.textContainer?.classList?.add("hidden"); this.chapterText?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.add("hidden"); utils.enableAutoHideAnimation(this.skipIcon); + if (this.onMobileYouTube) { + this.hideButton(); + } } updateMobileControls(): void { @@ -151,10 +162,9 @@ export class SkipButtonControlBar { if (overlay && this.enabled) { if (overlay?.classList?.contains("pointer-events-off")) { - this.disable(true); + this.hideButton(); } else { - this.disableText(true); - this.skipIcon.classList.remove("hidden"); + this.showButton(); } } } diff --git a/src/utils.ts b/src/utils.ts index 99d61137..bdb441e7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -183,7 +183,7 @@ export default class Utils { } } - setupAutoHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): void { + setupCustomHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): { hide: () => void, show: () => void } { if (enabled) element.classList.add("autoHiding"); element.classList.add("hidden"); element.classList.add("animationDone"); @@ -191,22 +191,30 @@ export default class Utils { let mouseEntered = false; - container.addEventListener("mouseenter", () => { - mouseEntered = true; - element.classList.remove("animationDone"); - - // Wait for next event loop - setTimeout(() => { - if (mouseEntered) element.classList.remove("hidden") - }, 10); - }); - - container.addEventListener("mouseleave", () => { - mouseEntered = false; - if (element.classList.contains("autoHiding")) { - element.classList.add("hidden"); + return { + hide: () => { + mouseEntered = false; + if (element.classList.contains("autoHiding")) { + element.classList.add("hidden"); + } + }, + show: () => { + mouseEntered = true; + element.classList.remove("animationDone"); + + // Wait for next event loop + setTimeout(() => { + if (mouseEntered) element.classList.remove("hidden") + }, 10); } - }); + }; + } + + setupAutoHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): void { + const { hide, show } = this.setupCustomHideAnimation(element, container, enabled, rightSlide); + + container.addEventListener("mouseleave", () => hide()); + container.addEventListener("mouseenter", () => show()); } enableAutoHideAnimation(element: Element): void { From 8e254c580784458fee84c8ddd332adde865c7d62 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 21 Oct 2021 22:11:26 -0400 Subject: [PATCH 12/25] Make bigger buttons on mobile skip button --- public/content.css | 5 +++++ src/components/NoticeComponent.tsx | 4 +++- src/components/SkipNoticeComponent.tsx | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/public/content.css b/public/content.css index 6e98a1c5..c53e05c7 100644 --- a/public/content.css +++ b/public/content.css @@ -294,6 +294,10 @@ float: right; } +.sponsorSkipNoticeCloseButton.biggerCloseButton { + padding: 20px; +} + .sponsorSkipMessage { font-size: 14px; font-weight: bold; @@ -302,6 +306,7 @@ margin-top: auto; display: inline-block; margin-right: 10px; + margin-bottom: auto; } .sponsorSkipInfo { diff --git a/src/components/NoticeComponent.tsx b/src/components/NoticeComponent.tsx index c317c0c1..d7307bca 100644 --- a/src/components/NoticeComponent.tsx +++ b/src/components/NoticeComponent.tsx @@ -33,6 +33,7 @@ export interface NoticeProps { zIndex?: number, style?: React.CSSProperties + biggerCloseButton?: boolean; } export interface NoticeState { @@ -151,7 +152,8 @@ class NoticeComponent extends React.Component { {/* Close button */} this.close()}> diff --git a/src/components/SkipNoticeComponent.tsx b/src/components/SkipNoticeComponent.tsx index 6d3c378b..6e8876ff 100644 --- a/src/components/SkipNoticeComponent.tsx +++ b/src/components/SkipNoticeComponent.tsx @@ -188,6 +188,7 @@ class SkipNoticeComponent extends React.Component this.contentContainer().v?.playbackRate} style={noticeStyle} + biggerCloseButton={this.contentContainer().onMobileYouTube} ref={this.noticeRef} closeListener={() => this.closeListener()} smaller={this.state.smaller} @@ -350,13 +351,21 @@ class SkipNoticeComponent extends React.Component 1 || getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI || this.props.unskipTime)) { + + const style: React.CSSProperties = { + marginLeft: "4px", + color: (this.state.actionState === SkipNoticeAction.Unskip) ? this.selectedColor : this.unselectedColor + }; + if (this.contentContainer().onMobileYouTube) { + style.padding = "20px"; + style.minWidth = "100px"; + } + return ( From 628abd03f07ce26762507e4663c7cddc649d011c Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 21 Oct 2021 22:33:49 -0400 Subject: [PATCH 13/25] Added swiping away for skip to highlight on mobile --- src/js-components/skipButtonControlBar.ts | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index 36ecb0c0..6f898d7f 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -32,6 +32,10 @@ export class SkipButtonControlBar { hideButton: () => void; showButton: () => void; + // Used by mobile only for swiping away + left = 0; + swipeStart = 0; + constructor(props: SkipButtonControlBarProps) { this.skip = props.skip; this.onMobileYouTube = props.onMobileYouTube; @@ -53,6 +57,11 @@ export class SkipButtonControlBar { this.container.addEventListener("click", () => this.toggleSkip()); this.container.addEventListener("mouseenter", () => this.stopTimer()); this.container.addEventListener("mouseleave", () => this.startTimer()); + if (this.onMobileYouTube) { + this.container.addEventListener("touchstart", (e) => this.handleTouchStart(e)); + this.container.addEventListener("touchmove", (e) => this.handleTouchMove(e)); + this.container.addEventListener("touchend", () => this.handleTouchEnd()); + } } getElement(): HTMLElement { @@ -176,5 +185,37 @@ export class SkipButtonControlBar { private getChapterPrefix(): HTMLElement { return document.querySelector(".ytp-chapter-title-prefix"); } + + // Swiping away on mobile + private handleTouchStart(event: TouchEvent): void { + this.swipeStart = event.touches[0].clientX; + } + + // Swiping away on mobile + private handleTouchMove(event: TouchEvent): void { + const distanceMoved = this.swipeStart - event.touches[0].clientX; + this.left = Math.min(-distanceMoved, 0); + + this.updateLeftStyle(); + } + + // Swiping away on mobile + private handleTouchEnd(): void { + if (this.left < -this.container.offsetWidth / 2) { + this.disableText(); + + // Don't let animation play + this.skipIcon.style.display = "none"; + setTimeout(() => this.skipIcon.style.removeProperty("display"), 200); + } + + this.left = 0; + this.updateLeftStyle(); + } + + // Swiping away on mobile + private updateLeftStyle() { + this.container.style.left = this.left + "px"; + } } From 5f2af1215048b77ac1e3399ffaa43eeb9a713312 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 21 Oct 2021 22:39:15 -0400 Subject: [PATCH 14/25] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index cf2199b0..68e31d32 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "3.4.1", + "version": "3.5", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 23bebbca7c7f54ce221f4bad3d058cc96acd5f44 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Fri, 22 Oct 2021 01:29:46 -0400 Subject: [PATCH 15/25] Fix help page on mobile --- public/help/index.html | 9 ++++---- public/help/styles.css | 52 ++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/public/help/index.html b/public/help/index.html index 4d69f321..88742e0d 100644 --- a/public/help/index.html +++ b/public/help/index.html @@ -3,6 +3,7 @@ SponsorBlock + @@ -39,7 +40,7 @@ __MSG_helpPageFeatureDisclaimer__

- +

__MSG_helpPageHowSkippingWorks__

@@ -56,14 +57,12 @@ __MSG_helpPageHowSkippingWorks2__

-
+

__MSG_Submitting__

- - - + __MSG_helpPageSubmitting1__ diff --git a/public/help/styles.css b/public/help/styles.css index 2e392c2e..fea609a2 100644 --- a/public/help/styles.css +++ b/public/help/styles.css @@ -40,14 +40,6 @@ body { transform: translateY(-20%); } -.projectPreviewImageLargeRight { - position: absolute; - right: -210px; - width: 200px; - top: 50%; - transform: translateY(-50%); -} - .createdBy { font-size: 14px; text-align: center; @@ -142,18 +134,9 @@ p,li,code,a { overflow-wrap: break-word; } -@media screen and (orientation:portrait) { - p,li,code,a { - max-width: 100%; - } - - .projectPreviewImage { - position: unset; - width: 130px; - display: block; - margin: auto; - transform: none; - } +.optionsFrame { + width: 100%; + height: 500px; } .previewImage { @@ -187,4 +170,33 @@ svg { #sbDonate { font-size: 10px; +} + +@media screen and (orientation:portrait) { + .projectPreviewImage { + position: unset; + width: 50%; + display: block; + margin: auto; + transform: none; + } + + .projectPreviewImageLarge { + position: unset; + left: 0; + width: 50%; + display: block; + margin: auto; + transform: unset; + } + + .container { + max-width: 100%; + margin: 5px; + text-align: center; + } + + p,li,code,a { + text-align: center; + } } \ No newline at end of file From 8b595af5e92b6730d351a8b5ef05d65375706c94 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Fri, 22 Oct 2021 01:50:17 -0400 Subject: [PATCH 16/25] Fix skip to highlight not hiding when none --- public/content.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/content.css b/public/content.css index c53e05c7..cf3c6847 100644 --- a/public/content.css +++ b/public/content.css @@ -538,6 +538,10 @@ input::-webkit-inner-spin-button { color: white; } +.skipButtonControlBarContainer.hidden { + display: none !important; +} + .skipButtonControlBarContainer.mobile { bottom: 30%; margin-left: 5px; From 4d09a603fe3bdc689de82b6e529b69b9c9a7c34d Mon Sep 17 00:00:00 2001 From: opl- Date: Sat, 23 Oct 2021 00:52:52 +0200 Subject: [PATCH 17/25] Fix mouse wheel can enter edit mode --- src/components/SponsorTimeEditComponent.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index d67d9d83..6a1b006f 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -152,8 +152,7 @@ class SponsorTimeEditComponent extends React.Component + onClick={this.toggleEditTime.bind(this)}> {utils.getFormattedTime(segment[0], true) + ((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable) ? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")} From e87efe2c6736efd51a7984ce2020993051909d50 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sat, 23 Oct 2021 15:09:47 -0400 Subject: [PATCH 18/25] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 68e31d32..9d2b6c6d 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "3.5", + "version": "3.5.1", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 41be51b3847ad68185ca3fa139a1f439ac61b4c0 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 26 Oct 2021 18:37:37 -0400 Subject: [PATCH 19/25] formatting fixes --- src/components/SponsorTimeEditComponent.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index ae185b58..ef0ace48 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -292,10 +292,9 @@ class SponsorTimeEditComponent extends React.Component {Config.config.scrollToEditTimeUpdate = true}, + buttonFunction: () => { Config.config.scrollToEditTimeUpdate = true }, fontSize: "14px", maxHeight: "200px" - }); } } From db55778fd82819b758a7225c7dea5367b5c50bc5 Mon Sep 17 00:00:00 2001 From: opl- Date: Fri, 29 Oct 2021 20:59:21 +0200 Subject: [PATCH 20/25] Add more detail to building section of readme --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c39b639e..4acd4339 100644 --- a/README.md +++ b/README.md @@ -60,21 +60,24 @@ You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Doc # Building -You must have Node.js 16 installed. +You must have [Node.js 16](https://nodejs.org/) and npm installed. -Rename `config.json.example` to `config.json` and adjust configuration as desired. +1. Copy the file `config.json.example` to `config.json`. -There are also other build scripts available. Install `npm`, then run `npm install` in the repository to install dependencies. + - You will need to repeat this step in the future if you get build errors related to `CompileConfig`. This can happen for example when a new category is added. -Run `npm run build` to generate a Chrome extension. +2. Run `npm install` in the repository to install dependencies. -Use `npm run build:firefox` to generate a Firefox extension. +3. Run `npm run build:dev` (for Chrome) or `npm run build:dev:firefox` (for Firefox) to generate a development version of the extension with source maps. -The result is in `dist`. This can be loaded as an unpacked extension + - You can also run `npm run build` (for Chrome) or `npm run build:firefox` (for Firefox) to generate a production build. -## Developing with a clean profile +4. The built extension is now in `dist/`. You can load it in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest) or in Firefox as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension). + +### Developing with a clean profile and hot reloading + +Run `npm run dev` (for Chrome) or `npm run dev:firefox` (for Firefox) to run the extension using a clean browser profile with hot reloading. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands). -Run `npm run dev` to run the extension using a clean browser profile with hot reloading. Use `npm run dev:firefox` for Firefox. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands). Known chromium bug: Extension is not loaded properly on first start. Visit `chrome://extensions/` and reload the extension. For Firefox for Android, use `npm run dev:firefox-android -- --adb-device `. See the [Firefox documentation](https://extensionworkshop.com/documentation/develop/developing-extensions-for-firefox-for-android/#debug-your-extension) for more information. From 36989907a210ff9fe6444fa781e2b86337a60a08 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Sat, 30 Oct 2021 22:02:21 -0400 Subject: [PATCH 21/25] Remove highlight skipping by clicking near it Closes #973 --- src/content.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/content.ts b/src/content.ts index 24267ec6..83a170b8 100644 --- a/src/content.ts +++ b/src/content.ts @@ -31,7 +31,6 @@ let sponsorVideoID: VideoID = null; // List of open skip notices const skipNotices: SkipNotice[] = []; let activeSkipKeybindElement: ToggleSkippable = null; -let lastPOISkip = 0; // JSON video info let videoInfo: VideoInfo = null; @@ -612,24 +611,6 @@ function setupVideoListeners() { startSponsorSchedule(); } - - if (!Config.config.dontShowNotice) { - const currentPoiSegment = sponsorTimes?.find((segment) => - getCategoryActionType(segment.category) === CategoryActionType.POI && - video.currentTime - segment.segment[0] > 0 && - video.currentTime - segment.segment[0] < previewBar.getMinimumSize(true)); - if (currentPoiSegment && lastPOISkip < Date.now() - 3000 - && !skipNotices.some((notice) => notice.segments.some((s) => s.UUID === currentPoiSegment.UUID))) { - lastPOISkip = Date.now(); - skipToTime({ - v: video, - skipTime: currentPoiSegment.segment, - skippingSegments: [currentPoiSegment], - openNotice: true, - forceAutoSkip: true - }); - } - } }); video.addEventListener('ratechange', () => startSponsorSchedule()); // Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740) From 5adcec2ca5a88e48ba77192d71464a5f5a2b8eb6 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 2 Nov 2021 00:06:40 -0400 Subject: [PATCH 22/25] Remove segment duration filter Close #1031 #989 --- src/content.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/content.ts b/src/content.ts index 83a170b8..9c7b079f 100644 --- a/src/content.ts +++ b/src/content.ts @@ -396,13 +396,6 @@ function createPreviewBar(): void { function durationChangeListener(): void { updateAdFlag(); updatePreviewBar(); - - if (sponsorTimes) sponsorTimes = sponsorTimes.filter(segmentDurationFilter); -} - -function segmentDurationFilter(segment: SponsorTime): boolean { - return segment.videoDuration === 0 || !video?.duration - || switchingVideos || Math.abs(video.duration - segment.videoDuration) < 2; } function cancelSponsorSchedule(): void { @@ -687,8 +680,7 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) { if (response?.ok) { const recievedSegments: SponsorTime[] = JSON.parse(response.responseText) ?.filter((video) => video.videoID === id) - ?.map((video) => video.segments)[0] - ?.filter(segmentDurationFilter); + ?.map((video) => video.segments)[0]; if (!recievedSegments || !recievedSegments.length) { // return if no video found retryFetch(); From 7a38bf0c0854a59cd7fa064f1e9113dde8c4ff96 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 2 Nov 2021 00:06:56 -0400 Subject: [PATCH 23/25] bump version --- manifest/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest/manifest.json b/manifest/manifest.json index 9d2b6c6d..74f5e48d 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "3.5.1", + "version": "3.5.2", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", From 34884026d93710aac542c655a83e0125b7722f0f Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 2 Nov 2021 00:07:08 -0400 Subject: [PATCH 24/25] New Crowdin updates (#1014) --- public/_locales/bg/messages.json | 6 +- public/_locales/da/messages.json | 25 ++++ public/_locales/fi/messages.json | 18 +++ public/_locales/fr/messages.json | 18 +++ public/_locales/hr/messages.json | 63 +++++++++ public/_locales/hu/messages.json | 205 ++++++++++++++++++++++++++++ public/_locales/ko/messages.json | 18 +++ public/_locales/pl/messages.json | 24 ++++ public/_locales/pt_BR/messages.json | 3 + public/_locales/sk/messages.json | 18 +++ public/_locales/uk/messages.json | 15 ++ 11 files changed, 410 insertions(+), 3 deletions(-) diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json index 19f2a5d1..bfa09428 100644 --- a/public/_locales/bg/messages.json +++ b/public/_locales/bg/messages.json @@ -23,7 +23,7 @@ "message": "сегмент" }, "Segments": { - "message": "сегменти" + "message": "сегмента" }, "upvoteButtonInfo": { "message": "Одобряване на това предложение" @@ -131,7 +131,7 @@ "message": "Изпратени сегменти" }, "savedPeopleFrom": { - "message": "Вие сте помогнали на хората да пропуснат " + "message": "Помогнахте на хората да пропуснат " }, "viewLeaderboard": { "message": "Класиране" @@ -156,7 +156,7 @@ "message": "Това се използва на страницата с публичната статистика, за да покаже колко сте допринесли. Вижте го" }, "Username": { - "message": "Потребителско име" + "message": "Потребител" }, "setUsername": { "message": "Задайте потребителско име" diff --git a/public/_locales/da/messages.json b/public/_locales/da/messages.json index e7e131d1..c7411441 100644 --- a/public/_locales/da/messages.json +++ b/public/_locales/da/messages.json @@ -52,6 +52,9 @@ "reskip": { "message": "Spring over" }, + "unmute": { + "message": "Lyd til" + }, "paused": { "message": "Sat på pause" }, @@ -115,7 +118,29 @@ "submitCheck": { "message": "Er du sikker på, at du vil indsende dette?" }, + "whitelistChannel": { + "message": "Hvidliste kanal" + }, + "removeFromWhitelist": { + "message": "Fjern kanal fra hvidliste" + }, "voteOnTime": { "message": "Stem På Et Segment" + }, + "Submissions": { + "message": "Indsendelser" + }, + "savedPeopleFrom": { + "message": "Du har reddet folk fra " + }, + "viewLeaderboard": { + "message": "Topliste" + }, + "recordTimesDescription": { + "message": "Indsend" + }, + "submissionEditHint": { + "message": "Sektionsredigering vises, når du klikker på afsend", + "description": "Appears in the popup to inform them that editing has been moved to the video player." } } diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json index ea2cb035..6f5ea836 100644 --- a/public/_locales/fi/messages.json +++ b/public/_locales/fi/messages.json @@ -699,6 +699,9 @@ "downvoteDescription": { "message": "Virheellinen/väärä aika" }, + "incorrectCategory": { + "message": "Vaihda kategoria" + }, "nonMusicCategoryOnMusic": { "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." }, @@ -808,6 +811,21 @@ "LearnMore": { "message": "Opi lisää" }, + "CopyDownvoteButtonInfo": { + "message": "Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen" + }, + "OpenCategoryWikiPage": { + "message": "Avaa tämän kategorian wiki-sivu." + }, + "CopyAndDownvote": { + "message": "Kopioi ja äänestä alas" + }, + "ContinueVoting": { + "message": "Jatka äänestystä" + }, + "ChangeCategoryTooltip": { + "message": "Tämä vaikuttaa sinun segmentteihin välittömästi" + }, "SponsorTimeEditScrollNewFeature": { "message": "Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn." } diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json index 52e2f73e..609a7e07 100644 --- a/public/_locales/fr/messages.json +++ b/public/_locales/fr/messages.json @@ -699,6 +699,9 @@ "downvoteDescription": { "message": "Segment de mauvaise qualité" }, + "incorrectCategory": { + "message": "Changer de catégorie" + }, "nonMusicCategoryOnMusic": { "message": "Cette vidéo est catégorisée comme de la musique. Êtes-vous sûr qu'elle est sponsorisée? S'il s'agit en fait d'un \"Segment non musical\", allez dans les options de l'extension et activez cette catégorie. Ensuite, vous pourrez soumettre ce segment en tant que \"Segment non musical\" au lieu de sponsor. Lisez les instructions en cas de confusion." }, @@ -808,6 +811,21 @@ "LearnMore": { "message": "En savoir plus" }, + "CopyDownvoteButtonInfo": { + "message": "Vote négatif et crée une copie locale que vous pouvez soumettre à nouveau" + }, + "OpenCategoryWikiPage": { + "message": "Ouvrez la page wiki de cette catégorie." + }, + "CopyAndDownvote": { + "message": "Copier et voter contre" + }, + "ContinueVoting": { + "message": "Continuer à voter" + }, + "ChangeCategoryTooltip": { + "message": "Cela s'appliquera instantanément à vos segments" + }, "SponsorTimeEditScrollNewFeature": { "message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches Ctrl ou Shift peuvent être utilisées pour affiner les modifications." } diff --git a/public/_locales/hr/messages.json b/public/_locales/hr/messages.json index 2c8d69dc..790790b6 100644 --- a/public/_locales/hr/messages.json +++ b/public/_locales/hr/messages.json @@ -52,6 +52,9 @@ "reskip": { "message": "Preskoči opet" }, + "unmute": { + "message": "Uključi zvuk" + }, "paused": { "message": "Pauzirano" }, @@ -79,6 +82,15 @@ "sponsorEnd": { "message": "Isječak završava sada" }, + "sponsorCancel": { + "message": "Otkaži Kreiranje Segmenta" + }, + "noVideoID": { + "message": "Nijedan YouTube video nije pronađen.\nAko ovo nije točno, osvježite karticu." + }, + "refreshSegments": { + "message": "Osvježi segmente" + }, "success": { "message": "Uspjeh!" }, @@ -97,15 +109,33 @@ "openPopup": { "message": "Otvori okvir SponsorBlock" }, + "closePopup": { + "message": "Zatvori izbornik" + }, "SubmitTimes": { "message": "Podnesi isječke" }, "submitCheck": { "message": "Jesi li siguran da želiš unijeti ovo?" }, + "whitelistChannel": { + "message": "Dopusti kanal" + }, + "removeFromWhitelist": { + "message": "Izbaci kanal iz bijele liste" + }, "voteOnTime": { "message": "Glasaj za isječak" }, + "Submissions": { + "message": "Podnesci" + }, + "savedPeopleFrom": { + "message": "Sačuvali ste ljude od" + }, + "viewLeaderboard": { + "message": "Ljestvica" + }, "recordTimesDescription": { "message": "Pošalji" }, @@ -113,21 +143,54 @@ "message": "Uređivanje dijela prikazat će se nakon što pritisneš gumb za slanje", "description": "Appears in the popup to inform them that editing has been moved to the video player." }, + "popupHint": { + "message": "Savjet: Možete namjestiti tipke za podnošenje u opcijama" + }, "clearTimesButton": { "message": "Očisti vremena" }, "submitTimesButton": { "message": "Unesi vremena" }, + "publicStats": { + "message": "Ovo se koristi na stranici sa javnim statistikama da se pokaže koliko se pridonijeli. Pogledajte" + }, "Username": { "message": "Korisničko ime" }, "setUsername": { "message": "Postavi korisničko ime" }, + "copyPublicID": { + "message": "Kopiraj javni UserID" + }, + "discordAdvert": { + "message": "Pridružite nam se u službenoj Discord zajednici i pošaljite svoje prijedloge i povrate informacije!" + }, + "hideThis": { + "message": "Sakrijte ovo" + }, "Options": { "message": "Opcije" }, + "showButtons": { + "message": "Pokažite gumbove na YouTube Player-u" + }, + "hideButtons": { + "message": "Sakrite gumbove na YouTube Player-u" + }, + "hideButtonsDescription": { + "message": "Ovo sakrije gumbove za pridonose segmenta za preskočiti koje se pokažu na YouTuve Player-u." + }, + "showSkipButton": { + "message": "Ostavite gumb za preskakanje" + }, + "showInfoButton": { + "message": "Pokažite gumb za Informacije na YouTube Player-u" + }, + "hideInfoButton": { + "message": "Sakrijte gumb za Informacije na YouTube Player-u" + }, "showSkipNotice": { "message": "Pokaži obavijest nakon preskakanja isječka" }, diff --git a/public/_locales/hu/messages.json b/public/_locales/hu/messages.json index ae4319d8..5a43da37 100644 --- a/public/_locales/hu/messages.json +++ b/public/_locales/hu/messages.json @@ -52,6 +52,9 @@ "reskip": { "message": "Újra-átugrás" }, + "unmute": { + "message": "Némítás feloldása" + }, "paused": { "message": "Szüneteltetve" }, @@ -158,6 +161,9 @@ "setUsername": { "message": "Felhasználónév megadása" }, + "copyPublicID": { + "message": "Nyilvános UserID másolása" + }, "discordAdvert": { "message": "Csatlakozzon a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhasson!" }, @@ -176,6 +182,9 @@ "hideButtonsDescription": { "message": "Ez elrejti az átugrandó szegmensek megjelöléséhez használt gombokat a YouTube lejátszón." }, + "showSkipButton": { + "message": "Kiemeléshez ugrás gomb maradjon a lejátszón" + }, "showInfoButton": { "message": "Info gomb mutatása a YouTube lejátszón" }, @@ -197,6 +206,9 @@ "whatViewTracking": { "message": "Ez a funkció követi, mely szegmenseket ugrotta át, hogy más felhasználók megtudhassák mennyit segítettek a bejelentéseik és a szavazatokkal együtt egy mértékegységként van használva, hogy ne kerülhessen spam az adatbázisba. A bővítmény küld egy üzenetet a szervernek, minden alkalommal, mikor átugrik egy szegmenst. Remélhetőleg nem sokan állítják át ezt a beállítást, hogy a számok pontosak maradhassanak. :)" }, + "enableViewTrackingInPrivate": { + "message": "Átugrások számlálásának engedélyezése privát/inkognitó füleken" + }, "enableQueryByHashPrefix": { "message": "Lekérdezés Hash előtaggal" }, @@ -215,6 +227,21 @@ "showSkipNotice": { "message": "Jelezzen, ha egy szegmens át lett ugorva" }, + "noticeVisibilityMode0": { + "message": "Teljes méretű átugrási értesítők" + }, + "noticeVisibilityMode1": { + "message": "Kis méretű átugrási értesítők Auto átugrás esetén" + }, + "noticeVisibilityMode2": { + "message": "Csak kis méretű átugrási értesítők" + }, + "noticeVisibilityMode3": { + "message": "Halvány átugrási értesítők Auto átugrás esetén" + }, + "noticeVisibilityMode4": { + "message": "Csak halvány átugrási értesítők" + }, "longDescription": { "message": "A SponsorBlock-al átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé tesz bárkit arra, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Ha megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a zene videók nem-zene részei is átugorhatóak.", "description": "Full description of the extension on the store pages." @@ -238,6 +265,9 @@ "setSkipShortcut": { "message": "Billentyű beállítása szegmens átugráshoz" }, + "setStartSponsorShortcut": { + "message": "Billentyű beállítása a szegmens kezdéséhez/befejezéséhez" + }, "setSubmitKeybind": { "message": "Billentyű beállítása a beküldés gombhoz" }, @@ -269,9 +299,31 @@ "skip": { "message": "Átugrás" }, + "mute": { + "message": "Némítás" + }, "skip_category": { "message": "Átugorja ezt: {0}?" }, + "mute_category": { + "message": "{0} némítása?" + }, + "skip_to_category": { + "message": "Ugrás ide: {0}?", + "description": "Used for skipping to things (Skip to Highlight)" + }, + "skipped": { + "message": "{0} átugorva", + "description": "Example: Sponsor Skipped" + }, + "muted": { + "message": "{0} némítva", + "description": "Example: Sponsor Muted" + }, + "skipped_to_category": { + "message": "Ide ugorva: {0}", + "description": "Used for skipping to things (Skipped to Highlight)" + }, "disableAutoSkip": { "message": "Auto átugrás kikapcsolása" }, @@ -320,6 +372,9 @@ "changeUserID": { "message": "UserID importálása / exportálása" }, + "whatChangeUserID": { + "message": "Ez privát információnak minősül. Ez olyan, mint egy jelszó, így nem ajánlott megosztani senkivel. Ha valakinek birtokában van, megszemélyesítheti önt. Ha a nyilvános userID-ját keresi, kattintson a vágólap ikonra a felugró ablakban." + }, "setUserID": { "message": "UserID beállítása" }, @@ -335,9 +390,22 @@ "supportOtherSites": { "message": "Harmadik fél Youtube oldalainak támogatása" }, + "supportOtherSitesDescription": { + "message": "Harmadik fél YouTube oldalainak támogatása. A támogatás bekapcsolásához el kell fogadnia az extra engedélyeket. NEM működik inkognitó módban Chrome-ban és egyéb Chromium változatokban.", + "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" + }, + "supportedSites": { + "message": "Támogatott oldalak: " + }, "optionsInfo": { "message": "Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több." }, + "addInvidiousInstance": { + "message": "Harmadik fél kliens példányának hozzáadása" + }, + "addInvidiousInstanceDescription": { + "message": "Egyedi példány hozzáadása. Formátuma CSAK a domain legyen. Például: invidious.ajay.app" + }, "add": { "message": "Hozzáadás" }, @@ -359,6 +427,12 @@ "minDurationDescription": { "message": "A beállított értéknél rövidebb szegmenseket nem ugorja át és nem jeleníti meg a lejátszó." }, + "skipNoticeDuration": { + "message": "Átugrási értesítés hossza (másodpercek):" + }, + "skipNoticeDurationDescription": { + "message": "Az átugrási értesítés ennyi ideig marad a képernyőn. Manuális átugrásnál tovább is látható maradhat." + }, "shortCheck": { "message": "A következő szegmens rövidebb, mint az Ön által beállított minimális időtartam. Ez azt jelentheti, hogy már beküldhették, csak emiatt az opció miatt Önnek figyelmen kívül marad. Biztosan beküldi?" }, @@ -486,9 +560,15 @@ "category_preview": { "message": "Előzetes/Ismétlés" }, + "category_preview_description": { + "message": "Az előző részekben történtek rövid ismétlése, vagy a videó további tartalmának előzetese. Összevágott jelenetekhez, nem szóbeli összegzéshez." + }, "category_music_offtopic": { "message": "Zene: nem-zene szegmens" }, + "category_music_offtopic_description": { + "message": "Csak videóklipekhez. Ezt csak videóklipek olyan részeihez szabad használni, amiket nem fed le a többi kategória." + }, "category_music_offtopic_short": { "message": "Nem-Zene" }, @@ -516,9 +596,28 @@ "disable": { "message": "Kikapcsol" }, + "autoSkip_POI": { + "message": "Auto ugrás a kezdetéhez" + }, + "manualSkip_POI": { + "message": "Kérdezzen rá a videó betöltésekor" + }, + "showOverlay_POI": { + "message": "Megjelenítés a keresősávban" + }, + "autoSkipOnMusicVideos": { + "message": "Minden szegmens automatikus átugrása, ha van nem-zene szegmens" + }, + "muteSegments": { + "message": "Szegmensek engedélyezése, amelyek lenémítják a hangot az átugrás helyett" + }, "colorFormatIncorrect": { "message": "A szín helytelenül van formázva. Egy 3 vagy 6 számjegyből álló hex kódnak kell lennie egy kettőskereszttel az elején." }, + "previewColor": { + "message": "Beküldetlen színe", + "description": "Referring to submissions that have not been sent to the server yet." + }, "seekBarColor": { "message": "Keresősáv színe" }, @@ -547,6 +646,13 @@ "chooseACategory": { "message": "Válasszon kategóriát" }, + "enableThisCategoryFirst": { + "message": "Hogy \"{0}\" kategóriájú szegmenst küldhessen be, először engedélyeznie kell a beállításokban. Most átirányításra kerül a beállításokhoz.", + "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." + }, + "poiOnlyOneSegment": { + "message": "Figyelem: Az ilyen típusú szegmensekből egyszerre csak egy lehet aktív. Több beküldése esetén véletlenszerűen az egyik fog megjelenni." + }, "youMustSelectACategory": { "message": "Minden szegmenshez kategóriát kell választania beküldés előtt!" }, @@ -559,9 +665,28 @@ "hiddenDueToDuration": { "message": "elrejtve: túl rövid" }, + "channelDataNotFound": { + "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", + "message": "A csatorna ID még nem került betöltésre. Ha beágyazott videót használ, próbálja meg inkább a YouTube oldalon keresztül. Ezt okozhatja még a YouTube elrendezésének változása is. Ha így gondolja, hagyjon egy kommentet itt:" + }, + "videoInfoFetchFailed": { + "message": "Úgy tűnik, valami korlátozza a SponsorBlock hozzáférését a videó adataihoz. További információkért látogasson el ide: https://github.com/ajayyy/SponsorBlock/issues/741 (angol nyelvű)." + }, + "youtubePermissionRequest": { + "message": "Úgy tűnik, a SponsorBlock nem tud csatlakozni a YouTube API-hoz. A javításhoz fogadja el a megjelenő engedélykérést, várjon néhány másodpercet, majd töltse újra az oldalt." + }, "acceptPermission": { "message": "Engedély jóváhagyása" }, + "permissionRequestSuccess": { + "message": "Engedélykérés sikeres!" + }, + "permissionRequestFailed": { + "message": "Engedélykérés sikertelen. Nem nyomott az elutasításra?" + }, + "adblockerIssueWhitelist": { + "message": "Ha nem sikerül megoldani a problémát, kapcsolja ki a \"Csatorna ellenőrzése átugrás előtt\" opciót, mert a SponsorBlock nem tudja megszerezni a csatorna-információkat ehhez a videóhoz" + }, "forceChannelCheck": { "message": "Csatorna ellenőrzése átugrás előtt" }, @@ -574,6 +699,9 @@ "downvoteDescription": { "message": "Helytelen/rossz időzítés" }, + "incorrectCategory": { + "message": "Kategória módosítása" + }, "nonMusicCategoryOnMusic": { "message": "Ez a videó zeneként van kategorizálva. Biztos benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyissa meg a bővítmény beállításait és kapcsolja be azt a kategóriát. Ezt követően elküldheti ezt a szegmenst \"nem-zene\"-ként szponzor helyett. Amennyiben nem érti, kérjük olvassa el az irányelveket." }, @@ -600,28 +728,105 @@ "message": "Értettem", "description": "Used as the button to dismiss a tooltip" }, + "experiementOptOut": { + "message": "Minden további kísérlet elutasítása", + "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": "Eltüntetés örökre" }, + "warningChatInfo": { + "message": "Ön figyelmeztetést kapott, és ideiglenesen nem tud szegmenseket beküldeni. Ez azt jelenti, hogy észrevettük, hogy néhány ártalmatlan gyakori hibát vétett. Kérjük erősítse meg, hogy megértette a szabályokat és eltávolítjuk a figyelmeztetést. Ehhez a beszélgetéshez csatlakozhat a discord.gg/SponsorBlock vagy matrix.to/#/#sponsor:ajay.app címeken is." + }, + "voteRejectedWarning": { + "message": "Szavazás visszautasítva figyelmeztetés miatt. Kattintson, hogy megnyisson egy beszélgetést a tisztázásához, vagy jöjjön vissza később, amikor ideje van.", + "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser." + }, "Donate": { "message": "Támogatás" }, + "hideDonationLink": { + "message": "Támogatás link elrejtése" + }, + "helpPageThanksForInstalling": { + "message": "Köszönjük, hogy telepítette a SponsorBlockot." + }, + "helpPageReviewOptions": { + "message": "Kérjük, nézze át az alábbi beállításokat" + }, + "helpPageFeatureDisclaimer": { + "message": "Sok funkció le van tiltva alapból. Ha át akar ugrani bevezetőket, záróképernyőket, Invidioust használna, stb., engedélyezze őket alább. Lehetőség van a felület különböző elemeinek elrejtésére/megjelenítésére is." + }, + "helpPageHowSkippingWorks": { + "message": "Az átugrás működése" + }, + "helpPageHowSkippingWorks1": { + "message": "A videók szegmensei automatikusan átugrásra kerülnek, ha szerepelnek az adatbázisban. Megnyithatja a felugró ablakot a bővítmény ikonjára kattintva, hogy megtekinthesse őket." + }, + "helpPageHowSkippingWorks2": { + "message": "Ahányszor átugrik egy szegmenst, kapni fog egy értesítést. Ha rossznak tűnik az időzítés, szavazza le a leszavazás gombra kattintva! A felugró ablakban is szavazhat." + }, "Submitting": { "message": "Küldés" }, + "helpPageSubmitting1": { + "message": "Beküldeni lehet a felugró ablakban a \"Szegmens eleje\" gombra kattintva, vagy a videó lejátszón lévő gombokkal." + }, + "helpPageSubmitting2": { + "message": "A lejátszás gomb megnyomása jelezte a szegmens kezdetét és a stop gomb megnyomása jelzi a végét. Több szponzort is előkészíthet, mielőtt a beküldésre nyomna. A feltöltés gombra kattintva beküldésre kerülnek a szegmensek. A szemetesre kattintva kitörlődnek." + }, "Editing": { "message": "Szerkesztés" }, + "helpPageEditing1": { + "message": "Ha hibázott, szerkesztheti, vagy törölheti a szegmenseit, a felfele nyílra kattintást követően." + }, "helpPageTooSlow": { "message": "Ez túl lassú" }, + "helpPageTooSlow1": { + "message": "Vannak gyorsbillentyűk is, ha használni szeretné őket. Nyomja meg a pontosvessző billentyűt egy szponzor szegmens elejének/végének jelzéséhez és nyomja meg a vesszőt a beküldéshez. Ezek módosíthatók a beállításokban. Ha nem QWERTY-t használ, valószínűleg szükséges lesz megváltoztatnia a billentyűket." + }, + "helpPageCopyOfDatabase": { + "message": "Szerezhetek egy másolatot az adatbázisról? Mi történik, ha eltűnik a fejlesztő?" + }, + "helpPageCopyOfDatabase1": { + "message": "Az adatbázis nyilvános, és elérhető itt:" + }, + "helpPageCopyOfDatabase2": { + "message": "A forráskód szabadon elérhető. Tehát még ha valami történne is velem, a beküldések nem vesznek el." + }, "helpPageNews": { "message": "Hírek és hogyan készül" }, + "helpPageSourceCode": { + "message": "Hol szerezhetem meg a forráskódot?" + }, "Credits": { "message": "Készítők" }, + "highlightNewFeature": { + "message": "Új! Juss a videó lényegéhez csak egy kattintással, az új kiemelés kategóriával" + }, "LearnMore": { "message": "Tudj meg többet" + }, + "CopyDownvoteButtonInfo": { + "message": "Leszavazza és készít egy helyi másolatot, amit beküldhet" + }, + "OpenCategoryWikiPage": { + "message": "A kategória wiki lapjának megnyitása." + }, + "CopyAndDownvote": { + "message": "Másol és leszavaz" + }, + "ContinueVoting": { + "message": "Szavazás folytatása" + }, + "ChangeCategoryTooltip": { + "message": "Ez azonnal érvényes lesz a szegmenseire" + }, + "SponsorTimeEditScrollNewFeature": { + "message": "Használja egérgörgőjét a szerkesztő mező fölött, hogy gyorsan módosíthassa az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatja a változás mértékét." } } diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json index b3d4bb48..c864c408 100644 --- a/public/_locales/ko/messages.json +++ b/public/_locales/ko/messages.json @@ -699,6 +699,9 @@ "downvoteDescription": { "message": "잘못된 타이밍입니다" }, + "incorrectCategory": { + "message": "카테고리 변경" + }, "nonMusicCategoryOnMusic": { "message": "이 영상은 음악 영상으로 분류됩니다. 정말로 스폰서가 있는 것이 확실한가요? 만약 음악 이외의 구간인 경우, 확장 옵션을 열어 이 카테고리를 활성화 하세요. 그리고, 이 구간을 스폰서 대신 음악이 아닌 구간으로 제출하세요. 헷갈릴 경우 가이드라인을 읽으세요." }, @@ -808,6 +811,21 @@ "LearnMore": { "message": "더보기" }, + "CopyDownvoteButtonInfo": { + "message": "반대에 투표한 뒤 다시 제출할 수 있도록 미제출 사본을 생성합니다" + }, + "OpenCategoryWikiPage": { + "message": "해당 카테고리의 위키 페이지를 엽니다." + }, + "CopyAndDownvote": { + "message": "복사 및 반대" + }, + "ContinueVoting": { + "message": "계속 투표" + }, + "ChangeCategoryTooltip": { + "message": "당신의 구간에 즉시 적용될 것입니다" + }, "SponsorTimeEditScrollNewFeature": { "message": "편집 상자 위에 커서를 올린 채 스크롤하면 시간을 빠르게 조정할 수 있습니다. Ctrl이나 Shift 키를 누른 채로 스크롤하면 세밀한 조정이 가능합니다." } diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json index 9643e9b4..9a2dc2bd 100644 --- a/public/_locales/pl/messages.json +++ b/public/_locales/pl/messages.json @@ -182,6 +182,9 @@ "hideButtonsDescription": { "message": "Ta opcja ukrywa przyciski do zamieszczania segmentów pojawiające się na odtwarzaczu YouTube." }, + "showSkipButton": { + "message": "Kontynuuj wyświetlanie przycisku pomijania" + }, "showInfoButton": { "message": "Pokaż przycisk informacyjny na odtwarzaczu YouTube" }, @@ -696,6 +699,9 @@ "downvoteDescription": { "message": "Niepoprawne/Zły czas" }, + "incorrectCategory": { + "message": "Zmień kategorię" + }, "nonMusicCategoryOnMusic": { "message": "Ten film jest skategoryzowany jako muzyka. Czy masz pewność, że jest tutaj sponsor? Jeśli w rzeczywistości jest to „Sekcja Niemuzyczna”, otwórz opcje rozszerzenia i włącz tę kategorię. Wtedy będziesz w stanie zamieścić ten segment jako „Bez Muzyki” zamiast sponsora. Przeczytaj proszę wytyczne, jeśli masz wątpliwości." }, @@ -804,5 +810,23 @@ }, "LearnMore": { "message": "Dowiedz się więcej" + }, + "CopyDownvoteButtonInfo": { + "message": "Minusuje i tworzy lokalną kopię, abyś mógł przesłać poprawioną wersję" + }, + "OpenCategoryWikiPage": { + "message": "Otwórz stronę wiki dla tej kategorii." + }, + "CopyAndDownvote": { + "message": "Skopiuj i zminusuj" + }, + "ContinueVoting": { + "message": "Kontynuuj głosowanie" + }, + "ChangeCategoryTooltip": { + "message": "To natychmiastowo zostanie zastosowane do twoich segmentów" + }, + "SponsorTimeEditScrollNewFeature": { + "message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany." } } diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json index 6e635d00..1db9dc6a 100644 --- a/public/_locales/pt_BR/messages.json +++ b/public/_locales/pt_BR/messages.json @@ -825,5 +825,8 @@ }, "ChangeCategoryTooltip": { "message": "Isto irá aplicar instantaneamente seus segmentos" + }, + "SponsorTimeEditScrollNewFeature": { + "message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças." } } diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json index 06fe4623..6ecf7492 100644 --- a/public/_locales/sk/messages.json +++ b/public/_locales/sk/messages.json @@ -699,6 +699,9 @@ "downvoteDescription": { "message": "Nesprávne/Zlé načasovanie" }, + "incorrectCategory": { + "message": "Zmeniť kategóriu" + }, "nonMusicCategoryOnMusic": { "message": "Toto video je kategorizované ako hudobné. Ste si istý, že obsahuje sponzora? Ak sa skutočne jedná o časť bez hudby, otvorte možnosti rozšírenia a povoľte túto kategóriu. Potom môžete tento segment uložiť ako kategóriu \"Bez hudby\" namiesto sponzora. Ak si neviete rady, tak si prosím prečítajte pravidlá." }, @@ -808,6 +811,21 @@ "LearnMore": { "message": "Zistiť viac" }, + "CopyDownvoteButtonInfo": { + "message": "Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať" + }, + "OpenCategoryWikiPage": { + "message": "Otvoriť wiki stránku tejto kategórie." + }, + "CopyAndDownvote": { + "message": "Skopírovať a dať palec dole" + }, + "ContinueVoting": { + "message": "Pokračovať v hodnotení" + }, + "ChangeCategoryTooltip": { + "message": "Týmto ihneď vykonáte zmeny v segmentoch" + }, "SponsorTimeEditScrollNewFeature": { "message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurozor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift." } diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json index cbe73f12..8fe6d2e3 100644 --- a/public/_locales/uk/messages.json +++ b/public/_locales/uk/messages.json @@ -811,6 +811,21 @@ "LearnMore": { "message": "Дізнатися більше" }, + "CopyDownvoteButtonInfo": { + "message": "Голосує проти та створює локальну копію для повторного надсилання" + }, + "OpenCategoryWikiPage": { + "message": "Відкрити вікі-сторінку цієї категорії." + }, + "CopyAndDownvote": { + "message": "Скопіювати та проголосувати проти" + }, + "ContinueVoting": { + "message": "Продовжити голосування" + }, + "ChangeCategoryTooltip": { + "message": "Це миттєво буде застосовано до ваших сегментів" + }, "SponsorTimeEditScrollNewFeature": { "message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін." } From e685697bbbe895e7d6b8936d2d35a0e1debe637b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 3 Nov 2021 19:36:45 -0400 Subject: [PATCH 25/25] Add back info about adjusting config --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4acd4339..34d34660 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Doc You must have [Node.js 16](https://nodejs.org/) and npm installed. -1. Copy the file `config.json.example` to `config.json`. +1. Copy the file `config.json.example` to `config.json` and adjust configuration as desired. - You will need to repeat this step in the future if you get build errors related to `CompileConfig`. This can happen for example when a new category is added.