Merge branch 'development' into add-command-line-arg-to-search

This commit is contained in:
ChunkyProgrammer 2024-03-25 10:31:39 -04:00
commit 39e6936b7b
65 changed files with 1661 additions and 1115 deletions

View File

@ -36,7 +36,7 @@ jobs:
- name: Install xmlstarlet
run: sudo apt -y install xmlstarlet
- name: Create Version Variable
uses: bluwy/substitute-string-action@v2
uses: bluwy/substitute-string-action@v3
id: sub
with:
_input-text: ${{ fromJson(steps.api_results.outputs.result).tag_name }}

View File

@ -11,7 +11,7 @@ jobs:
if: github.event.pull_request.merged
runs-on: ubuntu-latest
steps:
- uses: mondeja/remove-labels-gh-action@v1.1.1
- uses: mondeja/remove-labels-gh-action@v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
labels: |
@ -27,7 +27,7 @@ jobs:
if: github.event_name == 'pull_request_target' && (! github.event.pull_request.merged) && (github.event.action != 'converted_to_draft') && (github.event.action != 'ready_for_review')
runs-on: ubuntu-latest
steps:
- uses: mondeja/remove-labels-gh-action@v1.1.1
- uses: mondeja/remove-labels-gh-action@v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
labels: |
@ -43,7 +43,7 @@ jobs:
if: github.event_name == 'pull_request_target' && github.event.action == 'converted_to_draft'
runs-on: ubuntu-latest
steps:
- uses: mondeja/remove-labels-gh-action@v1.1.1
- uses: mondeja/remove-labels-gh-action@v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
labels: |
@ -54,7 +54,7 @@ jobs:
if: github.event_name == 'pull_request_target' && github.event.action == 'ready_for_review'
runs-on: ubuntu-latest
steps:
- uses: mondeja/remove-labels-gh-action@v1.1.1
- uses: mondeja/remove-labels-gh-action@v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
labels: |

View File

@ -62,7 +62,7 @@
"autolinker": "^4.0.0",
"electron-context-menu": "^3.6.1",
"lodash.debounce": "^4.0.8",
"marked": "^12.0.0",
"marked": "^12.0.1",
"path-browserify": "^1.0.1",
"process": "^0.11.10",
"swiper": "^11.0.7",
@ -80,43 +80,43 @@
"youtubei.js": "^9.1.0"
},
"devDependencies": {
"@babel/core": "^7.24.0",
"@babel/eslint-parser": "^7.23.10",
"@babel/core": "^7.24.3",
"@babel/eslint-parser": "^7.24.1",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/preset-env": "^7.24.0",
"@babel/preset-env": "^7.24.3",
"@double-great/stylelint-a11y": "^3.0.2",
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"electron": "^29.1.0",
"electron": "^29.1.5",
"electron-builder": "^24.13.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsonc": "^2.13.0",
"eslint-plugin-jsonc": "^2.14.1",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^51.0.1",
"eslint-plugin-vue": "^9.22.0",
"eslint-plugin-vue": "^9.23.0",
"eslint-plugin-vuejs-accessibility": "^2.2.1",
"eslint-plugin-yml": "^1.12.2",
"eslint-plugin-yml": "^1.13.2",
"html-webpack-plugin": "^5.6.0",
"js-yaml": "^4.1.0",
"json-minimizer-webpack-plugin": "^5.0.0",
"lefthook": "^1.6.4",
"lefthook": "^1.6.7",
"mini-css-extract-plugin": "^2.8.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.35",
"postcss": "^8.4.38",
"postcss-scss": "^4.0.9",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"sass": "^1.71.1",
"sass": "^1.72.0",
"sass-loader": "^14.1.1",
"stylelint": "^16.2.1",
"stylelint-config-sass-guidelines": "^11.0.0",
"stylelint": "^16.3.0",
"stylelint-config-sass-guidelines": "^11.1.0",
"stylelint-config-standard": "^36.0.0",
"stylelint-high-performance-animation": "^1.10.0",
"stylelint-use-logical-spec": "^5.0.1",
@ -124,9 +124,9 @@
"vue-devtools": "^5.1.4",
"vue-eslint-parser": "^9.4.2",
"vue-loader": "^15.10.0",
"webpack": "^5.90.3",
"webpack": "^5.91.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.2",
"webpack-dev-server": "^5.0.4",
"webpack-watch-external-files-plugin": "^3.0.0",
"yaml-eslint-parser": "^1.2.2"
}

View File

@ -174,10 +174,6 @@ function runApp() {
app.commandLine.appendSwitch('enable-features', 'VaapiVideoDecodeLinuxGL')
}
// Work around for context menus in the devtools being displayed behind the window
// https://github.com/electron/electron/issues/38790
app.commandLine.appendSwitch('disable-features', 'WidgetLayering')
// command line switches need to be added before the app ready event first
// that means we can't use the normal settings system as that is asynchronous,
// doing it synchronously ensures that we add it before the event fires

View File

@ -1,7 +1,6 @@
<template>
<div
class="ft-card"
@focusout="$emit('focusout')"
>
<slot />
</div>

View File

@ -33,7 +33,12 @@ export default defineComponent({
hideForbiddenTitles: {
type: Boolean,
default: true
}
},
searchQueryText: {
type: String,
required: false,
default: '',
},
},
computed: {
listType: function () {

View File

@ -13,6 +13,7 @@
:show-video-with-last-viewed-playlist="showVideoWithLastViewedPlaylist"
:use-channels-hidden-preference="useChannelsHiddenPreference"
:hide-forbidden-titles="hideForbiddenTitles"
:search-query-text="searchQueryText"
/>
</ft-auto-grid>
</template>

View File

@ -116,6 +116,11 @@ export default defineComponent({
}
},
handleDropdownEscape: function () {
this.$refs.iconButton.focus()
// handleDropdownFocusOut will hide the dropdown for us
},
handleDropdownClick: function ({ url, index }) {
if (this.returnIndex) {
this.$emit('click', index)

View File

@ -66,6 +66,7 @@
top: dropdownPositionY === 'top'
}"
@focusout="handleDropdownFocusOut"
@keydown.esc.stop="handleDropdownEscape"
>
<slot>
<ul

View File

@ -47,6 +47,11 @@ export default defineComponent({
type: Boolean,
default: true
},
searchQueryText: {
type: String,
required: false,
default: '',
},
},
data: function () {
return {

View File

@ -28,6 +28,7 @@
v-else-if="finalDataType === 'playlist'"
:appearance="appearance"
:data="data"
:search-query-text="searchQueryText"
/>
<ft-community-post
v-else-if="finalDataType === 'community'"

View File

@ -15,7 +15,12 @@ export default defineComponent({
appearance: {
type: String,
required: true
}
},
searchQueryText: {
type: String,
required: false,
default: '',
},
},
data: function () {
return {
@ -79,6 +84,7 @@ export default defineComponent({
path: `/playlist/${this.playlistId}`,
query: {
playlistType: this.isUserPlaylist ? 'user' : '',
searchQueryText: this.searchQueryText,
},
}
},

View File

@ -7,7 +7,6 @@ import {
formatNumber,
openExternalLink,
showToast,
toLocalePublicationString,
toDistractionFreeTitle,
deepCopy
} from '../../helpers/utils'
@ -98,7 +97,7 @@ export default defineComponent({
duration: '',
description: '',
watchProgress: 0,
publishedText: '',
published: undefined,
isLive: false,
isUpcoming: false,
isPremium: false,
@ -657,60 +656,60 @@ export default defineComponent({
if (typeof premiereDate === 'string') {
premiereDate = new Date(premiereDate)
}
this.publishedText = premiereDate.toLocaleString()
this.uploadedTime = premiereDate.toLocaleString([this.currentLocale, 'en'])
this.published = premiereDate.getTime()
} else if (typeof (this.data.premiereTimestamp) !== 'undefined') {
this.publishedText = new Date(this.data.premiereTimestamp * 1000).toLocaleString()
} else {
this.publishedText = this.data.publishedText
}
this.uploadedTime = new Date(this.data.premiereTimestamp * 1000).toLocaleString([this.currentLocale, 'en'])
this.published = this.data.premiereTimestamp * 1000
} else if (typeof this.data.published === 'number' && !this.isLive) {
this.published = this.data.published
if (this.data.isRSS && this.data.publishedDate != null && !this.isLive) {
const now = new Date()
// Convert from ms to second
// For easier code interpretation the value is made to be positive
// `publishedDate` is sometimes a string, e.g. when switched back from another view
const publishedDate = Date.parse(this.data.publishedDate)
let timeDiffFromNow = ((now - publishedDate) / 1000)
let timeUnit = 'second'
if (this.inHistory) {
this.uploadedTime = new Date(this.data.published).toLocaleDateString([this.currentLocale, 'en'])
} else {
const now = new Date().getTime()
// Convert from ms to second
// For easier code interpretation the value is made to be positive
let timeDiffFromNow = ((now - this.data.published) / 1000)
let timeUnit = 'second'
if (timeDiffFromNow > 60) {
timeDiffFromNow /= 60
timeUnit = 'minute'
if (timeDiffFromNow >= 60) {
timeDiffFromNow /= 60
timeUnit = 'minute'
}
if (timeUnit === 'minute' && timeDiffFromNow >= 60) {
timeDiffFromNow /= 60
timeUnit = 'hour'
}
if (timeUnit === 'hour' && timeDiffFromNow >= 24) {
timeDiffFromNow /= 24
timeUnit = 'day'
}
const timeDiffFromNowDays = timeDiffFromNow
if (timeUnit === 'day' && timeDiffFromNow >= 7) {
timeDiffFromNow /= 7
timeUnit = 'week'
}
// Use 30 days per month, just like calculatePublishedDate
if (timeUnit === 'week' && timeDiffFromNowDays >= 30) {
timeDiffFromNow = timeDiffFromNowDays / 30
timeUnit = 'month'
}
if (timeUnit === 'month' && timeDiffFromNow >= 12) {
timeDiffFromNow /= 12
timeUnit = 'year'
}
// Using `Math.ceil` so that -1.x days ago displayed as 1 day ago
// Notice that the value is turned to negative to be displayed as "ago"
this.uploadedTime = new Intl.RelativeTimeFormat([this.currentLocale, 'en']).format(Math.ceil(-timeDiffFromNow), timeUnit)
}
if (timeUnit === 'minute' && timeDiffFromNow > 60) {
timeDiffFromNow /= 60
timeUnit = 'hour'
}
if (timeUnit === 'hour' && timeDiffFromNow > 24) {
timeDiffFromNow /= 24
timeUnit = 'day'
}
// Diff month might have diff no. of days
// To ensure the display is fine we use 31
if (timeUnit === 'day' && timeDiffFromNow > 31) {
timeDiffFromNow /= 24
timeUnit = 'month'
}
if (timeUnit === 'month' && timeDiffFromNow > 12) {
timeDiffFromNow /= 12
timeUnit = 'year'
}
// Using `Math.ceil` so that -1.x days ago displayed as 1 day ago
// Notice that the value is turned to negative to be displayed as "ago"
this.uploadedTime = new Intl.RelativeTimeFormat(this.currentLocale).format(Math.ceil(-timeDiffFromNow), timeUnit)
} else if (this.publishedText && !this.isLive) {
// produces a string according to the template in the locales string
this.uploadedTime = toLocalePublicationString({
publishText: this.publishedText,
isLive: this.isLive,
isUpcoming: this.isUpcoming,
isRSS: this.data.isRSS
})
}
if (this.hideVideoViews) {
@ -732,14 +731,6 @@ export default defineComponent({
// For UX consistency, no progress reading if writing disabled
this.watchProgress = historyEntry.watchProgress
}
if (historyEntry.published !== '') {
const videoPublished = historyEntry.published
const videoPublishedDate = new Date(videoPublished)
this.publishedText = videoPublishedDate.toLocaleDateString()
} else {
this.publishedText = ''
}
} else {
this.watchProgress = 0
}
@ -751,7 +742,7 @@ export default defineComponent({
title: this.title,
author: this.channelName,
authorId: this.channelId,
published: this.publishedText ? this.publishedText.split(',')[0] : this.publishedText,
published: this.published,
description: this.description,
viewCount: this.viewCount,
lengthSeconds: this.data.lengthSeconds,

View File

@ -137,13 +137,9 @@
{{ $tc('Global.Counts.View Count', viewCount, {count: parsedViewCount}) }}
</span>
<span
v-if="uploadedTime !== '' && !isLive && !inHistory"
v-if="uploadedTime !== '' && !isLive"
class="uploadedTime"
> {{ uploadedTime }}</span>
<span
v-if="inHistory"
class="uploadedTime"
> {{ publishedText }}</span>
<span
v-if="isLive && !hideViews"
class="viewCount"

View File

@ -16,6 +16,36 @@
flex-direction: column;
}
.searchInputsRow {
display: grid;
/* 2 columns */
grid-template-columns: 1fr auto;
column-gap: 16px;
}
@media only screen and (max-width: 800px) {
.searchInputsRow {
/* Switch to 2 rows from 2 columns */
grid-template-columns: auto;
grid-template-rows: auto auto;
}
}
.optionsRow {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr;
align-items: center;
}
@media only screen and (max-width: 800px) {
.optionsRow {
/* Switch to 2 rows from 2 columns */
grid-template-columns: auto;
grid-template-rows: auto auto;
align-items: stretch;
}
}
.sortSelect {
/* Put it on the right */
margin-inline-start: auto;

View File

@ -7,6 +7,7 @@ import FtButton from '../ft-button/ft-button.vue'
import FtPlaylistSelector from '../ft-playlist-selector/ft-playlist-selector.vue'
import FtInput from '../../components/ft-input/ft-input.vue'
import FtSelect from '../../components/ft-select/ft-select.vue'
import FtToggleSwitch from '../../components/ft-toggle-switch/ft-toggle-switch.vue'
import {
showToast,
} from '../../helpers/utils'
@ -31,12 +32,14 @@ export default defineComponent({
'ft-playlist-selector': FtPlaylistSelector,
'ft-input': FtInput,
'ft-select': FtSelect,
'ft-toggle-switch': FtToggleSwitch,
},
data: function () {
return {
selectedPlaylistIdList: [],
createdSincePromptShownPlaylistIdList: [],
query: '',
doSearchPlaylistsWithMatchingVideos: false,
updateQueryDebounce: function() {},
lastShownAt: Date.now(),
lastActiveElement: null,
@ -115,6 +118,12 @@ export default defineComponent({
return this.allPlaylists.filter((playlist) => {
if (typeof (playlist.playlistName) !== 'string') { return false }
if (this.doSearchPlaylistsWithMatchingVideos) {
if (playlist.videos.some((v) => v.title.toLowerCase().includes(this.processedQuery))) {
return true
}
}
return playlist.playlistName.toLowerCase().includes(this.processedQuery)
})
},

View File

@ -12,23 +12,37 @@
playlistCount: selectedPlaylistCount,
}) }}
</p>
<ft-input
ref="searchBar"
:placeholder="$t('User Playlists.AddVideoPrompt.Search in Playlists')"
:show-clear-text-button="true"
:show-action-button="false"
@input="(input) => updateQueryDebounce(input)"
@clear="updateQueryDebounce('')"
/>
<ft-select
v-if="allPlaylists.length > 1"
class="sortSelect"
:value="sortBy"
:select-names="sortBySelectNames"
:select-values="sortBySelectValues"
:placeholder="$t('User Playlists.Sort By.Sort By')"
@change="sortBy = $event"
/>
<div
class="searchInputsRow"
>
<ft-input
ref="searchBar"
:placeholder="$t('User Playlists.AddVideoPrompt.Search in Playlists')"
:show-clear-text-button="true"
:show-action-button="false"
@input="(input) => updateQueryDebounce(input)"
@clear="updateQueryDebounce('')"
/>
</div>
<div
class="optionsRow"
>
<ft-toggle-switch
:label="$t('User Playlists.Playlists with Matching Videos')"
:compact="true"
:default-value="doSearchPlaylistsWithMatchingVideos"
@change="doSearchPlaylistsWithMatchingVideos = !doSearchPlaylistsWithMatchingVideos"
/>
<ft-select
v-if="allPlaylists.length > 1"
class="sortSelect"
:value="sortBy"
:select-names="sortBySelectNames"
:select-values="sortBySelectValues"
:placeholder="$t('User Playlists.Sort By.Sort By')"
@change="sortBy = $event"
/>
</div>
<div class="playlists-container">
<ft-flex-box>
<div

View File

@ -73,6 +73,11 @@ export default defineComponent({
}
},
handleProfileListEscape: function () {
this.$refs.iconButton.focus()
// handleProfileListFocusOut will hide the dropdown for us
},
setActiveProfile: function (profile) {
if (this.activeProfile._id !== profile._id) {
const targetProfile = this.profileList.find((x) => {

View File

@ -1,6 +1,7 @@
<template>
<div>
<div
ref="iconButton"
class="colorOption"
:title="$t('Profile.Toggle Profile List')"
:style="{ background: activeProfile.bgColor, color: activeProfile.textColor }"
@ -25,7 +26,8 @@
ref="profileList"
class="profileList"
tabindex="-1"
@focusout="handleProfileListFocusOut"
@focusout.native="handleProfileListFocusOut"
@keydown.native.esc.stop="handleProfileListEscape"
>
<h3
id="profileListTitle"

View File

@ -29,3 +29,9 @@
background-color: #000;
}
/* stylelint-enable liberty/use-logical-spec */
@media only screen and (max-width: 460px) {
:deep(.dash-selector .vjs-menu) {
max-block-size: 14em;
}
}

View File

@ -1817,6 +1817,34 @@ export default defineComponent({
// For default auto, it may select a resolution before generating the quality buttons
button.querySelector('#vjs-current-quality').innerText = defaultIsAuto ? autoQualityLabel : currentQualityLabel
const vjsMenu = button.querySelector('.vjs-menu')
let isTapping = false
button.addEventListener('touchstart', () => {
isTapping = true
})
button.addEventListener('touchmove', () => {
// if they are moving, they cannot be tapping
isTapping = false
})
button.addEventListener('touchend', (e) => {
if (isTapping) {
button.focus()
// make it easier to toggle the vjs-menu on touch (hover css is inconsistent w/ touch)
if (!e.target.classList.contains('quality-item') && !e.target.classList.contains('vjs-menu-item-text')) {
vjsMenu.classList.toggle('vjs-lock-showing')
} else {
// hide the quality selector on select (just like the other quality selectors do on mobile)
vjsMenu.classList.remove('vjs-lock-showing')
}
this.handleClick(e)
isTapping = false
}
})
button.addEventListener('focusout', () => {
// remove class which shows the selector
vjsMenu.classList.remove('vjs-lock-showing')
})
button.classList.add('dash-selector')
return button.children[0]
}

View File

@ -83,6 +83,18 @@ export default defineComponent({
type: Boolean,
required: true,
},
searchVideoModeAllowed: {
type: Boolean,
required: true,
},
searchVideoModeEnabled: {
type: Boolean,
required: true,
},
searchQueryText: {
type: String,
required: true,
},
},
data: function () {
return {
@ -239,6 +251,12 @@ export default defineComponent({
this.newTitle = this.title
this.newDescription = this.description
if (this.videoCount > 0) {
// Only enable search video mode when viewing non empty playlists
this.searchVideoMode = this.searchVideoModeEnabled
this.query = this.searchQueryText
}
this.updateQueryDebounce = debounce(this.updateQuery, 500)
},
methods: {

View File

@ -108,7 +108,7 @@
<div class="playlistOptions">
<ft-icon-button
v-if="isUserPlaylist && videoCount > 0 && !editMode"
v-if="searchVideoModeAllowed && videoCount > 0 && !editMode"
ref="enableSearchModeButton"
:title="$t('User Playlists.SinglePlaylistView.Search for Videos')"
:icon="['fas', 'search']"
@ -198,7 +198,7 @@
</div>
<div
v-if="isUserPlaylist && searchVideoMode"
v-if="searchVideoModeAllowed && searchVideoMode"
class="searchInputsRow"
>
<ft-input
@ -207,11 +207,11 @@
:placeholder="$t('User Playlists.SinglePlaylistView.Search for Videos')"
:show-clear-text-button="true"
:show-action-button="false"
:value="query"
@input="(input) => updateQueryDebounce(input)"
@clear="updateQueryDebounce('')"
/>
<ft-icon-button
v-if="isUserPlaylist && searchVideoMode"
:title="$t('User Playlists.Cancel')"
:icon="['fas', 'times']"
theme="secondary"

View File

@ -2,10 +2,10 @@ import { defineComponent } from 'vue'
import { mapActions, mapMutations } from 'vuex'
import SubscriptionsTabUI from '../subscriptions-tab-ui/subscriptions-tab-ui.vue'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { setPublishedTimestampsInvidious, copyToClipboard, showToast } from '../../helpers/utils'
import { invidiousAPICall } from '../../helpers/api/invidious'
import { getLocalChannelLiveStreams } from '../../helpers/api/local'
import { addPublishedDatesInvidious, addPublishedDatesLocal, parseYouTubeRSSFeed, updateVideoListAfterProcessing } from '../../helpers/subscriptions'
import { parseYouTubeRSSFeed, updateVideoListAfterProcessing } from '../../helpers/subscriptions'
export default defineComponent({
name: 'SubscriptionsLive',
@ -198,8 +198,6 @@ export default defineComponent({
}
}
addPublishedDatesLocal(result.videos)
return result
} catch (err) {
console.error(err)
@ -294,7 +292,7 @@ export default defineComponent({
invidiousAPICall(subscriptionsPayload).then((result) => {
const videos = result.videos.filter(e => e.type === 'video')
addPublishedDatesInvidious(videos)
setPublishedTimestampsInvidious(videos)
let name

View File

@ -2,10 +2,10 @@ import { defineComponent } from 'vue'
import { mapActions, mapMutations } from 'vuex'
import SubscriptionsTabUI from '../subscriptions-tab-ui/subscriptions-tab-ui.vue'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { setPublishedTimestampsInvidious, copyToClipboard, showToast } from '../../helpers/utils'
import { invidiousAPICall } from '../../helpers/api/invidious'
import { getLocalChannelVideos } from '../../helpers/api/local'
import { addPublishedDatesInvidious, addPublishedDatesLocal, parseYouTubeRSSFeed, updateVideoListAfterProcessing } from '../../helpers/subscriptions'
import { parseYouTubeRSSFeed, updateVideoListAfterProcessing } from '../../helpers/subscriptions'
export default defineComponent({
name: 'SubscriptionsVideos',
@ -198,8 +198,6 @@ export default defineComponent({
}
}
addPublishedDatesLocal(result.videos)
return result
} catch (err) {
console.error(err)
@ -291,7 +289,7 @@ export default defineComponent({
}
invidiousAPICall(subscriptionsPayload).then((result) => {
addPublishedDatesInvidious(result.videos)
setPublishedTimestampsInvidious(result.videos)
let name

View File

@ -3,7 +3,7 @@ import { mapMutations } from 'vuex'
import FtLoader from '../ft-loader/ft-loader.vue'
import FtCard from '../ft-card/ft-card.vue'
import FtListVideoNumbered from '../ft-list-video-numbered/ft-list-video-numbered.vue'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { copyToClipboard, setPublishedTimestampsInvidious, showToast } from '../../helpers/utils'
import {
getLocalPlaylist,
parseLocalPlaylistVideo,
@ -451,6 +451,8 @@ export default defineComponent({
this.playlistTitle = result.title
this.channelName = result.author
this.channelId = result.authorId
setPublishedTimestampsInvidious(result.videos)
this.playlistItems = this.playlistItems.concat(result.videos)
this.isLoading = false

View File

@ -5,6 +5,7 @@ import { join } from 'path'
import { PlayerCache } from './PlayerCache'
import {
CHANNEL_HANDLE_REGEX,
calculatePublishedDate,
escapeHTML,
extractNumberFromString,
getUserDataPath,
@ -681,8 +682,7 @@ export function parseLocalPlaylistVideo(video) {
}
}
let publishedText = null
let publishedText
// normal videos have 3 text runs with the last one containing the published date
// live videos have 2 text runs with the number of people watching
// upcoming either videos don't have any info text or the number of people waiting,
@ -691,13 +691,20 @@ export function parseLocalPlaylistVideo(video) {
publishedText = video_.video_info.runs[2].text
}
const published = calculatePublishedDate(
publishedText,
video_.is_live,
video_.is_upcoming,
video_.upcoming
)
return {
videoId: video_.id,
title: video_.title.text,
author: video_.author.name,
authorId: video_.author.id,
viewCount,
publishedText,
published,
lengthSeconds: isNaN(video_.duration.seconds) ? '' : video_.duration.seconds,
liveNow: video_.is_live,
isUpcoming: video_.is_upcoming,
@ -728,6 +735,20 @@ export function parseLocalListVideo(item) {
} else {
/** @type {import('youtubei.js').YTNodes.Video} */
const video = item
let publishedText
if (!video.published?.isEmpty()) {
publishedText = video.published.text
}
const published = calculatePublishedDate(
publishedText,
video.is_live,
video.is_upcoming || video.is_premiere,
video.upcoming
)
return {
type: 'video',
videoId: video.id,
@ -736,7 +757,7 @@ export function parseLocalListVideo(item) {
authorId: video.author.id,
description: video.description,
viewCount: video.view_count == null ? null : extractNumberFromString(video.view_count.text),
publishedText: (video.published == null || video.published.isEmpty()) ? null : video.published.text,
published,
lengthSeconds: isNaN(video.duration.seconds) ? '' : video.duration.seconds,
liveNow: video.is_live,
isUpcoming: video.is_upcoming || video.is_premiere,
@ -811,6 +832,14 @@ function parseListItem(item) {
* @param {import('youtubei.js').YTNodes.CompactVideo} video
*/
export function parseLocalWatchNextVideo(video) {
let publishedText
if (!video.published?.isEmpty()) {
publishedText = video.published.text
}
const published = calculatePublishedDate(publishedText, video.is_live, video.is_premiere)
return {
type: 'video',
videoId: video.id,
@ -818,7 +847,7 @@ export function parseLocalWatchNextVideo(video) {
author: video.author.name,
authorId: video.author.id,
viewCount: video.view_count == null ? null : extractNumberFromString(video.view_count.text),
publishedText: (video.published == null || video.published.isEmpty()) ? null : video.published.text,
published,
lengthSeconds: isNaN(video.duration.seconds) ? '' : video.duration.seconds,
liveNow: video.is_live,
isUpcoming: video.is_premiere

View File

@ -1,5 +1,4 @@
import store from '../store/index'
import { calculatePublishedDate } from './utils'
/**
* Filtering and sort based on user preferences
@ -57,7 +56,7 @@ export function updateVideoListAfterProcessing(videos) {
}
videoList.sort((a, b) => {
return b.publishedDate - a.publishedDate
return b.published - a.published
})
return videoList
@ -106,57 +105,10 @@ async function parseRSSEntry(entry, channelId, channelName) {
// querySelector doesn't support xml namespaces so we have to use getElementsByTagName here
videoId: entry.getElementsByTagName('yt:videoId')[0].textContent,
title: entry.querySelector('title').textContent,
publishedDate: published,
publishedText: published.toLocaleString(),
published: published.getTime(),
viewCount: entry.getElementsByTagName('media:statistics')[0]?.getAttribute('views') || null,
type: 'video',
lengthSeconds: '0:00',
isRSS: true
}
}
/**
* @param {{
* liveNow: boolean,
* isUpcoming: boolean,
* premiereDate: Date,
* publishedText: string,
* publishedDate: number
* }[]} videos publishedDate is added by this function,
* but adding it to the type definition stops vscode warning that the property doesn't exist
*/
export function addPublishedDatesLocal(videos) {
videos.forEach(video => {
if (video.liveNow) {
video.publishedDate = new Date().getTime()
} else if (video.isUpcoming) {
video.publishedDate = video.premiereDate
} else {
video.publishedDate = calculatePublishedDate(video.publishedText)
}
return video
})
}
/**
* @param {{
* liveNow: boolean,
* isUpcoming: boolean,
* premiereTimestamp: number,
* published: number,
* publishedDate: number
* }[]} videos publishedDate is added by this function,
* but adding it to the type definition stops vscode warning that the property doesn't exist
*/
export function addPublishedDatesInvidious(videos) {
videos.forEach(video => {
if (video.liveNow) {
video.publishedDate = new Date().getTime()
} else if (video.isUpcoming) {
video.publishedDate = new Date(video.premiereTimestamp * 1000)
} else {
video.publishedDate = new Date(video.published * 1000)
}
return video
})
}

View File

@ -12,11 +12,27 @@ export const CHANNEL_HANDLE_REGEX = /^@[\w.-]{3,30}$/
const PUBLISHED_TEXT_REGEX = /(\d+)\s?([a-z]+)/i
/**
* @param {string} publishedText
* @param {boolean} isLive
* @param {boolean} isUpcoming
* @param {Date|undefined} premiereDate
*/
export function calculatePublishedDate(publishedText) {
export function calculatePublishedDate(publishedText, isLive = false, isUpcoming = false, premiereDate = undefined) {
const date = new Date()
if (publishedText === 'Live') {
return publishedText
if (isLive) {
return date.getTime()
} else if (isUpcoming) {
if (premiereDate) {
return premiereDate.getTime()
} else {
// should never happen but just to be sure that we always return a number
return date.getTime()
}
}
if (!publishedText) {
console.error("publishedText is missing but the video isn't live or upcoming")
return undefined
}
const match = publishedText.match(PUBLISHED_TEXT_REGEX)
@ -44,6 +60,26 @@ export function calculatePublishedDate(publishedText) {
return date.getTime() - timeSpan
}
/**
* @param {{
* liveNow: boolean,
* isUpcoming: boolean,
* premiereTimestamp: number,
* published: number
* }[]} videos
*/
export function setPublishedTimestampsInvidious(videos) {
videos.forEach(video => {
if (video.liveNow) {
video.published = new Date().getTime()
} else if (video.isUpcoming) {
video.published = video.premiereTimestamp * 1000
} else if (typeof video.published === 'number') {
video.published *= 1000
}
})
}
export function toLocalePublicationString ({ publishText, isLive = false, isUpcoming = false, isRSS = false }) {
if (isLive) {
return i18n.tc('Global.Counts.Watching Count', 0, { count: 0 })

View File

@ -370,7 +370,9 @@ $watched-transition-duration: 0.5s;
}
&:hover .optionsButton,
&:has(:focus-visible) .optionsButton {
&:has(:focus-visible) .optionsButton,
// Keep visible when the drop down is open
:deep(.optionsButton:has(> .iconDropdown:focus-within)) {
opacity: 1;
}

View File

@ -12,7 +12,13 @@ import FtSubscribeButton from '../../components/ft-subscribe-button/ft-subscribe
import ChannelAbout from '../../components/channel-about/channel-about.vue'
import autolinker from 'autolinker'
import { copyToClipboard, extractNumberFromString, formatNumber, showToast } from '../../helpers/utils'
import {
setPublishedTimestampsInvidious,
copyToClipboard,
extractNumberFromString,
formatNumber,
showToast
} from '../../helpers/utils'
import { isNullOrEmpty } from '../../helpers/strings'
import packageDetails from '../../../../package.json'
import {
@ -33,10 +39,6 @@ import {
parseLocalListVideo,
parseLocalSubscriberCount
} from '../../helpers/api/local'
import {
addPublishedDatesInvidious,
addPublishedDatesLocal
} from '../../helpers/subscriptions'
export default defineComponent({
name: 'Channel',
@ -780,7 +782,6 @@ export default defineComponent({
this.isElementListLoading = false
if (this.isSubscribedInAnyProfile && this.latestVideos.length > 0 && this.videoSortBy === 'newest') {
addPublishedDatesLocal(this.latestVideos)
this.updateSubscriptionVideosCacheByChannel({
channelId: this.id,
// create a copy so that we only cache the first page
@ -917,7 +918,6 @@ export default defineComponent({
this.isElementListLoading = false
if (this.isSubscribedInAnyProfile && this.latestLive.length > 0 && this.liveSortBy === 'newest') {
addPublishedDatesLocal(this.latestLive)
this.updateSubscriptionLiveCacheByChannel({
channelId: this.id,
// create a copy so that we only cache the first page
@ -992,7 +992,6 @@ export default defineComponent({
thumbnailUrl: youtubeImageUrlToInvidious(thumbnailUrl, this.currentInvidiousInstance)
}
})
this.latestVideos = response.latestVideos
if (response.authorBanners instanceof Array && response.authorBanners.length > 0) {
this.bannerUrl = youtubeImageUrlToInvidious(response.authorBanners[0].url, this.currentInvidiousInstance)
@ -1088,6 +1087,8 @@ export default defineComponent({
}
invidiousAPICall(payload).then((response) => {
setPublishedTimestampsInvidious(response.videos)
if (more) {
this.latestVideos = this.latestVideos.concat(response.videos)
} else {
@ -1097,7 +1098,6 @@ export default defineComponent({
this.isElementListLoading = false
if (this.isSubscribedInAnyProfile && !more && this.latestVideos.length > 0 && this.videoSortBy === 'newest') {
addPublishedDatesInvidious(this.latestVideos)
this.updateSubscriptionVideosCacheByChannel({
channelId: this.id,
// create a copy so that we only cache the first page
@ -1143,7 +1143,7 @@ export default defineComponent({
// https://github.com/iv-org/invidious/issues/3801
response.videos.forEach(video => {
video.isUpcoming = false
delete video.publishedText
delete video.published
delete video.premiereTimestamp
})
@ -1199,6 +1199,8 @@ export default defineComponent({
}
invidiousAPICall(payload).then((response) => {
setPublishedTimestampsInvidious(response.videos)
if (more) {
this.latestLive.push(...response.videos)
} else {
@ -1208,7 +1210,6 @@ export default defineComponent({
this.isElementListLoading = false
if (this.isSubscribedInAnyProfile && !more && this.latestLive.length > 0 && this.liveSortBy === 'newest') {
addPublishedDatesInvidious(this.latestLive)
this.updateSubscriptionLiveCacheByChannel({
channelId: this.id,
// create a copy so that we only cache the first page

View File

@ -5,7 +5,7 @@ import FtFlexBox from '../../components/ft-flex-box/ft-flex-box.vue'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
import packageDetails from '../../../../package.json'
import { getHashtagLocal, parseLocalListVideo } from '../../helpers/api/local'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { copyToClipboard, setPublishedTimestampsInvidious, showToast } from '../../helpers/utils'
import { isNullOrEmpty } from '../../helpers/strings'
import { getHashtagInvidious } from '../../helpers/api/invidious'
@ -73,6 +73,7 @@ export default defineComponent({
getInvidiousHashtag: async function(hashtag, page) {
try {
const videos = await getHashtagInvidious(hashtag, page)
setPublishedTimestampsInvidious(videos)
this.hashtag = '#' + hashtag
this.isLoading = false
this.apiUsed = 'invidious'

View File

@ -12,7 +12,7 @@ import {
getLocalPlaylistContinuation,
parseLocalPlaylistVideo,
} from '../../helpers/api/local'
import { extractNumberFromString, showToast } from '../../helpers/utils'
import { extractNumberFromString, setPublishedTimestampsInvidious, showToast } from '../../helpers/utils'
import { invidiousGetPlaylistInfo, youtubeImageUrlToInvidious } from '../../helpers/api/invidious'
export default defineComponent({
@ -113,6 +113,17 @@ export default defineComponent({
}
},
searchVideoModeAllowed() {
return this.isUserPlaylistRequested
},
searchQueryTextRequested() {
return this.$route.query.searchQueryText
},
searchQueryTextPresent() {
const searchQueryText = this.searchQueryTextRequested
return typeof searchQueryText === 'string' && searchQueryText !== ''
},
isUserPlaylistRequested: function () {
return this.$route.query.playlistType === 'user'
},
@ -181,6 +192,11 @@ export default defineComponent({
},
created: function () {
this.getPlaylistInfoDebounce = debounce(this.getPlaylistInfo, 100)
if (this.searchVideoModeAllowed && this.searchQueryTextPresent) {
this.playlistInVideoSearchMode = true
this.videoSearchQuery = this.searchQueryTextRequested
}
},
mounted: function () {
this.getPlaylistInfoDebounce()
@ -284,6 +300,8 @@ export default defineComponent({
const dateString = new Date(result.updated * 1000)
this.lastUpdated = dateString.toLocaleDateString(this.currentLocale, { year: 'numeric', month: 'short', day: 'numeric' })
setPublishedTimestampsInvidious(result.videos)
this.playlistItems = result.videos
this.isLoading = false

View File

@ -22,6 +22,9 @@
:view-count="viewCount"
:info-source="infoSource"
:more-video-data-available="moreVideoDataAvailable"
:search-video-mode-allowed="searchVideoModeAllowed"
:search-video-mode-enabled="playlistInVideoSearchMode"
:search-query-text="searchQueryTextRequested"
class="playlistInfo"
:class="{
promptOpen,

View File

@ -5,7 +5,7 @@ import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
import FtIconButton from '../../components/ft-icon-button/ft-icon-button.vue'
import { invidiousAPICall } from '../../helpers/api/invidious'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { copyToClipboard, setPublishedTimestampsInvidious, showToast } from '../../helpers/utils'
export default defineComponent({
name: 'Popular',
@ -60,11 +60,15 @@ export default defineComponent({
return
}
this.shownResults = result.filter((item) => {
const items = result.filter((item) => {
return item.type === 'video' || item.type === 'shortVideo' || item.type === 'channel' || item.type === 'playlist'
})
setPublishedTimestampsInvidious(items.filter(item => item.type === 'video' || item.type === 'shortVideo'))
this.shownResults = items
this.isLoading = false
this.$store.commit('setPopularCache', this.shownResults)
this.$store.commit('setPopularCache', items)
},
/**

View File

@ -2,7 +2,12 @@ import { defineComponent } from 'vue'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
import FtCard from '../../components/ft-card/ft-card.vue'
import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
import { copyToClipboard, searchFiltersMatch, showToast } from '../../helpers/utils'
import {
copyToClipboard,
searchFiltersMatch,
setPublishedTimestampsInvidious,
showToast
} from '../../helpers/utils'
import { getLocalSearchContinuation, getLocalSearchResults } from '../../helpers/api/local'
import { invidiousAPICall } from '../../helpers/api/invidious'
import TopNavEvents from '../../components/top-nav/top-nav-events'
@ -219,6 +224,8 @@ export default defineComponent({
return item.type === 'video' || item.type === 'channel' || item.type === 'playlist' || item.type === 'hashtag'
})
setPublishedTimestampsInvidious(returnData.filter(item => item.type === 'video'))
if (this.searchPage !== 1) {
this.shownResults = this.shownResults.concat(returnData)
} else {

View File

@ -6,7 +6,7 @@ import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
import FtIconButton from '../../components/ft-icon-button/ft-icon-button.vue'
import FtFlexBox from '../../components/ft-flex-box/ft-flex-box.vue'
import { copyToClipboard, showToast } from '../../helpers/utils'
import { copyToClipboard, setPublishedTimestampsInvidious, showToast } from '../../helpers/utils'
import { getLocalTrending } from '../../helpers/api/local'
import { invidiousAPICall } from '../../helpers/api/invidious'
@ -146,6 +146,8 @@ export default defineComponent({
return item.type === 'video' || item.type === 'channel' || item.type === 'playlist'
})
setPublishedTimestampsInvidious(returnData.filter(item => item.type === 'video'))
this.shownResults = returnData
this.isLoading = false
this.$store.commit('setTrendingCache', { value: returnData, page: this.currentTab })

View File

@ -16,6 +16,36 @@
vertical-align: middle;
}
.searchInputsRow {
display: grid;
/* 2 columns */
grid-template-columns: 1fr auto;
column-gap: 16px;
}
@media only screen and (max-width: 800px) {
.searchInputsRow {
/* Switch to 2 rows from 2 columns */
grid-template-columns: auto;
grid-template-rows: auto auto;
}
}
.optionsRow {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr;
align-items: center;
}
@media only screen and (max-width: 800px) {
.optionsRow {
/* Switch to 2 rows from 2 columns */
grid-template-columns: auto;
grid-template-rows: auto auto;
align-items: stretch;
}
}
.sortSelect {
/* Put it on the right */
margin-inline-start: auto;

View File

@ -10,6 +10,7 @@ import FtSelect from '../../components/ft-select/ft-select.vue'
import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
import FtInput from '../../components/ft-input/ft-input.vue'
import FtIconButton from '../../components/ft-icon-button/ft-icon-button.vue'
import FtToggleSwitch from '../../components/ft-toggle-switch/ft-toggle-switch.vue'
const SORT_BY_VALUES = {
NameAscending: 'name_ascending',
@ -37,6 +38,7 @@ export default defineComponent({
'ft-element-list': FtElementList,
'ft-icon-button': FtIconButton,
'ft-input': FtInput,
'ft-toggle-switch': FtToggleSwitch,
},
data: function () {
return {
@ -45,6 +47,7 @@ export default defineComponent({
searchDataLimit: 100,
showLoadMoreButton: false,
query: '',
doSearchPlaylistsWithMatchingVideos: false,
activeData: [],
sortBy: SORT_BY_VALUES.LatestPlayedFirst,
}
@ -165,6 +168,10 @@ export default defineComponent({
this.searchDataLimit = 100
this.filterPlaylistAsync()
},
doSearchPlaylistsWithMatchingVideos() {
this.searchDataLimit = 100
this.filterPlaylistAsync()
},
fullData() {
this.activeData = this.fullData
this.filterPlaylist()
@ -209,15 +216,22 @@ export default defineComponent({
if (this.lowerCaseQuery === '') {
this.activeData = this.fullData
this.showLoadMoreButton = this.allPlaylists.length > this.activeData.length
} else {
const filteredPlaylists = this.allPlaylists.filter((playlist) => {
if (typeof (playlist.playlistName) !== 'string') { return false }
return playlist.playlistName.toLowerCase().includes(this.lowerCaseQuery)
})
this.showLoadMoreButton = filteredPlaylists.length > this.searchDataLimit
this.activeData = filteredPlaylists.length < this.searchDataLimit ? filteredPlaylists : filteredPlaylists.slice(0, this.searchDataLimit)
return
}
const filteredPlaylists = this.allPlaylists.filter((playlist) => {
if (typeof (playlist.playlistName) !== 'string') { return false }
if (this.doSearchPlaylistsWithMatchingVideos) {
if (playlist.videos.some((v) => v.title.toLowerCase().includes(this.lowerCaseQuery))) {
return true
}
}
return playlist.playlistName.toLowerCase().includes(this.lowerCaseQuery)
})
this.showLoadMoreButton = filteredPlaylists.length > this.searchDataLimit
this.activeData = filteredPlaylists.length < this.searchDataLimit ? filteredPlaylists : filteredPlaylists.slice(0, this.searchDataLimit)
},
createNewPlaylist: function () {

View File

@ -19,24 +19,39 @@
class="newPlaylistButton"
@click="createNewPlaylist"
/>
<ft-input
<div
v-if="fullData.length > 1"
ref="searchBar"
:placeholder="$t('User Playlists.Search bar placeholder')"
:show-clear-text-button="true"
:show-action-button="false"
@input="(input) => query = input"
@clear="query = ''"
/>
<ft-select
v-if="fullData.length > 1"
class="sortSelect"
:value="sortBy"
:select-names="sortBySelectNames"
:select-values="sortBySelectValues"
:placeholder="$t('User Playlists.Sort By.Sort By')"
@change="sortBy = $event"
/>
class="searchInputsRow"
>
<ft-input
ref="searchBar"
:placeholder="$t('User Playlists.Search bar placeholder')"
:show-clear-text-button="true"
:show-action-button="false"
@input="(input) => query = input"
@clear="query = ''"
/>
</div>
<div
class="optionsRow"
>
<ft-toggle-switch
v-if="fullData.length > 1"
:label="$t('User Playlists.Playlists with Matching Videos')"
:compact="true"
:default-value="doSearchPlaylistsWithMatchingVideos"
@change="doSearchPlaylistsWithMatchingVideos = !doSearchPlaylistsWithMatchingVideos"
/>
<ft-select
v-if="fullData.length > 1"
class="sortSelect"
:value="sortBy"
:select-names="sortBySelectNames"
:select-values="sortBySelectValues"
:placeholder="$t('User Playlists.Sort By.Sort By')"
@change="sortBy = $event"
/>
</div>
</div>
<ft-flex-box
v-if="fullData.length === 0"
@ -56,6 +71,7 @@
v-else-if="activeData.length > 0 && !isLoading"
:data="activeData"
:data-type="'playlist'"
:search-query-text="doSearchPlaylistsWithMatchingVideos ? lowerCaseQuery : ''"
:use-channels-hidden-preference="false"
:hide-forbidden-titles="false"
/>

View File

@ -11,6 +11,7 @@ import WatchVideoLiveChat from '../../components/watch-video-live-chat/watch-vid
import WatchVideoPlaylist from '../../components/watch-video-playlist/watch-video-playlist.vue'
import WatchVideoRecommendations from '../../components/watch-video-recommendations/watch-video-recommendations.vue'
import FtAgeRestricted from '../../components/ft-age-restricted/ft-age-restricted.vue'
import packageDetails from '../../../../package.json'
import { pathExists } from '../../helpers/filesystem'
import {
buildVTTFileLocally,
@ -1774,7 +1775,7 @@ export default defineComponent({
},
updateTitle: function () {
document.title = `${this.videoTitle} - FreeTube`
document.title = `${this.videoTitle} - ${packageDetails.productName}`
},
isHiddenVideo: function (forbiddenTitles, channelsHidden, video) {

View File

@ -119,7 +119,7 @@ User Playlists:
Playlist Message: هذه الصفحة لا تظهر قائمات التشغيل بشكل كامل, وإنما تظهر فيديوات
إحتفضت عليها أو فضّلتها. عندما يكمل العمل بالكامل على هذه الصفحة, سترى كل فيديواتك
هنا تنتقل إلى قائمة تشغيل تسمى "المفضلة".
Search bar placeholder: بحث في قائمة التشغيل
Search bar placeholder: بحث عن قوائم التشغيل
Empty Search Message: لا توجد مقاطع فيديو في قائمة التشغيل هذه تتطابق مع بحثك
This playlist currently has no videos.: لا تحتوي قائمة التشغيل هذه حاليًا على مقاطع
فيديو.
@ -211,6 +211,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: تمكين الإشارة المرجعية السريعة مع قائمة
التشغيل هذه
Disable Quick Bookmark: تعطيل الإشارة المرجعية السريعة
Playlists with Matching Videos: قوائم التشغيل مع مقاطع الفيديو المطابقة
History:
# On History Page
History: 'السجلّ'

View File

@ -128,7 +128,7 @@ User Playlists:
Playlist Message: Tato stránka neodráží plně funkční playlisty. Uvádí pouze videa,
která jste si uložili nebo zařadili mezi oblíbená. Po dokončení práce budou všechna
aktuálně zde umístěná videa přenesena do seznamu „Oblíbené“.
Search bar placeholder: Hledat v playlistu
Search bar placeholder: Hledat playlisty
Empty Search Message: V tomto playlistu nejsou žádná videa, která by odpovídala
vašemu vyhledávání
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Opravdu
@ -220,6 +220,7 @@ User Playlists:
Remove from Favorites: Odebrat z playlistu {playlistName}
Disable Quick Bookmark: Vypnout rychlé uložení
Enable Quick Bookmark With This Playlist: Zapnout u tohoto playlistu rychlé uložení
Playlists with Matching Videos: Playlisty s odpovídajícími videi
History:
# On History Page
History: 'Historie'

View File

@ -34,22 +34,29 @@ Forward: 'Fremad'
Global:
Videos: Videoer
Counts:
Watching Count: 1 ser | {count} ser
Subscriber Count: 1 abonnent | {count} abonnenter
View Count: 1 visning | {count} visninger
Video Count: 1 video | {count} videoer
Channel Count: 1 kanal | {count} kanaler
Community: Fællesskab
Version {versionNumber} is now available! Click for more details: 'Version {versionNumber}
er nu tilgængelig! Klik for flere detaljer'
Download From Site: 'Hent Fra Netsted'
A new blog is now available, {blogTitle}. Click to view more: 'En ny blog er nu tilgængelig,
{blogTitle}. Klik for at vise mere'
{blogTitle}. Klik for at se mere'
# Search Bar
Search / Go to URL: 'Søg / Gå til URL'
Search / Go to URL: 'Søg/gå til URL'
# In Filter Button
Search Filters:
Search Filters: 'Søgefiltre'
Sort By:
Sort By: 'Sortér Efter'
Sort By: 'Sortér efter'
Most Relevant: 'Mest Relevante'
Rating: 'Bedømmelse'
Upload Date: 'Indsendelsesdato'
Upload Date: 'Dato for Upload'
View Count: 'Visningstal'
Time:
Time: 'Tid'
@ -67,34 +74,36 @@ Search Filters:
#& Playlists
Movies: Film
Duration:
Duration: 'Længde'
All Durations: 'Alle Længder'
Duration: 'Varighed'
All Durations: 'Alle Varigheder'
Short (< 4 minutes): 'Kort (< 4 minutter)'
Long (> 20 minutes): 'Lang (> 20 minutter)'
# On Search Page
Medium (4 - 20 minutes): Medium (4-20 minutter)
Medium (4 - 20 minutes): Mellemlang (4-20 minutter)
Search Results: 'Søgeresultater'
Fetching results. Please wait: 'Skaffer resultater. Vent venligst'
Fetch more results: 'Skaf flere resultater'
Fetching results. Please wait: 'Henter resultater. Vent venligst'
Fetch more results: 'Hent flere resultater'
# Sidebar
There are no more results for this search: Der er ikke flere resultater for denne
søgning
Subscriptions:
# On Subscriptions Page
Subscriptions: 'Abonnementer'
Latest Subscriptions: 'Seneste Abonnementer'
Subscriptions: 'Abonnenter'
Latest Subscriptions: 'Seneste Abonnenter'
'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'Din
abonnementsliste er i øjeblikket tom. Begynd at tilføje abonnementer, for at se
dem her.'
'Getting Subscriptions. Please wait.': 'Henter Abonnementer. Vent venligst.'
Refresh Subscriptions: 'Genopfrisk Abonnementer'
abonnentliste er i øjeblikket tom. Begynd at tilføje abonnenter for at se dem
her.'
'Getting Subscriptions. Please wait.': 'Henter Abonnenter. Vent venligst.'
Refresh Subscriptions: 'Opdatér Abonnenter'
Load More Videos: Indlæs Flere Videoer
This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: Denne
profil har et stort antal abonnementer. Gennemtvinger RSS for at undgå adgangsbegrænsning
profil har et stort antal abonnenter. Gennemtvinger RSS for at undgå adgangsbegrænsning
Error Channels: Kanaler med Fejl
Empty Channels: De kanaler, du abonnerer på, har i øjeblikket ingen videoer.
Disabled Automatic Fetching: Du har deaktiveret automatisk hentning af abonnementer.
Opdater abonnementer for at se dem her.
Disabled Automatic Fetching: Du har deaktiveret automatisk hentning af abonnenter.
Opdatér abonnenter for at se dem her.
Empty Posts: Dine abonnerede kanaler har i øjeblikket ingen opslag.
Load More Posts: Indlæs Flere Opslag
Trending:
Trending: 'Trender'
Music: Musik
@ -110,18 +119,94 @@ User Playlists:
liste over gemte videoer er tom. Klik på gem-knappen i hjørnet af en video, for
at få den optegnet her
Playlist Message: Denne side afspejler ikke fuldt funktionelle playlister. Den optegner
blot videoer som du har gemt eller favoriseret. Når arbejdet er færdigt, vil alle
videoer her blive flyttet til en 'Favoritter'-playliste.
blot videoer, som du har gemt eller favoriseret. Når arbejdet er færdigt, vil
alle videoer her blive flyttet til en 'Favoritter'-playliste.
Search bar placeholder: Søg i Playliste
Empty Search Message: Der er ingen videoer i denne playliste, der passer til din
søgning
This playlist currently has no videos.: Denne playliste har i øjeblikket ingen videoer.
Create New Playlist: Opret Ny Playliste
Add to Playlist: Føj til Playliste
You have no playlists. Click on the create new playlist button to create a new one.: Du
har ingen playlister. Klik på 'Opret Ny Playliste'-knappen for at oprette en ny.
Remove from Favorites: Fjern fra {playlistName}
Move Video Up: Flyt Video Op
Copy Playlist: Kopiér Playliste
Remove Watched Videos: Fjern Sete Videoer
Delete Playlist: Slet Playliste
Sort By:
EarliestCreatedFirst: Tidligst Oprettet
EarliestUpdatedFirst: Tidligst Opdateret
LatestPlayedFirst: Afspillet For Nyligt
LatestCreatedFirst: Oprettet For Nyligt
Sort By: Sortér efter
LatestUpdatedFirst: Opdateret For Nyligt
EarliestPlayedFirst: Tidligst Afspillet
Are you sure you want to delete this playlist? This cannot be undone: Er du sikker
på, at du vil slette denne playliste? Dette kan ikke fortrydes.
SinglePlaylistView:
Search for Videos: Søg efter Videoer
Toast:
This video cannot be moved up.: Denne video kan ikke flyttes op.
This video cannot be moved down.: Denne video kan ikke flyttes ned.
Video has been removed: Video er blevet fjernet
There was a problem with removing this video: Der opstod et problem med at fjerne
denne video
Some videos in the playlist are not loaded yet. Click here to copy anyway.: Nogle
videoer i denne playliste er ikke indlæst endnu. Klik her for at kopiere alligevel.
Playlist name cannot be empty. Please input a name.: Playliste navn kan ikke
være tomt. Indtast venligst et navn.
This playlist is protected and cannot be removed.: Denne playliste er beskyttet
og kan ikke fjernes.
There was an issue with updating this playlist.: Der opstod et problem med at
opdatere denne playliste.
This playlist does not exist: Denne playliste eksisterer ikke
Playlist has been updated.: Playliste er blevet opdateret.
"{videoCount} video(s) have been removed": 1 video er blevet fjernet | {videoCount}
videoer er blevet fjernet
There were no videos to remove.: Der var ingen videoer at fjerne.
Playlist {playlistName} has been deleted.: Playliste {playlistName} er blevet
slettet.
AddVideoPrompt:
Select a playlist to add your N videos to: Vælg en playliste, du vil føje din
video til | Vælg en playliste, du vil føje dine {videoCount} videoer til
N playlists selected: '{playlistCount} Valgt'
Search in Playlists: Søg i Playlister
Toast:
"{videoCount} video(s) added to {playlistCount} playlists": 1 video tilføjet
til {playlistCount} playlister | {videoCount} videoer tilføjet til {playlistCount}
playlister
You haven't selected any playlist yet.: Du har ikke valgt nogen playliste endnu.
"{videoCount} video(s) added to 1 playlist": 1 video tilføjet til 1 playliste
| {videoCount} videoer tilføjet til 1 playliste
Added {count} Times: Tilføjet {count} Gang | Tilføjet {count} Gange
Save: Gem
CreatePlaylistPrompt:
Toast:
There was an issue with creating the playlist.: Der opstod et problem med at
oprette denne playliste.
There is already a playlist with this name. Please pick a different name.: En
playliste med dette navn eksisterer allerede. Vælg venligst et andet navn.
New Playlist Name: Ny Playliste Navn
Create: Opret
Move Video Down: Flyt Video Ned
Playlist Description: Playliste Beskrivelse
Save Changes: Gem Ændringer
Cancel: Annullér
Edit Playlist Info: Redigér Playliste Info
Add to Favorites: Føj til {playlistName}
Remove from Playlist: Fjern fra Playliste
Playlist Name: Playliste Navn
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Er
du sikker på, at du vil fjerne alle sete videoer fra denne playliste? Dette kan
ikke fortrydes.
History:
# On History Page
History: 'Historik'
Watch History: 'Set Historik'
Your history list is currently empty.: 'Din historikliste er i øjeblikket tom.'
Empty Search Message: Der er ingen videoer i din historie som passer til din søgning
Search bar placeholder: Søg i Historie
Empty Search Message: Der er ingen videoer i din historik som passer til din søgning
Search bar placeholder: Søg i Historik
Settings:
# On Settings Page
Settings: 'Indstillinger'
@ -143,14 +228,16 @@ Settings:
Grid: 'Gitter'
List: 'Liste'
Thumbnail Preference:
Thumbnail Preference: 'Indstilling for Forhåndsvisning'
Thumbnail Preference: 'Præference for Miniaturebillede'
Default: 'Standard'
Beginning: 'Begyndelsen'
Beginning: 'Begyndelse'
Middle: 'Midten'
End: 'Slutningen'
End: 'Slutning'
Blur: Slør
Hidden: Skjult
'Invidious Instance (Default is https://invidious.snopyta.org)': 'Invidious-Instans
(Standard er https://invidious.snopyta.org)'
Region for Trending: 'Område for Mode'
Region for Trending: 'Område for Trending'
#! List countries
View all Invidious instance information: Vis al Invidious-instans-information
Clear Default Instance: Ryd Standard Instans
@ -173,59 +260,62 @@ Settings:
Base Theme:
Base Theme: 'Grundtema'
Black: 'Sort'
Dark: 'Mørkt'
Light: 'Lyst'
Dark: 'Mørk'
Light: 'Lys'
Dracula: 'Dracula'
System Default: Systemstandard
Catppuccin Mocha: Catppuccin Mokka
Pastel Pink: Pastel Lyserød
Nordic: Nordisk
Main Color Theme:
Main Color Theme: 'Primært Farvetema'
Red: 'Rødt'
Pink: 'Lyserødt'
Main Color Theme: 'Primær Farvetema'
Red: 'Rød'
Pink: 'Lyserød'
Purple: 'Lilla'
Deep Purple: 'Mørkelilla'
Indigo: 'Indigoblå'
Blue: 'Blåt'
Light Blue: 'Lyseblåt'
Blue: 'Blå'
Light Blue: 'Lyseblå'
Cyan: 'Cyan'
Teal: 'Turkisfarvet'
Green: 'Grønt'
Light Green: 'Lysegrønt'
Lime: 'Limegrønt'
Yellow: 'Gult'
Teal: 'Turkis'
Green: 'Grøn'
Light Green: 'Lysegrøn'
Lime: 'Limegrøn'
Yellow: 'Gul'
Amber: 'Rav'
Orange: 'Orange'
Deep Orange: 'Dybt Orange'
Deep Orange: 'Dyb Orange'
Dracula Cyan: 'Dracula Cyan'
Dracula Green: 'Dracula Grønt'
Dracula Green: 'Dracula Grøn'
Dracula Orange: 'Dracula Orange'
Dracula Pink: 'Dracula Lyserødt'
Dracula Pink: 'Dracula Lyserød'
Dracula Purple: 'Dracula Lilla'
Dracula Red: 'Dracula Rødt'
Dracula Yellow: 'Dracula Gult'
Catppuccin Mocha Green: Catppuccin Mokka Grønt
Dracula Red: 'Dracula Rød'
Dracula Yellow: 'Dracula Gul'
Catppuccin Mocha Green: Catppuccin Mokka Grøn
Catppuccin Mocha Rosewater: Catppuccin Mokka Rosenvand
Catppuccin Mocha Flamingo: Catppuccin Mokka Flamingo
Catppuccin Mocha Mauve: Capttuccin Mokka Lysviolet
Catppuccin Mocha Peach: Catppuccin Mokka Ferskenfarvet
Catppuccin Mocha Yellow: Catppuccin Mokka Gult
Catppuccin Mocha Pink: Catppuccin Mokka Lyserødt
Catppuccin Mocha Red: Catppuccin Mokka Rødt
Catppuccin Mocha Maroon: Catppuccin Mokka Rødbrunt
Catppuccin Mocha Teal: Catppuccin Mokka Turkisfarvet
Catppuccin Mocha Peach: Catppuccin Mokka Fersken
Catppuccin Mocha Yellow: Catppuccin Mokka Gul
Catppuccin Mocha Pink: Catppuccin Mokka Lyserød
Catppuccin Mocha Red: Catppuccin Mokka Rød
Catppuccin Mocha Maroon: Catppuccin Mokka Rødbrun
Catppuccin Mocha Teal: Catppuccin Mokka Turkis
Catppuccin Mocha Sky: Catppuccin Mokka Himmel
Catppuccin Mocha Sapphire: Catppuccin Mokka Safir
Catppuccin Mocha Blue: Catppuccin Mokka Blåt
Catppuccin Mocha Lavender: Catppuccin Mokka Lavendelblå
Secondary Color Theme: 'Sekundært Farvetema'
Catppuccin Mocha Blue: Catppuccin Mokka Blå
Catppuccin Mocha Lavender: Catppuccin Mokka Lavendel
Secondary Color Theme: 'Sekundær Farvetema'
#* Main Color Theme
UI Scale: Skalering af Brugerflade
Disable Smooth Scrolling: Deaktivér Jævn Rulning
Expand Side Bar by Default: Udvid Sidebar som Standard
Hide Side Bar Labels: Skjul Sidebarens Etiketter
Hide FreeTube Header Logo: Skjul FreeTube Overskriftslogo
Player Settings:
Player Settings: 'Afspilningsindstillinger'
Force Local Backend for Legacy Formats: 'Tving Lokal Server for Gamle Formater'
Force Local Backend for Legacy Formats: 'Tving Lokal Backend til Ældre Formater'
Play Next Video: 'Afspil Næste Video'
Turn on Subtitles by Default: 'Slå Undertekster til som Standard'
Autoplay Videos: 'Autospil Videoer'
@ -237,7 +327,7 @@ Settings:
Default Video Format:
Default Video Format: 'Standard Videoformat'
Dash Formats: 'DASH-Formater'
Legacy Formats: 'Gamle Formater'
Legacy Formats: 'Ældre Formater'
Audio Formats: 'Lydformater'
Default Quality:
Default Quality: 'Standardkvalitet'
@ -267,35 +357,46 @@ Settings:
Ask Path: Spørg efter Mappe til at Gemme
Folder Label: Mappe til Skærmbilleder
Next Video Interval: Næste Videointerval
Max Video Playback Rate: Maks Videoafspilningshastighed
Display Play Button In Video Player: Vis Afspilningsknap I Videoafspiller
Max Video Playback Rate: Maks. Videoafspilningshastighed
Display Play Button In Video Player: Vis Afspilningsknap i Videoafspiller
Fast-Forward / Rewind Interval: Spol fremad / Spol tilbage Interval
Video Playback Rate Interval: Videoafspilningshastighed Interval
Scroll Playback Rate Over Video Player: Scroll-afspilningshastighed i Videoafspiller
Scroll Volume Over Video Player: Scroll-lydstyrke i Videoafspiller
Skip by Scrolling Over Video Player: Spring over ved at scrolle over videoafspilleren
Scroll Playback Rate Over Video Player: Scroll Afspilningshastighed i Videoafspiller
Scroll Volume Over Video Player: Scroll Lydstyrke i Videoafspiller
Skip by Scrolling Over Video Player: Spring Over ved at Scrolle Over Videoafspilleren
Comment Auto Load:
Comment Auto Load: Kommentar Auto-Indlæs
Allow DASH AV1 formats: Tillad DASH AV1-formater
Privacy Settings:
Privacy Settings: 'Privatlivsindstillinger'
Remember History: 'Husk Historik'
Save Watched Progress: 'Gem Set Fremskridt'
Clear Search Cache: 'Ryd Lokalt Søgelager'
Clear Search Cache: 'Ryd Søgecache'
Are you sure you want to clear out your search cache?: 'Er du sikker på, at du
vil udrydde dit lokale søgelager?'
Search cache has been cleared: 'Lokalt søgelager er blevet ryddet'
vil rydde din søgecache?'
Search cache has been cleared: 'Søgecache blev ryddet'
Remove Watch History: 'Fjern Set Historik'
Are you sure you want to remove your entire watch history?: 'Er du sikker på,
at du vil fjerne hele din sete historik?'
Watch history has been cleared: 'Set historik er blevet ryddet'
Watch history has been cleared: 'Set historik blev ryddet'
Remove All Subscriptions / Profiles: 'Fjern Alle Abonnementer / Profiler'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Er
du sikker på, at du vil fjerne alle abonnementer og profiler? Dette kan ikke
du sikker på, at du vil fjerne alle abonnementer og profiler? Dette kan ikke
fortrydes.'
Automatically Remove Video Meta Files: Fjern Automatisk Video Metafiler
All playlists have been removed: Alle playlister blev fjernet
Are you sure you want to remove all your playlists?: Er du sikker på, at du vil
fjerne alle dine playlister?
Save Watched Videos With Last Viewed Playlist: Gem Sete Videoer med Sidst Sete
Playliste
Remove All Playlists: Fjern Alle Playlister
Subscription Settings:
Subscription Settings: 'Abonnementsindstillinger'
Hide Videos on Watch: 'Skjul Videoer på Se'
Fetch Feeds from RSS: 'Skaf Strømme fra RSS'
Fetch Feeds from RSS: 'Hent Feeds fra RSS'
Manage Subscriptions: 'Abonnementshåndtering'
Only Show Latest Video for Each Channel: Vis Kun Seneste Video for Hver Kanal
Fetch Automatically: Hent Feed Automatisk
Data Settings:
Data Settings: 'Dataindstillinger'
Select Import Type: 'Vælg Importtype'
@ -335,13 +436,15 @@ Settings:
Manage Subscriptions: Abonnementshåndtering
Check for Legacy Subscriptions: Søg efter Gamle Abonnementer
Export Playlists: Eksportér Playlister
Playlist insufficient data: Utilstrækkeligt data for "{playlist}" playlist, springer
Playlist insufficient data: Utilstrækkelig data for "{playlist}" playliste, springer
objektet over
Import Playlists: Importér Playlister
All playlists has been successfully imported: Alle playlister er blevet importeret
succesfuldt
All playlists has been successfully exported: Alle playlister er blevet eksporteret
succesfuldt
History File: Historik-fil
Playlist File: Playliste-fil
Advanced Settings:
Advanced Settings: 'Avancerede indstillinger'
Enable Debug Mode (Prints data to the console): 'Aktivér fejlretningstilstand
@ -387,13 +490,13 @@ Settings:
Proxy Settings: Indstillinger for Proxy
Distraction Free Settings:
Hide Active Subscriptions: Skjul Aktive Abonnementer
Hide Live Chat: Skjul Direkte Chat
Hide Live Chat: Skjul Live Chat
Hide Popular Videos: Skjul Populære Videoer
Hide Trending Videos: Skjul Videoer På Mode
Hide Trending Videos: Skjul Trending Videoer
Hide Recommended Videos: Skjul Anbefalede Videoer
Hide Comment Likes: Skjul Kommentar-Tilkendegivelser
Hide Comment Likes: Skjul Kommentar-Likes
Hide Channel Subscribers: Skjul Kanal-Abonnenter
Hide Video Likes And Dislikes: Skjul Video-Tilkendegivelser
Hide Video Likes And Dislikes: Skjul Video-Likes og -Dislikes
Hide Video Views: Skjul Videovisninger
Distraction Free Settings: Distraktionsfri Indstillinger
Hide Live Streams: Skjul Livestreams
@ -401,6 +504,25 @@ Settings:
Hide Sharing Actions: Skjul Delingshandlinger
Hide Video Description: Skjul Videobeskrivelse
Hide Playlists: Skjul Playlister
Hide Upcoming Premieres: Skjul Kommende Premierer
Hide Channels: Skjul Videoer Fra Kanaler
Hide Chapters: Skjul Kapitler
Hide Channels Already Exists: Kanal-ID eksisterer allerede
Hide Featured Channels: Skjul Fremhævede Kanaler
Hide Videos and Playlists Containing Text: Skjul Videoer og Playlister med Tekst
Hide Profile Pictures in Comments: Skjul Profilbilleder i Kommentarer
Display Titles Without Excessive Capitalisation: Vis Titler Uden Overdrevne Store
Bogstaver og Tegnsætning
Sections:
General: Generelt
Side Bar: Sidebjælke
Hide Channels Placeholder: Kanal-ID
Hide Channels API Error: Fejl ved hentning af bruger med det angivne ID. Tjek
venligst igen, om ID'et er korrekt.
Hide Channel Playlists: Skjul Kanal-playlister
Hide Channel Community: Skjul Kanal-fællesskab
Hide Channel Podcasts: Skjul Kanal-podcasts
Hide Channels Invalid: Det angivne kanal-ID var ugyldigt
The app needs to restart for changes to take effect. Restart and apply change?: App'en
er nødt til at genstarte, for at ændringer kan træde i kraft. Genstart og anvend
ændringer?
@ -435,8 +557,28 @@ Settings:
Fil
Custom External Player Arguments: Brugerdefineret Ekstern Afspiller Argumenter
External Player: Ekstern Afspiller
Ignore Unsupported Action Warnings: Ignorér Advarsler Om Ikke-understøttede Handlinger
Ignore Unsupported Action Warnings: Ignorér Advarsler om Ikke-understøttede Handlinger
External Player Settings: Indstillinger for Ekstern Afspiller
Players:
None:
Name: Ingen
Password Settings:
Set Password: Indstil Adgangskode
Password Settings: Adgangskode-indstillinger
Remove Password: Fjern Adgangskode
Set Password To Prevent Access: Indstil en adgangskode for at forhindre adgang
til indstillinger
Password Dialog:
Password: Adgangskode
Enter Password To Unlock: Indtast adgangskode for at låse indstillinger op
Unlock: Lås op
Password Incorrect: Forkert Adgangskode
Experimental Settings:
Experimental Settings: Eksperimentelle Indstillinger
Warning: Disse indstillinger er eksperimentelle og kan forårsage nedbrud, mens
de er aktiveret. Det anbefales stærkt at lave sikkerhedskopier. Brug på eget
ansvar!
Replace HTTP Cache: Erstat HTTP-cache
About:
#On About page
About: 'Om'
@ -537,6 +679,9 @@ Profile:
#On Channel Page
Profile Filter: Profilfilter
Profile Settings: Profilindstillinger
Create Profile Name: Opret Profilnavn
Profile Name: Profilnavn
Edit Profile Name: Redigér Profilnavn
Channel:
Subscribe: 'Abonnér'
Unsubscribe: 'Afmeld'
@ -568,6 +713,23 @@ Channel:
About: 'Om'
Channel Description: 'Kanalbeskrivelse'
Featured Channels: 'Fremhævede Kanaler'
Details: Detaljer
Community:
Hide Answers: Skjul Svar
This channel currently does not have any posts: Denne kanal har i øjeblikket ingen
opslag
Video hidden by FreeTube: Video skjult af FreeTube
votes: '{votes} stemmer'
This channel does not allow searching: Denne kanal tillader ikke søgninger
This channel is age-restricted and currently cannot be viewed in FreeTube.: Denne
kanal er aldersbegrænset og kan i øjeblikket ikke ses på FreeTube.
Live:
This channel does not currently have any live streams: Denne kanal har i øjeblikket
ingen livestreams
Podcasts:
This channel does not currently have any podcasts: Denne kanal har i øjeblikket
ingen podcasts
This channel does not exist: Denne kanal eksisterer ikke
Video:
Mark As Watched: 'Markér Som Set'
Remove From History: 'Fjern Fra Historik'
@ -692,6 +854,15 @@ Video:
playlist: playliste
UnsupportedActionTemplate: '{externalPlayer} understøtter ikke: {action}'
Skipped segment: Sprunget over segment
Hide Channel: Skjul Kanal
Unhide Channel: Vis Kanal
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Live
Chat er ikke tilgængelig for denne stream. Den er muligvis blevet deaktiveret
af uploaderen.
Premieres: Premierer
Upcoming: Kommende
Scroll to Bottom: Rul til Bunden
Pause on Current Video: Pause på Nuværende Video
Videos:
#& Sort By
Sort By:
@ -737,6 +908,7 @@ Share:
YouTube Embed URL copied to clipboard: 'YouTube Indlejrings-URL kopieret til udklipsholder'
YouTube Channel URL copied to clipboard: YouTube Kanal-URL kopieret til udklipsholder
Invidious Channel URL copied to clipboard: Invidious Kanal-URL kopieret til udklipsholder
Share Channel: Del Kanal
Mini Player: 'Miniafspiller'
Comments:
Comments: 'Kommentarer'
@ -763,6 +935,8 @@ Comments:
And others: og andre
Show More Replies: Vis Flere Svar
Member: Medlem
Subscribed: Abonneret
View {replyCount} replies: Vis {replyCount} svar
Up Next: 'Næste'
# Toast Messages
@ -839,6 +1013,11 @@ Tooltips:
Privacy Settings:
Remove Video Meta Files: Når det er aktiveret, sletter FreeTube automatisk metafiler
oprettet under videoafspilning, når siden lukkes.
Distraction Free Settings:
Hide Channels: Indtast et kanal-ID for at skjule alle videoer, playlister og selve
kanalen fra at blive vist i søgning, trending, mest populære og anbefalet. Det
indtastede kanal-ID skal være et komplet match, og der skelnes mellem store
og små bogstaver.
New Window: Nyt Vindue
More: Mere
Open New Window: Åbn Nyt Vindue
@ -855,7 +1034,7 @@ Default Invidious instance has been set to {instance}: Standard Invidious-instan
er blevet sat til {instance}
Default Invidious instance has been cleared: Standard Invidious-instans er blevet
ryddet
Are you sure you want to open this link?: Er du sikker på at du vil åbne dette link?
Are you sure you want to open this link?: Er du sikker på, at du vil åbne dette link?
Search Bar:
Clear Input: Ryd Input
Downloading failed: Der var et problem med at downloade "{videoTitle}"
@ -873,3 +1052,18 @@ Playing Next Video Interval: Afspiller næste video om lidt. Klik for at afbryde
Afspiller næste video om {nextVideoInterval} sekund. Klik for at afbryde. | Afspiller
næste video om {nextVideoInterval} sekunder. Klik for at afbryde.
Preferences: Præferencer
Go to page: Gå til {page}
Close Banner: Luk Banner
Playlist will not pause when current video is finished: Playliste sættes ikke på pause,
når nuværende video er færdig
Playlist will pause when current video is finished: Playliste vil sættes på pause,
når nuværende video er færdig
Clipboard:
Cannot access clipboard without a secure connection: Kan ikke tilgå udklipsholder
uden en sikker forbindelse
Copy failed: Kopiering til udklipsholder mislykkedes
Chapters:
Chapters: Kapitler
Age Restricted:
This video is age restricted: Denne video er aldersbegrænset
This channel is age restricted: Denne kanal er aldersbegrænset

View File

@ -125,7 +125,7 @@ User Playlists:
wider. Sie listet nur Videos auf, die du gespeichert oder favorisiert hast. Wenn
die Arbeiten abgeschlossen sind, werden alle Videos, die sich derzeit hier befinden,
in eine Wiedergabeliste „Favoriten“ migriert.
Search bar placeholder: In Wiedergabeliste suchen
Search bar placeholder: Nach Wiedergabelisten suchen
Empty Search Message: Es gibt keine Videos in dieser Wiedergabeliste, die deiner
Suche entsprechen
This playlist currently has no videos.: Diese Wiedergabeliste enthält derzeit keine
@ -190,6 +190,7 @@ User Playlists:
Klicke hier zum zurücksetzen
Reverted to use {oldPlaylistName} for quick bookmark: '{oldPlaylistName} wird
wieder für Schnelles Merken genutzt'
Search for Videos: Nach Videos suchen
AddVideoPrompt:
N playlists selected: '{playlistCount} ausgewählt'
Search in Playlists: In Wiedergabelisten suchen
@ -204,6 +205,7 @@ User Playlists:
Select a playlist to add your N videos to: Wähle eine Wiedergabeliste, der du
dein Video hinzufügen möchtest | Wähle eine Wiedergabeliste, der du deine {videoCount}
Videos hinzufügen möchtest
Added {count} Times: '{count} Mal hinzugefügt | {count} Mal hinzugefügt'
CreatePlaylistPrompt:
New Playlist Name: Neuer Name der Wiedergabeliste
Create: Erstellen
@ -225,6 +227,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: Schnelles Merken für diese Wiedergabeliste
aktivieren
Disable Quick Bookmark: Schnelles Merken deaktivieren
Playlists with Matching Videos: Wiedergabelisten mit passenden Videos
History:
# On History Page
History: Verlauf
@ -544,7 +547,7 @@ Settings:
Hide Channels: Videos aus Kanälen ausblenden
Hide Channels Placeholder: Kanal-ID
Display Titles Without Excessive Capitalisation: Titel ohne übermäßige Großschreibung
anzeigen
und Zeichensetzung anzeigen
Hide Channel Playlists: Kanal-Wiedergabelisten ausblenden
Hide Channel Community: Kanal-Gemeinschaft ausblenden
Hide Channel Shorts: Kanal-Kurzvideos ausblenden
@ -930,6 +933,7 @@ Video:
Pause on Current Video: Pause für aktuelles Video
Unhide Channel: Kanal anzeigen
Hide Channel: Kanal ausblenden
More Options: Weitere Optionen
Videos:
#& Sort By
Sort By:
@ -1241,3 +1245,7 @@ Trimmed input must be at least N characters long: Gekürzte Eingaben müssen min
1 Zeichen lang sein | Gekürzte Eingaben müssen mindestens {length} Zeichen lang
sein
Tag already exists: Die Markierung „{tagName}“ existiert bereits
Close Banner: Banner schließen
Age Restricted:
This channel is age restricted: Dieser Kanal ist altersbeschränkt
This video is age restricted: Dieses Video ist altersbeschränkt

View File

@ -143,7 +143,8 @@ User Playlists:
it listed here
You have no playlists. Click on the create new playlist button to create a new one.: You have no playlists. Click on the create new playlist button to create a new one.
Empty Search Message: There are no videos in this playlist that matches your search
Search bar placeholder: Search in Playlist
Search bar placeholder: Search for Playlists
Playlists with Matching Videos: Playlists with Matching Videos
This playlist currently has no videos.: This playlist currently has no videos.

View File

@ -126,7 +126,7 @@ User Playlists:
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Your
saved videos are empty. Click on the save button on the corner of a video to have
it listed here
Search bar placeholder: Search in playlist
Search bar placeholder: Search for playlists
Empty Search Message: There are no videos in this playlist that match your search
Create New Playlist: Create new Playlist
Add to Playlist: Add to playlist
@ -177,6 +177,7 @@ User Playlists:
playlist is now used for quick bookmark instead of {oldPlaylistName}. Click
here to undo
Quick bookmark disabled: Quick bookmark disabled
Search for Videos: Search for videos
AddVideoPrompt:
N playlists selected: '{playlistCount} selected'
Search in Playlists: Search in playlists
@ -190,6 +191,7 @@ User Playlists:
playlists
Select a playlist to add your N videos to: Select a playlist to add your video
to | Select a playlist to add your {videoCount} videos to
Added {count} Times: Added {count} time | Added {count} times
CreatePlaylistPrompt:
New Playlist Name: New Playlist name
Create: Create
@ -216,6 +218,7 @@ User Playlists:
Remove from Favorites: Remove from {playlistName}
Enable Quick Bookmark With This Playlist: Enable quick bookmark with this playlist
Disable Quick Bookmark: Disable quick bookmark
Playlists with Matching Videos: Playlists with matching videos
History:
# On History Page
History: 'History'
@ -417,12 +420,17 @@ Settings:
Automatically Remove Video Meta Files: Automatically Remove Video Meta Files
Save Watched Videos With Last Viewed Playlist: Save Watched Videos With Last Viewed
Playlist
Remove All Playlists: Remove all playlists
All playlists have been removed: All playlists have been removed
Are you sure you want to remove all your playlists?: Are you sure you want to
remove all your playlists?
Subscription Settings:
Subscription Settings: 'Subscription Settings'
Hide Videos on Watch: 'Hide Videos on Watch'
Fetch Feeds from RSS: 'Fetch feeds from RSS'
Manage Subscriptions: 'Manage subscriptions'
Fetch Automatically: Fetch feed automatically
Only Show Latest Video for Each Channel: Only show latest video for each channel
Data Settings:
Data Settings: 'Data settings'
Select Import Type: 'Select import type'
@ -473,6 +481,14 @@ Settings:
Playlist File: Playlist file
Subscription File: Subscription file
History File: History file
Export Playlists For Older FreeTube Versions:
Label: Export playlists for older FreeTube versions
Tooltip: "This option exports videos from all playlists into one playlist named
Favourites.\nHow to export and import videos in playlists for an older version
of FreeTube:\n1. Export your playlists with this option enabled.\n2. Delete
all of your existing playlists using the Remove All playlists option under
Privacy settings.\n3. Launch the older version of FreeTube and import the
exported playlists."
Advanced Settings:
Advanced Settings: 'Advanced Settings'
Enable Debug Mode (Prints data to the console): 'Enable Debug Mode (Prints data
@ -520,8 +536,8 @@ Settings:
Hide Chapters: Hide chapters
Hide Channels: Hide videos from channels
Hide Channels Placeholder: Channel ID
Display Titles Without Excessive Capitalisation: Display Titles Without Excessive
Capitalisation
Display Titles Without Excessive Capitalisation: Display titles without excessive
capitalisation and punctuation
Hide Featured Channels: Hide featured channels
Hide Channel Playlists: Hide channel playlists
Hide Channel Community: Hide channel community
@ -545,6 +561,10 @@ Settings:
Hide Channels Already Exists: Channel ID already exists
Hide Channels API Error: Error retrieving user with the ID provided. Please check
again if the ID is correct.
Hide Videos and Playlists Containing Text Placeholder: Word, word Fragment or
phrase
Hide Videos and Playlists Containing Text: Hide videos and playlists containing
text
The app needs to restart for changes to take effect. Restart and apply change?: The
app needs to restart for changes to take effect. Do you want to restart and apply
the changes?
@ -578,6 +598,9 @@ Settings:
Do Nothing: Do nothing
Category Color: Category colour
UseDeArrowTitles: Use DeArrow video titles
'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': DeArrow
Thumbnail Generator API URL (Default is https://dearrow-thumb.ajay.app)
UseDeArrowThumbnails: Use DeArrow for thumbnails
Download Settings:
Download Settings: Download Settings
Ask Download Path: Ask for download path
@ -690,6 +713,11 @@ Profile:
Profile Filter: Profile Filter
'{number} selected': '{number} selected'
Toggle Profile List: Toggle profile list
Create Profile Name: Create profile name
Profile Name: Profile name
Edit Profile Name: Edit profile name
Open Profile Dropdown: Open profile dropdown
Close Profile Dropdown: Close profile dropdown
Channel:
Subscribe: 'Subscribe'
Unsubscribe: 'Unsubscribe'
@ -739,6 +767,7 @@ Channel:
Reveal Answers: Reveal answers
Hide Answers: Hide answers
votes: '{votes} votes'
Video hidden by FreeTube: Video hidden by FreeTube
Live:
This channel does not currently have any live streams: This channel does not currently
have any live streams
@ -896,6 +925,9 @@ Video:
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Live
Chat is unavailable for this stream. It may have been disabled by the uploader.
Pause on Current Video: Pause on current video
Hide Channel: Hide channel
Unhide Channel: Show channel
More Options: More options
Videos:
#& Sort By
Sort By:
@ -1064,8 +1096,13 @@ Tooltips:
channel ID entered must be a complete match and is case sensitive.
Hide Subscriptions Live: This setting is overridden by the app-wide {appWideSetting}
setting, in the {subsection} section of the {settingsSection}
Hide Videos and Playlists Containing Text: Enter a word, word fragment, or phrase
(case insensitive) to hide all videos and playlists whose original titles contain
it throughout all of FreeTube, excluding only History, Your playlists, and videos
inside of playlists.
SponsorBlock Settings:
UseDeArrowTitles: Replace video titles with user-submitted titles from DeArrow.
UseDeArrowThumbnails: Replace video thumbnails with thumbnails from DeArrow.
Playing Next Video Interval: Playing next video in no time. Click to cancel. | Playing
next video in {nextVideoInterval} second. Click to cancel. | Playing next video
in {nextVideoInterval} seconds. Click to cancel.
@ -1124,3 +1161,7 @@ Playlist will not pause when current video is finished: Playlist will not pause
Go to page: Go to {page}
Tag already exists: {tagName} tag already exists
Close Banner: Close Banner
Channel Hidden: '{channel} added to channel filter'
Channel Unhidden: '{channel} removed from channel filter'
Trimmed input must be at least N characters long: Trimmed input must be at least 1
character long | Trimmed input must be at least {length} characters long

View File

@ -121,7 +121,7 @@ User Playlists:
Playlist Message: Esta página no refleja el estado final de las listas de reproducción,
solo muestra los vídeos guardados. En futuras actualizaciones, estos vídeos migrarán
a la lista de reproducción «Favoritos».
Search bar placeholder: Buscar en la lista de reproducción
Search bar placeholder: Buscar listas de reproducción
Empty Search Message: No hay vídeos en esta lista de reproducción que coincidan
con tu búsqueda
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: ¿Estás
@ -174,6 +174,7 @@ User Playlists:
Haga clic aquí para deshacer
Reverted to use {oldPlaylistName} for quick bookmark: Revertido para usar {oldPlaylistName}
para un marcador rápido
Search for Videos: Buscar vídeos
Are you sure you want to delete this playlist? This cannot be undone: ¿Estás seguro
de que quieres borrar esta lista de reproducción? Esto no se puede deshacer.
Sort By:
@ -219,6 +220,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: Activar marcadores rápidos con esta lista
de reproducción
Disable Quick Bookmark: Desactivar el marcador rápido
Playlists with Matching Videos: Listas de reproducción con vídeos relacionados
History:
# On History Page
History: 'Historial'

View File

@ -127,7 +127,7 @@ User Playlists:
Playlist Message: See leht ei kirjelda terviklikke ja toimivad esitusloendeid. Siin
on kirjas vaid videod, mida oled salvestanud või mille oled märkinud lemmikuks.
Kui kõik on valmis, siis siin nähtavad videod on leitavad esitusloendist „Lemmikud“.
Search bar placeholder: Otsi esindusloendist
Search bar placeholder: Otsi esindusloendeid
Empty Search Message: Selles esitusloendis pole sinu otsingule vastavaid videosid
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Kas
sa oled kindel, et soovid kõik vaadatud videod sellest esitusloendist eemaldada?
@ -191,6 +191,7 @@ User Playlists:
Quick bookmark disabled: Kiirjärjehoidjad ei ole kasutusel
Reverted to use {oldPlaylistName} for quick bookmark: Võtsime {oldPlaylistName}
uuesti kasutusele kiirjärjehoidjate jaoks
Search for Videos: Otsi videoid
Are you sure you want to delete this playlist? This cannot be undone: Kas sa oled
kindel, et soovid selle esitusloendi kustutada? Seda tegevust ei saa tagasi pöörata.
Sort By:
@ -218,6 +219,7 @@ User Playlists:
Remove from Favorites: Eemalda esitusloendist {playlistName}
Enable Quick Bookmark With This Playlist: Võimalda kiirjärjehoidjate kasutamist
selle esitusloendiga
Playlists with Matching Videos: Sobivate videotega esitusloendid
History:
# On History Page
History: 'Ajalugu'
@ -876,7 +878,7 @@ Video:
Video statistics are not available for legacy videos: Vana tüüpi videote puhul
pole statistika saataval
Resolution: Resolutsioon
Premieres: Esilinastused
Premieres: Esilinastus
Show Super Chat Comment: Näita Super Chat'i kommentaare
Scroll to Bottom: Keri alla
Upcoming: Tulemas

View File

@ -117,7 +117,7 @@ User Playlists:
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Et
ole tallentanut videoita. Paina "Tallenna" painiketta videon kulmassa tallentaaksesi
sen tänne
Search bar placeholder: Etsi soittolistalta
Search bar placeholder: Etsi soittolistoja
Empty Search Message: Tällä soittolistalla ei ole videoita, jotka vastaavat hakuasi
Sort By:
NameAscending: A-Ö
@ -144,6 +144,7 @@ User Playlists:
ja sitä ei voi poistaa.
Playlist {playlistName} has been deleted.: Soittolista {playlistName} on poistettu.
This playlist does not exist: Soittolistaa ei ole olemassa
Search for Videos: Etsi videot
Move Video Down: Siirrä video alas
Remove from Playlist: Poista soittolistalta
Playlist Name: Soittolistan nimi
@ -1040,7 +1041,7 @@ Tooltips:
Hide Subscriptions Live: Tämä asetus ohitetaan koko sovelluksen laajuisella ”{appWideSetting}”-asetuksella,
joka on ”{settingsSection}”-osion ”{subsection}”-osiossa.
SponsorBlock Settings:
UseDeArrowTitles: Korvaa videon otsikot käyttäjien lähettämillä DeArrow'n otsikoilla.
UseDeArrowTitles: Korvaa videon otsikot käyttäjien lähettämillä DeArrown otsikoilla.
More: Lisää
Playing Next Video Interval: Seuraava video alkaa. Klikkaa peruuttaaksesi. |Seuraava
video alkaa {nextVideoInterval} sekunnin kuluttua. Klikkaa peruuttaaksesi. | Seuraava
@ -1097,3 +1098,6 @@ Playlist will not pause when current video is finished: Soittolistaa ei keskeyte
Channel Hidden: '{channel} lisätty kanavasuodattimeen'
Go to page: Siirry sivulle {page}
Channel Unhidden: '{channel} poistettu kanavasuodattimesta'
Age Restricted:
This video is age restricted: Tämä video on ikärajoitettu
This channel is age restricted: Tämä kanava on ikärajoitettu

View File

@ -127,7 +127,7 @@ User Playlists:
Elle ne répertorie que les vidéos que vous avez enregistrées ou mises en favoris.
Une fois le travail terminé, toutes les vidéos actuellement présentes ici seront
migrées vers une liste de lecture « Favoris ».
Search bar placeholder: Recherche dans la liste de lecture
Search bar placeholder: Recherche de listes de lecture
Empty Search Message: Il n'y a pas de vidéos dans cette liste de lecture qui correspondent
à votre recherche
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Êtes-vous
@ -182,6 +182,7 @@ User Playlists:
de {oldPlaylistName}. Cliquez ici pour annuler
Reverted to use {oldPlaylistName} for quick bookmark: Reprise de {oldPlaylistName}
pour un marque-page rapide
Search for Videos: Rechercher des vidéos
Are you sure you want to delete this playlist? This cannot be undone: Êtes-vous
sûr(e) de vouloir supprimer cette liste de lecture? Cette opération ne peut être
annulée.
@ -229,6 +230,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: Activer le marque-page rapide avec cette
liste de lecture
Disable Quick Bookmark: Désactiver le marque-page rapide
Playlists with Matching Videos: Listes de lecture avec des vidéos correspondantes
History:
# On History Page
History: 'Historique'

View File

@ -123,7 +123,7 @@ User Playlists:
‚מועדפים’.
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: לא
שמרת סרטונים. יש ללחוץ על כפתור השמירה בפינת הסרטון כדי שיופיע כאן
Search bar placeholder: חיפוש ברשימת הנגינה
Search bar placeholder: חיפוש רשימות נגינה
Empty Search Message: אין סרטונים ברשימת הנגינה הזו שעונים לחיפוש שלך
History:
# On History Page

View File

@ -122,7 +122,7 @@ User Playlists:
Playlist Message: Ova stranica ne odražava potpuno funkcionalne zbirke. Prikazuje
samo spremljena ili označena videa. Kad posao završi, sva trenutačno ovdje prisutna
videa premjestit će se u zbirku „Favoriti”.
Search bar placeholder: Pretraži zbirku
Search bar placeholder: Traži zbirke
Empty Search Message: U ovoj zbirci nema videa koji odgovaraju tvojem pretraživanju
This playlist currently has no videos.: Ova zbirka trenutačno nema nijedan video.
Create New Playlist: Stvori novu zbirku
@ -183,6 +183,7 @@ User Playlists:
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Ova
se zbirka sada koristi za brze zabilješke umjesto zbirke {oldPlaylistName}.
Pritisni ovdje za poništavanje
Search for Videos: Traži videa
AddVideoPrompt:
N playlists selected: 'Odabrano: {playlistCount}'
Search in Playlists: Traži u zbirkama
@ -210,6 +211,7 @@ User Playlists:
Remove from Favorites: Ukloni iz zbirke {playlistName}
Enable Quick Bookmark With This Playlist: Aktiviraj brze zabilješke s ovom zbirkom
Disable Quick Bookmark: Deaktiviraj brze zabilješke
Playlists with Matching Videos: Zbirke s poklapajućim videima
History:
# On History Page
History: 'Povijest'

View File

@ -109,7 +109,7 @@ Subscriptions:
Frissítse a feliratkozásokat, hogy itt láthassa őket.
Empty Channels: A feliratkozott csatornák jelenleg nem tartalmaznak videókat.
All Subscription Tabs Hidden: Az összes feliratkozási lap el van rejtve. Az itteni
tartalom megtekintéséhez, kérjük, jelenítse meg néhány lap elrejtését a(z) „{settingsSection}”
tartalom megtekintéséhez, jelenítse meg néhány lap elrejtését a(z) „{settingsSection}”
„{subsection}” szakaszában.
Subscriptions Tabs: Feliratkozások lapok
Load More Posts: További bejegyzések betöltése
@ -129,10 +129,10 @@ User Playlists:
mentett videók üresek. Kattintson a videó sarkában található mentés gombra, hogy
itt szerepeljen
Playlist Message: Ez az oldal nem tükrözi a teljesen működő lejátszási listákat.
Csak azokat a videókat sorolja fel, amelyeket Ön elmentett vagy a kedvencek közé
Csak azokat a videókat sorolja fel, amelyeket ön elmentett vagy a kedvencek közé
helyezett. A munka befejezése után az összes itt található videó átkerül a „Kedvencek”
lejátszási listára.
Search bar placeholder: Keresés a lejátszási listában
Search bar placeholder: Keresés a lejátszási listákban
Empty Search Message: Ebben a lejátszási listában nincsenek olyan videók, amelyek
megfelelnek a keresésnek
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Biztos,
@ -171,17 +171,17 @@ User Playlists:
ennek ellenére.
This playlist does not exist: Ez a lejátszási lista nem létezik
Playlist name cannot be empty. Please input a name.: A lejátszási lista neve
nem lehet üres. Kérjük, adjon meg egy nevet.
nem lehet üres. Adjon meg egy nevet.
There was a problem with removing this video: Probléma adódott a videó eltávolításával
"{videoCount} video(s) have been removed": 1 videó eltávolításra került | {videoCount}
videó eltávolításra került
This video cannot be moved down.: Ez a videó nem mozgatható lejjebb.
This playlist is now used for quick bookmark: Ezt a lejátszási listát most gyors
könyvjelzőként használjuk
This playlist is now used for quick bookmark: Ez a lejátszási lista most gyors
könyvjelzőként van használva
Quick bookmark disabled: Gyors könyvjelző letiltva
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: A(z)
{oldPlaylistName} helyett mostantól ez a lejátszási lista szolgál gyors könyvjelzőként.
Kattints ide a visszavonáshoz
Kattintson ide a visszavonáshoz
Reverted to use {oldPlaylistName} for quick bookmark: Visszaállítva a(z) {oldPlaylistName}
használatára a gyors könyvjelzőhöz
Search for Videos: Videók keresése
@ -198,7 +198,7 @@ User Playlists:
LatestUpdatedFirst: Nemrég frissítve
NameAscending: A-Z
You have no playlists. Click on the create new playlist button to create a new one.: Nincsenek
lejátszási listáid. Kattints az új lejátszási lista létrehozása gombra egy új
lejátszási listái. Kattintson az új lejátszási lista létrehozása gombra egy új
lejátszási lista létrehozásához.
Remove from Playlist: Eltávolítás a lejátszási listáról
Save Changes: Változtatások mentése
@ -210,7 +210,7 @@ User Playlists:
Playlist {playlistName} has been successfully created.: A lejátszási lista {playlistName}
sikeresen létrehozva.
There is already a playlist with this name. Please pick a different name.: Már
van egy lejátszási lista ezzel a névvel. Kérjük, válasszon egy másik nevet.
van egy lejátszási lista ezzel a névvel. Válasszon egy másik nevet.
New Playlist Name: Új lejátszási lista neve
This playlist currently has no videos.: Ez a lejátszási lista jelenleg nem tartalmaz
videókat.
@ -230,6 +230,7 @@ User Playlists:
Remove from Favorites: Törlés a(z) {playlistName} lejátszási listából
Enable Quick Bookmark With This Playlist: Gyors Könyvjelző Engedélyezése Ezzel A
Lejátszási Listával
Playlists with Matching Videos: Lejátszási listák a kapcsolódó videókkal
History:
# On History Page
History: 'Előzmények'
@ -434,7 +435,7 @@ Settings:
Fetch Feeds from RSS: 'RSS-hírcsatornák beolvasása'
Manage Subscriptions: 'Feliratkozások kezelése'
Fetch Automatically: Hírcsatorna automatikus lekérdezése
Only Show Latest Video for Each Channel: Csak a legújabb videókat megjelenítése
Only Show Latest Video for Each Channel: Csak a legújabb videókat jelenítse meg
a csatornáktól
Data Settings:
Data Settings: 'Adatbeállítások'
@ -568,7 +569,7 @@ Settings:
közben
Hide Channels Already Exists: Már létezik a csatornaazonosító
Hide Channels API Error: Hiba történt a megadott azonosítóval rendelkező felhasználó
lekérésekor. Kérjük, ellenőrizze még egyszer, hogy helyes-e az azonosító.
lekérésekor. Ellenőrizze még egyszer, hogy helyes-e az azonosító.
Hide Videos and Playlists Containing Text Placeholder: Szó, szótöredék, vagy kifejezés
Hide Videos and Playlists Containing Text: Szöveget tartalmazó videók és lejátszási
listák elrejtése
@ -687,7 +688,7 @@ About:
Credits: Közreműködők
Translate: Fordítás
room rules: szobaszabályok
Please read the: Kérjük, olvassa el a(z)
Please read the: Olvassa el a(z)
Chat on Matrix: Matrix csevegése
Mastodon: Mastodon
Blog: Napló
@ -839,8 +840,8 @@ Video:
Play Previous Video: 'Előző videó lejátszása'
Watched: 'Megtekintett'
Autoplay: 'Automatikus lejátszás'
Starting soon, please refresh the page to check again: 'Hamarosan kezdődik, kérjük,
frissítse a lapot az ellenőrzéshez'
Starting soon, please refresh the page to check again: 'Hamarosan kezdődik, frissítse
a lapot az ellenőrzéshez'
# As in a Live Video
Live: 'Élő'
Live Now: 'Élő most'

View File

@ -124,7 +124,7 @@ User Playlists:
Playlist Message: Questa pagina non è rappresentativa di una playlist completa.
Mostra solo i video che hai salvato o aggiunto ai preferiti. A lavoro finito,
tutti i video che si trovano qui saranno spostati in una playlist preferiti.
Search bar placeholder: Cerca nella playlist
Search bar placeholder: Cerca nelle playlist
Empty Search Message: Non ci sono video in questa playlist che corrispondono alla
tua ricerca
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Sei
@ -220,6 +220,7 @@ User Playlists:
Remove from Favorites: Rimuovi da {playlistName}
Enable Quick Bookmark With This Playlist: Abilita segnalibro rapido con questa playlist
Disable Quick Bookmark: Disabilita segnalibro rapido
Playlists with Matching Videos: Playlist con video corrispondenti
History:
# On History Page
History: 'Cronologia'

View File

@ -44,18 +44,18 @@ Global:
View Count: 1 weergave | {count} weergaven
Watching Count: 1 aan het kijken | {count} aan het kijken
Channel Count: 1 kanaal | {count} kanalen
Community: Gemeenschap
Community: Gemeen­schap
Input Tags:
Length Requirement: Tag moet minstens {number} tekens lang zijn
Search / Go to URL: 'Zoeken / Ga naar URL'
# In Filter Button
Search Filters:
Search Filters: 'Zoekfilters'
Search Filters: 'Zoek­filters'
Sort By:
Sort By: 'Sorteren op'
Most Relevant: 'Meest relevant'
Rating: 'Beoordeling'
Upload Date: 'Uploaddatum'
Upload Date: 'Upload­datum'
View Count: 'Aantal weergaven'
Time:
Time: 'Tijd'
@ -73,36 +73,36 @@ Search Filters:
#& Playlists
Movies: Films
Duration:
Duration: 'Tijdsduur'
All Durations: 'Alle tijdsduren'
Duration: 'Tijds­duur'
All Durations: 'Alle tijds­duren'
Short (< 4 minutes): 'Kort (< 4 minuten)'
Long (> 20 minutes): 'Lang (> 20 minuten)'
# On Search Page
Medium (4 - 20 minutes): Gemiddeld (4 - 20 minuten)
Search Results: 'Zoekresultaten'
Fetching results. Please wait: 'Resultaten verzamelen. Even geduld aub'
Fetch more results: 'Meer resultaten laden'
Search Results: 'Zoek­resultaten'
Fetching results. Please wait: 'Resultaten ophalen, even geduld'
Fetch more results: 'Meer resultaten ophalen'
# Sidebar
There are no more results for this search: Er zijn geen verdere resultaten voor
deze zoekopdracht
deze zoek­opdracht
Subscriptions:
# On Subscriptions Page
Subscriptions: 'Abonnementen'
Latest Subscriptions: 'Nieuwste abonnementen'
'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'U
heeft nog geen Abonnementen. Voeg abonnementen toe om ze hier te zien'
'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'Uw
abonnementen­lijst is momenteel leeg. Voeg abonnementen toe om ze hier te zien.'
Refresh Subscriptions: Abonnementen vernieuwen
Getting Subscriptions. Please wait.: Abonnementen verzamelen. Even geduld aub.
Getting Subscriptions. Please wait.: Abonnementen ophalen, even geduld.
This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: Dit
profiel heeft een groot aantal abonnementen. RSS wordt geforceerd om tariefbeperkingen
profiel heeft een groot aantal abonnementen. RSS wordt geforceerd om rate-limiting
te vermijden
Load More Videos: Meer video's laden
Error Channels: Kanalen met storingen
Disabled Automatic Fetching: U hebt het automatisch ophalen van abonnementen uitgeschakeld.
Error Channels: Kanalen met fouten
Disabled Automatic Fetching: U heeft het automatisch ophalen van abonnementen uitgeschakeld.
Vernieuw abonnementen om ze hier te zien.
Empty Channels: Je geabonneerde kanalen hebben momenteel geen video's.
Empty Channels: De kanalen waarop u geabonneerd bent hebben momenteel geen video's.
Subscriptions Tabs: Abonnement­tabbladen
All Subscription Tabs Hidden: Alle abonnementstabbladen zijn verborgen. Om de inhoud
All Subscription Tabs Hidden: Alle abonnement­tabbladen zijn verborgen. Om de inhoud
hier te zien moet u enkele tabbladen zichtbaar maken in de sectie {subsection}
onder {settingsSection}.
Load More Posts: Meer berichten laden
@ -115,9 +115,9 @@ Trending:
Music: Muziek
Default: Standaard
Most Popular: 'Populairst'
Playlists: 'Afspeellijsten'
Playlists: 'Afspeel­sten'
User Playlists:
Your Playlists: 'Uw afspeellijsten'
Your Playlists: 'Uw afspeel­sten'
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Je
opgeslagen video's is leeg. Klik op de opslaan knop in de hoek van een video om
het hier in de lijst te plaatsen
@ -125,7 +125,7 @@ User Playlists:
Er worden alleen video's weergegeven die jij hebt opgeslagen of gefavoriet. Wanneer
we klaar zijn met de ontwikkeling van deze feature zullen al deze video's worden
gemigreerd naar de 'favorieten' afspeellijst.
Search bar placeholder: In afspeellijst zoeken
Search bar placeholder: Zoeken naar afspeel­lijsten
Empty Search Message: Deze afspeellijst bevat geen video's die overeenkomen met
de zoekopdracht
Cancel: Annuleren
@ -209,6 +209,7 @@ User Playlists:
mag niet leeg zijn. Voer een naam in.
There was an issue with updating this playlist.: Er is een probleem opgetreden
bij het bij­werken van deze afspeel­lijst.
Search for Videos: Zoeken naar video's
You have no playlists. Click on the create new playlist button to create a new one.: U
heeft geen afspeellijsten. Druk op de knop om er één aan te maken.
This playlist currently has no videos.: Deze afspeel­lijst bevat geen video's.
@ -219,6 +220,7 @@ User Playlists:
kan niet ongedaan gemaakt worden.
Are you sure you want to delete this playlist? This cannot be undone: Weet u zeker
dat u deze afspeel­lijst wilt verwijderen? Dit kan niet ongedaan gemaakt worden.
Playlists with Matching Videos: Afspeel­lijsten met overeen­komende video's
History:
# On History Page
History: 'Geschiedenis'
@ -256,17 +258,16 @@ Settings:
(Standaard is https://invidious.snopyta.org)'
Region for Trending: 'Regio voor trending'
#! List countries
Check for Latest Blog Posts: Controleer op nieuwe blogposts
Check for Latest Blog Posts: Op nieuwe blog­posts controleren
Check for Updates: Op updates controleren
View all Invidious instance information: Bekijk alle Invidious-instantiegegevens
System Default: Systeemstandaard
Current Invidious Instance: Huidige Invidious-instantie
Clear Default Instance: Standaardinstantie wissen
Set Current Instance as Default: Stel momenteel geselecteerde instantie in als
standaard
Clear Default Instance: Standaard­instantie wissen
Set Current Instance as Default: Huidige instantie instellen als standaard
Current instance will be randomized on startup: Momenteel gebruikte instantie
zal willekeurig worden gekozen bij het starten
No default instance has been set: Er is geen standaard instantie ingesteld
No default instance has been set: Er is geen standaard­instantie ingesteld
The currently set default instance is {instance}: De momenteel als standaard ingestelde
instantie is {instance}
External Link Handling:
@ -332,8 +333,8 @@ Settings:
UI Scale: Interface­schaal
Expand Side Bar by Default: Zijbalk standaard uitklappen
Disable Smooth Scrolling: Vloeiend scrollen uitschakelen
Hide Side Bar Labels: Labels op zijbalk verbergen
Hide FreeTube Header Logo: Verberg het FreeTube-koplogo
Hide Side Bar Labels: Labels in zijbalk verbergen
Hide FreeTube Header Logo: FreeTube-koplogo verbergen
Player Settings:
Player Settings: 'Videospelerinstellingen'
Force Local Backend for Legacy Formats: 'Lokale backend voor oudere formaten forceren'
@ -342,7 +343,7 @@ Settings:
Autoplay Videos: 'Video''s automatisch afspelen'
Proxy Videos Through Invidious: 'Video''s via Invidious-proxy afspelen'
Autoplay Playlists: 'Afspeellijsten automatisch afspelen'
Enable Theatre Mode by Default: 'Theatermodus standaard inschakelen'
Enable Theatre Mode by Default: 'Theater­modus standaard inschakelen'
Default Volume: 'Standaardvolume'
Default Playback Rate: 'Standaard­afspeel­snelheid'
Default Video Format:
@ -420,8 +421,8 @@ Settings:
Subscription Settings: 'Abonnement­instellingen'
Hide Videos on Watch: 'Bekeken video''s verbergen'
Manage Subscriptions: 'Abonnementen beheren'
Fetch Feeds from RSS: Verzamel feeds via RSS
Fetch Automatically: Haal feed automatisch op
Fetch Feeds from RSS: Feeds ophalen via RSS
Fetch Automatically: Feed automatisch ophalen
Only Show Latest Video for Each Channel: Alleen nieuwste video voor elk kanaal
tonen
Advanced Settings:
@ -487,7 +488,7 @@ Settings:
met succes geëxporteerd
All watched history has been successfully imported: De bekeken geschiedenis is
met succes geïmporteerd
Check for Legacy Subscriptions: Controleer op Legacy Abonnementen
Check for Legacy Subscriptions: Op legacy-abonnementen controleren
Manage Subscriptions: Abonnementen beheren
Export Playlists: Afspeellijsten exporteren
All playlists has been successfully imported: Alle speellijsten zijn met succes
@ -509,21 +510,21 @@ Settings:
de optie Alle afspeel­lijsten verwijderen onder Privacy­instellingen.\n
3. Start de oudere versie van FreeTube en importeer de geëxporteerde afspeel­lijsten."
Distraction Free Settings:
Hide Live Chat: Livechat verbergen
Hide Live Chat: Live­chat verbergen
Hide Popular Videos: Populaire video's verbergen
Hide Trending Videos: Trending video's verbergen
Hide Recommended Videos: Aanbevolen video's verbergen
Hide Comment Likes: Likes op opmerkingen verbergen
Hide Channel Subscribers: Aantal abonnees verbergen
Hide Video Likes And Dislikes: Likes en dislikes verbergen
Hide Video Views: Aantal videoweergaven verbergen
Hide Video Views: Aantal video­weergaven verbergen
Distraction Free Settings: Instellingen voor afleidingsvrij kijken
Hide Active Subscriptions: Actieve abonnementen verbergen
Hide Playlists: Afspeellijsten verbergen
Hide Sharing Actions: Verberg knoppen om te delen
Hide Playlists: Afspeel­sten verbergen
Hide Sharing Actions: Deel­acties verbergen
Hide Video Description: Video-omschrijving verbergen
Hide Comments: Opmerkingen verbergen
Hide Live Streams: Verberg rechtstreekse uitzendingen
Hide Live Streams: Live­streams verbergen
Display Titles Without Excessive Capitalisation: Titels tonen zonder overmatig
hoofdletter­gebruik en inter­punctie
Sections:
@ -612,14 +613,14 @@ Settings:
Choose Path: Pad kiezen
Download Settings: Downloadinstellingen
Ask Download Path: Om downloadpad vragen
Download in app: Opslaan in programma
Open in web browser: Openen in webstruiner
Download in app: Downloaden in app
Open in web browser: Openen in web­browser
Download Behavior: Gedrag downloaden
Parental Control Settings:
Hide Unsubscribe Button: Verberg knop "Afmelden"
Hide Unsubscribe Button: Deabonneer­knop verbergen
Parental Control Settings: Instellingen voor ouderlijk toezicht
Show Family Friendly Only: Enkel familievriendelijke inhoud tonen
Hide Search Bar: Zoekbalk verbergen
Hide Search Bar: Zoek­balk verbergen
Experimental Settings:
Warning: Dit zijn experimentele instellingen, die een crash kunnen veroorzaken.
Het is raadzaam backups te maken. Gebruiken op eigen risico!
@ -681,8 +682,8 @@ About:
Email: E-mail
Blog: Blog
Website: Website
Please check for duplicates before posting: Controleer a.u.b. eerst of een probleem
al gerapporteerd is
Please check for duplicates before posting: Controleer eerst of een probleem al
gerapporteerd is
GitHub issues: GitHub-issues
Report a problem: Probleem melden
FAQ: Veelgestelde vragen
@ -1017,7 +1018,7 @@ Profile:
Are you sure you want to delete this profile?: Weet u zeker dat u dit profiel wilt
verwijderen?
Delete Profile: Profiel verwijderen
Make Default Profile: Als standaardprofiel instellen
Make Default Profile: Als standaard­profiel instellen
Update Profile: Profiel bijwerken
Create Profile: Profiel aanmaken
Profile Preview: Profielvoorbeeld
@ -1051,8 +1052,8 @@ Profile:
Create Profile Name: Profiel­naam aanmaken
Close Profile Dropdown: Profiel­menu sluiten
Open Profile Dropdown: Profiel­menu openen
A new blog is now available, {blogTitle}. Click to view more: Een nieuwe blogpost
is beschikbaar, {blogTitle}. Klik voor meer informatie
A new blog is now available, {blogTitle}. Click to view more: 'Een nieuwe blogpost
is beschikbaar: {blogTitle}. Druk voor meer informatie'
Download From Site: Van website downloaden
Version {versionNumber} is now available! Click for more details: Versie {versionNumber}
is nu beschikbaar! Klik voor meer informatie
@ -1086,16 +1087,16 @@ Tooltips:
te spoelen, zoals bij MPV.
Subscription Settings:
Fetch Feeds from RSS: Wanneer ingeschakeld zal FreeTube RSS gebruiken in plaats
van de standaard methode om de videolijsten van je abonnementen te verzamelen.
RSS is sneller en voorkomt dat je IP wordt geblokkeerd maar geeft geen toegang
tot sommige informatie zoals de videoduur en live-status
van de standaard­methode om uw abonnementen­feed op te halen. RSS is sneller
en voorkomt IP-blokkering, maar geeft geen toegang tot sommige informatie zoals
de video­duur en live-status
Fetch Automatically: Indien ingeschakeld, haalt FreeTube automatisch uw abonnementen­feed
op wanneer een nieuw venster wordt geopend en wanneer u van profiel verandert.
General Settings:
Invidious Instance: Dit is de Invidious-instantie waar FreeTube mee zal verbinden
om API calls te maken.
Thumbnail Preference: Alle thumbnails in FreeTube zullen worden vervangen met
een momentopname uit de video in plaats van de standaard thumbnail.
Thumbnail Preference: Alle miniaturen in FreeTube zullen worden vervangen met
een moment­opname uit de video in plaats van de standaard­miniatuur.
Fallback to Non-Preferred Backend on Failure: Wanneer het API met voorkeur problemen
geeft dan zal FreeTube automatisch terugvallen op het alternatieve niet-voorkeur
API wanneer deze instelling is ingeschakeld.
@ -1157,7 +1158,7 @@ Open New Window: Nieuw venster openen
Default Invidious instance has been cleared: Standaard Invidious-instantie is verwijderd
Default Invidious instance has been set to {instance}: Standaard Invidious-instantie
is ingesteld op {instance}
Are you sure you want to open this link?: Weet je zeker dat je deze link wilt openen?
Are you sure you want to open this link?: Weet u zeker dat u deze link wilt openen?
Search Bar:
Clear Input: Invoer wissen
External link opening has been disabled in the general settings: Het openen van externe
@ -1175,9 +1176,9 @@ Channels:
Search bar placeholder: Kanalen zoeken
Count: '{number} kanaal/kanalen gevonden'
Channels: Kanalen
Empty: Uw lijst van kanalen is thans leeg.
Empty: Uw lijst van kanalen is momenteel leeg.
Unsubscribe: Deabonneren
Unsubscribed: '{channelName} is verwijderd uit uw lijst van abonnees'
Unsubscribed: '{channelName} is verwijderd uit uw lijst van abonnementen'
Unsubscribe Prompt: Weet u zeker dat u zich wilt deabonneren van {channelName}?
Screenshot Error: Schermafbeelding kon niet worden opgeslagen. {error}
Preferences: Voorkeuren
@ -1200,7 +1201,7 @@ Playlist will pause when current video is finished: Afspeellijst zal pauzeren wa
de huidige video is afgelopen
Playlist will not pause when current video is finished: Afspeellijst zal niet pauzeren
wanneer de huidige video is afgelopen
Go to page: Ga naar {page}
Go to page: Pagina {page}
Tag already exists: Tag {tagName} bestaat al
Channel Unhidden: {channel} verwijderd uit kanaal­filter
Channel Hidden: {channel} toe­gevoegd aan kanaal­filter

View File

@ -7,7 +7,7 @@ FreeTube: 'FreeTube'
# Webkit Menu Bar
File: 'Plik'
Quit: 'Wyjdź'
Edit: 'Edycja'
Edit: 'Edytuj'
Undo: 'Cofnij'
Redo: 'Ponów'
Cut: 'Wytnij'
@ -123,7 +123,7 @@ User Playlists:
tu jedynie wymienione filmy, które zapisałeś lub oznaczyłeś jako ulubione. Kiedy
prace nad tą stroną zostaną zakończone, wszystkie filmy tu obecne zostaną przeniesione
do playlisty „Ulubione”.
Search bar placeholder: Przeszukaj playlisty
Search bar placeholder: Szukaj playlist
Empty Search Message: Na tej playliście nie ma filmów, które pasowałyby do Twojego
zapytania
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Czy
@ -175,6 +175,7 @@ User Playlists:
ta playlista, zamiast „{oldPlaylistName}”, będzie używana dla funkcji Szybkiej
Zakładki . Kliknij tutaj, by cofnąć zmianę
Quick bookmark disabled: Wyłączono Szybką Zakładkę
Search for Videos: Szukaj filmów
Are you sure you want to delete this playlist? This cannot be undone: Czy na pewno
chcesz usunąć tę playlistę? Nie można cofnąć tej czynności.
Sort By:
@ -217,6 +218,7 @@ User Playlists:
Remove from Favorites: Usuń z „{playlistName}”
Disable Quick Bookmark: Wyłącz Szybką Zakładkę
Enable Quick Bookmark With This Playlist: Włącz Szybką Zakładkę z tą playlistą
Playlists with Matching Videos: Playlisty z pasującymi filmami
History:
# On History Page
History: 'Historia'

View File

@ -38,14 +38,14 @@ Global:
# Search Bar
Counts:
Video Count: Contagem de videos
Channel Count: Contagem de Canais
Video Count: 1 vídeo | {count} vídeos
Channel Count: 1 canal | {count} canais
Subscriber Count: 1 inscrito | {count} inscritos
View Count: 1 visualização | {count} visualizações
Watching Count: 1 assistindo | {count} assistindo
Input Tags:
Length Requirement: A tag deve ter pelo menos {number} caracteres
Search / Go to URL: 'Buscar/Ir ao URL'
Search / Go to URL: 'Pesquisar ou digitar URL'
# In Filter Button
Search Filters:
Search Filters: 'Filtros de busca'
@ -58,7 +58,7 @@ Search Filters:
Time:
Time: 'Tempo'
Any Time: 'Qualquer momento'
Last Hour: 'Última hora'
Last Hour: 'Últimas horas'
Today: 'Hoje'
This Week: 'Esta semana'
This Month: 'Este mês'
@ -122,7 +122,7 @@ User Playlists:
apenas os vídeos que você salvou ou adicionou aos favoritos. Quando o trabalho
terminar, todos os vídeos atualmente aqui serão migrados para uma playlist chamada
"Favoritos".
Search bar placeholder: Pesquisar na playlist
Search bar placeholder: Pesquisar playlists
Empty Search Message: Não há vídeos nesta playlist que correspondam à sua pesquisa
You have no playlists. Click on the create new playlist button to create a new one.: Você
não tem playlists. Clique no botão "Criar playlist" para criar uma.
@ -207,7 +207,7 @@ User Playlists:
You haven't selected any playlist yet.: Você ainda não selecionou nenhuma playlist.
Select a playlist to add your N videos to: Selecione uma playlist para adicionar
seu vídeo | Selecione uma playlist para adicionar seus {videoCount} vídeos
N playlists selected: '{playlistCount} selecionadas'
N playlists selected: '{playlistCount} selecionada(s)'
Search in Playlists: Pesquisar nas playlists
Save: Salvar
Added {count} Times: Adicionado {count} vez | Adicionado {count} vezes
@ -215,6 +215,7 @@ User Playlists:
certeza de que deseja remover todos os vídeos assistidos desta playlist? Isto
não pode ser desfeito.
Remove Watched Videos: Remove vídeos assistidos
Playlists with Matching Videos: Playlists com vídeos correspondentes
History:
# On History Page
History: 'Histórico'
@ -387,7 +388,7 @@ Settings:
criar subpastas.
Enter Fullscreen on Display Rotate: Entrar em tela cheia ao girar a tela para
o modo paisagem
Skip by Scrolling Over Video Player: Ignorar ao rolar sobre o player
Skip by Scrolling Over Video Player: Pular vídeo ao rolar sobre o player
Allow DASH AV1 formats: Permitir formatos DASH AV1
Comment Auto Load:
Comment Auto Load: Carregar automaticamente os comentários
@ -522,7 +523,7 @@ Settings:
Hide Trending Videos: Ocultar vídeos em alta
Hide Recommended Videos: Ocultar vídeos recomendados
Hide Comment Likes: Ocultar "curtidas" em comentários
Distraction Free Settings: Configurações de Modo sem Distração
Distraction Free Settings: Configurações de distrações
Hide Channel Subscribers: Ocultar número de inscritos
Hide Video Likes And Dislikes: Ocultar "curtidas" em vídeo
Hide Video Views: Ocultar visualizações de vídeo
@ -621,7 +622,7 @@ Settings:
Download in app: Baixar no aplicativo
Download Behavior: Comportamento de download
Parental Control Settings:
Show Family Friendly Only: Mostrar Apenas Amigável à Família
Show Family Friendly Only: Mostrar apenas conteúdo adequado para toda a família
Hide Search Bar: Ocultar barra de pesquisa
Parental Control Settings: Configurações de Controle Parental
Hide Unsubscribe Button: Ocultar botão de cancelamento de inscrição
@ -837,7 +838,7 @@ Video:
Download Video: Baixar vídeo
Starting soon, please refresh the page to check again: Vai começar em breve, atualize
a página para verificar novamente
Autoplay: Reprodução Automática
Autoplay: Reprodução automática
Play Previous Video: Reproduzir vídeo anterior
Play Next Video: Reproduzir próximo vídeo
Reverse Playlist: Inverter ordem da playlist
@ -957,7 +958,7 @@ Share:
área de transferência
Invidious Channel URL copied to clipboard: URL do canal Invidious copiado para a
área de transferência
Include Timestamp: Incluir marcação de tempo
Include Timestamp: Incluir momento atual
Share Channel: Compartilhar canal
Mini Player: 'Mini Player'
Comments:
@ -1060,7 +1061,7 @@ Profile:
Version {versionNumber} is now available! Click for more details: A versão {versionNumber}
já está disponível! Clique para mais detalhes
A new blog is now available, {blogTitle}. Click to view more: 'Um novo blog está disponível,
{blogTitle}. Clique para ver mais'
{blogTitle}. Clique aqui para saber mais'
Download From Site: Baixar do site
The playlist has been reversed: A playlist foi invertida
This video is unavailable because of missing formats. This can happen due to country unavailability.: Este
@ -1153,9 +1154,10 @@ Tooltips:
a partir do DeArrow.
UseDeArrowThumbnails: Substitua as miniaturas de vídeo pelas miniaturas do DeArrow.
More: Mais
Playing Next Video Interval: Reproduzir próximo vídeo imediatamente. Clique para cancelar.
| Reproduzindo o próximo vídeo em {nextVideoInterval} segundo(s). Clique para cancelar.
| Reproduzir próximo vídeo em {nextVideoInterval} segundos. Clique para cancelar.
Playing Next Video Interval: A reproduzir o próximo vídeo imediatamente. Clique para
cancelar. | A reproduzir o próximo vídeo em {nextVideoInterval} segundo(s). Clique
para cancelar. | A reproduzir o próximo vídeo em {nextVideoInterval} segundos. Clique
para cancelar.
Hashtags have not yet been implemented, try again later: Hashtags ainda não foram
implementadas, tente novamente mais tarde
Unknown YouTube url type, cannot be opened in app: Tipo de URL do YouTube desconhecida,

View File

@ -180,6 +180,7 @@ User Playlists:
This playlist is now used for quick bookmark: Esta lista de reprodução é agora
usada como marcador rápido
Quick bookmark disabled: Marcador rápido desativado
Search for Videos: Pesquisar vídeos
AddVideoPrompt:
Search in Playlists: Pesquisar nas listas de reprodução
Save: Guardar
@ -954,6 +955,7 @@ Video:
Pause on Current Video: Pausa no vídeo atual
Unhide Channel: Mostrar canal
Hide Channel: Ocultar canal
More Options: Mais opções
Videos:
#& Sort By
Sort By:
@ -1187,3 +1189,4 @@ Channel Hidden: '{channel} adicionado ao filtro do canal'
Go to page: Ir para {page}
Channel Unhidden: '{channel} removido do filtro do canal'
Tag already exists: '"{tagName}" já existe'
Close Banner: Fechar banner

View File

@ -721,8 +721,8 @@ The playlist has been reversed: 'Sezam predvajanja je bil obrnjen'
Playing Next Video: 'Predvaja se naslednji videoposnetek'
Playing Previous Video: 'Predvaja se prejšnji videoposnetek'
Canceled next video autoplay: 'Samodejno predvajanje preklicano'
'The playlist has ended. Enable loop to continue playing': "Seznama predvajanja je\
\ konec. Vklopite ponovno predvajanje, če želite nadaljevati"
'The playlist has ended. Enable loop to continue playing': "Seznama predvajanja je
konec. Vklopite ponovno predvajanje, če želite nadaljevati"
Yes: 'Da'
No: 'Ne'

View File

@ -131,7 +131,7 @@ User Playlists:
га додали на ову листу'
Empty Search Message: На овој плејлисти нема видео снимака који одговарају вашој
претрази
Search bar placeholder: Претрага у плејлисти
Search bar placeholder: Претрага плејлиста
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Желите
ли заиста да уклоните све одгледане видео снимке са ове плејлисте? Ово се не може
поништити.
@ -180,6 +180,7 @@ User Playlists:
Кликните овде да поништите
Reverted to use {oldPlaylistName} for quick bookmark: Враћено на коришћење „{oldPlaylistName}“
за брзо обележавање
Search for Videos: Претрага видео снимака
Are you sure you want to delete this playlist? This cannot be undone: Желите ли
заиста да избришете ову плејлисту? Ово се не може поништити.
Sort By:
@ -223,6 +224,7 @@ User Playlists:
Disable Quick Bookmark: Онемогући брзо обележавање
Add to Favorites: Додај на плејлисту „{playlistName}“
Remove from Favorites: Уклони са плејлисте „{playlistName}“
Playlists with Matching Videos: Плејлисте с подударајућим видео снимцима
History:
# On History Page
History: 'Историја'

View File

@ -128,7 +128,7 @@ User Playlists:
Yalnızca kaydettiğiniz veya favorilerinize eklediğiniz videoları listeler. İş
bittiğinde, şu anda burada bulunan tüm videolar bir 'Favoriler' oynatma listesine
taşınacaktır.
Search bar placeholder: Oynatma Listesinde Ara
Search bar placeholder: Oynatma Listesi Ara
Empty Search Message: Bu oynatma listesinde aramanızla eşleşen video yok
This playlist currently has no videos.: Bu oynatma listesinde şu anda hiç video
yok.
@ -223,6 +223,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: Bu Oynatma Listesiyle Hızlı Yer İşaretini
Etkinleştir
Disable Quick Bookmark: Hızlı Yer İşaretini Devre Dışı Bırak
Playlists with Matching Videos: Eşleşen Videoları İçeren Oynatma Listeleri
History:
# On History Page
History: 'Geçmiş'

View File

@ -113,7 +113,7 @@ User Playlists:
Your Playlists: '您的播放列表'
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: 您未保存视频。点击视频角落的“保存”按钮保存视频
Playlist Message: 本页面不代表功能完备的播放列表。它只列举您保存或喜爱的播放列表。当项目完成时,本页面的所有视频将会迁移到“最喜爱”播放列表。
Search bar placeholder: 在播放列表中搜索
Search bar placeholder: 搜索播放列表
Empty Search Message: 这个与你的搜索匹配的播放列表中没有视频
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: 你确定要从此播放列表删除所有已观看的视频吗?此操作无法撤销。
AddVideoPrompt:
@ -150,6 +150,7 @@ User Playlists:
进行快速添加书签操作
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: 此播放列表现用于快速添加书签,而非
{oldPlaylistName}。单击此处撤销
Search for Videos: 搜索视频
Are you sure you want to delete this playlist? This cannot be undone: 你确定要删除此播放列表吗?此操作无法撤销。
Sort By:
LatestPlayedFirst: 最近播放的
@ -187,6 +188,7 @@ User Playlists:
Enable Quick Bookmark With This Playlist: 开启使用此播放列表来快速添加书签
Remove from Favorites: 从播放列表 {playlistName} 删除
Disable Quick Bookmark: 停用快速添加书签
Playlists with Matching Videos: 有匹配视频的播放列表
History:
# On History Page
History: '历史记录'

View File

@ -112,7 +112,7 @@ User Playlists:
Your Playlists: '您的播放清單'
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: 您播放清單的影片是空的。點擊影片角落的星星按鈕以將其列在此處
Playlist Message: 此頁面無法列出完整的播放清單。其僅列出您已儲存或加入最愛的影片。工作完成後,所有目前在此的影片都會轉移到「最愛」播放清單。
Search bar placeholder: 在播放清單搜尋
Search bar placeholder: 搜尋播放清單
Empty Search Message: 此播放清單中沒有與您的搜尋相符的影片
This playlist currently has no videos.: 此播放清單目前沒有影片。
Create New Playlist: 建立新播放清單
@ -188,6 +188,7 @@ User Playlists:
Remove from Favorites: 從 {playlistName} 移除
Enable Quick Bookmark With This Playlist: 啟用此播放清單的快速書籤
Disable Quick Bookmark: 停用快速書籤
Playlists with Matching Videos: 包含相符影片的播放清單
History:
# On History Page
History: '觀看紀錄'

1452
yarn.lock

File diff suppressed because it is too large Load Diff