mirror of https://github.com/FreeTubeApp/FreeTube
Merge branch 'development' into piped-support
This commit is contained in:
commit
ca588c77e2
4
.babelrc
4
.babelrc
|
@ -4,8 +4,8 @@
|
|||
"@babel/env",
|
||||
{
|
||||
"targets": {
|
||||
"chrome": "106",
|
||||
"node": "16.16.0"
|
||||
"chrome": "122",
|
||||
"node": "20.9.0"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
46
.eslintrc.js
46
.eslintrc.js
|
@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ body:
|
|||
- Portable
|
||||
- .rpm
|
||||
- .zip
|
||||
- .apk (Android, FreeTubeCordova Unofficial)
|
||||
- .apk (FreeTubeAndroid Unofficial)
|
||||
- AUR (Unofficial)
|
||||
- Chocolatey (Unofficial)
|
||||
- Homebrew (Unofficial)
|
||||
|
|
|
@ -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)'
|
||||
|
|
|
@ -12,7 +12,7 @@ jobs:
|
|||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
node-version: [20.x]
|
||||
runtime:
|
||||
- linux-x64
|
||||
- linux-armv7l
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -12,7 +12,7 @@ jobs:
|
|||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
node-version: [20.x]
|
||||
runtime:
|
||||
- linux-x64
|
||||
- linux-armv7l
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
21
package.json
21
package.json
|
@ -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",
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
// *********** //
|
||||
|
|
|
@ -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'))
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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 []
|
||||
|
|
|
@ -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')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
},
|
||||
|
||||
|
|
|
@ -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
|
||||
},
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -13,10 +13,7 @@
|
|||
@change="$emit('change', currentValue)"
|
||||
>
|
||||
<span>
|
||||
{{ label }}:
|
||||
<span>
|
||||
{{ displayLabel }}
|
||||
</span>
|
||||
{{ $t('Display Label', {label: label, value: displayLabel}) }}
|
||||
</span>
|
||||
</label>
|
||||
</template>
|
||||
|
|
|
@ -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 ''
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
:id="sanitizedId"
|
||||
class="sponsorTitle"
|
||||
>
|
||||
{{ $t("Video.Sponsor Block category." + categoryName) }}
|
||||
{{ translatedCategoryName }}
|
||||
</div>
|
||||
<ft-select
|
||||
:sanitized-id="sanitizedId + 'categoryColor'"
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
<div
|
||||
class="initial"
|
||||
>
|
||||
{{ isProfileSubscribed(profile) ? '✓' : profileInitials[index] }}
|
||||
{{ isProfileSubscribed(profile) ? $t('checkmark') : profileInitials[index] }}
|
||||
</div>
|
||||
</div>
|
||||
<p
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
})
|
||||
},
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
)
|
||||
})
|
||||
},
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 = []
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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', {
|
||||
|
|
|
@ -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
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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 () {
|
||||
|
|
|
@ -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: '',
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
FreeTube: 'ফ্ৰীটিউব'
|
||||
# Currently on Subscriptions, Playlists, and History
|
||||
File: 'ফাইল'
|
||||
Quit: 'অন্ত কৰক'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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: Всички персонализирани аргументи от командния
|
||||
ред, разделени с точка и запетая (";"), които искате да бъдат предадени на външния
|
||||
|
|
|
@ -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.': >-
|
||||
অ্যাপের এই অংশটি এখনও প্রস্তুত নয়। পরে ফিরে এসো যখন অগ্রগতি হয়েছে।
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: ✓
|
||||
|
|
|
@ -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 θα υποθέσει ότι
|
||||
το επιλεγμένο εξωτερικό πρόγραμμα αναπαραγωγής μπορεί να βρεθεί μέσω της μεταβλητής
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 پیدا کرد. در صورت
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: ✓
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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.': >-
|
||||
ऐप का यह हिस्सा अभी तैयार नहीं है। बाद में वापस आएँ जब प्रगति हुई हो
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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: ✓
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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: 現在の外部プレーヤーが、現在のアクションに未対応の場合(動画リストの反転など)に警告を抑制します。
|
||||
|
|
|
@ -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.': >-
|
||||
აპლიკაციის ეს ნაწილი ჯერ არ არის მზად. გთხოვთ, შეამოწმოთ მოგვიანებით, როდესაც იქნება
|
||||
|
|
|
@ -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.': >-
|
||||
ផ្នែកនេះនៃកម្មវិធីមិនទាន់រួចរាល់នៅឡើយទេ។ ត្រលប់មកវិញនៅពេលក្រោយ ពេលដែលវឌ្ឍនភាពត្រូវបានបង្កើតឡើង។
|
||||
|
|
|
@ -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를 입력해 해당 채널의 영상이나 재생목록, 채널 자체가 검색이나 인기 영상에 나타나지 않도록
|
||||
합니다. 입력되는 채널 이름은 완전히 일치해야하며, 대소문자를 구별합니다.
|
||||
|
|
|
@ -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.': >-
|
||||
ئە بەشە لە ئەپلیکەیشنەکە هێشتا بەردەست نییە. لە کاتێکی دواتردا وەرەوە کە پێشکەوتنێک
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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: ✓
|
||||
|
|
|
@ -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.': >-
|
||||
एपको यो भाग अझै तयार भएको छैन। केहि प्रगति भएपछि आउनु होला।
|
||||
|
|
|
@ -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 afspeellijsten 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 leeftijdsbeperking
|
||||
Trimmed input must be at least N characters long: Bijgesneden invoer moet minimaal
|
||||
1 teken lang zijn | Bijgesneden invoer moet minimaal {length} tekens lang zijn
|
||||
checkmark: ✓
|
||||
Display Label: '{label}: {value}'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue