Merge branch 'development' into piped-support

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
- '(visual bug)' - '(visual bug)'
'B: Unofficial Download': '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': 'B: keyboard control':
- '(keyboard control not working)' - '(keyboard control not working)'

View File

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

View File

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

View File

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

View File

@ -4,7 +4,7 @@
FreeTube is an open source desktop YouTube player built with privacy in mind. 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. 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"><a href="https://github.com/FreeTubeApp/FreeTube/releases">Download FreeTube</a></p>
<p align="center"> <p align="center">
@ -78,6 +78,10 @@ FreeTube is supported by the [Privacy Redirect](https://github.com/SimonBrazell/
## Download Links ## Download Links
### Official Downloads ### 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) * [GitHub Releases](https://github.com/FreeTubeApp/FreeTube/releases)
* [FreeTube Website](https://freetubeapp.io/#download) * [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/) * 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) * Homebrew Formulae (Mac only): [Download](https://formulae.brew.sh/cask/freetube)

View File

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

View File

@ -23,7 +23,10 @@ const IpcChannels = {
SYNC_SETTINGS: 'sync-settings', SYNC_SETTINGS: 'sync-settings',
SYNC_HISTORY: 'sync-history', SYNC_HISTORY: 'sync-history',
SYNC_PROFILES: 'sync-profiles', 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 = { const DBActions = {

View File

@ -10,6 +10,7 @@ import { IpcChannels, DBActions, SyncEvents } from '../constants'
import baseHandlers from '../datastores/handlers/base' import baseHandlers from '../datastores/handlers/base'
import { extractExpiryTimestamp, ImageCache } from './ImageCache' import { extractExpiryTimestamp, ImageCache } from './ImageCache'
import { existsSync } from 'fs' import { existsSync } from 'fs'
import asyncFs from 'fs/promises'
import packageDetails from '../../package.json' import packageDetails from '../../package.json'
@ -177,7 +178,8 @@ function runApp() {
// command line switches need to be added before the app ready event first // 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, // 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 // 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) { if (replaceHttpCache) {
// the http cache causes excessive disk usage during video playback // 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 // 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') { if (process.env.NODE_ENV === 'development') {
app.exit(parseInt(process.env.FREETUBE_RELAUNCH_EXIT_CODE)) app.exit(parseInt(process.env.FREETUBE_RELAUNCH_EXIT_CODE))
return return
@ -693,6 +695,10 @@ function runApp() {
} }
app.quit() app.quit()
}
ipcMain.once('relaunchRequest', () => {
relaunch()
}) })
nativeTheme.on('updated', () => { nativeTheme.on('updated', () => {
@ -780,6 +786,22 @@ function runApp() {
child.unref() 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 // DB related IPC calls
// *********** // // *********** //

View File

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

View File

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

View File

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

View File

@ -21,9 +21,15 @@ export default defineComponent({
computed: { computed: {
externalPlayerNames: function () { externalPlayerNames: function () {
const fallbackNames = this.$store.getters.getExternalPlayerNames 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 () { externalPlayerValues: function () {
return this.$store.getters.getExternalPlayerValues return this.$store.getters.getExternalPlayerValues

View File

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

View File

@ -1,5 +1,44 @@
@use '../../scss-partials/_ft-list-item'; @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 { .handle {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;

View File

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

View File

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

View File

@ -58,6 +58,16 @@ export default defineComponent({
return this.shareTargetType === 'Video' 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 () { currentInvidiousInstance: function () {
return this.$store.getters.getCurrentInvidiousInstance return this.$store.getters.getCurrentInvidiousInstance
}, },

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2111,6 +2111,8 @@ export default defineComponent({
// Unexpected errors should be reported // Unexpected errors should be reported
console.error(err) 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)') const errorMessage = this.$t('play() request Error (Click to copy)')
showToast(`${errorMessage}: ${err}`, 10000, () => { showToast(`${errorMessage}: ${err}`, 10000, () => {
copyToClipboard(err) copyToClipboard(err)

View File

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

View File

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

View File

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

View File

@ -29,15 +29,6 @@
@change="updateSaveVideoHistoryWithLastViewedPlaylist" @change="updateSaveVideoHistoryWithLastViewedPlaylist"
/> />
</div> </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> </div>
<br> <br>
<ft-flex-box> <ft-flex-box>

View File

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

View File

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

View File

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

View File

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

View File

@ -331,7 +331,7 @@ export async function getLocalChannelLiveStreams(id) {
// it has some empty fields in the protobuf but it doesn't work if you remove them) // 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) const { id: channelId = id, name, thumbnailUrl } = parseLocalChannelHeader(liveStreamsTab)
let videos 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 // 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 // so we need to check that we got the right tab
if (liveStreamsTab.current_tab?.endpoint.metadata.url?.endsWith('/streams')) { 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 { } else {
videos = [] videos = []
} }

View File

@ -1,3 +1,5 @@
import i18n from '../i18n/index'
export const colors = [ export const colors = [
{ name: 'Red', value: '#d50000' }, { name: 'Red', value: '#d50000' },
{ name: 'Pink', value: '#C51162' }, { name: 'Pink', value: '#C51162' },
@ -38,14 +40,55 @@ export const colors = [
{ name: 'CatppuccinMochaLavender', value: '#B4BEFE' } { 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() { export function getRandomColorClass() {
const randomInt = Math.floor(Math.random() * colors.length) return 'main' + getRandomColor().name
return 'main' + colors[randomInt].name
} }
export function getRandomColor() { export function getRandomColor() {
const randomInt = Math.floor(Math.random() * colors.length) const randomInt = Math.floor(Math.random() * colors.length)
return colors[randomInt].value return colors[randomInt]
} }
export function calculateColorLuminance(colorValue) { export function calculateColorLuminance(colorValue) {

View File

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

View File

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

View File

@ -8,7 +8,20 @@ Vue.use(VueI18n)
const i18n = new VueI18n({ const i18n = new VueI18n({
locale: 'en-US', 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) { export async function loadLocale(locale) {
@ -18,6 +31,7 @@ export async function loadLocale(locale) {
} }
if (!activeLocales.includes(locale)) { if (!activeLocales.includes(locale)) {
console.error(`Unable to load unknown locale: "${locale}"`) console.error(`Unable to load unknown locale: "${locale}"`)
return
} }
// locales are only compressed in our production Electron builds // locales are only compressed in our production Electron builds
@ -45,6 +59,4 @@ export async function loadLocale(locale) {
} }
} }
loadLocale('en-US')
export default i18n export default i18n

View File

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

View File

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

View File

@ -366,7 +366,7 @@ $watched-transition-duration: 0.5s;
&:has(:focus-visible) .addToPlaylistIcon:not(.alwaysVisible), &:has(:focus-visible) .addToPlaylistIcon:not(.alwaysVisible),
&:has(:focus-visible) .quickBookmarkVideoIcon:not(.alwaysVisible), &:has(:focus-visible) .quickBookmarkVideoIcon:not(.alwaysVisible),
&:has(:focus-visible) .externalPlayerIcon { &:has(:focus-visible) .externalPlayerIcon {
opacity: $thumbnail-overlay-opacity; opacity: 1;
} }
&:hover .optionsButton, &: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, .videoWatched,
.live, .live,
.upcoming { .upcoming {

View File

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

View File

@ -241,7 +241,6 @@ const state = {
proxyVideos: !process.env.IS_ELECTRON, proxyVideos: !process.env.IS_ELECTRON,
region: 'US', region: 'US',
rememberHistory: true, rememberHistory: true,
removeVideoMetaFiles: true,
saveWatchedProgress: true, saveWatchedProgress: true,
saveVideoHistoryWithLastViewedPlaylist: true, saveVideoHistoryWithLastViewedPlaylist: true,
showFamilyFriendlyOnly: false, 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 i18n.locale = targetLocale
await dispatch('getRegionData', { await dispatch('getRegionData', {

View File

@ -47,7 +47,6 @@ const state = {
duration: '' duration: ''
}, },
externalPlayerNames: [], externalPlayerNames: [],
externalPlayerNameTranslationKeys: [],
externalPlayerValues: [], externalPlayerValues: [],
externalPlayerCmdArguments: {} externalPlayerCmdArguments: {}
} }
@ -133,10 +132,6 @@ const getters = {
return state.externalPlayerNames return state.externalPlayerNames
}, },
getExternalPlayerNameTranslationKeys () {
return state.externalPlayerNameTranslationKeys
},
getExternalPlayerValues () { getExternalPlayerValues () {
return state.externalPlayerValues return state.externalPlayerValues
}, },
@ -262,7 +257,7 @@ const actions = {
} }
if (parsedString !== replaceFilenameForbiddenChars(parsedString)) { 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 let filename
@ -274,7 +269,7 @@ const actions = {
} }
if (!filename) { if (!filename) {
reject(new Error('Empty File Name')) reject(new Error(i18n.t('Settings.Player Settings.Screenshot.Error.Empty File Name')))
} }
resolve(parsedString) resolve(parsedString)
@ -603,7 +598,7 @@ const actions = {
const fileData = await fs.readFile(`${fileLocation}${fileName}`) const fileData = await fs.readFile(`${fileLocation}${fileName}`)
const externalPlayerMap = JSON.parse(fileData).map((entry) => { 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 // Sort external players alphabetically & case-insensitive, keep default entry at the top
const playerNone = externalPlayerMap.shift() const playerNone = externalPlayerMap.shift()
@ -611,7 +606,6 @@ const actions = {
externalPlayerMap.unshift(playerNone) externalPlayerMap.unshift(playerNone)
const externalPlayerNames = externalPlayerMap.map((entry) => { return entry.name }) 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 externalPlayerValues = externalPlayerMap.map((entry) => { return entry.value })
const externalPlayerCmdArguments = externalPlayerMap.reduce((result, item) => { const externalPlayerCmdArguments = externalPlayerMap.reduce((result, item) => {
result[item.value] = item.cmdArguments result[item.value] = item.cmdArguments
@ -619,7 +613,6 @@ const actions = {
}, {}) }, {})
commit('setExternalPlayerNames', externalPlayerNames) commit('setExternalPlayerNames', externalPlayerNames)
commit('setExternalPlayerNameTranslationKeys', externalPlayerNameTranslationKeys)
commit('setExternalPlayerValues', externalPlayerValues) commit('setExternalPlayerValues', externalPlayerValues)
commit('setExternalPlayerCmdArguments', externalPlayerCmdArguments) commit('setExternalPlayerCmdArguments', externalPlayerCmdArguments)
}, },
@ -667,7 +660,7 @@ const actions = {
args.push(cmdArgs.startOffset, Math.trunc(payload.watchProgress)) args.push(cmdArgs.startOffset, Math.trunc(payload.watchProgress))
} }
} else if (!ignoreWarnings) { } 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') { if (typeof cmdArgs.playbackRate === 'string') {
args.push(`${cmdArgs.playbackRate}${payload.playbackRate}`) args.push(`${cmdArgs.playbackRate}${payload.playbackRate}`)
} else if (!ignoreWarnings) { } 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') { if (typeof cmdArgs.playlistIndex === 'string') {
args.push(`${cmdArgs.playlistIndex}${payload.playlistIndex}`) args.push(`${cmdArgs.playlistIndex}${payload.playlistIndex}`)
} else if (!ignoreWarnings) { } 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') { if (typeof cmdArgs.playlistReverse === 'string') {
args.push(cmdArgs.playlistReverse) args.push(cmdArgs.playlistReverse)
} else if (!ignoreWarnings) { } 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') { if (typeof cmdArgs.playlistShuffle === 'string') {
args.push(cmdArgs.playlistShuffle) args.push(cmdArgs.playlistShuffle)
} else if (!ignoreWarnings) { } 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') { if (typeof cmdArgs.playlistLoop === 'string') {
args.push(cmdArgs.playlistLoop) args.push(cmdArgs.playlistLoop)
} else if (!ignoreWarnings) { } 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 { } else {
if (payload.playlistId != null && payload.playlistId !== '' && !ignoreWarnings) { 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) { if (payload.videoId != null) {
args.push(`${cmdArgs.videoUrl}https://www.youtube.com/watch?v=${payload.videoId}`) args.push(`${cmdArgs.videoUrl}https://www.youtube.com/watch?v=${payload.videoId}`)
@ -874,10 +867,6 @@ const mutations = {
state.externalPlayerNames = value state.externalPlayerNames = value
}, },
setExternalPlayerNameTranslationKeys (state, value) {
state.externalPlayerNameTranslationKeys = value
},
setExternalPlayerValues (state, value) { setExternalPlayerValues (state, value) {
state.externalPlayerValues = value state.externalPlayerValues = value
}, },

View File

@ -906,7 +906,16 @@ export default defineComponent({
return 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.liveContinuationData = liveTab.has_continuation ? liveTab : null
this.isElementListLoading = false this.isElementListLoading = false
@ -1920,6 +1929,7 @@ export default defineComponent({
} }
invidiousAPICall(payload).then((response) => { invidiousAPICall(payload).then((response) => {
setPublishedTimestampsInvidious(response.filter(item => item.type === 'video'))
if (this.hideChannelPlaylists) { if (this.hideChannelPlaylists) {
this.searchResults = this.searchResults.concat(response.filter(item => item.type !== 'playlist')) this.searchResults = this.searchResults.concat(response.filter(item => item.type !== 'playlist'))
} else { } else {

View File

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

View File

@ -145,7 +145,13 @@ export default defineComponent({
if (this.processedVideoSearchQuery === '') { return this.playlistItems } if (this.processedVideoSearchQuery === '') { return this.playlistItems }
return this.playlistItems.filter((v) => { 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 () { visiblePlaylistItems: function () {

View File

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

View File

@ -223,7 +223,7 @@ export default defineComponent({
if (typeof (playlist.playlistName) !== 'string') { return false } if (typeof (playlist.playlistName) !== 'string') { return false }
if (this.doSearchPlaylistsWithMatchingVideos) { 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 return true
} }
} }

View File

@ -1,6 +1,5 @@
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import fs from 'fs/promises'
import FtLoader from '../../components/ft-loader/ft-loader.vue' import FtLoader from '../../components/ft-loader/ft-loader.vue'
import FtVideoPlayer from '../../components/ft-video-player/ft-video-player.vue' import FtVideoPlayer from '../../components/ft-video-player/ft-video-player.vue'
import WatchVideoInfo from '../../components/watch-video-info/watch-video-info.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 WatchVideoRecommendations from '../../components/watch-video-recommendations/watch-video-recommendations.vue'
import FtAgeRestricted from '../../components/ft-age-restricted/ft-age-restricted.vue' import FtAgeRestricted from '../../components/ft-age-restricted/ft-age-restricted.vue'
import packageDetails from '../../../../package.json' import packageDetails from '../../../../package.json'
import { pathExists } from '../../helpers/filesystem'
import { import {
buildVTTFileLocally, buildVTTFileLocally,
copyToClipboard, copyToClipboard,
formatDurationAsTimestamp, formatDurationAsTimestamp,
formatNumber, formatNumber,
getFormatsFromHLSManifest, getFormatsFromHLSManifest,
getUserDataPath,
showToast showToast
} from '../../helpers/utils' } from '../../helpers/utils'
import { import {
@ -141,9 +138,6 @@ export default defineComponent({
rememberHistory: function () { rememberHistory: function () {
return this.$store.getters.getRememberHistory return this.$store.getters.getRememberHistory
}, },
removeVideoMetaFiles: function () {
return this.$store.getters.getRemoveVideoMetaFiles
},
saveWatchedProgress: function () { saveWatchedProgress: function () {
return this.$store.getters.getSaveWatchedProgress return this.$store.getters.getSaveWatchedProgress
}, },
@ -707,7 +701,7 @@ export default defineComponent({
} }
if (result.storyboards?.type === 'PlayerStoryboardSpec') { 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) this.playNextCountDownIntervalId = setInterval(showCountDownMessage, 1000)
}, },
handleRouteChange: async function (videoId) { handleRouteChange: 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
// receiving it as an arg instead of accessing it ourselves means we always have the right one // receiving it as an arg instead of accessing it ourselves means we always have the right one
clearTimeout(this.playNextTimeout) clearTimeout(this.playNextTimeout)
@ -1437,21 +1429,9 @@ export default defineComponent({
} }
} }
if (process.env.IS_ELECTRON && this.removeVideoMetaFiles) { if (this.videoStoryboardSrc.startsWith('blob:')) {
if (process.env.NODE_ENV === 'development') { URL.revokeObjectURL(this.videoStoryboardSrc)
const vttFileLocation = `static/storyboards/${videoId}.vtt` this.videoStoryboardSrc = ''
// 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)
}
}
} }
}, },
@ -1616,36 +1596,14 @@ export default defineComponent({
}) })
}, },
createLocalStoryboardUrls: async function (storyboardInfo) { createLocalStoryboardUrls: function (storyboardInfo) {
const results = buildVTTFileLocally(storyboardInfo, this.videoLengthSeconds) 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 // after the player migration, switch to using a data URI, as those don't need to be revoked
// 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)
}
await fs.writeFile(fileLocation, results) const blob = new Blob([results], { type: 'text/vtt;charset=UTF-8' })
} else {
if (!(await pathExists(`${userData}/storyboards/`))) {
await fs.mkdir(`${userData}/storyboards/`)
}
fileLocation = `${userData}/storyboards/${this.videoId}.vtt`
uriSchema = `file://${fileLocation}`
await fs.writeFile(fileLocation, results) this.videoStoryboardSrc = URL.createObjectURL(blob)
}
this.videoStoryboardSrc = uriSchema
}, },
tryAddingTranslatedLocaleCaption: function (captionTracks, locale, baseUrl) { tryAddingTranslatedLocaleCaption: function (captionTracks, locale, baseUrl) {

View File

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

View File

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

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Беларуская' Locale Name: 'Беларуская'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Гэтая частка праграмы яшчэ не гатова. Прыходзьце пазней. Гэтая частка праграмы яшчэ не гатова. Прыходзьце пазней.
@ -307,7 +306,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: ''
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?: ''
Search cache has been cleared: '' Search cache has been cleared: ''
@ -802,8 +800,6 @@ Tooltips:
Subscription Settings: Subscription Settings:
Fetch Feeds from RSS: '' Fetch Feeds from RSS: ''
Fetch Automatically: '' Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings: Experimental Settings:
Replace HTTP Cache: '' Replace HTTP Cache: ''
SponsorBlock Settings: SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Български' Locale Name: 'Български'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Тази част от приложението все още не е готова. Върнете се по-късно, когато може Тази част от приложението все още не е готова. Върнете се по-късно, когато може
@ -415,7 +414,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: Автоматично премахване на видео метафайловете
Save Watched Videos With Last Viewed Playlist: Запазване на гледани видеа с последно Save Watched Videos With Last Viewed Playlist: Запазване на гледани видеа с последно
гледан плейлист гледан плейлист
Remove All Playlists: Премахване на всички плейлисти Remove All Playlists: Премахване на всички плейлисти
@ -1099,10 +1097,6 @@ Tooltips:
External Link Handling: "Избор на поведението по подразбиране, когато щракнете External Link Handling: "Избор на поведението по подразбиране, когато щракнете
върху връзка, която не може да бъде отворена във FreeTube.\nПо подразбиране върху връзка, която не може да бъде отворена във FreeTube.\nПо подразбиране
FreeTube ще отвори връзката в браузъра по подразбиране.\n" FreeTube ще отвори връзката в браузъра по подразбиране.\n"
Privacy Settings:
Remove Video Meta Files: Когато страницата за гледане бъде затворена, FreeTube
автоматично ще изтрива метафайловете, създадени по време на възпроизвеждане
на видеото.
External Player Settings: External Player Settings:
Custom External Player Arguments: Всички персонализирани аргументи от командния Custom External Player Arguments: Всички персонализирани аргументи от командния
ред, разделени с точка и запетая (";"), които искате да бъдат предадени на външния ред, разделени с точка и запетая (";"), които искате да бъдат предадени на външния

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'বাংলা' Locale Name: 'বাংলা'
FreeTube: 'ফ্রিটিউব'
# Currently on Subscriptions, Playlists, and History # 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.': >-
অ্যাপের এই অংশটি এখনও প্রস্তুত নয়। পরে ফিরে এসো যখন অগ্রগতি হয়েছে। অ্যাপের এই অংশটি এখনও প্রস্তুত নয়। পরে ফিরে এসো যখন অগ্রগতি হয়েছে।

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Bosanski' Locale Name: 'Bosanski'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Ovaj dio aplikacije još nije spreman. Vratite se kasnije kad se postigne napredak. Ovaj dio aplikacije još nije spreman. Vratite se kasnije kad se postigne napredak.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'català' Locale Name: 'català'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Aquesta secció de l'aplicació encara no està llesta. Torna més endavant quan s'hagin 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 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 segur que voleu esborrar totes les subscripcions i perfils? Aquesta acció no
es pot desfer.' es pot desfer.'
Automatically Remove Video Meta Files: Suprimeix automàticament les metadades
dels vídeos
Subscription Settings: Subscription Settings:
Subscription Settings: 'Configuració de les subscripcions' Subscription Settings: 'Configuració de les subscripcions'
Hide Videos on Watch: 'Oculta els vídeos visualitzats' Hide Videos on Watch: 'Oculta els vídeos visualitzats'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'ئیگلیزی (وڵاتە یەکگرتووەکانی ئەمریکا)' Locale Name: 'ئیگلیزی (وڵاتە یەکگرتووەکانی ئەمریکا)'
FreeTube: 'فریتیوب'
# Currently on Subscriptions, Playlists, and History # 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.': >-
بەشێک لە نەرمەواڵەکە هێشتا ئامادە نییە. کە ڕەوتەکە درووست کرا دووبارە وەرەوە. بەشێک لە نەرمەواڵەکە هێشتا ئامادە نییە. کە ڕەوتەکە درووست کرا دووبارە وەرەوە.
@ -311,7 +310,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: ''
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?: ''
Search cache has been cleared: '' Search cache has been cleared: ''
@ -818,8 +816,6 @@ Tooltips:
Subscription Settings: Subscription Settings:
Fetch Feeds from RSS: '' Fetch Feeds from RSS: ''
Fetch Automatically: '' Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings: Experimental Settings:
Replace HTTP Cache: '' Replace HTTP Cache: ''
SponsorBlock Settings: SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Čeština' Locale Name: 'Čeština'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Tato část aplikace ještě není hotova. Vraťte se později. 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' 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 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á.' 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 Save Watched Videos With Last Viewed Playlist: Uložit zhlédnutá videa s naposledy
zobrazeným playlistem zobrazeným playlistem
All playlists have been removed: Všechny playlisty byly odstraněny All playlists have been removed: Všechny playlisty byly odstraněny
@ -1057,9 +1055,6 @@ Tooltips:
# Toast Messages # Toast Messages
Fetch Automatically: Při povolení tohoto nastavení bude FreeTube automaticky načítat 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ů. 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: External Player Settings:
Ignore Warnings: Potlačuje varování, kdy současný externí přehrávač nepodporuje Ignore Warnings: Potlačuje varování, kdy současný externí přehrávač nepodporuje
aktuální akci (např. obrácení seznamů skladeb apod.). aktuální akci (např. obrácení seznamů skladeb apod.).
@ -1173,3 +1168,5 @@ Close Banner: Zavřít panel
Age Restricted: Age Restricted:
This channel is age restricted: Tento kanál je omezen věkem This channel is age restricted: Tento kanál je omezen věkem
This video is age restricted: Toto video je omezeno věkem This video is age restricted: Toto video je omezeno věkem
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Cymraeg' Locale Name: 'Cymraeg'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >
@ -314,7 +313,6 @@ Settings:
Remember History: 'Cadw Hanes' Remember History: 'Cadw Hanes'
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: ''
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?: ''
Search cache has been cleared: '' Search cache has been cleared: ''
@ -820,8 +818,6 @@ Tooltips:
Subscription Settings: Subscription Settings:
Fetch Feeds from RSS: '' Fetch Feeds from RSS: ''
Fetch Automatically: '' Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings: Experimental Settings:
Replace HTTP Cache: '' Replace HTTP Cache: ''
SponsorBlock Settings: SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'dansk' Locale Name: 'dansk'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Denne del af app'en er ikke klar endnu. Kom tilbage senere, når der er gjort fremskridt. 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 Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Er
du sikker på, at du vil fjerne alle abonnementer og profiler? Dette kan ikke du sikker på, at du vil fjerne alle abonnementer og profiler? Dette kan ikke
fortrydes.' fortrydes.'
Automatically Remove Video Meta Files: Fjern Automatisk Video Metafiler
All playlists have been removed: Alle playlister blev fjernet 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 Are you sure you want to remove all your playlists?: Er du sikker på, at du vil
fjerne alle dine playlister? fjerne alle dine playlister?
@ -1010,9 +1008,6 @@ Tooltips:
Advarsel: Invidious-indstillinger har ingen effekt på eksterne afspillere.' Advarsel: Invidious-indstillinger har ingen effekt på eksterne afspillere.'
Ignore Warnings: Undertryk advarsler for når den eksterne afspiller ikke understøtter Ignore Warnings: Undertryk advarsler for når den eksterne afspiller ikke understøtter
den gældende handling (fx vende playlister om, etc.). 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: Distraction Free Settings:
Hide Channels: Indtast et kanal-ID for at skjule alle videoer, playlister og selve 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 kanalen fra at blive vist i søgning, trending, mest populære og anbefalet. Det

View File

@ -1,4 +1,3 @@
FreeTube: FreeTube
# Currently on Subscriptions, Playlists, and History # 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.': >-
Dieser Teil der App ist noch nicht bereit. Komme später wieder, wenn Fortschritte 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 du sicher, dass du alle Abos und Profile löschen möchtest? Diese Aktion kann
nicht rückgängig gemacht werden. nicht rückgängig gemacht werden.
Remove All Subscriptions / Profiles: Alle Abos / Profile entfernen 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 Save Watched Videos With Last Viewed Playlist: Angesehene Videos mit der zuletzt
angesehenen Wiedergabeliste speichern angesehenen Wiedergabeliste speichern
Remove All Playlists: Alle Wiedergabelisten entfernen 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 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 bei allen Videos verfügbar. In diesen Fällen verwendet der Abspieler stattdessen
die DASH H.264-Formate. 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: External Player Settings:
Custom External Player Arguments: Alle benutzerdefinierten Befehlszeilenargumente, Custom External Player Arguments: Alle benutzerdefinierten Befehlszeilenargumente,
getrennt durch Semikolon (';'), die an den externen Abspieler übergeben werden getrennt durch Semikolon (';'), die an den externen Abspieler übergeben werden
@ -1249,3 +1243,5 @@ Close Banner: Banner schließen
Age Restricted: Age Restricted:
This channel is age restricted: Dieser Kanal ist altersbeschränkt This channel is age restricted: Dieser Kanal ist altersbeschränkt
This video is age restricted: Dieses Video ist altersbeschränkt This video is age restricted: Dieses Video ist altersbeschränkt
Display Label: '{label}: {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Ελληνικά (EL)' Locale Name: 'Ελληνικά (EL)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Αυτό το μέρος της εφαρμογής δεν είναι ακόμη έτοιμο. Επιστρέψτε αργότερα όταν έχει Αυτό το μέρος της εφαρμογής δεν είναι ακόμη έτοιμο. Επιστρέψτε αργότερα όταν έχει
@ -323,7 +322,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: Αυτόματη αφαίρεση μετα-αρχείων βίντεο
Save Watched Videos With Last Viewed Playlist: Αποθήκευση Βίντεο που Παρακολουθήσατε Save Watched Videos With Last Viewed Playlist: Αποθήκευση Βίντεο που Παρακολουθήσατε
Με τη Λίστα Αναπαραγωγής Τελευταίας Προβολής Με τη Λίστα Αναπαραγωγής Τελευταίας Προβολής
Subscription Settings: Subscription Settings:
@ -1019,10 +1017,6 @@ Tooltips:
σε έναν σύνδεσμο, ο οποίος δεν μπορεί να ανοίξει στο FreeTube.\nΑπό προεπιλογή, σε έναν σύνδεσμο, ο οποίος δεν μπορεί να ανοίξει στο FreeTube.\nΑπό προεπιλογή,
το FreeTube θα ανοίξει τον σύνδεσμο που έχει πατηθεί στο προεπιλεγμένο πρόγραμμα το FreeTube θα ανοίξει τον σύνδεσμο που έχει πατηθεί στο προεπιλεγμένο πρόγραμμα
περιήγησης.\n" περιήγησης.\n"
Privacy Settings:
Remove Video Meta Files: Όταν είναι ενεργοποιημένο, το FreeTube διαγράφει αυτόματα
τα μετα-αρχεία που δημιουργήθηκαν κατά την αναπαραγωγή βίντεο, όταν η σελίδα
παρακολούθησης είναι κλειστή.
External Player Settings: External Player Settings:
Custom External Player Executable: Από προεπιλογή, το FreeTube θα υποθέσει ότι Custom External Player Executable: Από προεπιλογή, το FreeTube θα υποθέσει ότι
το επιλεγμένο εξωτερικό πρόγραμμα αναπαραγωγής μπορεί να βρεθεί μέσω της μεταβλητής το επιλεγμένο εξωτερικό πρόγραμμα αναπαραγωγής μπορεί να βρεθεί μέσω της μεταβλητής

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: English (US) Locale Name: English (US)
FreeTube: FreeTube
# Currently on Subscriptions, Playlists, and History # 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.': >-
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 Remember History: Remember History
Save Watched Progress: Save Watched Progress Save Watched Progress: Save Watched Progress
Save Watched Videos With Last Viewed Playlist: Save Watched Videos With Last Viewed Playlist 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 Clear Search Cache: Clear Search Cache
Are you sure you want to clear out your search cache?: Are you sure you want to Are you sure you want to clear out your search cache?: Are you sure you want to
clear out your search cache? clear out your search cache?
@ -1010,9 +1008,6 @@ Tooltips:
but doesn't provide certain information like video duration or live status but doesn't provide certain information like video duration or live status
Fetch Automatically: When enabled, FreeTube will automatically fetch Fetch Automatically: When enabled, FreeTube will automatically fetch
your subscription feed when a new window is opened and when switching profile. 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: 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. 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: SponsorBlock Settings:
@ -1070,3 +1065,7 @@ Hashtag:
Yes: Yes Yes: Yes
No: No No: No
Ok: Ok Ok: Ok
# symbol used to indicate that an item is correct
checkmark:
# French is the only language that should change this (they have a space before the colon)
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'English (UK)' Locale Name: 'English (UK)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
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 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 you sure you want to remove all subscriptions and profiles? This cannot be
undone.' undone.'
Automatically Remove Video Meta Files: Automatically Remove Video Meta Files
Save Watched Videos With Last Viewed Playlist: Save Watched Videos With Last Viewed Save Watched Videos With Last Viewed Playlist: Save Watched Videos With Last Viewed
Playlist Playlist
Remove All Playlists: Remove all playlists Remove All Playlists: Remove all playlists
@ -1084,9 +1082,6 @@ Tooltips:
Custom External Player Arguments: Any custom command line arguments, separated Custom External Player Arguments: Any custom command line arguments, separated
by semicolons (';'), you want to be passed to the external player. by semicolons (';'), you want to be passed to the external player.
DefaultCustomArgumentsTemplate: '(Default: {defaultCustomArguments})' 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: Experimental Settings:
Replace HTTP Cache: Disables Electron's disk-based HTTP cache and enables a custom Replace HTTP Cache: Disables Electron's disk-based HTTP cache and enables a custom
in-memory image cache. Will lead to increased RAM usage. in-memory image cache. Will lead to increased RAM usage.

View File

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

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Esta parte de la aplicación aún no está lista. Vuelva más tarde cuando se haya avanzado. 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 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 seguro de que deseas eliminar todos los suscripciones y perfiles? Esto no puede
ser deshecho. ser deshecho.
Automatically Remove Video Meta Files: Borrar automáticamente metadatos del video
Data Settings: Data Settings:
How do I import my subscriptions?: ¿Cómo puedo importar mis suscripciones? How do I import my subscriptions?: ¿Cómo puedo importar mis suscripciones?
Export History: Exportar Historia Export History: Exportar Historia
@ -796,9 +794,6 @@ Tooltips:
presionada la tecla Ctrl (tecla Comando en Mac) y haga clic izquierdo para reestablecer 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 la velocidad de reproducción predeterminada (que es de 1x, a menos que la haya
cambiado en configuración). 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: Subscription Settings:
Fetch Feeds from RSS: Si se habilita, FreeTube usará RSS en lugar del método predeterminado 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 para recibir videos de sus suscripciones. RSS es más rápido y previene que bloqueen

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'español (España)' Locale Name: 'español (España)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Esta parte de la aplicación aún no está lista. Vuelve más tarde cuando se hayan 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' 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 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.' 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 Save Watched Videos With Last Viewed Playlist: Guardar vídeos vistos con la última
lista de reproducción vista lista de reproducción vista
All playlists have been removed: Se han eliminado todas las listas de reproducción 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 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á 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" 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: External Player Settings:
Custom External Player Executable: Por defecto, FreeTube buscará el reproductor Custom External Player Executable: Por defecto, FreeTube buscará el reproductor
externo seleccionado mediante la variable de entorno PATH, de no encontrarlo, externo seleccionado mediante la variable de entorno PATH, de no encontrarlo,
@ -1219,3 +1212,5 @@ Close Banner: Cerrar el banner
Age Restricted: Age Restricted:
This channel is age restricted: Este canal está restringido por edad This channel is age restricted: Este canal está restringido por edad
This video is age restricted: Este vídeo está restringido por edad This video is age restricted: Este vídeo está restringido por edad
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'español (Argentina)' Locale Name: 'español (Argentina)'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Esta parte de la aplicación no esta lista por el momento. Vuelve después cuando 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 Search bar placeholder: Buscar en la Lista de Reproducción
Empty Search Message: No hay videos en esta lista de reproducción que coincidan Empty Search Message: No hay videos en esta lista de reproducción que coincidan
con tu búsqueda 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: History:
# On History Page # On History Page
History: 'Historial' History: 'Historial'
@ -296,7 +300,6 @@ Settings:
Remove All Subscriptions / Profiles: 'Remover todas las suscripciones / perfiles' 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 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.' 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 Save Watched Videos With Last Viewed Playlist: Guardar videos vistos con la última
lista de reproducción vista lista de reproducción vista
Subscription Settings: Subscription Settings:
@ -489,3 +492,5 @@ Tooltips:
Distraction Free Settings: Distraction Free Settings:
Hide Subscriptions Live: Esta configuración se reemplaza por la configuración 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}» «{appWideSetting}» de toda la aplicación, en la sección «{subsection}» de «{settingsSection}»
Go to page: Ir a {page}
Close Banner: Cerrar banner

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'eesti keel' Locale Name: 'eesti keel'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Rakenduse see osa pole veel valmis. Tule hiljem tagasi, kui arendustööd on valmis. 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 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 sa oled kindel, et soovid kustutada kõik tellimused/profiilid? Seda tegevust
ei saa tagasi pöörata.' 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 Save Watched Videos With Last Viewed Playlist: Salvesta vaadatud videod viimati
vaadatud videote esitusloendisse vaadatud videote esitusloendisse
All playlists have been removed: Kõik esitusloendid on eemaldatud 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 IP-aadressi blokeerimise, kuid ei sisalda video kestust ja otseesituse olekut
Fetch Automatically: Kui see valik on kasutusel, siis FreeTube automaatselt laadib Fetch Automatically: Kui see valik on kasutusel, siis FreeTube automaatselt laadib
uue akna avamisel ja profiili vahetamisel sinu tellimuste loendi. 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: General Settings:
Region for Trending: Piirkond, mille alusel kuvame hetkel menukad ehk populaarsust Region for Trending: Piirkond, mille alusel kuvame hetkel menukad ehk populaarsust
koguvad videod. koguvad videod.
@ -1128,3 +1123,5 @@ Age Restricted:
This channel is age restricted: Kanali vaatamisel on vanusepiirang This channel is age restricted: Kanali vaatamisel on vanusepiirang
This video is age restricted: Video vaatamisel on vanusepiirang This video is age restricted: Video vaatamisel on vanusepiirang
Close Banner: Sulge rekaampilt Close Banner: Sulge rekaampilt
checkmark:
Display Label: '{label}: {value}'

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'فارسی (ایرانی)' Locale Name: 'فارسی (ایرانی)'
FreeTube: 'یوتیوب آزاد'
# Currently on Subscriptions, Playlists, and History # 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.': >-
این بخش از نرم افزار هنوز آماده نیست.زمانی که پیشرفتی صورت گرفت به اینجا باز گردید. این بخش از نرم افزار هنوز آماده نیست.زمانی که پیشرفتی صورت گرفت به اینجا باز گردید.
@ -290,8 +289,6 @@ Settings:
Privacy Settings: 'تنظیمات امنیتی' Privacy Settings: 'تنظیمات امنیتی'
Remember History: 'حفظ تاریخچه' Remember History: 'حفظ تاریخچه'
Save Watched Progress: 'ذخیره ویدیو های دیده شده' Save Watched Progress: 'ذخیره ویدیو های دیده شده'
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?: 'آیا مطمئن هستید که میخواهید
کش جستجویتان را پاک کنید؟' کش جستجویتان را پاک کنید؟'
@ -702,9 +699,6 @@ Tooltips:
نمی دهد نمی دهد
Fetch Automatically: هنگامی که فعال باشد، FreeTube به طور خودکار فید اشتراک شما Fetch Automatically: هنگامی که فعال باشد، FreeTube به طور خودکار فید اشتراک شما
را هنگام باز شدن یک پنجره جدید و هنگام تغییر نمایه دریافت می کند. را هنگام باز شدن یک پنجره جدید و هنگام تغییر نمایه دریافت می کند.
Privacy Settings:
Remove Video Meta Files: هنگامی که FreeTube فعال باشد، به طور خودکار فایل های
متا ایجاد شده در حین پخش ویدیو را حذف می کند، زمانی که صفحه تماشا بسته می شود.
External Player Settings: External Player Settings:
Custom External Player Executable: به طور پیش فرض، FreeTube فرض می کند که پخش Custom External Player Executable: به طور پیش فرض، FreeTube فرض می کند که پخش
کننده خارجی انتخاب شده را می توان از طریق متغیر محیطی PATH پیدا کرد. در صورت کننده خارجی انتخاب شده را می توان از طریق متغیر محیطی PATH پیدا کرد. در صورت

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Filipino' Locale Name: 'Filipino'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Ang bahagi ito ng aplikasyon ay hindi pa handa. Bumalik po kayo mamaya kapag nag-unsad Ang bahagi ito ng aplikasyon ay hindi pa handa. Bumalik po kayo mamaya kapag nag-unsad

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Cette partie de l'application n'est pas encore prête. Revenez plus tard lorsque 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 sûr(e) de vouloir supprimer tous les abonnements et les profils ? Cette action
est définitive. est définitive.
Remove All Subscriptions / Profiles: Supprimer tous les Abonnements / Profils 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 Save Watched Videos With Last Viewed Playlist: Sauvegarder les vidéos regardées
avec la dernière liste de lecture vue avec la dernière liste de lecture vue
All playlists have been removed: Toutes les listes de lecture ont été supprimées 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 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 sur un lien qui ne peut être ouvert dans FreeTube.\nPar défaut, FreeTube ouvrira
le lien dans votre navigateur par défaut.\n" 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: External Player Settings:
Custom External Player Arguments: Tous les arguments de ligne de commande personnalisés, 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 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 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 This video is age restricted: Cette vidéo est soumise à des restrictions d'âge
Close Banner: Fermer la bannière Close Banner: Fermer la bannière
# French is the only language that should change this (they have a space before the colon)
Display Label: '{label} : {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'galego' Locale Name: 'galego'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Esta parte da aplicación non está lista aínda. Volve máis adiante, cando se avance 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' 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 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.' 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 Save Watched Videos With Last Viewed Playlist: Gardalos vídeos vistos coa última
lista de reprodución vista lista de reprodución vista
Subscription Settings: Subscription Settings:
@ -883,10 +880,6 @@ Tooltips:
# Toast Messages # Toast Messages
Fetch Automatically: Cando estea activado, FreeTube buscará automaticamente o 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. 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: External Player Settings:
Custom External Player Arguments: Calquera argumento de liña de comandos personalizado, 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. separado por puntos e coma (';'), que desexa que se pase ao reprodutor externo.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Schwiizerdütsch' Locale Name: 'Schwiizerdütsch'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
De Teil vom Programm isch nonig fertig. Bitte chum zumene spötere Ziitpunkt wider De Teil vom Programm isch nonig fertig. Bitte chum zumene spötere Ziitpunkt wider

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'עברית' Locale Name: 'עברית'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
החלק הזה ביישומון עדיין לא מוכן. מזמינים אותך לשוב ולבדוק בהמשך כשנתקדם. החלק הזה ביישומון עדיין לא מוכן. מזמינים אותך לשוב ולבדוק בהמשך כשנתקדם.
@ -307,7 +306,6 @@ Settings:
Remove All Subscriptions / Profiles: 'למחק את כל המינויים / פרופילים' Remove All Subscriptions / Profiles: 'למחק את כל המינויים / פרופילים'
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: להסיר אוטומטית קובצי נתוני על של הסרטון
Save Watched Videos With Last Viewed Playlist: לשמור את הסרטונים שנצפו עם רשימת Save Watched Videos With Last Viewed Playlist: לשמור את הסרטונים שנצפו עם רשימת
הנגינה לאחרונים שנצפו הנגינה לאחרונים שנצפו
Subscription Settings: Subscription Settings:
@ -943,9 +941,6 @@ Tooltips:
נגיש דרך משתנה הסביבה PATH. במקרה הצורך, ניתן להגדיר כאן נתיב משלך. נגיש דרך משתנה הסביבה PATH. במקרה הצורך, ניתן להגדיר כאן נתיב משלך.
Custom External Player Arguments: הארגומנטים משלך לשורת הפקודה שיועברו לנגן החיצוני, Custom External Player Arguments: הארגומנטים משלך לשורת הפקודה שיועברו לנגן החיצוני,
מופרדים בפסיקים (;). מופרדים בפסיקים (;).
Privacy Settings:
Remove Video Meta Files: כאשר אפשרות זו מופעלת, FreeTube מוחק באופן אוטומטי קובצי
על שנוצרים במהלך ניגון סרטון, לאחר סגירת עמוד הצפייה.
Experimental Settings: Experimental Settings:
Replace HTTP Cache: משבית את מטמון ה־HTTP מבוסס הכונן ומפעיל מטמון תמונות מותאם Replace HTTP Cache: משבית את מטמון ה־HTTP מבוסס הכונן ומפעיל מטמון תמונות מותאם
אישית בזיכרון. יגדיל את צריכת הזיכרון (RAM). אישית בזיכרון. יגדיל את צריכת הזיכרון (RAM).

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'English (US)' Locale Name: 'English (US)'
FreeTube: 'फ्रीट्यूब'
# Currently on Subscriptions, Playlists, and History # 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.': >-
ऐप का यह हिस्सा अभी तैयार नहीं है। बाद में वापस आएँ जब प्रगति हुई हो ऐप का यह हिस्सा अभी तैयार नहीं है। बाद में वापस आएँ जब प्रगति हुई हो

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Hrvatski' Locale Name: 'Hrvatski'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Ovaj dio programa još nije gotov. Navrati kasnije. 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 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. želiš ukloniti sve pretplate i profile? Ovo je nepovratna radnja.
Remove All Subscriptions / Profiles: Ukloni sve pretplate/profile 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 Save Watched Videos With Last Viewed Playlist: Spremi gledana videa sa zadnjim
gledanom zbirkom gledanom zbirkom
Remove All Playlists: Ukloni sve zbirke Remove All Playlists: Ukloni sve zbirke
@ -1095,10 +1092,6 @@ Tooltips:
ili stanja „uživo” ili stanja „uživo”
Fetch Automatically: Kada je aktivirano, FreeTube će automatski dohvatiti feed Fetch Automatically: Kada je aktivirano, FreeTube će automatski dohvatiti feed
tvoje pretplate kada se otvori novi prozor i prilikom mijenjanja profila. 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 Settings:
External Player: Biranjem vanjskog playera prikazat će se ikona, za otvaranje External Player: Biranjem vanjskog playera prikazat će se ikona, za otvaranje
videa (zbirka, ako je podržana) u vanjskom playeru, na minijaturi. Upozorenje, videa (zbirka, ako je podržana) u vanjskom playeru, na minijaturi. Upozorenje,

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Magyar' Locale Name: 'Magyar'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Az alkalmazás ezen része még nem áll készen. Térjen vissza később amikor előrelépés 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' 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 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.' 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 Save Watched Videos With Last Viewed Playlist: Megtekintett videók mentése az
utoljára megtekintett lejátszási listával utoljára megtekintett lejátszási listával
All playlists have been removed: Minden lejátszási lista eltávolításra került 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! 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 Nem minden videónál érhetők el, ilyenkor a lejátszó a DASH H.264 formátumot
használja helyette. 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: External Player Settings:
Custom External Player Executable: Alapértelmezés szerint a FreeTube feltételezi, 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 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: Age Restricted:
This channel is age restricted: Ez a csatorna korhatáros This channel is age restricted: Ez a csatorna korhatáros
This video is age restricted: Ez a videó korhatáros This video is age restricted: Ez a videó korhatáros
Display Label: '{label}: {value}'
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Bahasa Indonesia' Locale Name: 'Bahasa Indonesia'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Bagian dari aplikasi ini belum disiapkan. Kembali lagi nanti saat kemajuan telah 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 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 Anda yakin ingin menghapus semua langganan dan profil? Tindakan ini tidak bisa
diurungkan.' diurungkan.'
Automatically Remove Video Meta Files: Secara Otomatis Hapus File Meta Video
Subscription Settings: Subscription Settings:
Subscription Settings: 'Pengaturan Langganan' Subscription Settings: 'Pengaturan Langganan'
Hide Videos on Watch: 'Sembunyikan Video saat Menonton' Hide Videos on Watch: 'Sembunyikan Video saat Menonton'
@ -809,9 +807,6 @@ Tooltips:
External Link Handling: "Pilih perilaku default ketika tautan, yang tidak dapat External Link Handling: "Pilih perilaku default ketika tautan, yang tidak dapat
dibuka di FreeTube, diklik.\nSecara default FreeTube akan membuka tautan yang dibuka di FreeTube, diklik.\nSecara default FreeTube akan membuka tautan yang
diklik dengan browser default Anda.\n" 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: External Player Settings:
Custom External Player Arguments: Semua argumen perintah khusus, dipisahkan dengan Custom External Player Arguments: Semua argumen perintah khusus, dipisahkan dengan
titik koma (';'), yang Anda ingin gunakan dengan pemutar eksternal. titik koma (';'), yang Anda ingin gunakan dengan pemutar eksternal.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Íslenska' Locale Name: 'Íslenska'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Þessi hluti forritsins er ekki tilbúinn. Skoðaðu þetta seinna þegar meira hefur Þ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 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 viss um að þú viljir fjarlægja allar áskriftir og notkunarsnið? Ekki er hægt
að afturkalla þetta.' 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 á Save Watched Videos With Last Viewed Playlist: Vista myndskeið sem horft var á
með síðast notaða spilunarlista með síðast notaða spilunarlista
Remove All Playlists: Fjarlægja alla spilunarlista Remove All Playlists: Fjarlægja alla spilunarlista
@ -1027,9 +1025,6 @@ Tooltips:
# Toast Messages # Toast Messages
Fetch Automatically: Þegar þetta er virkt, mun FreeTube sækja sjálfkrafa áskriftarstreymin 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ð. þí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: External Player Settings:
Custom External Player Arguments: Öll sérsniðin skipanaviðföng og rofar, aðskilin Custom External Player Arguments: Öll sérsniðin skipanaviðföng og rofar, aðskilin
með semíkommum (';'), sem beina á til utanaðkomandi spilarans. með semíkommum (';'), sem beina á til utanaðkomandi spilarans.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Italiano' Locale Name: 'Italiano'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Questa parte dell'app non è ancora pronta. Torna più tardi quando saranno stati 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 sicuro di volere eliminare tutte le iscrizioni e i profili? L'operazione non
può essere annullata. può essere annullata.
Remove All Subscriptions / Profiles: Elimina tutte le iscrizioni e i profili 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 Save Watched Videos With Last Viewed Playlist: Salva i video guardati con l'ultima
playlist vista playlist vista
All playlists have been removed: Tutte le playlist sono state rimosse 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 Ignore Default Arguments: Non inviare argomenti predefiniti al lettore esterno
oltre all'URL del video (ad esempio velocità di riproduzione, URL della playlist, oltre all'URL del video (ad esempio velocità di riproduzione, URL della playlist,
ecc.). Gli argomenti personalizzati verranno comunque trasmessi. 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: Experimental Settings:
Replace HTTP Cache: Disabilita la cache HTTP basata su disco Electron e abilita 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 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 video is age restricted: Questo video è soggetto a limiti di età
This channel is age restricted: Questo canale è soggetto a limiti di età This channel is age restricted: Questo canale è soggetto a limiti di età
Close Banner: Chiudi banner Close Banner: Chiudi banner
checkmark:
Display Label: '{label}: {value}'

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'ქართული ენა' Locale Name: 'ქართული ენა'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
აპლიკაციის ეს ნაწილი ჯერ არ არის მზად. გთხოვთ, შეამოწმოთ მოგვიანებით, როდესაც იქნება აპლიკაციის ეს ნაწილი ჯერ არ არის მზად. გთხოვთ, შეამოწმოთ მოგვიანებით, როდესაც იქნება

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'ភាសាខ្មែរ' Locale Name: 'ភាសាខ្មែរ'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
ផ្នែកនេះនៃកម្មវិធីមិនទាន់រួចរាល់នៅឡើយទេ។ ត្រលប់មកវិញនៅពេលក្រោយ ពេលដែលវឌ្ឍនភាពត្រូវបានបង្កើតឡើង។ ផ្នែកនេះនៃកម្មវិធីមិនទាន់រួចរាល់នៅឡើយទេ។ ត្រលប់មកវិញនៅពេលក្រោយ ពេលដែលវឌ្ឍនភាពត្រូវបានបង្កើតឡើង។

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'کوردی ناوەڕاست' Locale Name: 'کوردی ناوەڕاست'
FreeTube: 'فریتیوب'
# Currently on Subscriptions, Playlists, and History # 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.': >-
ئە بەشە لە ئەپلیکەیشنەکە هێشتا بەردەست نییە. لە کاتێکی دواتردا وەرەوە کە پێشکەوتنێک ئە بەشە لە ئەپلیکەیشنەکە هێشتا بەردەست نییە. لە کاتێکی دواتردا وەرەوە کە پێشکەوتنێک

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Latina' Locale Name: 'Latina'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Haec programmatis pars perfecta non est. Remea cum in hac profectum sit. Haec programmatis pars perfecta non est. Remea cum in hac profectum sit.

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'lietuvių' Locale Name: 'lietuvių'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Ši programėlės dalis dar neparengta. Grįžkite vėliau, kai bus padaryta pažanga. Š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' Privacy Settings: 'Privatumo nustatymai'
Remember History: 'Įsiminti istoriją' Remember History: 'Įsiminti istoriją'
Save Watched Progress: 'Išsaugoti peržiūros progresą' 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ą' Clear Search Cache: 'Išvalyti paieškos talpyklą'
Are you sure you want to clear out your search cache?: 'Ar tikrai norite išvalyti Are you sure you want to clear out your search cache?: 'Ar tikrai norite išvalyti
paieškos talpyklą?' paieškos talpyklą?'
@ -832,9 +829,6 @@ Tooltips:
trukmės ar tiesioginės transliacijos būsenos' trukmės ar tiesioginės transliacijos būsenos'
Fetch Automatically: Kai ši funkcija įjungta, FreeTube automatiškai įkels naują Fetch Automatically: Kai ši funkcija įjungta, FreeTube automatiškai įkels naują
turinį iš prenumeratų, kai atidaromas naujas langas ir perjungiamas profilis. 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 # Toast Messages
Experimental Settings: Experimental Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Latviešu' Locale Name: 'Latviešu'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >
@ -309,7 +308,6 @@ Settings:
Remember History: 'Atcerēties vēsturi' Remember History: 'Atcerēties vēsturi'
Save Watched Progress: 'Saglabāt skatīto attīstību' Save Watched Progress: 'Saglabāt skatīto attīstību'
Save Watched Videos With Last Viewed Playlist: '' Save Watched Videos With Last Viewed Playlist: ''
Automatically Remove Video Meta Files: 'Automātiski noņemt video metadatus'
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?: ''
Search cache has been cleared: '' Search cache has been cleared: ''
@ -817,8 +815,6 @@ Tooltips:
Subscription Settings: Subscription Settings:
Fetch Feeds from RSS: '' Fetch Feeds from RSS: ''
Fetch Automatically: '' Fetch Automatically: ''
Privacy Settings:
Remove Video Meta Files: ''
Experimental Settings: Experimental Settings:
Replace HTTP Cache: '' Replace HTTP Cache: ''
SponsorBlock Settings: SponsorBlock Settings:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Norsk bokmål' Locale Name: 'Norsk bokmål'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Denne delen av programmet er ikke klart enda. Kom tilbake senere når ting er i orden. 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 Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Er
du sikker på at du vil fjerne alle abonnementer og profiler? Dette kan ikke du sikker på at du vil fjerne alle abonnementer og profiler? Dette kan ikke
angres. angres.
Automatically Remove Video Meta Files: Fjern metadata automatisk fra videoer
Save Watched Videos With Last Viewed Playlist: Lagre sette videoer med sist sette Save Watched Videos With Last Viewed Playlist: Lagre sette videoer med sist sette
spilleliste spilleliste
Subscription Settings: Subscription Settings:
@ -888,9 +886,6 @@ Tooltips:
Allow DASH AV1 formats: DASH AV1-formater kan ha bedre kvalitet enn DASH H.264 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 -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. 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: External Player Settings:
Custom External Player Arguments: Alle egendefinerte kommandolinjeargumenter, Custom External Player Arguments: Alle egendefinerte kommandolinjeargumenter,
semikoloninndelt («;») du ønsker å sende til den eksterne avspilleren. semikoloninndelt («;») du ønsker å sende til den eksterne avspilleren.
@ -968,3 +963,4 @@ Hashtag:
Hashtag: Emneknagg Hashtag: Emneknagg
This hashtag does not currently have any videos: Denne emneknaggen har ingen videoer This hashtag does not currently have any videos: Denne emneknaggen har ingen videoer
enda enda
checkmark:

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'नेपाली' Locale Name: 'नेपाली'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
एपको यो भाग अझै तयार भएको छैन। केहि प्रगति भएपछि आउनु होला। एपको यो भाग अझै तयार भएको छैन। केहि प्रगति भएपछि आउनु होला।

View File

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

View File

@ -1,6 +1,5 @@
# Put the name of your locale in the same language # Put the name of your locale in the same language
Locale Name: 'Norsk nynorsk' Locale Name: 'Norsk nynorsk'
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Denne delen av programmet er ikkje klar enda. Ver venleg og kom tilbake på eit seinare 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 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 du sikker på at du vil fjerne alle abonnentar og profil? Dette kan ikkje bli
ugjort.' ugjort.'
Automatically Remove Video Meta Files: Fjern metadata automatisk frå videoar
Subscription Settings: Subscription Settings:
Subscription Settings: 'Abonnementinnstillingar' Subscription Settings: 'Abonnementinnstillingar'
Hide Videos on Watch: 'Skjul sette videoar' Hide Videos on Watch: 'Skjul sette videoar'
@ -798,9 +796,6 @@ Tooltips:
# Toast Messages # Toast Messages
Fetch Automatically: Om dette alternativet er aktivert, vil FreeTube automatisk 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. 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: External Player Settings:
DefaultCustomArgumentsTemplate: "(Standard: '{defaultCustomArguments}')" DefaultCustomArgumentsTemplate: "(Standard: '{defaultCustomArguments}')"
Custom External Player Executable: Som standard vil FreeTube anta at den valte Custom External Player Executable: Som standard vil FreeTube anta at den valte

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Ta część aplikacji nie jest jeszcze gotowa. Wróć później, gdy zostaną poczynione 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 jesteś pewny/a, że chcesz usunąć wszystkie subskrypcje i profile? Nie będzie
można tego cofnąć. można tego cofnąć.
Remove All Subscriptions / Profiles: Usuń wszystkie subskrypcje / profile 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 Save Watched Videos With Last Viewed Playlist: Zapisuj do historii film wraz z
ostatnią odtwarzaną playlistą, która go zawierała ostatnią odtwarzaną playlistą, która go zawierała
All playlists have been removed: Wszystkie playlisty zostały usunięte 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. 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 W filmach, dla których ten format nie jest dostępny, zostanie użyty format H.264
DASH. 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: External Player Settings:
Ignore Warnings: Nie pokazuj ostrzeżeń o nieobsługiwanych akcjach przez zewnętrzny Ignore Warnings: Nie pokazuj ostrzeżeń o nieobsługiwanych akcjach przez zewnętrzny
odtwarzacz (n.p. odwracanie playlist, itp.). odtwarzacz (n.p. odwracanie playlist, itp.).
@ -1225,3 +1220,5 @@ Age Restricted:
This video is age restricted: Ten film ma ograniczenie wiekowe This video is age restricted: Ten film ma ograniczenie wiekowe
This channel is age restricted: Ten kanał ma ograniczenie wiekowe This channel is age restricted: Ten kanał ma ograniczenie wiekowe
Close Banner: Zamknij Baner Close Banner: Zamknij Baner
checkmark:
Display Label: '{label}: {value}'

View File

@ -1,4 +1,3 @@
FreeTube: 'FreeTube'
# Currently on Subscriptions, Playlists, and History # 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.': >-
Esta parte do aplicativo ainda não está pronta. Volte mais tarde quando o progresso 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 certeza de que deseja remover todas as inscrições e perfis? Isto não pode ser
desfeito. desfeito.
Remove All Subscriptions / Profiles: Remover todas as inscrições ou perfis 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 Save Watched Videos With Last Viewed Playlist: Salvar vídeos assistidos com a
última playlist visualizada última playlist visualizada
All playlists have been removed: Todas as playlists foram removidas 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 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 pode ser aberto no FreeTube for clicado.\nPor padrão, o FreeTube abrirá o link
clicado em seu navegador padrão.\n" 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: External Player Settings:
Custom External Player Arguments: Quaisquer argumentos de linha de comando personalizados, 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 separados por ponto e vírgula (';'), você deseja que seja passado para o player
@ -1216,3 +1209,5 @@ Close Banner: Fechar Banner
Age Restricted: Age Restricted:
This channel is age restricted: Este canal tem restrição de idade 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 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