Merge branch 'development' into piped-support

This commit is contained in:
ChunkyProgrammer 2024-04-12 08:43:55 -04:00
commit ca588c77e2
119 changed files with 871 additions and 734 deletions

View File

@ -4,8 +4,8 @@
"@babel/env",
{
"targets": {
"chrome": "106",
"node": "16.16.0"
"chrome": "122",
"node": "20.9.0"
}
}
]

View File

@ -1,3 +1,8 @@
const path = require('path')
const { readFileSync } = require('fs')
const activeLocales = JSON.parse(readFileSync(path.join(__dirname, './static/locales/activeLocales.json')))
module.exports = {
// https://eslint.org/docs/user-guide/configuring#using-configuration-files-1
root: true,
@ -47,11 +52,12 @@ module.exports = {
'plugin:vue/recommended',
'standard',
'plugin:jsonc/recommended-with-json',
'plugin:vuejs-accessibility/recommended'
'plugin:vuejs-accessibility/recommended',
'plugin:@intlify/vue-i18n/recommended'
],
// https://eslint.org/docs/user-guide/configuring#configuring-plugins
plugins: ['vue', 'vuejs-accessibility', 'n', 'unicorn'],
plugins: ['vue', 'vuejs-accessibility', 'n', 'unicorn', '@intlify/vue-i18n'],
rules: {
'space-before-function-paren': 'off',
@ -77,6 +83,40 @@ module.exports = {
'unicorn/no-array-push-push': 'error',
'unicorn/prefer-keyboard-event-key': 'error',
'unicorn/prefer-regexp-test': 'error',
'unicorn/prefer-string-replace-all': 'error'
'unicorn/prefer-string-replace-all': 'error',
'@intlify/vue-i18n/no-dynamic-keys': 'error',
// TODO: enable at a later date. currently disabled to prevent massive conflicts for initial PR
// '@intlify/vue-i18n/no-unused-keys': [
// 'error',
// {
// extensions: ['.js', '.vue', 'yaml']
// }
// ],
'@intlify/vue-i18n/no-duplicate-keys-in-locale': 'error',
'@intlify/vue-i18n/no-raw-text': [
'error',
{
attributes: {
'/.+/': [
'title',
'aria-label',
'aria-placeholder',
'aria-roledescription',
'aria-valuetext',
'tooltip',
'message'
],
input: ['placeholder', 'value'],
img: ['alt']
},
ignoreText: ['-', '•', '/', 'YouTube', 'Invidious', 'FreeTube']
}
],
},
settings: {
'vue-i18n': {
localeDir: `./static/locales/{${activeLocales.join(',')}}.yaml`,
messageSyntaxVersion: '^8.0.0'
}
}
}

View File

@ -92,7 +92,7 @@ body:
- Portable
- .rpm
- .zip
- .apk (Android, FreeTubeCordova Unofficial)
- .apk (FreeTubeAndroid Unofficial)
- AUR (Unofficial)
- Chocolatey (Unofficial)
- Homebrew (Unofficial)

View File

@ -2,7 +2,7 @@
- '(visual bug)'
'B: Unofficial Download':
- '(AUR \(Unofficial\)|Chocolatey \(Unofficial\)|\.apk \(Android, FreeTubeCordova Unofficial\)|Homebrew \(Unofficial\)|PortableApps \(Unofficial\)|WAPT \(Unofficial\)|winget \(Unofficial\)|Scoop \(Unofficial\)|Snapcraft \(Unofficial\)|MPR \(Unofficial\)|Nix \(Unofficial\))'
- '(AUR \(Unofficial\)|Chocolatey \(Unofficial\)|\.apk \(FreeTubeAndroid Unofficial\)|Homebrew \(Unofficial\)|PortableApps \(Unofficial\)|WAPT \(Unofficial\)|winget \(Unofficial\)|Scoop \(Unofficial\)|Snapcraft \(Unofficial\)|MPR \(Unofficial\)|Nix \(Unofficial\))'
'B: keyboard control':
- '(keyboard control not working)'

View File

@ -12,7 +12,7 @@ jobs:
build:
strategy:
matrix:
node-version: [18.x]
node-version: [20.x]
runtime:
- linux-x64
- linux-armv7l

View File

@ -18,10 +18,12 @@ jobs:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/checkout@v4
- name: Use Node.js 18.x
- name: Use Node.js 20.x
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 20.x
cache: "yarn"
- run: yarn run ci
- run: yarn run lint
# let's verify that webpack is able to package the project
- run: yarn run pack

View File

@ -12,7 +12,7 @@ jobs:
build:
strategy:
matrix:
node-version: [18.x]
node-version: [20.x]
runtime:
- linux-x64
- linux-armv7l

View File

@ -4,7 +4,7 @@
FreeTube is an open source desktop YouTube player built with privacy in mind.
Use YouTube without advertisements and prevent Google from tracking you with their cookies and JavaScript.
Available for Windows, Mac & Linux thanks to Electron.
Available for Windows (10 and later), Mac (macOS 10.15 and later) & Linux thanks to Electron.
<p align="center"><a href="https://github.com/FreeTubeApp/FreeTube/releases">Download FreeTube</a></p>
<p align="center">
@ -78,6 +78,10 @@ FreeTube is supported by the [Privacy Redirect](https://github.com/SimonBrazell/
## Download Links
### Official Downloads
> [!CAUTION]
> FreeTube is only supported on Windows 10 and later, macOS 10.15 and above, and various Linux distributions. Installing it on unsupported systems may result in unexpected issues.
* [GitHub Releases](https://github.com/FreeTubeApp/FreeTube/releases)
* [FreeTube Website](https://freetubeapp.io/#download)
@ -103,7 +107,7 @@ The first build with a green check mark is the latest build.
* Chocolatey: [Download](https://chocolatey.org/packages/freetube/)
* FreeTubeCordova (FreeTube port for Android and PWA): [Download](https://github.com/MarmadileManteater/FreeTubeCordova/releases) and [Source Code](https://github.com/MarmadileManteater/FreeTubeCordova)
* FreeTubeAndroid (FreeTube port for Android and PWA): [Download](https://github.com/MarmadileManteater/FreeTubeAndroid/releases) and [Source Code](https://github.com/MarmadileManteater/FreeTubeAndroid)
* Homebrew Formulae (Mac only): [Download](https://formulae.brew.sh/cask/freetube)

View File

@ -25,7 +25,7 @@
"build-release": "node _scripts/build.js",
"build-release:arm64": "node _scripts/build.js arm64",
"build-release:arm32": "node _scripts/build.js arm32",
"clean": "rimraf build/ static/dashFiles/ dist/ static/storyboards/",
"clean": "rimraf build/ dist/",
"debug": "run-s rebuild:electron debug-runner",
"debug-runner": "node _scripts/dev-runner.js --remote-debug",
"dev": "run-s rebuild:electron dev-runner",
@ -53,9 +53,9 @@
"ci": "yarn install --silent --frozen-lockfile"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-brands-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/vue-fontawesome": "^2.0.10",
"@seald-io/nedb": "^4.0.4",
"@silvermine/videojs-quality-selector": "^1.3.1",
@ -80,16 +80,17 @@
"youtubei.js": "^9.2.0"
},
"devDependencies": {
"@babel/core": "^7.24.3",
"@babel/core": "^7.24.4",
"@babel/eslint-parser": "^7.24.1",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/preset-env": "^7.24.3",
"@babel/preset-env": "^7.24.4",
"@double-great/stylelint-a11y": "^3.0.2",
"@intlify/eslint-plugin-vue-i18n": "^2.0.0",
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.10.0",
"css-loader": "^7.0.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"electron": "^29.1.6",
"electron": "^29.2.0",
"electron-builder": "^24.13.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
@ -106,14 +107,14 @@
"html-webpack-plugin": "^5.6.0",
"js-yaml": "^4.1.0",
"json-minimizer-webpack-plugin": "^5.0.0",
"lefthook": "^1.6.7",
"lefthook": "^1.6.8",
"mini-css-extract-plugin": "^2.8.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.38",
"postcss-scss": "^4.0.9",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"sass": "^1.72.0",
"sass": "^1.74.1",
"sass-loader": "^14.1.1",
"stylelint": "^16.3.1",
"stylelint-config-sass-guidelines": "^11.1.0",

View File

@ -23,7 +23,10 @@ const IpcChannels = {
SYNC_SETTINGS: 'sync-settings',
SYNC_HISTORY: 'sync-history',
SYNC_PROFILES: 'sync-profiles',
SYNC_PLAYLISTS: 'sync-playlists'
SYNC_PLAYLISTS: 'sync-playlists',
GET_REPLACE_HTTP_CACHE: 'get-replace-http-cache',
TOGGLE_REPLACE_HTTP_CACHE: 'toggle-replace-http-cache'
}
const DBActions = {

View File

@ -10,6 +10,7 @@ import { IpcChannels, DBActions, SyncEvents } from '../constants'
import baseHandlers from '../datastores/handlers/base'
import { extractExpiryTimestamp, ImageCache } from './ImageCache'
import { existsSync } from 'fs'
import asyncFs from 'fs/promises'
import packageDetails from '../../package.json'
@ -177,7 +178,8 @@ function runApp() {
// 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
const replaceHttpCache = existsSync(`${app.getPath('userData')}/experiment-replace-http-cache`)
const REPLACE_HTTP_CACHE_PATH = `${app.getPath('userData')}/experiment-replace-http-cache`
const replaceHttpCache = existsSync(REPLACE_HTTP_CACHE_PATH)
if (replaceHttpCache) {
// the http cache causes excessive disk usage during video playback
// we've got a custom image cache to make up for disabling the http cache
@ -662,7 +664,7 @@ function runApp() {
}
})
ipcMain.once('relaunchRequest', () => {
function relaunch() {
if (process.env.NODE_ENV === 'development') {
app.exit(parseInt(process.env.FREETUBE_RELAUNCH_EXIT_CODE))
return
@ -693,6 +695,10 @@ function runApp() {
}
app.quit()
}
ipcMain.once('relaunchRequest', () => {
relaunch()
})
nativeTheme.on('updated', () => {
@ -780,6 +786,22 @@ function runApp() {
child.unref()
})
ipcMain.handle(IpcChannels.GET_REPLACE_HTTP_CACHE, () => {
return replaceHttpCache
})
ipcMain.once(IpcChannels.TOGGLE_REPLACE_HTTP_CACHE, async () => {
if (replaceHttpCache) {
await asyncFs.rm(REPLACE_HTTP_CACHE_PATH)
} else {
// create an empty file
const handle = await asyncFs.open(REPLACE_HTTP_CACHE_PATH, 'w')
await handle.close()
}
relaunch()
})
// ************************************************* //
// DB related IPC calls
// *********** //

View File

@ -15,6 +15,7 @@ import { marked } from 'marked'
import { IpcChannels } from '../constants'
import packageDetails from '../../package.json'
import { openExternalLink, openInternalPath, showToast } from './helpers/utils'
import { translateWindowTitle } from './helpers/strings'
let ipcRenderer = null
@ -77,14 +78,13 @@ export default defineComponent({
return this.$store.getters.getShowCreatePlaylistPrompt
},
windowTitle: function () {
const routeTitle = this.$route.meta.title
if (routeTitle !== 'Channel' && routeTitle !== 'Watch' && routeTitle !== 'Hashtag') {
let title =
this.$route.meta.path === '/home'
? packageDetails.productName
: `${this.$t(this.$route.meta.title)} - ${packageDetails.productName}`
const routePath = this.$route.path
if (!routePath.startsWith('/channel/') && !routePath.startsWith('/watch/') && !routePath.startsWith('/hashtag/')) {
let title = translateWindowTitle(this.$route.meta.title, this.$i18n)
if (!title) {
title = packageDetails.productName
} else {
title = `${title} - ${packageDetails.productName}`
}
return title
} else {
@ -477,12 +477,7 @@ export default defineComponent({
default: {
// Unknown URL type
let message = 'Unknown YouTube url type, cannot be opened in app'
if (this.$te(message) && this.$t(message) !== '') {
message = this.$t(message)
}
showToast(message)
showToast(this.$t('Unknown YouTube url type, cannot be opened in app'))
}
}
})

View File

@ -524,7 +524,7 @@ export default defineComponent({
]
}
await this.promptAndWriteToFile(options, subscriptionsDb, 'Subscriptions have been successfully exported')
await this.promptAndWriteToFile(options, subscriptionsDb, this.$t('Settings.Data Settings.Subscriptions have been successfully exported'))
},
exportYouTubeSubscriptions: async function () {
@ -577,7 +577,7 @@ export default defineComponent({
return object
})
await this.promptAndWriteToFile(options, JSON.stringify(subscriptionsObject), 'Subscriptions have been successfully exported')
await this.promptAndWriteToFile(options, JSON.stringify(subscriptionsObject), this.$t('Settings.Data Settings.Subscriptions have been successfully exported'))
},
exportOpmlYouTubeSubscriptions: async function () {
@ -605,7 +605,7 @@ export default defineComponent({
opmlData += '</outline></body></opml>'
await this.promptAndWriteToFile(options, opmlData, 'Subscriptions have been successfully exported')
await this.promptAndWriteToFile(options, opmlData, this.$t('Settings.Data Settings.Subscriptions have been successfully exported'))
},
exportCsvYouTubeSubscriptions: async function () {
@ -632,7 +632,7 @@ export default defineComponent({
})
exportText += '\n'
await this.promptAndWriteToFile(options, exportText, 'Subscriptions have been successfully exported')
await this.promptAndWriteToFile(options, exportText, this.$t('Settings.Data Settings.Subscriptions have been successfully exported'))
},
exportNewPipeSubscriptions: async function () {
@ -666,7 +666,7 @@ export default defineComponent({
newPipeObject.subscriptions.push(subscription)
})
await this.promptAndWriteToFile(options, JSON.stringify(newPipeObject), 'Subscriptions have been successfully exported')
await this.promptAndWriteToFile(options, JSON.stringify(newPipeObject), this.$t('Settings.Data Settings.Subscriptions have been successfully exported'))
},
importHistory: async function () {
@ -860,7 +860,7 @@ export default defineComponent({
]
}
await this.promptAndWriteToFile(options, historyDb, 'All watched history has been successfully exported')
await this.promptAndWriteToFile(options, historyDb, this.$t('Settings.Data Settings.All watched history has been successfully exported'))
},
importPlaylists: async function () {
@ -1039,7 +1039,7 @@ export default defineComponent({
return JSON.stringify(playlist)
}).join('\n') + '\n'// a trailing line is expected
await this.promptAndWriteToFile(options, playlistsDb, 'All playlists has been successfully exported')
await this.promptAndWriteToFile(options, playlistsDb, this.$t('Settings.Data Settings.All playlists has been successfully exported'))
},
exportPlaylistsForOlderVersionsSometimes: function () {
@ -1088,7 +1088,7 @@ export default defineComponent({
})
})
await this.promptAndWriteToFile(options, JSON.stringify([favoritesPlaylistData]), 'All playlists has been successfully exported')
await this.promptAndWriteToFile(options, JSON.stringify([favoritesPlaylistData]), this.$t('Settings.Data Settings.All playlists has been successfully exported'))
},
convertOldFreeTubeFormatToNew(oldData) {
@ -1098,7 +1098,7 @@ export default defineComponent({
for (const profile of channel.profile) {
let index = convertedData.findIndex(p => p.name === profile.value)
if (index === -1) { // profile doesn't exist yet
const randomBgColor = getRandomColor()
const randomBgColor = getRandomColor().value
const contrastyTextColor = calculateColorLuminance(randomBgColor)
convertedData.push({
name: profile.value,
@ -1122,7 +1122,7 @@ export default defineComponent({
return convertedData
},
promptAndWriteToFile: async function (saveOptions, content, successMessageKeySuffix) {
promptAndWriteToFile: async function (saveOptions, content, successMessage) {
const response = await showSaveDialog(saveOptions)
if (response.canceled || response.filePath === '') {
// User canceled the save dialog
@ -1137,7 +1137,7 @@ export default defineComponent({
return
}
showToast(this.$t(`Settings.Data Settings.${successMessageKeySuffix}`))
showToast(successMessage)
},
getChannelInfoInvidious: function (channelId) {
@ -1186,7 +1186,7 @@ export default defineComponent({
})
if (this.backendFallback && this.backendPreference === 'local') {
showToast(this.$t('Falling back to the Invidious API'))
showToast(this.$t('Falling back to Invidious API'))
return await this.getChannelInfoInvidious(channelId)
} else {
return []

View File

@ -1,11 +1,9 @@
import fs from 'fs/promises'
import { defineComponent } from 'vue'
import FtSettingsSection from '../ft-settings-section/ft-settings-section.vue'
import FtFlexBox from '../ft-flex-box/ft-flex-box.vue'
import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue'
import FtPrompt from '../ft-prompt/ft-prompt.vue'
import { pathExists } from '../../helpers/filesystem'
import { getUserDataPath } from '../../helpers/utils'
import { IpcChannels } from '../../../constants'
export default defineComponent({
name: 'ExperimentalSettings',
@ -19,19 +17,16 @@ export default defineComponent({
return {
replaceHttpCacheLoading: true,
replaceHttpCache: false,
replaceHttpCachePath: '',
showRestartPrompt: false
}
},
mounted: function () {
getUserDataPath().then((userData) => {
this.replaceHttpCachePath = `${userData}/experiment-replace-http-cache`
mounted: async function () {
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')
this.replaceHttpCache = await ipcRenderer.invoke(IpcChannels.GET_REPLACE_HTTP_CACHE)
}
pathExists(this.replaceHttpCachePath).then((exists) => {
this.replaceHttpCache = exists
this.replaceHttpCacheLoading = false
})
})
this.replaceHttpCacheLoading = false
},
methods: {
handleRestartPrompt: function (value) {
@ -39,7 +34,7 @@ export default defineComponent({
this.showRestartPrompt = true
},
handleReplaceHttpCache: async function (value) {
handleReplaceHttpCache: function (value) {
this.showRestartPrompt = false
if (value === null || value === 'no') {
@ -47,16 +42,10 @@ export default defineComponent({
return
}
if (this.replaceHttpCache) {
// create an empty file
const handle = await fs.open(this.replaceHttpCachePath, 'w')
await handle.close()
} else {
await fs.rm(this.replaceHttpCachePath)
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')
ipcRenderer.send(IpcChannels.TOGGLE_REPLACE_HTTP_CACHE)
}
const { ipcRenderer } = require('electron')
ipcRenderer.send('relaunchRequest')
}
}
})

View File

@ -21,9 +21,15 @@ export default defineComponent({
computed: {
externalPlayerNames: function () {
const fallbackNames = this.$store.getters.getExternalPlayerNames
const nameTranslationKeys = this.$store.getters.getExternalPlayerNameTranslationKeys
const translations = [{
name: 'None',
translatedValue: this.$t('Settings.External Player Settings.Players.None.Name')
}]
return nameTranslationKeys.map((translationKey, idx) => this.$te(translationKey) ? this.$t(translationKey) : fallbackNames[idx])
return fallbackNames.map((name) => {
const translation = translations.find(e => e.name === name)
return translation ? translation.translatedValue : name
})
},
externalPlayerValues: function () {
return this.$store.getters.getExternalPlayerValues

View File

@ -23,7 +23,7 @@ export default defineComponent({
return this.$t('Age Restricted.This channel is age restricted')
}
return this.$t('Age Restricted.This video is age restricted:')
return this.$t('Age Restricted.This video is age restricted')
}
}
})

View File

@ -1,5 +1,44 @@
@use '../../scss-partials/_ft-list-item';
.ft-list-channel {
&.grid {
align-items: center;
text-align: center;
.infoAndSubscribe {
flex-flow: column wrap;
align-items: center;
.info {
margin-block-end: 12px;
.infoLine {
text-align: center;
}
}
}
}
&.list {
.infoAndSubscribe {
flex-flow: row wrap;
justify-content: center;
.channelSubscribeButton {
margin-block: auto;
margin-inline: 7px;
}
}
}
}
.infoAndSubscribe {
display: flex;
flex-flow: row wrap;
justify-content: center;
inline-size: 100%;
}
.handle {
color: inherit;
text-decoration: none;

View File

@ -58,7 +58,7 @@
<ft-icon-button
v-if="isQuickBookmarkEnabled && quickBookmarkButtonEnabled"
:title="quickBookmarkIconText"
:icon="isInQuickBookmarkPlaylist ? ['fas', 'check'] : ['fas', 'clock']"
:icon="isInQuickBookmarkPlaylist ? ['fas', 'check'] : ['fas', 'bookmark']"
class="quickBookmarkVideoIcon"
:class="{
bookmarked: isInQuickBookmarkPlaylist,

View File

@ -119,7 +119,7 @@ export default defineComponent({
if (typeof (playlist.playlistName) !== 'string') { return false }
if (this.doSearchPlaylistsWithMatchingVideos) {
if (playlist.videos.some((v) => v.title.toLowerCase().includes(this.processedQuery))) {
if (playlist.videos.some((v) => v.author.toLowerCase().includes(this.processedQuery) || v.title.toLowerCase().includes(this.processedQuery))) {
return true
}
}
@ -240,13 +240,20 @@ export default defineComponent({
this.updatePlaylist({ _id: playlist._id })
})
const translationEntryKey = addedPlaylistIds.size === 1
? 'User Playlists.AddVideoPrompt.Toast.{videoCount} video(s) added to 1 playlist'
: 'User Playlists.AddVideoPrompt.Toast.{videoCount} video(s) added to {playlistCount} playlists'
showToast(this.$tc(translationEntryKey, this.toBeAddedToPlaylistVideoCount, {
videoCount: this.toBeAddedToPlaylistVideoCount,
playlistCount: addedPlaylistIds.size,
}))
let message
if (addedPlaylistIds.size === 1) {
message = this.$tc('User Playlists.AddVideoPrompt.Toast.{videoCount} video(s) added to 1 playlist', this.toBeAddedToPlaylistVideoCount, {
videoCount: this.toBeAddedToPlaylistVideoCount,
playlistCount: addedPlaylistIds.size,
})
} else {
message = this.$tc('User Playlists.AddVideoPrompt.Toast.{videoCount} video(s) added to {playlistCount} playlists', this.toBeAddedToPlaylistVideoCount, {
videoCount: this.toBeAddedToPlaylistVideoCount,
playlistCount: addedPlaylistIds.size,
})
}
showToast(message)
this.hide()
},

View File

@ -58,6 +58,16 @@ export default defineComponent({
return this.shareTargetType === 'Video'
},
shareTitle: function() {
if (this.isChannel) {
return this.$t('Share.Share Channel')
}
if (this.isPlaylist) {
return this.$t('Share.Share Playlist')
}
return this.$t('Share.Share Video')
},
currentInvidiousInstance: function () {
return this.$store.getters.getCurrentInvidiousInstance
},

View File

@ -1,7 +1,7 @@
<template>
<ft-icon-button
ref="iconButton"
:title="$t(`Share.Share ${shareTargetType}`)"
:title="shareTitle"
theme="secondary"
:icon="['fas', 'share-alt']"
:dropdown-modal-on-mobile="true"
@ -75,7 +75,7 @@
id="invidiousShare"
class="header invidious"
>
<span class="invidiousLogo" />Invidious
<span class="invidiousLogo" /> Invidious
</div>
<div class="buttons">

View File

@ -13,10 +13,7 @@
@change="$emit('change', currentValue)"
>
<span>
{{ label }}:
<span>
{{ displayLabel }}
</span>
{{ $t('Display Label', {label: label, value: displayLabel}) }}
</span>
</label>
</template>

View File

@ -1,6 +1,6 @@
import { defineComponent } from 'vue'
import { mapActions } from 'vuex'
import { colors } from '../../helpers/colors'
import { colors, getColorTranslations } from '../../helpers/colors'
import FtSelect from '../ft-select/ft-select.vue'
import { sanitizeForHtmlId } from '../../helpers/accessibility'
@ -31,11 +31,7 @@ export default defineComponent({
},
colorNames: function () {
return this.colorValues.map(colorVal => {
// add spaces before capital letters
const colorName = colorVal.replaceAll(/([A-Z])/g, ' $1').trim()
return this.$t(`Settings.Theme Settings.Main Color Theme.${colorName}`)
})
return getColorTranslations()
},
sponsorBlockValues: function() {
@ -80,6 +76,29 @@ export default defineComponent({
this.$t('Settings.SponsorBlock Settings.Skip Options.Show In Seek Bar'),
this.$t('Settings.SponsorBlock Settings.Skip Options.Do Nothing')
]
},
translatedCategoryName: function() {
switch (this.categoryName.toLowerCase()) {
case 'sponsor':
return this.$t('Video.Sponsor Block category.sponsor')
case 'self-promotion':
return this.$t('Video.Sponsor Block category.self-promotion')
case 'interaction':
return this.$t('Video.Sponsor Block category.interaction')
case 'intro':
return this.$t('Video.Sponsor Block category.intro')
case 'outro':
return this.$t('Video.Sponsor Block category.outro')
case 'recap':
return this.$t('Video.Sponsor Block category.recap')
case 'music offtopic':
return this.$t('Video.Sponsor Block category.music offtopic')
case 'filler':
return this.$t('Video.Sponsor Block category.filler')
default:
return ''
}
}
},

View File

@ -4,7 +4,7 @@
:id="sanitizedId"
class="sponsorTitle"
>
{{ $t("Video.Sponsor Block category." + categoryName) }}
{{ translatedCategoryName }}
</div>
<ft-select
:sanitized-id="sanitizedId + 'categoryColor'"

View File

@ -63,7 +63,7 @@
<div
class="initial"
>
{{ isProfileSubscribed(profile) ? '✓' : profileInitials[index] }}
{{ isProfileSubscribed(profile) ? $t('checkmark') : profileInitials[index] }}
</div>
</div>
<p

View File

@ -2111,6 +2111,8 @@ export default defineComponent({
// Unexpected errors should be reported
console.error(err)
// ignore as this will most likely be removed by shaka player changes
// eslint-disable-next-line @intlify/vue-i18n/no-missing-keys
const errorMessage = this.$t('play() request Error (Click to copy)')
showToast(`${errorMessage}: ${err}`, 10000, () => {
copyToClipboard(err)

View File

@ -8,6 +8,7 @@ import FtInstanceSelector from '../ft-instance-selector/ft-instance-selector.vue
import debounce from 'lodash.debounce'
import allLocales from '../../../../static/locales/activeLocales.json'
import { showToast } from '../../helpers/utils'
import { translateWindowTitle } from '../../helpers/strings'
export default defineComponent({
name: 'GeneralSettings',
@ -94,7 +95,7 @@ export default defineComponent({
return this.$router.getRoutes().filter((route) => includedPageNames.includes(route.name))
},
defaultPageNames: function () {
return this.defaultPages.map((route) => this.$t(route.meta.title))
return this.defaultPages.map((route) => translateWindowTitle(route.meta.title, this.$i18n))
},
defaultPageValues: function () {
// avoid Vue parsing issues by excluding '/' from path values

View File

@ -287,7 +287,7 @@ export default defineComponent({
this.screenshotFilenameExample = `${res}.${this.screenshotFormat}`
return true
}).catch(err => {
this.screenshotFilenameExample = `${this.$t(`Settings.Player Settings.Screenshot.Error.${err.message}`)}`
this.screenshotFilenameExample = `${err.message}`
return false
})
},

View File

@ -39,9 +39,6 @@ export default defineComponent({
saveVideoHistoryWithLastViewedPlaylist: function () {
return this.$store.getters.getSaveVideoHistoryWithLastViewedPlaylist
},
removeVideoMetaFiles: function () {
return this.$store.getters.getRemoveVideoMetaFiles
},
profileList: function () {
return this.$store.getters.getProfileList
@ -74,13 +71,6 @@ export default defineComponent({
this.updateRememberHistory(value)
},
handleVideoMetaFiles: function (value) {
if (!value) {
this.updateRemoveVideoMetaFiles(false)
}
this.updateRemoveVideoMetaFiles(value)
},
handleRemoveHistory: function (option) {
this.showRemoveHistoryPrompt = false
@ -126,7 +116,6 @@ export default defineComponent({
...mapActions([
'updateRememberHistory',
'updateRemoveVideoMetaFiles',
'removeAllHistory',
'updateSaveWatchedProgress',
'updateSaveVideoHistoryWithLastViewedPlaylist',

View File

@ -29,15 +29,6 @@
@change="updateSaveVideoHistoryWithLastViewedPlaylist"
/>
</div>
<div class="switchColumn">
<ft-toggle-switch
:label="$t('Settings.Privacy Settings.Automatically Remove Video Meta Files')"
:compact="true"
:default-value="removeVideoMetaFiles"
:tooltip="$t('Tooltips.Privacy Settings.Remove Video Meta Files')"
@change="handleVideoMetaFiles"
/>
</div>
</div>
<br>
<ft-flex-box>

View File

@ -61,16 +61,16 @@
{{ $t('Settings.Proxy Settings.Your Info') }}
</h3>
<p>
{{ $t('Settings.Proxy Settings.Ip') }}: {{ proxyIp }}
{{ $t('Display Label', { label: $t('Settings.Proxy Settings.Ip'), value: proxyIp }) }}
</p>
<p>
{{ $t('Settings.Proxy Settings.Country') }}: {{ proxyCountry }}
{{ $t('Display Label', { label: $t('Settings.Proxy Settings.Country'), value: proxyCountry }) }}
</p>
<p>
{{ $t('Settings.Proxy Settings.Region') }}: {{ proxyRegion }}
{{ $t('Display Label', { label: $t('Settings.Proxy Settings.Region'), value: proxyRegion }) }}
</p>
<p>
{{ $t('Settings.Proxy Settings.City') }}: {{ proxyCity }}
{{ $t('Display Label', { label: $t('Settings.Proxy Settings.City'), value: proxyCity }) }}
</p>
</div>
</template>

View File

@ -6,7 +6,7 @@ import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue'
import FtSlider from '../ft-slider/ft-slider.vue'
import FtFlexBox from '../ft-flex-box/ft-flex-box.vue'
import FtPrompt from '../ft-prompt/ft-prompt.vue'
import { colors } from '../../helpers/colors'
import { colors, getColorTranslations } from '../../helpers/colors'
export default defineComponent({
name: 'ThemeSettings',
@ -114,11 +114,7 @@ export default defineComponent({
},
colorNames: function () {
return this.colorValues.map(colorVal => {
// add spaces before capital letters
const colorName = colorVal.replaceAll(/([A-Z])/g, ' $1').trim()
return this.$t(`Settings.Theme Settings.Main Color Theme.${colorName}`)
})
return getColorTranslations()
},
areColorThemesEnabled: function() {

View File

@ -7,6 +7,7 @@ import debounce from 'lodash.debounce'
import { IpcChannels } from '../../../constants'
import { openInternalPath } from '../../helpers/utils'
import { translateWindowTitle } from '../../helpers/strings'
import { clearLocalSearchSuggestionsSession, getLocalSearchSuggestions } from '../../helpers/api/local'
import { invidiousAPICall } from '../../helpers/api/invidious'
@ -47,9 +48,10 @@ export default defineComponent({
headerLogoTitle: function () {
return this.$t('Go to page',
{
page: this.$t(this.$router.getRoutes()
page: translateWindowTitle(this.$router.getRoutes()
.find((route) => route.path === '/' + this.landingPage)
.meta.title
.meta.title,
this.$i18n
)
})
},

View File

@ -90,7 +90,7 @@
<ft-icon-button
v-if="isQuickBookmarkEnabled"
:title="quickBookmarkIconText"
:icon="isInQuickBookmarkPlaylist ? ['fas', 'check'] : ['fas', 'clock']"
:icon="isInQuickBookmarkPlaylist ? ['fas', 'check'] : ['fas', 'bookmark']"
class="quickBookmarkVideoIcon"
:class="{
bookmarked: isInQuickBookmarkPlaylist,

View File

@ -331,7 +331,7 @@ export async function getLocalChannelLiveStreams(id) {
// it has some empty fields in the protobuf but it doesn't work if you remove them)
}))
const liveStreamsTab = new YT.Channel(null, response)
let liveStreamsTab = new YT.Channel(innertube.actions, response)
const { id: channelId = id, name, thumbnailUrl } = parseLocalChannelHeader(liveStreamsTab)
let videos
@ -339,7 +339,16 @@ export async function getLocalChannelLiveStreams(id) {
// if the channel doesn't have a live tab, YouTube returns the home tab instead
// so we need to check that we got the right tab
if (liveStreamsTab.current_tab?.endpoint.metadata.url?.endsWith('/streams')) {
videos = parseLocalChannelVideos(liveStreamsTab.videos, channelId, name)
// work around YouTube bug where it will return a bunch of responses with only continuations in them
// e.g. https://www.youtube.com/@TWLIVES/streams
let tempVideos = liveStreamsTab.videos
while (tempVideos.length === 0 && liveStreamsTab.has_continuation) {
liveStreamsTab = await liveStreamsTab.getContinuation()
tempVideos = liveStreamsTab.videos
}
videos = parseLocalChannelVideos(tempVideos, channelId, name)
} else {
videos = []
}

View File

@ -1,3 +1,5 @@
import i18n from '../i18n/index'
export const colors = [
{ name: 'Red', value: '#d50000' },
{ name: 'Pink', value: '#C51162' },
@ -38,14 +40,55 @@ export const colors = [
{ name: 'CatppuccinMochaLavender', value: '#B4BEFE' }
]
export function getColorTranslations() {
return [
i18n.t('Settings.Theme Settings.Main Color Theme.Red'),
i18n.t('Settings.Theme Settings.Main Color Theme.Pink'),
i18n.t('Settings.Theme Settings.Main Color Theme.Purple'),
i18n.t('Settings.Theme Settings.Main Color Theme.Deep Purple'),
i18n.t('Settings.Theme Settings.Main Color Theme.Indigo'),
i18n.t('Settings.Theme Settings.Main Color Theme.Blue'),
i18n.t('Settings.Theme Settings.Main Color Theme.Light Blue'),
i18n.t('Settings.Theme Settings.Main Color Theme.Cyan'),
i18n.t('Settings.Theme Settings.Main Color Theme.Teal'),
i18n.t('Settings.Theme Settings.Main Color Theme.Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Light Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Lime'),
i18n.t('Settings.Theme Settings.Main Color Theme.Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Amber'),
i18n.t('Settings.Theme Settings.Main Color Theme.Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Deep Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Cyan'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Pink'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Purple'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Red'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Rosewater'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Flamingo'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Pink'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Mauve'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Red'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Maroon'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Peach'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Teal'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Sky'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Sapphire'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Blue'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Lavender')
]
}
export function getRandomColorClass() {
const randomInt = Math.floor(Math.random() * colors.length)
return 'main' + colors[randomInt].name
return 'main' + getRandomColor().name
}
export function getRandomColor() {
const randomInt = Math.floor(Math.random() * colors.length)
return colors[randomInt].value
return colors[randomInt]
}
export function calculateColorLuminance(colorValue) {

View File

@ -23,3 +23,32 @@ export function isKeyboardEventKeyPrintableChar(eventKey) {
return false
}
export function translateWindowTitle(title, i18n) {
switch (title) {
case 'Subscriptions':
return i18n.t('Subscriptions.Subscriptions')
case 'Channels':
return i18n.t('Channels.Title')
case 'Trending':
return i18n.t('Trending.Trending')
case 'Most Popular':
return i18n.t('Most Popular')
case 'Your Playlists':
return i18n.t('User Playlists.Your Playlists')
case 'History':
return i18n.t('History.History')
case 'Settings':
return i18n.t('Settings.Settings')
case 'About':
return i18n.t('About.About')
case 'Profile Settings':
return i18n.t('Profile.Profile Settings')
case 'Search Results':
return i18n.t('Search Filters.Search Results')
case 'Playlist':
return i18n.t('Playlist.Playlist')
default:
return null
}
}

View File

@ -92,43 +92,67 @@ export function toLocalePublicationString ({ publishText, isLive = false, isUpco
const match = publishText.match(PUBLISHED_TEXT_REGEX)
const singular = (match[1] === '1')
let translationKey = ''
let unit = ''
switch (match[2].substring(0, 2)) {
case 'se':
case 's':
translationKey = 'Video.Published.Second'
if (singular) {
unit = i18n.t('Video.Published.Second')
} else {
unit = i18n.t('Video.Published.Seconds')
}
break
case 'mi':
case 'm':
translationKey = 'Video.Published.Minute'
if (singular) {
unit = i18n.t('Video.Published.Minute')
} else {
unit = i18n.t('Video.Published.Minutes')
}
break
case 'ho':
case 'h':
translationKey = 'Video.Published.Hour'
if (singular) {
unit = i18n.t('Video.Published.Hour')
} else {
unit = i18n.t('Video.Published.Hours')
}
break
case 'da':
case 'd':
translationKey = 'Video.Published.Day'
if (singular) {
unit = i18n.t('Video.Published.Day')
} else {
unit = i18n.t('Video.Published.Days')
}
break
case 'we':
case 'w':
translationKey = 'Video.Published.Week'
if (singular) {
unit = i18n.t('Video.Published.Week')
} else {
unit = i18n.t('Video.Published.Weeks')
}
break
case 'mo':
translationKey = 'Video.Published.Month'
if (singular) {
unit = i18n.t('Video.Published.Month')
} else {
unit = i18n.t('Video.Published.Months')
}
break
case 'ye':
case 'y':
translationKey = 'Video.Published.Year'
if (singular) {
unit = i18n.t('Video.Published.Year')
} else {
unit = i18n.t('Video.Published.Years')
}
break
default:
return publishText
}
if (!singular) {
translationKey += 's'
}
const unit = i18n.t(translationKey)
return i18n.t('Video.Publicationtemplate', { number: match[1], unit })
}
@ -574,8 +598,7 @@ export function extractNumberFromString(str) {
}
}
export function showExternalPlayerUnsupportedActionToast(externalPlayer, actionName) {
const action = i18n.t(`Video.External Player.Unsupported Actions.${actionName}`)
export function showExternalPlayerUnsupportedActionToast(externalPlayer, action) {
const message = i18n.t('Video.External Player.UnsupportedActionTemplate', { externalPlayer, action })
showToast(message)
}

View File

@ -8,7 +8,20 @@ Vue.use(VueI18n)
const i18n = new VueI18n({
locale: 'en-US',
fallbackLocale: { default: 'en-US' }
fallbackLocale: {
// https://kazupon.github.io/vue-i18n/guide/fallback.html#explicit-fallback-with-decision-maps
// es_AR -> es -> en-US
es_AR: ['es'],
// es-MX -> es -> en-US
'es-MX': ['es'],
// pt-BR -> pt -> en-US
'pt-BR': ['pt'],
// pt-PT -> pt -> en-US
'pt-PT': ['pt'],
// any -> en-US
default: ['en-US'],
}
})
export async function loadLocale(locale) {
@ -18,6 +31,7 @@ export async function loadLocale(locale) {
}
if (!activeLocales.includes(locale)) {
console.error(`Unable to load unknown locale: "${locale}"`)
return
}
// locales are only compressed in our production Electron builds
@ -45,6 +59,4 @@ export async function loadLocale(locale) {
}
}
loadLocale('en-US')
export default i18n

View File

@ -22,7 +22,6 @@ import {
faCheck,
faChevronRight,
faCircleUser,
faClock,
faClone,
faComment,
faCommentDots,
@ -102,7 +101,6 @@ library.add(
faCheck,
faChevronRight,
faCircleUser,
faClock,
faClone,
faComment,
faCommentDots,

View File

@ -23,7 +23,7 @@ const router = new Router({
path: '/',
name: 'default',
meta: {
title: 'Subscriptions.Subscriptions'
title: 'Subscriptions'
},
component: Subscriptions
},
@ -31,7 +31,7 @@ const router = new Router({
path: '/subscriptions',
name: 'subscriptions',
meta: {
title: 'Subscriptions.Subscriptions'
title: 'Subscriptions'
},
component: Subscriptions
},
@ -39,7 +39,7 @@ const router = new Router({
path: '/subscribedchannels',
name: 'subscribedChannels',
meta: {
title: 'Channels.Title'
title: 'Channels'
},
component: SubscribedChannels
},
@ -47,7 +47,7 @@ const router = new Router({
path: '/trending',
name: 'trending',
meta: {
title: 'Trending.Trending'
title: 'Trending'
},
component: Trending
},
@ -63,7 +63,7 @@ const router = new Router({
path: '/userplaylists',
name: 'userPlaylists',
meta: {
title: 'User Playlists.Your Playlists'
title: 'Your Playlists'
},
component: UserPlaylists
},
@ -71,7 +71,7 @@ const router = new Router({
path: '/history',
name: 'history',
meta: {
title: 'History.History'
title: 'History'
},
component: History
},
@ -79,7 +79,7 @@ const router = new Router({
path: '/settings',
name: 'settings',
meta: {
title: 'Settings.Settings'
title: 'Settings'
},
component: Settings
},
@ -87,7 +87,7 @@ const router = new Router({
path: '/about',
name: 'about',
meta: {
title: 'About.About'
title: 'About'
},
component: About
},
@ -95,21 +95,21 @@ const router = new Router({
path: '/settings/profile',
name: 'profileSettings',
meta: {
title: 'Profile.Profile Settings'
title: 'Profile Settings'
},
component: ProfileSettings
},
{
path: '/search/:query',
meta: {
title: 'Search Filters.Search Results'
title: 'Search Results'
},
component: Search
},
{
path: '/playlist/:id',
meta: {
title: 'Playlist.Playlist'
title: 'Playlist'
},
component: Playlist
},

View File

@ -366,7 +366,7 @@ $watched-transition-duration: 0.5s;
&:has(:focus-visible) .addToPlaylistIcon:not(.alwaysVisible),
&:has(:focus-visible) .quickBookmarkVideoIcon:not(.alwaysVisible),
&:has(:focus-visible) .externalPlayerIcon {
opacity: $thumbnail-overlay-opacity;
opacity: 1;
}
&:hover .optionsButton,
@ -386,45 +386,6 @@ $watched-transition-duration: 0.5s;
}
}
.ft-list-channel {
.infoAndSubscribe {
display: flex;
flex-flow: row wrap;
justify-content: center;
inline-size: 100%;
}
&.grid {
align-items: center;
text-align: center;
.infoAndSubscribe {
flex-flow: column wrap;
align-items: center;
.info {
margin-block-end: 12px;
.infoLine {
text-align: center;
}
}
}
}
&.list {
.infoAndSubscribe {
flex-flow: row wrap;
justify-content: center;
.channelSubscribeButton {
margin-block: auto;
margin-inline: 7px;
}
}
}
}
.videoWatched,
.live,
.upcoming {

View File

@ -54,7 +54,7 @@ const actions = {
if (profiles.length === 0) {
// Create a default profile and persist it
const randomColor = getRandomColor()
const randomColor = getRandomColor().value
const textColor = calculateColorLuminance(randomColor)
const defaultProfile = {
_id: MAIN_PROFILE_ID,

View File

@ -241,7 +241,6 @@ const state = {
proxyVideos: !process.env.IS_ELECTRON,
region: 'US',
rememberHistory: true,
removeVideoMetaFiles: true,
saveWatchedProgress: true,
saveVideoHistoryWithLastViewedPlaylist: true,
showFamilyFriendlyOnly: false,
@ -354,7 +353,34 @@ const stateWithSideEffects = {
}
}
await loadLocale(targetLocale)
const loadPromises = []
if (targetLocale !== defaultLocale) {
// "en-US" is used as a fallback for missing strings in other locales
loadPromises.push(
loadLocale(defaultLocale)
)
}
// "es" is used as a fallback for "es_AR" and "es-MX"
if (targetLocale === 'es_AR' || targetLocale === 'es-MX') {
loadPromises.push(
loadLocale('es')
)
}
// "pt" is used as a fallback for "pt-PT" and "pt-BR"
if (targetLocale === 'pt-PT' || targetLocale === 'pt-BR') {
loadPromises.push(
loadLocale('pt')
)
}
loadPromises.push(
loadLocale(targetLocale)
)
await Promise.allSettled(loadPromises)
i18n.locale = targetLocale
await dispatch('getRegionData', {

View File

@ -47,7 +47,6 @@ const state = {
duration: ''
},
externalPlayerNames: [],
externalPlayerNameTranslationKeys: [],
externalPlayerValues: [],
externalPlayerCmdArguments: {}
}
@ -133,10 +132,6 @@ const getters = {
return state.externalPlayerNames
},
getExternalPlayerNameTranslationKeys () {
return state.externalPlayerNameTranslationKeys
},
getExternalPlayerValues () {
return state.externalPlayerValues
},
@ -262,7 +257,7 @@ const actions = {
}
if (parsedString !== replaceFilenameForbiddenChars(parsedString)) {
reject(new Error('Forbidden Characters')) // use message as translation key
reject(new Error(i18n.t('Settings.Player Settings.Screenshot.Error.Forbidden Characters')))
}
let filename
@ -274,7 +269,7 @@ const actions = {
}
if (!filename) {
reject(new Error('Empty File Name'))
reject(new Error(i18n.t('Settings.Player Settings.Screenshot.Error.Empty File Name')))
}
resolve(parsedString)
@ -603,7 +598,7 @@ const actions = {
const fileData = await fs.readFile(`${fileLocation}${fileName}`)
const externalPlayerMap = JSON.parse(fileData).map((entry) => {
return { name: entry.name, nameTranslationKey: entry.nameTranslationKey, value: entry.value, cmdArguments: entry.cmdArguments }
return { name: entry.name, value: entry.value, cmdArguments: entry.cmdArguments }
})
// Sort external players alphabetically & case-insensitive, keep default entry at the top
const playerNone = externalPlayerMap.shift()
@ -611,7 +606,6 @@ const actions = {
externalPlayerMap.unshift(playerNone)
const externalPlayerNames = externalPlayerMap.map((entry) => { return entry.name })
const externalPlayerNameTranslationKeys = externalPlayerMap.map((entry) => { return entry.nameTranslationKey })
const externalPlayerValues = externalPlayerMap.map((entry) => { return entry.value })
const externalPlayerCmdArguments = externalPlayerMap.reduce((result, item) => {
result[item.value] = item.cmdArguments
@ -619,7 +613,6 @@ const actions = {
}, {})
commit('setExternalPlayerNames', externalPlayerNames)
commit('setExternalPlayerNameTranslationKeys', externalPlayerNameTranslationKeys)
commit('setExternalPlayerValues', externalPlayerValues)
commit('setExternalPlayerCmdArguments', externalPlayerCmdArguments)
},
@ -667,7 +660,7 @@ const actions = {
args.push(cmdArgs.startOffset, Math.trunc(payload.watchProgress))
}
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'starting video at offset')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.starting video at offset'))
}
}
@ -675,7 +668,7 @@ const actions = {
if (typeof cmdArgs.playbackRate === 'string') {
args.push(`${cmdArgs.playbackRate}${payload.playbackRate}`)
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'setting a playback rate')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.setting a playback rate'))
}
}
@ -685,7 +678,7 @@ const actions = {
if (typeof cmdArgs.playlistIndex === 'string') {
args.push(`${cmdArgs.playlistIndex}${payload.playlistIndex}`)
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'opening specific video in a playlist (falling back to opening the video)')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.opening specific video in a playlist (falling back to opening the video)'))
}
}
@ -693,7 +686,7 @@ const actions = {
if (typeof cmdArgs.playlistReverse === 'string') {
args.push(cmdArgs.playlistReverse)
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'reversing playlists')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.reversing playlists'))
}
}
@ -701,7 +694,7 @@ const actions = {
if (typeof cmdArgs.playlistShuffle === 'string') {
args.push(cmdArgs.playlistShuffle)
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'shuffling playlists')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.shuffling playlists'))
}
}
@ -709,7 +702,7 @@ const actions = {
if (typeof cmdArgs.playlistLoop === 'string') {
args.push(cmdArgs.playlistLoop)
} else if (!ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'looping playlists')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.looping playlists'))
}
}
@ -721,7 +714,7 @@ const actions = {
}
} else {
if (payload.playlistId != null && payload.playlistId !== '' && !ignoreWarnings) {
showExternalPlayerUnsupportedActionToast(externalPlayer, 'opening playlists')
showExternalPlayerUnsupportedActionToast(externalPlayer, i18n.t('Video.External Player.Unsupported Actions.opening playlists'))
}
if (payload.videoId != null) {
args.push(`${cmdArgs.videoUrl}https://www.youtube.com/watch?v=${payload.videoId}`)
@ -874,10 +867,6 @@ const mutations = {
state.externalPlayerNames = value
},
setExternalPlayerNameTranslationKeys (state, value) {
state.externalPlayerNameTranslationKeys = value
},
setExternalPlayerValues (state, value) {
state.externalPlayerValues = value
},

View File

@ -906,7 +906,16 @@ export default defineComponent({
return
}
this.latestLive = parseLocalChannelVideos(liveTab.videos, this.id, this.channelName)
// work around YouTube bug where it will return a bunch of responses with only continuations in them
// e.g. https://www.youtube.com/@TWLIVES/streams
let videos = liveTab.videos
while (videos.length === 0 && liveTab.has_continuation) {
liveTab = await liveTab.getContinuation()
videos = liveTab.videos
}
this.latestLive = parseLocalChannelVideos(videos, this.id, this.channelName)
this.liveContinuationData = liveTab.has_continuation ? liveTab : null
this.isElementListLoading = false
@ -1920,6 +1929,7 @@ export default defineComponent({
}
invidiousAPICall(payload).then((response) => {
setPublishedTimestampsInvidious(response.filter(item => item.type === 'video'))
if (this.hideChannelPlaylists) {
this.searchResults = this.searchResults.concat(response.filter(item => item.type !== 'playlist'))
} else {

View File

@ -93,11 +93,13 @@ export default defineComponent({
} else {
const lowerCaseQuery = this.query.toLowerCase()
const filteredQuery = this.historyCacheSorted.filter((video) => {
if (typeof (video.title) !== 'string' || typeof (video.author) !== 'string') {
return false
} else {
return video.title.toLowerCase().includes(lowerCaseQuery) || video.author.toLowerCase().includes(lowerCaseQuery)
if (typeof (video.title) === 'string' && video.title.toLowerCase().includes(lowerCaseQuery)) {
return true
} else if (typeof (video.author) === 'string' && video.author.toLowerCase().includes(lowerCaseQuery)) {
return true
}
return false
}).sort((a, b) => {
return b.timeWatched - a.timeWatched
})

View File

@ -145,7 +145,13 @@ export default defineComponent({
if (this.processedVideoSearchQuery === '') { return this.playlistItems }
return this.playlistItems.filter((v) => {
return v.title.toLowerCase().includes(this.processedVideoSearchQuery)
if (typeof (v.title) === 'string' && v.title.toLowerCase().includes(this.processedVideoSearchQuery)) {
return true
} else if (typeof (v.author) === 'string' && v.author.toLowerCase().includes(this.processedVideoSearchQuery)) {
return true
}
return false
})
},
visiblePlaylistItems: function () {

View File

@ -52,7 +52,7 @@ export default defineComponent({
methods: {
openSettingsForNewProfile: function () {
this.isNewProfileOpen = true
const bgColor = getRandomColor()
const bgColor = getRandomColor().value
const textColor = calculateColorLuminance(bgColor)
this.openSettingsProfile = {
name: '',

View File

@ -223,7 +223,7 @@ export default defineComponent({
if (typeof (playlist.playlistName) !== 'string') { return false }
if (this.doSearchPlaylistsWithMatchingVideos) {
if (playlist.videos.some((v) => v.title.toLowerCase().includes(this.lowerCaseQuery))) {
if (playlist.videos.some((v) => v.author.toLowerCase().includes(this.lowerCaseQuery) || v.title.toLowerCase().includes(this.lowerCaseQuery))) {
return true
}
}

View File

@ -1,6 +1,5 @@
import { defineComponent } from 'vue'
import { mapActions } from 'vuex'
import fs from 'fs/promises'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
import FtVideoPlayer from '../../components/ft-video-player/ft-video-player.vue'
import WatchVideoInfo from '../../components/watch-video-info/watch-video-info.vue'
@ -12,14 +11,12 @@ import WatchVideoPlaylist from '../../components/watch-video-playlist/watch-vide
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,
copyToClipboard,
formatDurationAsTimestamp,
formatNumber,
getFormatsFromHLSManifest,
getUserDataPath,
showToast
} from '../../helpers/utils'
import {
@ -141,9 +138,6 @@ export default defineComponent({
rememberHistory: function () {
return this.$store.getters.getRememberHistory
},
removeVideoMetaFiles: function () {
return this.$store.getters.getRemoveVideoMetaFiles
},
saveWatchedProgress: function () {
return this.$store.getters.getSaveWatchedProgress
},
@ -707,7 +701,7 @@ export default defineComponent({
}
if (result.storyboards?.type === 'PlayerStoryboardSpec') {
await this.createLocalStoryboardUrls(result.storyboards.boards.at(-1))
this.createLocalStoryboardUrls(result.storyboards.boards.at(-1))
}
}
@ -1404,9 +1398,7 @@ export default defineComponent({
this.playNextCountDownIntervalId = setInterval(showCountDownMessage, 1000)
},
handleRouteChange: async function (videoId) {
// if the user navigates to another video, the ipc call for the userdata path
// takes long enough for the video id to have already changed to the new one
handleRouteChange: function (videoId) {
// receiving it as an arg instead of accessing it ourselves means we always have the right one
clearTimeout(this.playNextTimeout)
@ -1437,21 +1429,9 @@ export default defineComponent({
}
}
if (process.env.IS_ELECTRON && this.removeVideoMetaFiles) {
if (process.env.NODE_ENV === 'development') {
const vttFileLocation = `static/storyboards/${videoId}.vtt`
// only delete the file it actually exists
if (await pathExists(vttFileLocation)) {
await fs.rm(vttFileLocation)
}
} else {
const userData = await getUserDataPath()
const vttFileLocation = `${userData}/storyboards/${videoId}.vtt`
if (await pathExists(vttFileLocation)) {
await fs.rm(vttFileLocation)
}
}
if (this.videoStoryboardSrc.startsWith('blob:')) {
URL.revokeObjectURL(this.videoStoryboardSrc)
this.videoStoryboardSrc = ''
}
},
@ -1616,36 +1596,14 @@ export default defineComponent({
})
},
createLocalStoryboardUrls: async function (storyboardInfo) {
createLocalStoryboardUrls: function (storyboardInfo) {
const results = buildVTTFileLocally(storyboardInfo, this.videoLengthSeconds)
const userData = await getUserDataPath()
let fileLocation
let uriSchema
// Dev mode doesn't have access to the file:// schema, so we access
// storyboards differently when run in dev
if (process.env.NODE_ENV === 'development') {
fileLocation = `static/storyboards/${this.videoId}.vtt`
uriSchema = `storyboards/${this.videoId}.vtt`
// if the location does not exist, writeFile will not create the directory, so we have to do that manually
if (!(await pathExists('static/storyboards/'))) {
fs.mkdir('static/storyboards/')
} else if (await pathExists(fileLocation)) {
await fs.rm(fileLocation)
}
// after the player migration, switch to using a data URI, as those don't need to be revoked
await fs.writeFile(fileLocation, results)
} else {
if (!(await pathExists(`${userData}/storyboards/`))) {
await fs.mkdir(`${userData}/storyboards/`)
}
fileLocation = `${userData}/storyboards/${this.videoId}.vtt`
uriSchema = `file://${fileLocation}`
const blob = new Blob([results], { type: 'text/vtt;charset=UTF-8' })
await fs.writeFile(fileLocation, results)
}
this.videoStoryboardSrc = uriSchema
this.videoStoryboardSrc = URL.createObjectURL(blob)
},
tryAddingTranslatedLocaleCaption: function (captionTracks, locale, baseUrl) {

View File

@ -1,13 +1,11 @@
[
{
"name": "None",
"nameTranslationKey": "Settings.External Player Settings.Players.None.Name",
"value": "",
"cmdArguments": null
},
{
"name": "mpv",
"nameTranslationKey": "Settings.External Player Settings.Players.mpv.Name",
"value": "mpv",
"cmdArguments": {
"defaultExecutable": "mpv",
@ -25,7 +23,6 @@
},
{
"name": "VLC",
"nameTranslationKey": "Settings.External Player Settings.Players.VLC.Name",
"value": "vlc",
"cmdArguments": {
"defaultExecutable": "vlc",
@ -43,7 +40,6 @@
},
{
"name": "iina",
"nameTranslationKey": "Settings.External Player Settings.Players.iina.Name",
"value": "iina",
"cmdArguments": {
"defaultExecutable": "iina",
@ -61,7 +57,6 @@
},
{
"name": "SMPlayer",
"nameTranslationKey": "Settings.External Player Settings.Players.SMPlayer.Name",
"value": "smplayer",
"cmdArguments": {
"defaultExecutable": "smplayer",
@ -79,7 +74,6 @@
},
{
"name": "MPC-BE",
"nameTranslationKey": "Settings.External Player Settings.Players.MPC-BE.Name",
"value": "mpc-be",
"cmdArguments": {
"defaultExecutable": "mpc-be64",
@ -97,7 +91,6 @@
},
{
"name": "MPC-HC",
"nameTranslationKey": "Settings.External Player Settings.Players.MPC-HC.Name",
"value": "mpc-hc",
"cmdArguments": {
"defaultExecutable": "mpc-hc64",
@ -115,7 +108,6 @@
},
{
"name": "PotPlayer",
"nameTranslationKey": "Settings.External Player Settings.Players.PotPlayer.Name",
"value": "potplayer",
"cmdArguments": {
"defaultExecutable": "potplayermini64",
@ -133,7 +125,6 @@
},
{
"name": "Clapper",
"nameTranslationKey": "Settings.External Player Settings.Players.Clapper.Name",
"value": "clapper",
"cmdArguments": {
"defaultExecutable": "clapper",
@ -151,7 +142,6 @@
},
{
"name": "Celluloid",
"nameTranslationKey": "Settings.External Player Settings.Players.Celluloid.Name",
"value": "celluloid",
"cmdArguments": {
"defaultExecutable": "celluloid",
@ -169,7 +159,6 @@
},
{
"name": "Haruna",
"nameTranslationKey": "Settings.External Player Settings.Players.Haruna.Name",
"value": "haruna",
"cmdArguments": {
"defaultExecutable": "haruna",

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'العربية'
FreeTube: 'فري تيوب'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
هذا الجزء من التطبيق ليس جاهزاً بعد. عُد لاحقاً عندما يتم إحراز تقدم.
@ -399,7 +398,6 @@ Settings:
أنت متأكد أنك تريد إزالة جميع الاشتراكات والملفات الشخصية؟ لا يمكن التراجع عن
هذا.
Remove All Subscriptions / Profiles: إزالة جميع الاشتراكات \ الملفات الشخصية
Automatically Remove Video Meta Files: إزالة ملفات تعريف الفيديو تلقائيًا
Save Watched Videos With Last Viewed Playlist: حفظ مقاطع الفيديو التي تمت مشاهدتها
مع آخر قائمة تشغيل تم عرضها
All playlists have been removed: تمت إزالة جميع قوائم التشغيل
@ -1068,9 +1066,6 @@ Tooltips:
Allow DASH AV1 formats: قد تبدو تنسيقات DASH AV1 أفضل من تنسيقات DASH H.264. تتطلب
تنسيقات DASH AV1 مزيدا من الطاقة للتشغيل! وهي غير متوفرة في جميع مقاطع الفيديو
، وفي هذه الحالات سيستخدم المشغل تنسيقات DASH H.264 بدلا من ذلك.
Privacy Settings:
Remove Video Meta Files: عندما يمكن، يحذف Freetube تلقائيًا ملفات التعريف التي
تم إنشاؤها أثناء تشغيل الفيديو ، عندما تكون صفحة المشاهدة مغلقة.
Subscription Settings:
Fetch Feeds from RSS: عند تفعيلها، سوف يستخدم فريتيوب طريقة RSS بدلًا من طريقته
المعتادة لجلب صفحة اشتراكاتك. طريقة RSS أسرع وتتخطى حجب الآي بي IP، لكنها لا
@ -1175,3 +1170,5 @@ Age Restricted:
This channel is age restricted: هذه القناة مقيدة بالعمر
This video is age restricted: هذا الفيديو مقيد بالفئة العمرية
Close Banner: إغلاق الشعار
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,4 +1,3 @@
FreeTube: 'ফ্ৰীটিউব'
# Currently on Subscriptions, Playlists, and History
File: 'ফাইল'
Quit: 'অন্ত কৰক'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Беларуская'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Гэтая частка праграмы яшчэ не гатова. Прыходзьце пазней.
@ -307,7 +306,6 @@ Settings:
Remember History: ''
Save Watched Progress: ''
Save Watched Videos With Last Viewed Playlist: ''
Automatically Remove Video Meta Files: ''
Clear Search Cache: ''
Are you sure you want to clear out your search cache?: ''
Search cache has been cleared: ''
@ -802,8 +800,6 @@ Tooltips:
Subscription Settings:
Fetch Feeds from RSS: ''
Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings:
Replace HTTP Cache: ''
SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Български'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Тази част от приложението все още не е готова. Върнете се по-късно, когато може
@ -415,7 +414,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Сигурни
ли сте, че искате да премахнете всички абонаменти и профили? Това не може да
бъде възстановено.'
Automatically Remove Video Meta Files: Автоматично премахване на видео метафайловете
Save Watched Videos With Last Viewed Playlist: Запазване на гледани видеа с последно
гледан плейлист
Remove All Playlists: Премахване на всички плейлисти
@ -1099,10 +1097,6 @@ Tooltips:
External Link Handling: "Избор на поведението по подразбиране, когато щракнете
върху връзка, която не може да бъде отворена във FreeTube.\nПо подразбиране
FreeTube ще отвори връзката в браузъра по подразбиране.\n"
Privacy Settings:
Remove Video Meta Files: Когато страницата за гледане бъде затворена, FreeTube
автоматично ще изтрива метафайловете, създадени по време на възпроизвеждане
на видеото.
External Player Settings:
Custom External Player Arguments: Всички персонализирани аргументи от командния
ред, разделени с точка и запетая (";"), които искате да бъдат предадени на външния

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'বাংলা'
FreeTube: 'ফ্রিটিউব'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
অ্যাপের এই অংশটি এখনও প্রস্তুত নয়। পরে ফিরে এসো যখন অগ্রগতি হয়েছে।

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Bosanski'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Ovaj dio aplikacije još nije spreman. Vratite se kasnije kad se postigne napredak.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'català'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Aquesta secció de l'aplicació encara no està llesta. Torna més endavant quan s'hagin
@ -266,8 +265,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Esteu
segur que voleu esborrar totes les subscripcions i perfils? Aquesta acció no
es pot desfer.'
Automatically Remove Video Meta Files: Suprimeix automàticament les metadades
dels vídeos
Subscription Settings:
Subscription Settings: 'Configuració de les subscripcions'
Hide Videos on Watch: 'Oculta els vídeos visualitzats'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'ئیگلیزی (وڵاتە یەکگرتووەکانی ئەمریکا)'
FreeTube: 'فریتیوب'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
بەشێک لە نەرمەواڵەکە هێشتا ئامادە نییە. کە ڕەوتەکە درووست کرا دووبارە وەرەوە.
@ -311,7 +310,6 @@ Settings:
Remember History: ''
Save Watched Progress: ''
Save Watched Videos With Last Viewed Playlist: ''
Automatically Remove Video Meta Files: ''
Clear Search Cache: ''
Are you sure you want to clear out your search cache?: ''
Search cache has been cleared: ''
@ -818,8 +816,6 @@ Tooltips:
Subscription Settings:
Fetch Feeds from RSS: ''
Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings:
Replace HTTP Cache: ''
SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Čeština'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Tato část aplikace ještě není hotova. Vraťte se později.
@ -411,7 +410,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Odstranit všechny odběry / profily'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Opravdu
chcete odstranit všechny odběry a profily? Tato akce je nevratná.'
Automatically Remove Video Meta Files: Automaticky odstranit meta soubory videa
Save Watched Videos With Last Viewed Playlist: Uložit zhlédnutá videa s naposledy
zobrazeným playlistem
All playlists have been removed: Všechny playlisty byly odstraněny
@ -1057,9 +1055,6 @@ Tooltips:
# Toast Messages
Fetch Automatically: Při povolení tohoto nastavení bude FreeTube automaticky načítat
vaše odběry při otevření nového okna a při přepínání profilů.
Privacy Settings:
Remove Video Meta Files: Pokud je povoleno, FreeTube automaticky odstraní meta
soubory vytvořené během přehrávání videa, když se stránka sledování zavře.
External Player Settings:
Ignore Warnings: Potlačuje varování, kdy současný externí přehrávač nepodporuje
aktuální akci (např. obrácení seznamů skladeb apod.).
@ -1173,3 +1168,5 @@ Close Banner: Zavřít panel
Age Restricted:
This channel is age restricted: Tento kanál je omezen věkem
This video is age restricted: Toto video je omezeno věkem
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Cymraeg'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >
@ -314,7 +313,6 @@ Settings:
Remember History: 'Cadw Hanes'
Save Watched Progress: ''
Save Watched Videos With Last Viewed Playlist: ''
Automatically Remove Video Meta Files: ''
Clear Search Cache: ''
Are you sure you want to clear out your search cache?: ''
Search cache has been cleared: ''
@ -820,8 +818,6 @@ Tooltips:
Subscription Settings:
Fetch Feeds from RSS: ''
Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings:
Replace HTTP Cache: ''
SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'dansk'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Denne del af app'en er ikke klar endnu. Kom tilbage senere, når der er gjort fremskridt.
@ -383,7 +382,6 @@ Settings:
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
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?
@ -1010,9 +1008,6 @@ Tooltips:
Advarsel: Invidious-indstillinger har ingen effekt på eksterne afspillere.'
Ignore Warnings: Undertryk advarsler for når den eksterne afspiller ikke understøtter
den gældende handling (fx vende playlister om, etc.).
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

View File

@ -1,4 +1,3 @@
FreeTube: FreeTube
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Dieser Teil der App ist noch nicht bereit. Komme später wieder, wenn Fortschritte
@ -461,7 +460,6 @@ Settings:
du sicher, dass du alle Abos und Profile löschen möchtest? Diese Aktion kann
nicht rückgängig gemacht werden.
Remove All Subscriptions / Profiles: Alle Abos / Profile entfernen
Automatically Remove Video Meta Files: Video-Metadateien automatisch entfernen
Save Watched Videos With Last Viewed Playlist: Angesehene Videos mit der zuletzt
angesehenen Wiedergabeliste speichern
Remove All Playlists: Alle Wiedergabelisten entfernen
@ -1140,10 +1138,6 @@ Tooltips:
Die DASH AV1-Formate benötigen mehr Leistung für die Wiedergabe! Sie sind nicht
bei allen Videos verfügbar. In diesen Fällen verwendet der Abspieler stattdessen
die DASH H.264-Formate.
Privacy Settings:
Remove Video Meta Files: Wenn aktiviert, löscht FreeTube automatisch die während
der Videowiedergabe erstellten Metadateien, wenn die Abspielseite geschlossen
wird.
External Player Settings:
Custom External Player Arguments: Alle benutzerdefinierten Befehlszeilenargumente,
getrennt durch Semikolon (';'), die an den externen Abspieler übergeben werden
@ -1249,3 +1243,5 @@ 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
Display Label: '{label}: {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Ελληνικά (EL)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Αυτό το μέρος της εφαρμογής δεν είναι ακόμη έτοιμο. Επιστρέψτε αργότερα όταν έχει
@ -323,7 +322,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Είστε
βέβαιοι ότι θέλετε να καταργήσετε όλες τις συνδρομές και τα προφίλ; Αυτό δεν
μπορεί να αναιρεθεί.'
Automatically Remove Video Meta Files: Αυτόματη αφαίρεση μετα-αρχείων βίντεο
Save Watched Videos With Last Viewed Playlist: Αποθήκευση Βίντεο που Παρακολουθήσατε
Με τη Λίστα Αναπαραγωγής Τελευταίας Προβολής
Subscription Settings:
@ -1019,10 +1017,6 @@ Tooltips:
σε έναν σύνδεσμο, ο οποίος δεν μπορεί να ανοίξει στο FreeTube.\nΑπό προεπιλογή,
το FreeTube θα ανοίξει τον σύνδεσμο που έχει πατηθεί στο προεπιλεγμένο πρόγραμμα
περιήγησης.\n"
Privacy Settings:
Remove Video Meta Files: Όταν είναι ενεργοποιημένο, το FreeTube διαγράφει αυτόματα
τα μετα-αρχεία που δημιουργήθηκαν κατά την αναπαραγωγή βίντεο, όταν η σελίδα
παρακολούθησης είναι κλειστή.
External Player Settings:
Custom External Player Executable: Από προεπιλογή, το FreeTube θα υποθέσει ότι
το επιλεγμένο εξωτερικό πρόγραμμα αναπαραγωγής μπορεί να βρεθεί μέσω της μεταβλητής

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: English (US)
FreeTube: FreeTube
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
This part of the app is not ready yet. Come back later when progress has been made.
@ -417,7 +416,6 @@ Settings:
Remember History: Remember History
Save Watched Progress: Save Watched Progress
Save Watched Videos With Last Viewed Playlist: Save Watched Videos With Last Viewed Playlist
Automatically Remove Video Meta Files: Automatically Remove Video Meta Files
Clear Search Cache: Clear Search Cache
Are you sure you want to clear out your search cache?: Are you sure you want to
clear out your search cache?
@ -1010,9 +1008,6 @@ Tooltips:
but doesn't provide certain information like video duration or live status
Fetch Automatically: When enabled, FreeTube will automatically fetch
your subscription feed when a new window is opened and when switching profile.
Privacy Settings:
Remove Video Meta Files: When enabled, FreeTube automatically deletes meta files created during video playback,
when the watch page is closed.
Experimental Settings:
Replace HTTP Cache: Disables Electron's disk based HTTP cache and enables a custom in-memory image cache. Will lead to increased RAM usage.
SponsorBlock Settings:
@ -1070,3 +1065,7 @@ Hashtag:
Yes: Yes
No: No
Ok: Ok
# symbol used to indicate that an item is correct
checkmark:
# French is the only language that should change this (they have a space before the colon)
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'English (UK)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
This part of the app is not ready yet. Come back later when progress has been made.
@ -417,7 +416,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Are
you sure you want to remove all subscriptions and profiles? This cannot be
undone.'
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
@ -1084,9 +1082,6 @@ Tooltips:
Custom External Player Arguments: Any custom command line arguments, separated
by semicolons (';'), you want to be passed to the external player.
DefaultCustomArgumentsTemplate: '(Default: {defaultCustomArguments})'
Privacy Settings:
Remove Video Meta Files: When enabled, FreeTube automatically deletes meta files
created during video playback, when the watch page is closed.
Experimental Settings:
Replace HTTP Cache: Disables Electron's disk-based HTTP cache and enables a custom
in-memory image cache. Will lead to increased RAM usage.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Esperanto'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
File: 'Dosiero'
Quit: 'Eliri'

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Esta parte de la aplicación aún no está lista. Vuelva más tarde cuando se haya avanzado.
@ -290,7 +289,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: ¿Estás
seguro de que deseas eliminar todos los suscripciones y perfiles? Esto no puede
ser deshecho.
Automatically Remove Video Meta Files: Borrar automáticamente metadatos del video
Data Settings:
How do I import my subscriptions?: ¿Cómo puedo importar mis suscripciones?
Export History: Exportar Historia
@ -796,9 +794,6 @@ Tooltips:
presionada la tecla Ctrl (tecla Comando en Mac) y haga clic izquierdo para reestablecer
la velocidad de reproducción predeterminada (que es de 1x, a menos que la haya
cambiado en configuración).
Privacy Settings:
Remove Video Meta Files: Si se habilita, FreeTube borrará automáticamente los
metadatos creados al abrir el video, una vez que la ventana se cierre.
Subscription Settings:
Fetch Feeds from RSS: Si se habilita, FreeTube usará RSS en lugar del método predeterminado
para recibir videos de sus suscripciones. RSS es más rápido y previene que bloqueen

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'español (España)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Esta parte de la aplicación aún no está lista. Vuelve más tarde cuando se hayan
@ -413,8 +412,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Borrar todas las suscripciones/perfiles'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: '¿Confirma
que quieres borrar todas las suscripciones y perfiles? Esta operación es irreversible.'
Automatically Remove Video Meta Files: Eliminar automáticamente los metadatos
de vídeos
Save Watched Videos With Last Viewed Playlist: Guardar vídeos vistos con la última
lista de reproducción vista
All playlists have been removed: Se han eliminado todas las listas de reproducción
@ -1113,10 +1110,6 @@ Tooltips:
External Link Handling: "Elija el comportamiento por defecto cuando se hace clic
en un enlace que no se pueda abrirse en FreeTube. \nPor defecto, FreeTube abrirá
el enlace en el que se hizo clic en su navegador predeterminado.\n"
Privacy Settings:
Remove Video Meta Files: Cuando se active, FreeTube eliminará automáticamente
meta-archivos creados durante la reproducción del vídeo una vez se cierre la
página de visualizado.
External Player Settings:
Custom External Player Executable: Por defecto, FreeTube buscará el reproductor
externo seleccionado mediante la variable de entorno PATH, de no encontrarlo,
@ -1219,3 +1212,5 @@ Close Banner: Cerrar el banner
Age Restricted:
This channel is age restricted: Este canal está restringido por edad
This video is age restricted: Este vídeo está restringido por edad
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'español (Argentina)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Esta parte de la aplicación no esta lista por el momento. Vuelve después cuando
@ -111,6 +110,11 @@ User Playlists:
Search bar placeholder: Buscar en la Lista de Reproducción
Empty Search Message: No hay videos en esta lista de reproducción que coincidan
con tu búsqueda
This playlist currently has no videos.: Esta lista de reproducción no tiene videos.
Playlists with Matching Videos: Listas de reproducción con videos repetidos
Create New Playlist: Crear nueva lista de reproducción
Add to Favorites: Añadir a {playlistName}
Add to Playlist: Añadir a la lista de reproducción
History:
# On History Page
History: 'Historial'
@ -296,7 +300,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Remover todas las suscripciones / perfiles'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: '¿Realmente
querés remover todas las suscripciones y perfiles? Esta acción no puede deshacerse.'
Automatically Remove Video Meta Files: Borrar automáticamente metadatos del video
Save Watched Videos With Last Viewed Playlist: Guardar videos vistos con la última
lista de reproducción vista
Subscription Settings:
@ -489,3 +492,5 @@ Tooltips:
Distraction Free Settings:
Hide Subscriptions Live: Esta configuración se reemplaza por la configuración
«{appWideSetting}» de toda la aplicación, en la sección «{subsection}» de «{settingsSection}»
Go to page: Ir a {page}
Close Banner: Cerrar banner

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'eesti keel'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Rakenduse see osa pole veel valmis. Tule hiljem tagasi, kui arendustööd on valmis.
@ -409,7 +408,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Kas
sa oled kindel, et soovid kustutada kõik tellimused/profiilid? Seda tegevust
ei saa tagasi pöörata.'
Automatically Remove Video Meta Files: Kustuta videote metateave automaatselt
Save Watched Videos With Last Viewed Playlist: Salvesta vaadatud videod viimati
vaadatud videote esitusloendisse
All playlists have been removed: Kõik esitusloendid on eemaldatud
@ -1014,9 +1012,6 @@ Tooltips:
IP-aadressi blokeerimise, kuid ei sisalda video kestust ja otseesituse olekut
Fetch Automatically: Kui see valik on kasutusel, siis FreeTube automaatselt laadib
uue akna avamisel ja profiili vahetamisel sinu tellimuste loendi.
Privacy Settings:
Remove Video Meta Files: Selle valiku kasutamisel FreeTube automaatselt kustutab
peale video esitamist kogu metateabe.
General Settings:
Region for Trending: Piirkond, mille alusel kuvame hetkel menukad ehk populaarsust
koguvad videod.
@ -1128,3 +1123,5 @@ Age Restricted:
This channel is age restricted: Kanali vaatamisel on vanusepiirang
This video is age restricted: Video vaatamisel on vanusepiirang
Close Banner: Sulge rekaampilt
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Euskera'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Zati hau ez dago prest oraindik. Itzuli aurrerago aurrerapenak egin direnean.
@ -400,7 +399,6 @@ Settings:
Privacy Settings: 'Pribatutasunari buruzko ezarpenak'
Remember History: 'Historikoa oroitu'
Save Watched Progress: 'Ikusitakoaren progresioa gorde'
Automatically Remove Video Meta Files: 'Bideo metafitxategiak ezabatu automatikoki'
Clear Search Cache: 'Bilaketen cachea ezabatu'
Are you sure you want to clear out your search cache?: 'Ziur al zaude bilaketa-cachea
garbitu nahi duzula?'
@ -1019,10 +1017,6 @@ Tooltips:
bideoaren iraupenaren informaziorik ez du ematen, besteak beste'
Fetch Automatically: Gaituta dagoenean, FreeTubek automatikoki eskuratuko du zure
harpidetza-jarioa leiho berri bat irekitzen denean eta profila aldatzean.
Privacy Settings:
Remove Video Meta Files: 'Gaituta dagoenean, FreeTube-k automatikoki ezabatzen
ditu bideoen erreprodukzioan sortutako metafitxategiak, bistaratze orria ixten
denean.'
# Toast Messages
External Player Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'فارسی (ایرانی)'
FreeTube: 'یوتیوب آزاد'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
این بخش از نرم افزار هنوز آماده نیست.زمانی که پیشرفتی صورت گرفت به اینجا باز گردید.
@ -290,8 +289,6 @@ Settings:
Privacy Settings: 'تنظیمات امنیتی'
Remember History: 'حفظ تاریخچه'
Save Watched Progress: 'ذخیره ویدیو های دیده شده'
Automatically Remove Video Meta Files: 'به صورت خودکار متا فایل های ویدیو را حذف
کردن'
Clear Search Cache: 'پاک کردن کش جستجو'
Are you sure you want to clear out your search cache?: 'آیا مطمئن هستید که میخواهید
کش جستجویتان را پاک کنید؟'
@ -702,9 +699,6 @@ Tooltips:
نمی دهد
Fetch Automatically: هنگامی که فعال باشد، FreeTube به طور خودکار فید اشتراک شما
را هنگام باز شدن یک پنجره جدید و هنگام تغییر نمایه دریافت می کند.
Privacy Settings:
Remove Video Meta Files: هنگامی که FreeTube فعال باشد، به طور خودکار فایل های
متا ایجاد شده در حین پخش ویدیو را حذف می کند، زمانی که صفحه تماشا بسته می شود.
External Player Settings:
Custom External Player Executable: به طور پیش فرض، FreeTube فرض می کند که پخش
کننده خارجی انتخاب شده را می توان از طریق متغیر محیطی PATH پیدا کرد. در صورت

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Tämä sovelluksen osa ei ole vielä valmis. Tule takaisin myöhemmin kun olemme edistyneet.
@ -144,6 +143,8 @@ 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
There was an issue with updating this playlist.: Tätä soittolistaa päivittäessä
ilmeni ongelma.
Search for Videos: Etsi videot
Move Video Down: Siirrä video alas
Remove from Playlist: Poista soittolistalta
@ -174,6 +175,8 @@ User Playlists:
nimellä on jo olemassa soittolista. Valitse eri nimi.
Playlist {playlistName} has been successfully created.: Soittolista {playlistName}
on luotu.
There was an issue with creating the playlist.: Soittolistaa luotaessa ilmeni
ongelma.
Add to Favorites: Lisää soittolistaan {playlistName}
Remove from Favorites: Poista soittolistalta {playlistName}
Remove Watched Videos: Poista katsotut videot
@ -363,6 +366,7 @@ Settings:
How do I import my subscriptions?: 'Miten voin tuoda tilaukseni?'
Fetch Feeds from RSS: Nouda RSS-syöte
Fetch Automatically: Nouda syöte automaattisesti
Only Show Latest Video for Each Channel: Näytä vain jokaisen kanavan uusin video
Advanced Settings:
Advanced Settings: 'Lisäasetukset'
Enable Debug Mode (Prints data to the console): 'Ota virheenkorjaustila käyttöön
@ -404,7 +408,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Haluatko
cvarmasti poistaa kaikki tilaukset ja profiilit. Tätä toimintoa ei voi perua.
Remove All Subscriptions / Profiles: Poista kaikki tilaukset / profiilit
Automatically Remove Video Meta Files: Poista videoiden metadata automaattisesti
Save Watched Videos With Last Viewed Playlist: Tallenna katsotut videot viimeksi
katsotulla soittolistalla
Remove All Playlists: Poista kaikki soittolistat
@ -458,6 +461,8 @@ Settings:
Playlist File: Soittolistatiedosto
History File: Historia-tiedosto
Subscription File: Tilaustiedosto
Export Playlists For Older FreeTube Versions:
Label: Vie soittolistat FreeTuben vanhempiin versioihin
Distraction Free Settings:
Hide Live Chat: Piilota Live-keskustelu
Hide Popular Videos: Piilota suositut videot
@ -570,6 +575,7 @@ Settings:
Password Settings: Salasana-asetukset
Set Password: Aseta salasana
Remove Password: Poista salasana
Expand All Settings Sections: Laajenna asetusten kaikki osiot
About:
#On About page
About: 'Tietoja'
@ -1013,9 +1019,6 @@ Tooltips:
H.264 formaatit. DASH AV1 formaatit vaativat enemmän tehoa toistamiseen! Ne
eivät ole käytettävissä kaikissa videoissa ja näissä tapauksissa soitin käyttää
sen sijaan DASH H.264 formaatteja.
Privacy Settings:
Remove Video Meta Files: Kun tämä on kytkettynä päälle, FreeTube poistaa automaattisesti
meta-tiedostot jotka luotiin videon toiston aikana, katselusivu suljettaessa.
External Player Settings:
Custom External Player Arguments: Kaikki ne omavalintaiset komentorivin määreet,
puolipisteillä eroteltuina (';'), jotka haluat siirtää eteenpäin ulkoiselle

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Filipino'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Ang bahagi ito ng aplikasyon ay hindi pa handa. Bumalik po kayo mamaya kapag nag-unsad

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Cette partie de l'application n'est pas encore prête. Revenez plus tard lorsque
@ -471,8 +470,6 @@ Settings:
sûr(e) de vouloir supprimer tous les abonnements et les profils ? Cette action
est définitive.
Remove All Subscriptions / Profiles: Supprimer tous les Abonnements / Profils
Automatically Remove Video Meta Files: Supprimer automatiquement les métafichiers
vidéo
Save Watched Videos With Last Viewed Playlist: Sauvegarder les vidéos regardées
avec la dernière liste de lecture vue
All playlists have been removed: Toutes les listes de lecture ont été supprimées
@ -1159,10 +1156,6 @@ Tooltips:
External Link Handling: "Choisissez le comportement par défaut quand on clique
sur un lien qui ne peut être ouvert dans FreeTube.\nPar défaut, FreeTube ouvrira
le lien dans votre navigateur par défaut.\n"
Privacy Settings:
Remove Video Meta Files: Lorsqu'il est activé, FreeTube supprime automatiquement
les MétaFichiers créés pendant la lecture de la vidéo, dès que la page de la
vidéo est quittée.
External Player Settings:
Custom External Player Arguments: Tous les arguments de ligne de commande personnalisés,
séparés par des points-virgules (';'), que vous souhaitez transmettre au lecteur
@ -1269,3 +1262,6 @@ Age Restricted:
This channel is age restricted: Cette chaîne est soumise à des restrictions d'âge
This video is age restricted: Cette vidéo est soumise à des restrictions d'âge
Close Banner: Fermer la bannière
# French is the only language that should change this (they have a space before the colon)
Display Label: '{label} : {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'galego'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Esta parte da aplicación non está lista aínda. Volve máis adiante, cando se avance
@ -305,8 +304,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Limpar tódalas subscricións / perfís'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Estás
seguro de querer limpar tódalas subscricións e perfís? Esta acción é irreversible.'
Automatically Remove Video Meta Files: Elimina automaticamente os ficheiros meta
de vídeo
Save Watched Videos With Last Viewed Playlist: Gardalos vídeos vistos coa última
lista de reprodución vista
Subscription Settings:
@ -883,10 +880,6 @@ Tooltips:
# Toast Messages
Fetch Automatically: Cando estea activado, FreeTube buscará automaticamente o
teu feed da subscrición, cando se abra unha nova ventá e cando cambies de perfil.
Privacy Settings:
Remove Video Meta Files: Cando está activado, FreeTube elimina automaticamente
os ficheiros meta creados durante a reprodución de vídeo cando a páxina de visualización
está pechada.
External Player Settings:
Custom External Player Arguments: Calquera argumento de liña de comandos personalizado,
separado por puntos e coma (';'), que desexa que se pase ao reprodutor externo.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Schwiizerdütsch'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
De Teil vom Programm isch nonig fertig. Bitte chum zumene spötere Ziitpunkt wider

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'עברית'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
החלק הזה ביישומון עדיין לא מוכן. מזמינים אותך לשוב ולבדוק בהמשך כשנתקדם.
@ -307,7 +306,6 @@ Settings:
Remove All Subscriptions / Profiles: 'למחק את כל המינויים / פרופילים'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'למחוק
כל את המינויים והפרופילים? זופעולה בלתי הפיכה.'
Automatically Remove Video Meta Files: להסיר אוטומטית קובצי נתוני על של הסרטון
Save Watched Videos With Last Viewed Playlist: לשמור את הסרטונים שנצפו עם רשימת
הנגינה לאחרונים שנצפו
Subscription Settings:
@ -943,9 +941,6 @@ Tooltips:
נגיש דרך משתנה הסביבה PATH. במקרה הצורך, ניתן להגדיר כאן נתיב משלך.
Custom External Player Arguments: הארגומנטים משלך לשורת הפקודה שיועברו לנגן החיצוני,
מופרדים בפסיקים (;).
Privacy Settings:
Remove Video Meta Files: כאשר אפשרות זו מופעלת, FreeTube מוחק באופן אוטומטי קובצי
על שנוצרים במהלך ניגון סרטון, לאחר סגירת עמוד הצפייה.
Experimental Settings:
Replace HTTP Cache: משבית את מטמון ה־HTTP מבוסס הכונן ומפעיל מטמון תמונות מותאם
אישית בזיכרון. יגדיל את צריכת הזיכרון (RAM).

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'English (US)'
FreeTube: 'फ्रीट्यूब'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
ऐप का यह हिस्सा अभी तैयार नहीं है। बाद में वापस आएँ जब प्रगति हुई हो

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Hrvatski'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Ovaj dio programa još nije gotov. Navrati kasnije.
@ -401,8 +400,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Stvarno
želiš ukloniti sve pretplate i profile? Ovo je nepovratna radnja.
Remove All Subscriptions / Profiles: Ukloni sve pretplate/profile
Automatically Remove Video Meta Files: Automatski ukloni datoteke metapodataka
videa
Save Watched Videos With Last Viewed Playlist: Spremi gledana videa sa zadnjim
gledanom zbirkom
Remove All Playlists: Ukloni sve zbirke
@ -1095,10 +1092,6 @@ Tooltips:
ili stanja „uživo”
Fetch Automatically: Kada je aktivirano, FreeTube će automatski dohvatiti feed
tvoje pretplate kada se otvori novi prozor i prilikom mijenjanja profila.
Privacy Settings:
Remove Video Meta Files: Kada je aktivirano, FreeTube automatski uklanja datoteke
metapodataka koji su stvoreni tijekom reprodukcije videa, kad se zatvori stranica
gledanja.
External Player Settings:
External Player: Biranjem vanjskog playera prikazat će se ikona, za otvaranje
videa (zbirka, ako je podržana) u vanjskom playeru, na minijaturi. Upozorenje,

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Magyar'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Az alkalmazás ezen része még nem áll készen. Térjen vissza később amikor előrelépés
@ -422,7 +421,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Összes feliratkozás és profil eltávolítása'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Biztosan
törli az összes feliratkozást és profilt? A művelet nem vonható vissza.'
Automatically Remove Video Meta Files: Videó-metafájlok automatikus eltávolítása
Save Watched Videos With Last Viewed Playlist: Megtekintett videók mentése az
utoljára megtekintett lejátszási listával
All playlists have been removed: Minden lejátszási lista eltávolításra került
@ -1109,9 +1107,6 @@ Tooltips:
H.264 formátumok. A DASH AV1 formátumok több energiát igényelnek a lejátszáshoz!
Nem minden videónál érhetők el, ilyenkor a lejátszó a DASH H.264 formátumot
használja helyette.
Privacy Settings:
Remove Video Meta Files: Ha engedélyezve van, a FreeTube automatikusan törli a
videolejátszás során létrehozott metafájlokat, amikor a nézőlapot bezárják.
External Player Settings:
Custom External Player Executable: Alapértelmezés szerint a FreeTube feltételezi,
hogy a kiválasztott külső lejátszó megtalálható a PATH (ÚTVONAL) környezeti
@ -1211,3 +1206,5 @@ Close Banner: Banner bezárása
Age Restricted:
This channel is age restricted: Ez a csatorna korhatáros
This video is age restricted: Ez a videó korhatáros
Display Label: '{label}: {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Bahasa Indonesia'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Bagian dari aplikasi ini belum disiapkan. Kembali lagi nanti saat kemajuan telah
@ -280,7 +279,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Apakah
Anda yakin ingin menghapus semua langganan dan profil? Tindakan ini tidak bisa
diurungkan.'
Automatically Remove Video Meta Files: Secara Otomatis Hapus File Meta Video
Subscription Settings:
Subscription Settings: 'Pengaturan Langganan'
Hide Videos on Watch: 'Sembunyikan Video saat Menonton'
@ -809,9 +807,6 @@ Tooltips:
External Link Handling: "Pilih perilaku default ketika tautan, yang tidak dapat
dibuka di FreeTube, diklik.\nSecara default FreeTube akan membuka tautan yang
diklik dengan browser default Anda.\n"
Privacy Settings:
Remove Video Meta Files: Saat diaktifkan, FreeTube secara otomatis menghapus file
meta yang dibuat selama pemutaran video, saat halaman tonton ditutup.
External Player Settings:
Custom External Player Arguments: Semua argumen perintah khusus, dipisahkan dengan
titik koma (';'), yang Anda ingin gunakan dengan pemutar eksternal.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Íslenska'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Þessi hluti forritsins er ekki tilbúinn. Skoðaðu þetta seinna þegar meira hefur
@ -416,7 +415,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Ertu
viss um að þú viljir fjarlægja allar áskriftir og notkunarsnið? Ekki er hægt
að afturkalla þetta.'
Automatically Remove Video Meta Files: Sjálfvirkt fjarlægja lýsigögn úr myndskeiðaskrám
Save Watched Videos With Last Viewed Playlist: Vista myndskeið sem horft var á
með síðast notaða spilunarlista
Remove All Playlists: Fjarlægja alla spilunarlista
@ -1027,9 +1025,6 @@ Tooltips:
# Toast Messages
Fetch Automatically: Þegar þetta er virkt, mun FreeTube sækja sjálfkrafa áskriftarstreymin
þín þegar nýr gluggi er opnaður og þegar skipt er um notkunarsnið.
Privacy Settings:
Remove Video Meta Files: Þegar þetta er virkt, eyðir FreeTube sjálfkrafa lýsigagnaskrám
sem útbúnar eru við afspilun, þegar skoðunarsíðunni er lokað.
External Player Settings:
Custom External Player Arguments: Öll sérsniðin skipanaviðföng og rofar, aðskilin
með semíkommum (';'), sem beina á til utanaðkomandi spilarans.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Italiano'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Questa parte dell'app non è ancora pronta. Torna più tardi quando saranno stati
@ -412,8 +411,6 @@ Settings:
sicuro di volere eliminare tutte le iscrizioni e i profili? L'operazione non
può essere annullata.
Remove All Subscriptions / Profiles: Elimina tutte le iscrizioni e i profili
Automatically Remove Video Meta Files: Rimuovi automaticamente i metafile dai
video
Save Watched Videos With Last Viewed Playlist: Salva i video guardati con l'ultima
playlist vista
All playlists have been removed: Tutte le playlist sono state rimosse
@ -1135,10 +1132,6 @@ Tooltips:
Ignore Default Arguments: Non inviare argomenti predefiniti al lettore esterno
oltre all'URL del video (ad esempio velocità di riproduzione, URL della playlist,
ecc.). Gli argomenti personalizzati verranno comunque trasmessi.
Privacy Settings:
Remove Video Meta Files: Se abilitato, quando chiuderai la pagina di riproduzione
, FreeTube eliminerà automaticamente i metafile creati durante la visione del
video .
Experimental Settings:
Replace HTTP Cache: Disabilita la cache HTTP basata su disco Electron e abilita
una cache di immagini in memoria personalizzata. Comporta un aumento dell'uso
@ -1222,3 +1215,5 @@ Age Restricted:
This video is age restricted: Questo video è soggetto a limiti di età
This channel is age restricted: Questo canale è soggetto a limiti di età
Close Banner: Chiudi banner
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
アプリのこの部分は未完成です。完成後に実行してください。
@ -110,7 +109,7 @@ Playlists: '再生リスト'
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:
Playlist Message:
このページは、完全に動作する動画リストではありません。保存またはお気に入りと設定した動画のみが表示されます。操作が完了すると、現在ここにあるすべての動画は「お気に入り」の動画リストに移動します。
Search bar placeholder: 動画リスト内の検索
Empty Search Message: この再生リストに、検索に一致する動画はありません
@ -332,7 +331,6 @@ Settings:
Privacy Settings: 個人情報の設定
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: すべての登録チャンネルとプロファイルを削除しますか?元に戻せません。
Remove All Subscriptions / Profiles: 登録とプロファイルをすべて削除
Automatically Remove Video Meta Files: 動画のメタファイルの自動削除
Save Watched Videos With Last Viewed Playlist: 「最後に再生した」リストで視聴済み動画を保存
Data Settings:
How do I import my subscriptions?: 私の登録情報を取り込むにはどうしたらいいですか?
@ -469,7 +467,7 @@ Settings:
Experimental Settings:
Replace HTTP Cache: HTTP キャッシュの置換
Experimental Settings: 実験中の設定
Warning:
Warning:
これらの設定は実験的なものであり、有効にするとアプリのクラッシュを引き起こす恐れがあります。バックアップをとっておくことを強くお勧めします。自己責任で使用してください!
Password Settings:
Password Settings: パスワード設定
@ -882,8 +880,6 @@ Tooltips:
Region for Trending: 急上昇の地域設定では、急上昇動画を表示する国を選択できます。
External Link Handling: "FreeTube で開けないリンクをクリックしたときのデフォルトの動作を選択します。\nデフォルトでは、FreeTube
はクリックしたリンクをデフォルトのブラウザで開きます。\n"
Privacy Settings:
Remove Video Meta Files: 有効にすると、FreeTube は動画再生中に作成したメタファイルを、再生ページを閉じるときに自動的に削除します。
External Player Settings:
Custom External Player Arguments: '";"、セミコロンで区切られたカスタム コマンド ライン引数を外部プレーヤーに渡します。'
Ignore Warnings: 現在の外部プレーヤーが、現在のアクションに未対応の場合(動画リストの反転など)に警告を抑制します。

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'ქართული ენა'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
აპლიკაციის ეს ნაწილი ჯერ არ არის მზად. გთხოვთ, შეამოწმოთ მოგვიანებით, როდესაც იქნება

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'ភាសាខ្មែរ'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
ផ្នែកនេះនៃកម្មវិធីមិនទាន់រួចរាល់នៅឡើយទេ។ ត្រលប់មកវិញនៅពេលក្រោយ ពេលដែលវឌ្ឍនភាពត្រូវបានបង្កើតឡើង។

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: '한국어'
FreeTube: '프리튜브'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
아직 구현 되지 않은 기능입니다. 개발이 완료된 후 다시 시도해주세요.
@ -286,7 +285,6 @@ Settings:
Remove All Subscriptions / Profiles: '모든 구독채널과 프로필 삭제'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: '정말로
모든 구독채널과 프로필을 삭제하시겠습니까? 삭제하면 복구가되지않습니다.'
Automatically Remove Video Meta Files: 비디오 메타 파일 자동 제거
Subscription Settings:
Subscription Settings: '구독 설정'
Hide Videos on Watch: '시청한 동영상 숨기기'
@ -752,9 +750,6 @@ Tooltips:
Ignore Warnings: '현재 외부 플레이어가 현재 작업을 지원하지 않는 경우(예: 재생 목록 반전 등) 경고를 표시하지 않습니다.'
Custom External Player Arguments: 외부 플레이어로 전달되기를 원하는사용자 지정 명령줄 인수는 세미콜론(';')으로
구분됩니다.
Privacy Settings:
Remove Video Meta Files: 활성화되면 FreeTube는 보기 페이지가 닫힐 때 비디오 재생 중에 생성된 메타 파일을 자동으로
삭제합니다.
Distraction Free Settings:
Hide Channels: 채널 이름이나 채널 ID를 입력해 해당 채널의 영상이나 재생목록, 채널 자체가 검색이나 인기 영상에 나타나지 않도록
합니다. 입력되는 채널 이름은 완전히 일치해야하며, 대소문자를 구별합니다.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'کوردی ناوەڕاست'
FreeTube: 'فریتیوب'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
ئە بەشە لە ئەپلیکەیشنەکە هێشتا بەردەست نییە. لە کاتێکی دواتردا وەرەوە کە پێشکەوتنێک

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Latina'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Haec programmatis pars perfecta non est. Remea cum in hac profectum sit.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'lietuvių'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Ši programėlės dalis dar neparengta. Grįžkite vėliau, kai bus padaryta pažanga.
@ -311,8 +310,6 @@ Settings:
Privacy Settings: 'Privatumo nustatymai'
Remember History: 'Įsiminti istoriją'
Save Watched Progress: 'Išsaugoti peržiūros progresą'
Automatically Remove Video Meta Files: 'Automatiškai pašalinti vaizdo įrašų meta
failus'
Clear Search Cache: 'Išvalyti paieškos talpyklą'
Are you sure you want to clear out your search cache?: 'Ar tikrai norite išvalyti
paieškos talpyklą?'
@ -832,9 +829,6 @@ Tooltips:
trukmės ar tiesioginės transliacijos būsenos'
Fetch Automatically: Kai ši funkcija įjungta, FreeTube automatiškai įkels naują
turinį iš prenumeratų, kai atidaromas naujas langas ir perjungiamas profilis.
Privacy Settings:
Remove Video Meta Files: 'Įjungus FreeTube, uždarius žiūrėjimo puslapį, automatiškai
ištrinami meta failai, sukurti vaizdo atkūrimo metu.'
# Toast Messages
Experimental Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Latviešu'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >
@ -309,7 +308,6 @@ Settings:
Remember History: 'Atcerēties vēsturi'
Save Watched Progress: 'Saglabāt skatīto attīstību'
Save Watched Videos With Last Viewed Playlist: ''
Automatically Remove Video Meta Files: 'Automātiski noņemt video metadatus'
Clear Search Cache: ''
Are you sure you want to clear out your search cache?: ''
Search cache has been cleared: ''
@ -817,8 +815,6 @@ Tooltips:
Subscription Settings:
Fetch Feeds from RSS: ''
Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings:
Replace HTTP Cache: ''
SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Norsk bokmål'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Denne delen av programmet er ikke klart enda. Kom tilbake senere når ting er i orden.
@ -295,7 +294,6 @@ Settings:
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
angres.
Automatically Remove Video Meta Files: Fjern metadata automatisk fra videoer
Save Watched Videos With Last Viewed Playlist: Lagre sette videoer med sist sette
spilleliste
Subscription Settings:
@ -888,9 +886,6 @@ Tooltips:
Allow DASH AV1 formats: DASH AV1-formater kan ha bedre kvalitet enn DASH H.264
-formater. DASH AV1-formater krever dog mer regnekraft for avspilling. Ikke
tilgjengelig for alle videoer, og i sådant fall bruker avspilleren DASH H.264-formater.
Privacy Settings:
Remove Video Meta Files: Hvis denne instillingen er på, vil FreeTube automatisk
slette metadata generert under videoavspilling når du lukker avspillingsiden.
External Player Settings:
Custom External Player Arguments: Alle egendefinerte kommandolinjeargumenter,
semikoloninndelt («;») du ønsker å sende til den eksterne avspilleren.
@ -968,3 +963,4 @@ Hashtag:
Hashtag: Emneknagg
This hashtag does not currently have any videos: Denne emneknaggen har ingen videoer
enda
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'नेपाली'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
एपको यो भाग अझै तयार भएको छैन। केहि प्रगति भएपछि आउनु होला।

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Nederlands'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Dit gedeelte van de app is nog niet klaar. Kom later terug als er vooruitgang is
@ -409,8 +408,6 @@ Settings:
u zeker dat u alle abonnementen en profielen wil verwijderen? Dit kan niet ongedaan
worden gemaakt.
Remove All Subscriptions / Profiles: Verwijder alle abonnementen / profielen
Automatically Remove Video Meta Files: Bestanden met metadata van video's automatisch
verwijderen
Save Watched Videos With Last Viewed Playlist: Houd bekeken video's bij met de
afspeellijst Laatst bekeken
Remove All Playlists: Alle afspeel­lijsten verwijderen
@ -1108,10 +1105,6 @@ Tooltips:
External Link Handling: "Kies het standaard gedrag voor wanneer een link dat niet
kan worden geopend in FreeTube is aangeklikt.\nStandaard zal FreeTube de aangeklikte
link openen in je standaardbrowser.\n"
Privacy Settings:
Remove Video Meta Files: Wanneer ingeschakeld zal FreeTube automatisch meta bestanden
die worden gecreëerd tijdens het afspelen van video's verwijderen zodra de pagina
wordt gesloten.
External Player Settings:
Custom External Player Arguments: Aangepaste opdrachtregelargumenten, gescheiden
door puntkomma's (';'), die je wil doorgeven aan de externe videospeler.
@ -1211,3 +1204,5 @@ Age Restricted:
This video is age restricted: Deze video heeft een leeftijds­beperking
Trimmed input must be at least N characters long: Bij­gesneden invoer moet minimaal
1 teken lang zijn | Bij­gesneden invoer moet minimaal {length} tekens lang zijn
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language
Locale Name: 'Norsk nynorsk'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Denne delen av programmet er ikkje klar enda. Ver venleg og kom tilbake på eit seinare
@ -298,7 +297,6 @@ Settings:
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Er
du sikker på at du vil fjerne alle abonnentar og profil? Dette kan ikkje bli
ugjort.'
Automatically Remove Video Meta Files: Fjern metadata automatisk frå videoar
Subscription Settings:
Subscription Settings: 'Abonnementinnstillingar'
Hide Videos on Watch: 'Skjul sette videoar'
@ -798,9 +796,6 @@ Tooltips:
# Toast Messages
Fetch Automatically: Om dette alternativet er aktivert, vil FreeTube automatisk
hente abonnementfeeden din når eit nytt vindauge opnast og når du bytter profil.
Privacy Settings:
Remove Video Meta Files: Viss denne innstillinga er på, vil FreeTube automatisk
slette metadata generert under videoavspeling når du lukker avspelingsida.
External Player Settings:
DefaultCustomArgumentsTemplate: "(Standard: '{defaultCustomArguments}')"
Custom External Player Executable: Som standard vil FreeTube anta at den valte

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Ta część aplikacji nie jest jeszcze gotowa. Wróć później, gdy zostaną poczynione
@ -454,7 +453,6 @@ Settings:
jesteś pewny/a, że chcesz usunąć wszystkie subskrypcje i profile? Nie będzie
można tego cofnąć.
Remove All Subscriptions / Profiles: Usuń wszystkie subskrypcje / profile
Automatically Remove Video Meta Files: Automatycznie usuwaj pliki metadanych filmu
Save Watched Videos With Last Viewed Playlist: Zapisuj do historii film wraz z
ostatnią odtwarzaną playlistą, która go zawierała
All playlists have been removed: Wszystkie playlisty zostały usunięte
@ -1121,9 +1119,6 @@ Tooltips:
H.264 DASH. Dekodowanie formatu AV1 DASH wymaga większej mocy obliczeniowej.
W filmach, dla których ten format nie jest dostępny, zostanie użyty format H.264
DASH.
Privacy Settings:
Remove Video Meta Files: Po włączeniu FreeTube automatycznie usunie pliki metadanych
utworzone podczas odtwarzania filmu, gdy strona odtwarzacza zostanie zamknięta.
External Player Settings:
Ignore Warnings: Nie pokazuj ostrzeżeń o nieobsługiwanych akcjach przez zewnętrzny
odtwarzacz (n.p. odwracanie playlist, itp.).
@ -1225,3 +1220,5 @@ Age Restricted:
This video is age restricted: Ten film ma ograniczenie wiekowe
This channel is age restricted: Ten kanał ma ograniczenie wiekowe
Close Banner: Zamknij Baner
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History
'This part of the app is not ready yet. Come back later when progress has been made.': >-
Esta parte do aplicativo ainda não está pronta. Volte mais tarde quando o progresso
@ -451,8 +450,6 @@ Settings:
certeza de que deseja remover todas as inscrições e perfis? Isto não pode ser
desfeito.
Remove All Subscriptions / Profiles: Remover todas as inscrições ou perfis
Automatically Remove Video Meta Files: Remover automaticamente os metarquivos
de vídeo
Save Watched Videos With Last Viewed Playlist: Salvar vídeos assistidos com a
última playlist visualizada
All playlists have been removed: Todas as playlists foram removidas
@ -1115,10 +1112,6 @@ Tooltips:
External Link Handling: "Escolha o comportamento padrão quando um link que não
pode ser aberto no FreeTube for clicado.\nPor padrão, o FreeTube abrirá o link
clicado em seu navegador padrão.\n"
Privacy Settings:
Remove Video Meta Files: Quando ativado, o FreeTube exclui automaticamente os
metarquivos criados durante a reprodução do vídeo quando a página de exibição
é fechada.
External Player Settings:
Custom External Player Arguments: Quaisquer argumentos de linha de comando personalizados,
separados por ponto e vírgula (';'), você deseja que seja passado para o player
@ -1216,3 +1209,5 @@ Close Banner: Fechar Banner
Age Restricted:
This channel is age restricted: Este canal tem restrição de idade
This video is age restricted: Este vídeo tem restrição de idade
checkmark:
Display Label: '{label}: {value}'

Some files were not shown because too many files have changed in this diff Show More