diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 3ba13e0cec6cb..26cd65aa8c3e8 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1 +1,17 @@ blank_issues_enabled: false +contact_links: + - name: Discussions + url: https://github.com/FreeTubeApp/FreeTube/discussions/categories/general + about: View discussions or start one yourself + - name: Questions + url: https://github.com/FreeTubeApp/FreeTube/discussions/categories/q-a + about: Ask and answer questions + - name: Matrix Community + url: https://matrix.to/#/+freetube:matrix.org + about: Join our Matrix chatroom - "Note: Bugs and Feature requests should be made on GitHub and not in the Matrix room" + - name: Translate FreeTube + url: https://hosted.weblate.org/engage/free-tube/ + about: Help translate FreeTube on Weblate + - name: FreeTube Documentation + url: https://docs.freetubeapp.io/ + about: View the Documentation to find all relevant information about FreeTube diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 63a54a471c7c6..569ded4476692 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -108,91 +108,91 @@ jobs: run: yarn run build:arm64 - name: Upload Linux .zip x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_x64 path: build/freetube-${{ steps.versionNumber.outputs.result }}.zip - name: Upload Linux .7z x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_x64.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}.7z - name: Upload Linux .zip ARMv7l Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_armv7l path: build/freetube-${{ steps.versionNumber.outputs.result }}-armv7l.zip - name: Upload Linux .7z ARMv7l Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_armv7l.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-armv7l.7z - name: Upload Linux .zip ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_arm64 path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.zip - name: Upload Linux .7z ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_linux_portable_arm64.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.7z - name: Upload .deb x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_amd64.deb path: build/freetube_${{ steps.versionNumber.outputs.result }}_amd64.deb - name: Upload .deb ARMv7l Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') with: name: freetube_${{ steps.versionNumber.outputs.result }}_armv7l.deb path: build/freetube_${{ steps.versionNumber.outputs.result }}_armv7l.deb - name: Upload .deb ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_arm64.deb path: build/freetube_${{ steps.versionNumber.outputs.result }}_arm64.deb - name: Upload AppImage x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_amd64.AppImage path: build/FreeTube-${{ steps.versionNumber.outputs.result }}.AppImage - name: Upload AppImage ARMv7l Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') with: name: freetube_${{ steps.versionNumber.outputs.result }}_armv7l.AppImage path: build/FreeTube-${{ steps.versionNumber.outputs.result }}-armv7l.AppImage - name: Upload AppImage ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_arm64.AppImage path: build/FreeTube-${{ steps.versionNumber.outputs.result }}-arm64.AppImage - name: Upload .rpm x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_amd64.rpm @@ -201,133 +201,133 @@ jobs: # rpm are not built for armv7l - name: Upload .rpm ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_arm64.rpm path: build/freetube-${{ steps.versionNumber.outputs.result }}.aarch64.rpm - name: Upload Alpine .apk x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_alpine_amd64.apk path: build/freetube-${{ steps.versionNumber.outputs.result }}.apk - name: Upload Alpine .apk ARMv7l Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') with: name: freetube_${{ steps.versionNumber.outputs.result }}_alpine_armv7l.apk path: build/freetube-${{ steps.versionNumber.outputs.result }}-armv7l.apk - name: Upload Alpine .apk ARM64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_alpine_arm64.apk path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.apk - name: Upload Pacman .pacman x64 Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') with: name: freetube_${{ steps.versionNumber.outputs.result }}_amd64.pacman path: build/freetube-${{ steps.versionNumber.outputs.result }}.pacman # - name: Upload Web Build - # uses: actions/upload-artifact@v3 + # uses: actions/upload-artifact@v4 # if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') # with: # name: freetube_${{ steps.versionNumber.outputs.result }}_static_web # path: dist/web - name: Upload Windows x64 .exe Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-setup-x64.exe path: build/freetube Setup ${{ steps.versionNumber.outputs.result }}.exe - name: Upload Windows arm64 .exe Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-arm64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-setup-arm64.exe path: build/freetube Setup ${{ steps.versionNumber.outputs.result }}.exe - name: Upload Windows x64 .zip Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-win-x64-portable path: build/freetube-${{ steps.versionNumber.outputs.result }}-win.zip - name: Upload Windows x64 .7z Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-win-x64-portable.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-win.7z - name: Upload Windows arm64 .zip Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-arm64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-win-arm64-portable path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64-win.zip - name: Upload Windows arm64 .7z Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-arm64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-win-arm64-portable.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64-win.7z - name: Upload Windows x64 Portable Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-portable-x64.exe path: build/freetube ${{ steps.versionNumber.outputs.result }}.exe - name: Upload Windows arm64 Portable Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'windows') && startsWith(matrix.runtime, 'win-arm64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-portable-arm64.exe path: build/freetube ${{ steps.versionNumber.outputs.result }}.exe - name: Upload Mac x64 .dmg Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-mac-x64.dmg path: build/freetube-${{ steps.versionNumber.outputs.result }}.dmg # - name: Upload Mac arm64 .dmg Artifact -# uses: actions/upload-artifact@v3 +# uses: actions/upload-artifact@v4 # if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') # with: # name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.dmg # path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.dmg - name: Upload Mac x64 .zip Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-mac-x64.zip path: build/freetube-${{ steps.versionNumber.outputs.result }}-mac.zip - name: Upload Mac x64 .7z Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-x64') with: name: freetube-${{ steps.versionNumber.outputs.result }}-mac-x64.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-mac.7z # - name: Upload Mac arm64 .zip Artifact -# uses: actions/upload-artifact@v3 +# uses: actions/upload-artifact@v4 # if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') # with: # name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.zip diff --git a/.github/workflows/calibreapp-image-actions.yml b/.github/workflows/calibreapp-image-actions.yml index f94e1ac32c843..d336cad2328ab 100644 --- a/.github/workflows/calibreapp-image-actions.yml +++ b/.github/workflows/calibreapp-image-actions.yml @@ -20,7 +20,7 @@ jobs: compressOnly: true - name: Create New Pull Request If Needed if: steps.calibre.outputs.markdown != '' - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: title: Compressed Images Nightly branch-suffix: timestamp diff --git a/.github/workflows/label-issue.yml b/.github/workflows/label-issue.yml index 46eed6d43bfae..24e42dc04f3c9 100644 --- a/.github/workflows/label-issue.yml +++ b/.github/workflows/label-issue.yml @@ -11,7 +11,7 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: github/issue-labeler@v3.3 + - uses: github/issue-labeler@v3.4 with: configuration-path: .github/issue-labeler.yml enable-versioned-regex: 0 diff --git a/_icons/iconNordicLightSmall.png b/_icons/iconNordicLightSmall.png new file mode 100644 index 0000000000000..b5b83494c8e56 Binary files /dev/null and b/_icons/iconNordicLightSmall.png differ diff --git a/_icons/textNordicLightSmall.png b/_icons/textNordicLightSmall.png new file mode 100644 index 0000000000000..b23422a08c14f Binary files /dev/null and b/_icons/textNordicLightSmall.png differ diff --git a/_scripts/dev-runner.js b/_scripts/dev-runner.js index d030c8b814035..0a4678040e19f 100644 --- a/_scripts/dev-runner.js +++ b/_scripts/dev-runner.js @@ -1,6 +1,5 @@ process.env.NODE_ENV = 'development' -const open = require('open') const electron = require('electron') const webpack = require('webpack') const WebpackDevServer = require('webpack-dev-server') @@ -161,7 +160,8 @@ function startWeb (callback) { if (!web) { startRenderer(startMain) } else { - startWeb(({ port }) => { + startWeb(async ({ port }) => { + const open = (await import('open')).default open(`http://localhost:${port}`) }) } diff --git a/_scripts/webpack.renderer.config.js b/_scripts/webpack.renderer.config.js index 057be25f4a65b..5cb371e8a2437 100644 --- a/_scripts/webpack.renderer.config.js +++ b/_scripts/webpack.renderer.config.js @@ -1,5 +1,5 @@ const path = require('path') -const { readFileSync } = require('fs') +const { readFileSync, readdirSync } = require('fs') const webpack = require('webpack') const HtmlWebpackPlugin = require('html-webpack-plugin') const VueLoaderPlugin = require('vue-loader/lib/plugin') @@ -11,6 +11,8 @@ const CopyWebpackPlugin = require('copy-webpack-plugin') const isDevMode = process.env.NODE_ENV === 'development' +const { version: swiperVersion } = JSON.parse(readFileSync(path.join(__dirname, '../node_modules/swiper/package.json'))) + const processLocalesPlugin = new ProcessLocalesPlugin({ compress: !isDevMode, inputDir: path.join(__dirname, '../static/locales'), @@ -117,7 +119,9 @@ const config = { new webpack.DefinePlugin({ 'process.env.IS_ELECTRON': true, 'process.env.IS_ELECTRON_MAIN': false, - 'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames) + 'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames), + 'process.env.GEOLOCATION_NAMES': JSON.stringify(readdirSync(path.join(__dirname, '..', 'static', 'geolocations')).map(filename => filename.replace('.json', ''))), + 'process.env.SWIPER_VERSION': `'${swiperVersion}'` }), new HtmlWebpackPlugin({ excludeChunks: ['processTaskWorker'], @@ -136,7 +140,7 @@ const config = { patterns: [ { from: path.join(__dirname, '../node_modules/swiper/modules/{a11y,navigation,pagination}-element.css').replaceAll('\\', '/'), - to: 'swiper.css', + to: `swiper-${swiperVersion}.css`, context: path.join(__dirname, '../node_modules/swiper/modules'), transformAll: (assets) => { return Buffer.concat(assets.map(asset => asset.data)) diff --git a/_scripts/webpack.web.config.js b/_scripts/webpack.web.config.js index 9dd0e20f1a22c..5113f06a7caed 100644 --- a/_scripts/webpack.web.config.js +++ b/_scripts/webpack.web.config.js @@ -11,6 +11,8 @@ const ProcessLocalesPlugin = require('./ProcessLocalesPlugin') const isDevMode = process.env.NODE_ENV === 'development' +const { version: swiperVersion } = JSON.parse(fs.readFileSync(path.join(__dirname, '../node_modules/swiper/package.json'))) + const config = { name: 'web', mode: process.env.NODE_ENV, @@ -114,6 +116,7 @@ const config = { new webpack.DefinePlugin({ 'process.env.IS_ELECTRON': false, 'process.env.IS_ELECTRON_MAIN': false, + 'process.env.SWIPER_VERSION': `'${swiperVersion}'`, // video.js' vhs-utils supports both atob() in web browsers and Buffer in node // As the FreeTube web build only runs in web browsers, we can override their check for atob() here: https://github.com/videojs/vhs-utils/blob/main/src/decode-b64-to-uint8-array.js#L3 @@ -145,7 +148,7 @@ const config = { patterns: [ { from: path.join(__dirname, '../node_modules/swiper/modules/{a11y,navigation,pagination}-element.css').replaceAll('\\', '/'), - to: 'swiper.css', + to: `swiper-${swiperVersion}.css`, context: path.join(__dirname, '../node_modules/swiper/modules'), transformAll: (assets) => { return Buffer.concat(assets.map(asset => asset.data)) diff --git a/jsconfig.json b/jsconfig.json index 8f5ea8a228e3c..6efa53c23ad98 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,5 +1,8 @@ { "vueCompilerOptions": { "target": 2.7 + }, + "compilerOptions": { + "strictNullChecks": true } } diff --git a/package.json b/package.json index e0fe5fb099682..52472b28b3b6c 100644 --- a/package.json +++ b/package.json @@ -62,10 +62,10 @@ "autolinker": "^4.0.0", "electron-context-menu": "^3.6.1", "lodash.debounce": "^4.0.8", - "marked": "^11.2.0", + "marked": "^12.0.0", "path-browserify": "^1.0.1", "process": "^0.11.10", - "swiper": "^11.0.5", + "swiper": "^11.0.7", "video.js": "7.21.5", "videojs-contrib-quality-levels": "^3.0.0", "videojs-http-source-selector": "^1.1.6", @@ -77,21 +77,21 @@ "vue-observe-visibility": "^1.0.0", "vue-router": "^3.6.5", "vuex": "^3.6.2", - "youtubei.js": "^8.2.0" + "youtubei.js": "^9.1.0" }, "devDependencies": { - "@babel/core": "^7.23.9", - "@babel/eslint-parser": "^7.23.9", + "@babel/core": "^7.24.0", + "@babel/eslint-parser": "^7.23.10", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.23.9", - "@double-great/stylelint-a11y": "^3.0.0", + "@babel/preset-env": "^7.24.0", + "@double-great/stylelint-a11y": "^3.0.2", "babel-loader": "^9.1.3", "copy-webpack-plugin": "^12.0.2", - "css-loader": "^6.9.1", + "css-loader": "^6.10.0", "css-minimizer-webpack-plugin": "^6.0.0", - "electron": "^28.2.0", - "electron-builder": "^24.9.1", - "eslint": "^8.56.0", + "electron": "^29.1.0", + "electron-builder": "^24.13.3", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.29.1", @@ -99,23 +99,23 @@ "eslint-plugin-n": "^16.6.2", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^50.0.1", - "eslint-plugin-vue": "^9.20.1", + "eslint-plugin-unicorn": "^51.0.1", + "eslint-plugin-vue": "^9.22.0", "eslint-plugin-vuejs-accessibility": "^2.2.1", "eslint-plugin-yml": "^1.12.2", "html-webpack-plugin": "^5.6.0", "js-yaml": "^4.1.0", "json-minimizer-webpack-plugin": "^5.0.0", - "lefthook": "^1.6.1", - "mini-css-extract-plugin": "^2.7.7", + "lefthook": "^1.6.4", + "mini-css-extract-plugin": "^2.8.1", "npm-run-all": "^4.1.5", - "postcss": "^8.4.33", + "postcss": "^8.4.35", "postcss-scss": "^4.0.9", "prettier": "^2.8.8", "rimraf": "^5.0.5", - "sass": "^1.70.0", - "sass-loader": "^14.0.0", - "stylelint": "^16.2.0", + "sass": "^1.71.1", + "sass-loader": "^14.1.1", + "stylelint": "^16.2.1", "stylelint-config-sass-guidelines": "^11.0.0", "stylelint-config-standard": "^36.0.0", "stylelint-high-performance-animation": "^1.10.0", @@ -124,9 +124,9 @@ "vue-devtools": "^5.1.4", "vue-eslint-parser": "^9.4.2", "vue-loader": "^15.10.0", - "webpack": "^5.90.0", + "webpack": "^5.90.3", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^5.0.2", "webpack-watch-external-files-plugin": "^3.0.0", "yaml-eslint-parser": "^1.2.2" } diff --git a/src/main/index.js b/src/main/index.js index 23b561cee10b4..f9c8fd7a901d5 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -64,7 +64,9 @@ function runApp() { const path = urlParts[1] if (path) { - visible = ['/playlist', '/channel', '/watch'].some(p => path.startsWith(p)) + visible = ['/channel', '/watch'].some(p => path.startsWith(p)) || + // Only show copy link entry for non user playlists + (path.startsWith('/playlist') && !/playlistType=user/.test(path)) } } else { visible = true @@ -103,17 +105,17 @@ function runApp() { let url if (toYouTube) { - url = `https://youtu.be/${id}` + url = new URL(`https://youtu.be/${id}`) } else { - url = `https://redirect.invidious.io/watch?v=${id}` + url = new URL(`https://redirect.invidious.io/watch?v=${id}`) } if (query) { const params = new URLSearchParams(query) - const newParams = new URLSearchParams() + const newParams = new URLSearchParams(url.search) let hasParams = false - if (params.has('playlistId')) { + if (params.has('playlistId') && params.get('playlistType') !== 'user') { newParams.set('list', params.get('playlistId')) hasParams = true } @@ -124,11 +126,11 @@ function runApp() { } if (hasParams) { - url += '?' + newParams.toString() + url.search = newParams.toString() } } - return url + return url.toString() } } } @@ -493,6 +495,8 @@ function runApp() { return '#ffd1dc' case 'hot-pink': return '#de1c85' + case 'nordic': + return '#2b2f3a' case 'system': default: return nativeTheme.shouldUseDarkColors ? '#212121' : '#f1f1f1' diff --git a/src/renderer/components/data-settings/data-settings.js b/src/renderer/components/data-settings/data-settings.js index 4f036a9f8001d..f5ae352fc48f0 100644 --- a/src/renderer/components/data-settings/data-settings.js +++ b/src/renderer/components/data-settings/data-settings.js @@ -1133,7 +1133,7 @@ export default defineComponent({ }) if (process.env.IS_ELECTRON && this.backendFallback && this.backendPreference === 'invidious') { - showToast(this.$t('Falling back to the local API')) + showToast(this.$t('Falling back to Local API')) resolve(this.getChannelInfoLocal(channelId)) } else { resolve([]) diff --git a/src/renderer/components/ft-age-restricted/ft-age-restricted.js b/src/renderer/components/ft-age-restricted/ft-age-restricted.js index 7e925441b4650..c9cd917bc8e88 100644 --- a/src/renderer/components/ft-age-restricted/ft-age-restricted.js +++ b/src/renderer/components/ft-age-restricted/ft-age-restricted.js @@ -3,10 +3,14 @@ import { defineComponent } from 'vue' export default defineComponent({ name: 'FtAgeRestricted', props: { - contentTypeString: { - type: String, - required: true - } + isChannel: { + type: Boolean, + default: false, + }, + isVideo: { + type: Boolean, + default: false, + }, }, computed: { emoji: function () { @@ -15,8 +19,11 @@ export default defineComponent({ }, restrictedMessage: function () { - const contentType = this.$t('Age Restricted.Type.' + this.contentTypeString) - return this.$t('Age Restricted.This {videoOrPlaylist} is age restricted', { videoOrPlaylist: contentType }) + if (this.isChannel) { + return this.$t('Age Restricted.This channel is age restricted') + } + + return this.$t('Age Restricted.This video is age restricted:') } } }) diff --git a/src/renderer/components/ft-community-post/ft-community-post.js b/src/renderer/components/ft-community-post/ft-community-post.js index 350eccc102020..6be036209b80e 100644 --- a/src/renderer/components/ft-community-post/ft-community-post.js +++ b/src/renderer/components/ft-community-post/ft-community-post.js @@ -40,7 +40,6 @@ export default defineComponent({ voteCount: '', postContent: '', commentCount: '', - isLoading: true, author: '', authorId: '', } @@ -73,7 +72,7 @@ export default defineComponent({ injectStylesUrls: [ // This file is created with the copy webpack plugin in the web and renderer webpack configs. // If you add more modules, please remember to add their CSS files to the list in webpack config files. - createWebURL('/swiper.css') + createWebURL(`/swiper-${process.env.SWIPER_VERSION}.css`) ], a11y: true, @@ -132,7 +131,6 @@ export default defineComponent({ this.type = (this.data.postContent !== null && this.data.postContent !== undefined) ? this.data.postContent.type : 'text' this.author = this.data.author this.authorId = this.data.authorId - this.isLoading = false }, getBestQualityImage(imageArray) { diff --git a/src/renderer/components/ft-community-post/ft-community-post.vue b/src/renderer/components/ft-community-post/ft-community-post.vue index 053bd4c61a59d..f65e379e47824 100644 --- a/src/renderer/components/ft-community-post/ft-community-post.vue +++ b/src/renderer/components/ft-community-post/ft-community-post.vue @@ -1,6 +1,5 @@ diff --git a/src/renderer/components/ft-timestamp-catcher/ft-timestamp-catcher.js b/src/renderer/components/ft-timestamp-catcher/ft-timestamp-catcher.js index 940213031b0bc..1006ea5944499 100644 --- a/src/renderer/components/ft-timestamp-catcher/ft-timestamp-catcher.js +++ b/src/renderer/components/ft-timestamp-catcher/ft-timestamp-catcher.js @@ -9,18 +9,29 @@ export default defineComponent({ } }, methods: { - catchTimestampClick: function(event) { - const match = event.detail.match(/(\d+):(\d+):?(\d+)?/) - if (match[3] !== undefined) { // HH:MM:SS - const seconds = 3600 * Number(match[1]) + 60 * Number(match[2]) + Number(match[3]) - this.$emit('timestamp-event', seconds) - } else { // MM:SS - const seconds = 60 * Number(match[1]) + Number(match[2]) - this.$emit('timestamp-event', seconds) - } + catchTimestampClick: function (event) { + this.$emit('timestamp-event', event.detail) }, detectTimestamps: function (input) { - return input.replaceAll(/(\d+(:\d+)+)/g, '$1') + const videoId = this.$route.params.id + + return input.replaceAll(/(?:(\d+):)?(\d+):(\d+)/g, (timestamp, hours, minutes, seconds) => { + let time = 60 * Number(minutes) + Number(seconds) + + if (hours) { + time += 3600 * Number(hours) + } + + const url = this.$router.resolve({ + path: `/watch/${videoId}`, + query: { + timestamp: time + } + }).href + + // Adding the URL lets the user open the video in a new window at this timestamp + return `${timestamp}` + }) } } }) diff --git a/src/renderer/components/playlist-info/playlist-info.js b/src/renderer/components/playlist-info/playlist-info.js index 616a7d99bee8c..52d9198408e9d 100644 --- a/src/renderer/components/playlist-info/playlist-info.js +++ b/src/renderer/components/playlist-info/playlist-info.js @@ -5,10 +5,12 @@ import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' import FtIconButton from '../ft-icon-button/ft-icon-button.vue' import FtInput from '../ft-input/ft-input.vue' import FtPrompt from '../ft-prompt/ft-prompt.vue' +import FtButton from '../ft-button/ft-button.vue' import { formatNumber, showToast, } from '../../helpers/utils' +import debounce from 'lodash.debounce' export default defineComponent({ name: 'PlaylistInfo', @@ -18,6 +20,7 @@ export default defineComponent({ 'ft-icon-button': FtIconButton, 'ft-input': FtInput, 'ft-prompt': FtPrompt, + 'ft-button': FtButton, }, props: { id: { @@ -83,6 +86,9 @@ export default defineComponent({ }, data: function () { return { + searchVideoMode: false, + query: '', + updateQueryDebounce: function() {}, editMode: false, showDeletePlaylistPrompt: false, showRemoveVideosOnWatchPrompt: false, @@ -232,6 +238,8 @@ export default defineComponent({ created: function () { this.newTitle = this.title this.newDescription = this.description + + this.updateQueryDebounce = debounce(this.updateQuery, 500) }, methods: { toggleCopyVideosPrompt: function (force = false) { @@ -373,6 +381,30 @@ export default defineComponent({ showToast(this.$t('User Playlists.SinglePlaylistView.Toast.Quick bookmark disabled')) }, + updateQuery(query) { + this.query = query + this.$emit('search-video-query-change', query) + }, + enableVideoSearchMode() { + this.searchVideoMode = true + this.$emit('search-video-mode-on') + + nextTick(() => { + // Some elements only present after rendering update + this.$refs.searchInput.focus() + }) + }, + disableVideoSearchMode() { + this.searchVideoMode = false + this.updateQuery('') + this.$emit('search-video-mode-off') + + nextTick(() => { + // Some elements only present after rendering update + this.$refs.enableSearchModeButton?.focus() + }) + }, + ...mapActions([ 'showAddToPlaylistPromptForManyVideos', 'updatePlaylist', diff --git a/src/renderer/components/playlist-info/playlist-info.scss b/src/renderer/components/playlist-info/playlist-info.scss index 3fb13c0c0fe8a..8bf11cf0882e4 100644 --- a/src/renderer/components/playlist-info/playlist-info.scss +++ b/src/renderer/components/playlist-info/playlist-info.scss @@ -72,3 +72,20 @@ column-gap: 8px; justify-content: flex-end; } + +.searchInputsRow { + margin-block-start: 8px; + + display: grid; + + /* 2 columns */ + grid-template-columns: 1fr auto; + column-gap: 8px; +} + +@media only screen and (max-width: 1250px) { + :deep(.sharePlaylistIcon .iconDropdown) { + inset-inline-start: auto; + inset-inline-end: auto; + } +} diff --git a/src/renderer/components/playlist-info/playlist-info.vue b/src/renderer/components/playlist-info/playlist-info.vue index d5af7424e0b15..4f25a297a7754 100644 --- a/src/renderer/components/playlist-info/playlist-info.vue +++ b/src/renderer/components/playlist-info/playlist-info.vue @@ -76,6 +76,7 @@
+ @@ -186,6 +196,28 @@ @click="handleRemoveVideosOnWatchPromptAnswer" />
+ +
+ + +
diff --git a/src/renderer/components/side-nav-more-options/side-nav-more-options.vue b/src/renderer/components/side-nav-more-options/side-nav-more-options.vue index 6541150f21a3f..07f17810e3a1a 100644 --- a/src/renderer/components/side-nav-more-options/side-nav-more-options.vue +++ b/src/renderer/components/side-nav-more-options/side-nav-more-options.vue @@ -44,6 +44,7 @@ />
{{ chapter.timestamp }} diff --git a/src/renderer/components/watch-video-comments/watch-video-comments.js b/src/renderer/components/watch-video-comments/watch-video-comments.js index f4f4535440ae1..702a3f117aa89 100644 --- a/src/renderer/components/watch-video-comments/watch-video-comments.js +++ b/src/renderer/components/watch-video-comments/watch-video-comments.js @@ -298,7 +298,7 @@ export default defineComponent({ copyToClipboard(err) }) if (process.env.IS_ELECTRON && this.backendFallback && this.backendPreference === 'invidious') { - showToast(this.$t('Falling back to local API')) + showToast(this.$t('Falling back to Local API')) this.getCommentDataLocal() } else { this.isLoading = false diff --git a/src/renderer/components/watch-video-comments/watch-video-comments.vue b/src/renderer/components/watch-video-comments/watch-video-comments.vue index f893a420628be..39518ec86fdca 100644 --- a/src/renderer/components/watch-video-comments/watch-video-comments.vue +++ b/src/renderer/components/watch-video-comments/watch-video-comments.vue @@ -268,7 +268,7 @@ v-else-if="showComments && !isLoading" >

- {{ $t("There are no comments available for this video") }} + {{ $t("Comments.There are no comments available for this video") }}

- {{ publishedString }} {{ dateString }} • {{ parsedViewCount }} + {{ publishedString }} {{ dateString }} +
fetch(input, init), cache, - generate_session_locally: !!options.generateSessionLocally + generate_session_locally: !!generateSessionLocally }) } @@ -290,7 +290,9 @@ export async function getLocalChannelVideos(id) { // if the channel doesn't have a videos tab, YouTube returns the home tab instead // so we need to check that we got the right tab if (videosTab.current_tab?.endpoint.metadata.url?.endsWith('/videos')) { - return parseLocalChannelVideos(videosTab.videos, videosTab.header.author) + const { id: channelId = id, name } = parseLocalChannelHeader(videosTab) + + return parseLocalChannelVideos(videosTab.videos, channelId, name) } else { return [] } @@ -320,7 +322,9 @@ export async function getLocalChannelLiveStreams(id) { // if the channel doesn't have a live tab, YouTube returns the home tab instead // so we need to check that we got the right tab if (liveStreamsTab.current_tab?.endpoint.metadata.url?.endsWith('/streams')) { - return parseLocalChannelVideos(liveStreamsTab.videos, liveStreamsTab.header.author) + const { id: channelId = id, name } = parseLocalChannelHeader(liveStreamsTab) + + return parseLocalChannelVideos(liveStreamsTab.videos, channelId, name) } else { return [] } @@ -364,17 +368,159 @@ export async function getLocalChannelCommunity(id) { } } +/** + * @param {YT.Channel} channel + */ +export function parseLocalChannelHeader(channel) { + /** @type {string=} */ + let id + /** @type {string} */ + let name + /** @type {string=} */ + let thumbnailUrl + /** @type {string=} */ + let bannerUrl + /** @type {string=} */ + let subscriberText + /** @type {string[]} */ + const tags = [] + + switch (channel.header.type) { + case 'C4TabbedHeader': { + // example: Linus Tech Tips + // https://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw + + /** + * @type {import('youtubei.js').YTNodes.C4TabbedHeader} + */ + const header = channel.header + + id = header.author.id + name = header.author.name + thumbnailUrl = header.author.best_thumbnail.url + bannerUrl = header.banner?.[0]?.url + subscriberText = header.subscribers?.text + break + } + case 'CarouselHeader': { + // examples: Music and YouTube Gaming + // https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ + // https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg + + /** + * @type {import('youtubei.js').YTNodes.CarouselHeader} + */ + const header = channel.header + + /** + * @type {import('youtubei.js').YTNodes.TopicChannelDetails} + */ + const topicChannelDetails = header.contents.find(node => node.type === 'TopicChannelDetails') + name = topicChannelDetails.title.text + subscriberText = topicChannelDetails.subtitle.text + thumbnailUrl = topicChannelDetails.avatar[0].url + + if (channel.metadata.external_id) { + id = channel.metadata.external_id + } else { + id = topicChannelDetails.subscribe_button.channel_id + } + break + } + case 'InteractiveTabbedHeader': { + // example: Minecraft - Topic + // https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg + + /** + * @type {import('youtubei.js').YTNodes.InteractiveTabbedHeader} + */ + const header = channel.header + name = header.title.text + thumbnailUrl = header.box_art.at(-1).url + bannerUrl = header.banner[0]?.url + + const badges = header.badges.map(badge => badge.label).filter(tag => tag) + tags.push(...badges) + + id = channel.current_tab?.endpoint.payload.browseId + break + } + case 'PageHeader': { + // example: YouTube Gaming + // https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg + + // User channels (an A/B test at the time of writing) + + /** + * @type {import('youtubei.js').YTNodes.PageHeader} + */ + const header = channel.header + + name = header.content.title.text.text + if (header.content.image) { + if (header.content.image.type === 'ContentPreviewImageView') { + /** @type {import('youtubei.js').YTNodes.ContentPreviewImageView} */ + const image = header.content.image + + thumbnailUrl = image.image[0].url + } else { + /** @type {import('youtubei.js').YTNodes.DecoratedAvatarView} */ + const image = header.content.image + thumbnailUrl = image.avatar?.image[0].url + } + } + + if (!thumbnailUrl && channel.metadata.thumbnail) { + thumbnailUrl = channel.metadata.thumbnail[0].url + } + + if (header.content.banner) { + bannerUrl = header.content.banner.image[0]?.url + } + + if (header.content.actions) { + const modal = header.content.actions.actions_rows[0].actions[0].on_tap.modal + + if (modal && modal.type === 'ModalWithTitleAndButton') { + /** @type {import('youtubei.js').YTNodes.ModalWithTitleAndButton} */ + const typedModal = modal + + id = typedModal.button.endpoint.next_endpoint?.payload.browseId + } + } else if (channel.metadata.external_id) { + id = channel.metadata.external_id + } + + if (header.content.metadata) { + subscriberText = header.content.metadata.metadata_rows[0].metadata_parts[1].text.text + } + + break + } + } + + return { + id, + name, + thumbnailUrl, + bannerUrl, + subscriberText, + tags + } +} + /** * @param {import('youtubei.js').YTNodes.Video[]} videos - * @param {Misc.Author} author + * @param {string} channelId + * @param {string} channelName */ -export function parseLocalChannelVideos(videos, author) { +export function parseLocalChannelVideos(videos, channelId, channelName) { const parsedVideos = videos.map(parseLocalListVideo) // fix empty author info parsedVideos.forEach(video => { - video.author = author.name - video.authorId = author.id + video.author = channelName + video.authorId = channelId }) return parsedVideos @@ -382,17 +528,18 @@ export function parseLocalChannelVideos(videos, author) { /** * @param {import('youtubei.js').YTNodes.ReelItem[]} shorts - * @param {Misc.Author} author + * @param {string} channelId + * @param {string} channelName */ -export function parseLocalChannelShorts(shorts, author) { +export function parseLocalChannelShorts(shorts, channelId, channelName) { return shorts.map(short => { return { type: 'video', videoId: short.id, title: short.title.text, - author: author.name, - authorId: author.id, - viewCount: parseLocalSubscriberCount(short.views.text), + author: channelName, + authorId: channelId, + viewCount: short.views.isEmpty() ? null : parseLocalSubscriberCount(short.views.text), lengthSeconds: '' } }) @@ -405,40 +552,43 @@ export function parseLocalChannelShorts(shorts, author) { /** * @param {Playlist|GridPlaylist} playlist - * @param {Misc.Author} author + * @param {string} channelId + * @param {string} chanelName */ -export function parseLocalListPlaylist(playlist, author = undefined) { - let channelName - let channelId = null - /** @type {import('youtubei.js').YTNodes.PlaylistVideoThumbnail} */ - const thumbnailRenderer = playlist.thumbnail_renderer +export function parseLocalListPlaylist(playlist, channelId = undefined, channelName = undefined) { + let internalChannelName + let internalChannelId = null + if (playlist.author && playlist.author.id !== 'N/A') { if (playlist.author instanceof Misc.Text) { - channelName = playlist.author.text + internalChannelName = playlist.author.text - if (author) { - channelId = author.id + if (channelId) { + internalChannelId = channelId } } else { - channelName = playlist.author.name - channelId = playlist.author.id + internalChannelName = playlist.author.name + internalChannelId = playlist.author.id } - } else if (author) { - channelName = author.name - channelId = author.id + } else if (channelId || channelName) { + internalChannelName = channelName + internalChannelId = channelId } else if (playlist.author?.name) { // auto-generated album playlists don't have an author // so in search results, the author text is "Playlist" and doesn't have a link or channel ID - channelName = playlist.author.name + internalChannelName = playlist.author.name } + /** @type {import('youtubei.js').YTNodes.PlaylistVideoThumbnail} */ + const thumbnailRenderer = playlist.thumbnail_renderer + return { type: 'playlist', dataSource: 'local', title: playlist.title.text, thumbnail: thumbnailRenderer ? thumbnailRenderer.thumbnail[0].url : playlist.thumbnails[0].url, - channelName, - channelId, + channelName: internalChannelName, + channelId: internalChannelId, playlistId: playlist.id, videoCount: extractNumberFromString(playlist.video_count.text) } @@ -742,7 +892,7 @@ export function parseLocalTextRuns(runs, emojiSize = 16, options = { looseChanne case 'WEB_PAGE_TYPE_CHANNEL': { const trimmedText = text.trim() // In comments, mention can be `@Channel Name` (not handle, but name) - if (CHANNEL_HANDLE_REGEX.test(trimmedText) || (options.looseChannelNameDetection && trimmedText.startsWith('@'))) { + if (CHANNEL_HANDLE_REGEX.test(trimmedText) || options.looseChannelNameDetection) { // Note that in regex `\s` must be used since the text contain non-default space (the half-width space char when we press spacebar) const spacesBefore = (spacesBeforeRegex.exec(text) || [''])[0] const spacesAfter = (spacesAfterRegex.exec(text) || [''])[0] diff --git a/src/renderer/helpers/utils.js b/src/renderer/helpers/utils.js index 0a4f3d5a8489e..4fde63b77c033 100644 --- a/src/renderer/helpers/utils.js +++ b/src/renderer/helpers/utils.js @@ -616,9 +616,10 @@ export function getVideoParamsFromUrl(url) { /** * This will match sequences of upper case characters and convert them into title cased words. + * This will also match excessive strings of punctionation and convert them to one representative character * @param {string} title the title to process * @param {number} minUpperCase the minimum number of consecutive upper case characters to match - * @returns {string} the title with upper case characters removed + * @returns {string} the title with upper case characters removed and punctuation normalized */ export function toDistractionFreeTitle(title, minUpperCase = 3) { const firstValidCharIndex = (word) => { @@ -634,7 +635,10 @@ export function toDistractionFreeTitle(title, minUpperCase = 3) { } const reg = RegExp(`[\\p{Lu}|']{${minUpperCase},}`, 'ug') - return title.replace(reg, x => capitalizedWord(x.toLowerCase())) + return title + .replaceAll(/!{2,}/g, '!') + .replaceAll(/[!?]{2,}/g, '?') + .replace(reg, x => capitalizedWord(x.toLowerCase())) } export function formatNumber(number, options = undefined) { diff --git a/src/renderer/store/modules/invidious.js b/src/renderer/store/modules/invidious.js index c104ccf09741b..b7b9aa41431f3 100644 --- a/src/renderer/store/modules/invidious.js +++ b/src/renderer/store/modules/invidious.js @@ -1,5 +1,4 @@ import fs from 'fs/promises' -import { pathExists } from '../../helpers/filesystem' import { createWebURL, fetchWithTimeout } from '../../helpers/utils' const state = { @@ -40,6 +39,7 @@ const actions = { console.error(err) } } + // If the invidious instance fetch isn't returning anything interpretable if (instances.length === 0) { // Fallback: read from static file @@ -47,15 +47,13 @@ const actions = { /* eslint-disable-next-line n/no-path-concat */ const fileLocation = process.env.NODE_ENV === 'development' ? './static/' : `${__dirname}/static/` const filePath = `${fileLocation}${fileName}` - if (!process.env.IS_ELECTRON || await pathExists(filePath)) { - console.warn('reading static file for invidious instances') - const fileData = process.env.IS_ELECTRON ? await fs.readFile(filePath, 'utf8') : await (await fetch(createWebURL(filePath))).text() - instances = JSON.parse(fileData).filter(e => { - return process.env.IS_ELECTRON || e.cors - }).map(e => { - return e.url - }) - } + console.warn('reading static file for invidious instances') + const fileData = process.env.IS_ELECTRON ? await fs.readFile(filePath, 'utf8') : await (await fetch(createWebURL(filePath))).text() + instances = JSON.parse(fileData).filter(e => { + return process.env.IS_ELECTRON || e.cors + }).map(e => { + return e.url + }) } commit('setInvidiousInstancesList', instances) }, diff --git a/src/renderer/store/modules/settings.js b/src/renderer/store/modules/settings.js index 27c37dffd1d0d..9e561418c48b4 100644 --- a/src/renderer/store/modules/settings.js +++ b/src/renderer/store/modules/settings.js @@ -289,7 +289,7 @@ const state = { videoPlaybackRateInterval: 0.25, downloadAskPath: true, downloadFolderPath: '', - downloadBehavior: 'download', + downloadBehavior: 'open', enableScreenshot: false, screenshotFormat: 'png', screenshotQuality: 95, diff --git a/src/renderer/store/modules/subscriptions.js b/src/renderer/store/modules/subscriptions.js index 76f34bcb993cb..c851684238731 100644 --- a/src/renderer/store/modules/subscriptions.js +++ b/src/renderer/store/modules/subscriptions.js @@ -54,6 +54,10 @@ const actions = { commit('updateShortsCacheByChannel', payload) }, + updateSubscriptionShortsCacheWithChannelPageShorts: ({ commit }, payload) => { + commit('updateShortsCacheWithChannelPageShorts', payload) + }, + updateSubscriptionLiveCacheByChannel: ({ commit }, payload) => { commit('updateLiveCacheByChannel', payload) }, @@ -86,6 +90,31 @@ const mutations = { if (videos != null) { newObject.videos = videos } state.shortsCache[channelId] = newObject }, + updateShortsCacheWithChannelPageShorts(state, { channelId, videos }) { + const cachedObject = state.shortsCache[channelId] + + if (cachedObject && cachedObject.videos.length > 0) { + cachedObject.videos.forEach(cachedVideo => { + const channelVideo = videos.find(short => cachedVideo.videoId === short.videoId) + + if (channelVideo) { + // authorId probably never changes, so we don't need to update that + + cachedVideo.title = channelVideo.title + cachedVideo.author = channelVideo.author + + // as the channel shorts page only has compact view counts for numbers above 1000 e.g. 12k + // and the RSS feeds include an exact value, we only want to overwrite it when the number is larger than the cached value + // 12345 vs 12000 => 12345 + // 12345 vs 15000 => 15000 + + if (channelVideo.viewCount > cachedVideo.viewCount) { + cachedVideo.viewCount = channelVideo.viewCount + } + } + }) + } + }, clearShortsCache(state) { state.shortsCache = {} }, diff --git a/src/renderer/store/modules/utils.js b/src/renderer/store/modules/utils.js index 428c92e69ac73..243520044a821 100644 --- a/src/renderer/store/modules/utils.js +++ b/src/renderer/store/modules/utils.js @@ -358,14 +358,10 @@ const actions = { }, async getRegionData ({ commit }, { locale }) { - let localePathExists + const localePathExists = process.env.GEOLOCATION_NAMES.includes(locale) // Exclude __dirname from path if not in electron const fileLocation = `${process.env.IS_ELECTRON ? process.env.NODE_ENV === 'development' ? '.' : __dirname : ''}/static/geolocations/` - if (process.env.IS_ELECTRON) { - localePathExists = await pathExists(`${fileLocation}${locale}.json`) - } else { - localePathExists = process.env.GEOLOCATION_NAMES.includes(locale) - } + const pathName = `${fileLocation}${localePathExists ? locale : 'en-US'}.json` const countries = process.env.IS_ELECTRON ? JSON.parse(await fs.readFile(pathName)) : await (await fetch(createWebURL(pathName))).json() @@ -601,15 +597,10 @@ const actions = { async getExternalPlayerCmdArgumentsData ({ commit }, payload) { const fileName = 'external-player-map.json' - let fileData /* eslint-disable-next-line n/no-path-concat */ const fileLocation = process.env.NODE_ENV === 'development' ? './static/' : `${__dirname}/static/` - if (await pathExists(`${fileLocation}${fileName}`)) { - fileData = await fs.readFile(`${fileLocation}${fileName}`) - } else { - fileData = '[{"name":"None","value":"","cmdArguments":null}]' - } + const fileData = await fs.readFile(`${fileLocation}${fileName}`) const externalPlayerMap = JSON.parse(fileData).map((entry) => { return { name: entry.name, nameTranslationKey: entry.nameTranslationKey, value: entry.value, cmdArguments: entry.cmdArguments } diff --git a/src/renderer/themes.css b/src/renderer/themes.css index 0e6ddecf4a285..fd100cc5f5f2f 100644 --- a/src/renderer/themes.css +++ b/src/renderer/themes.css @@ -5,7 +5,8 @@ .dracula, .catppuccinMocha, .pastelPink, -.hotPink { +.hotPink, +.nordic { --primary-input-color: rgba(0, 0, 0, 0.50); } @@ -15,7 +16,8 @@ .dracula, .catppuccinMocha, .pastelPink, -.hotPink { +.hotPink, +.nordic { --link-color: var(--accent-color); --link-visited-color: var(--accent-color-visited); --instance-menu-color: var(--search-bar-color); @@ -27,7 +29,8 @@ .gray, .dracula, .catppuccinMocha, -.pastelPink { +.pastelPink, +.nordic { --primary-input-color: rgba(0, 0, 0, 0.50); --side-nav-hover-text-color: var(--primary-text-color); } @@ -37,7 +40,8 @@ .black, .gray, .dracula, -.catppuccinMocha { +.catppuccinMocha, +.nordic { --side-nav-active-text-color: var(--primary-text-color); --scrollbar-text-color-hover: var(--primary-text-color); @@ -56,7 +60,8 @@ .gray, .dracula, .catppuccinMocha, -.hotPink { +.hotPink, +.nordic { --primary-shadow-color: rgba(0, 0, 0, 0.75); } @@ -237,6 +242,25 @@ it can be safely elided. This looks quite pleasant on this theme. */ text-decoration: underline; } +.nordic { + --primary-text-color: #EEEEEE; + --secondary-text-color: #ddd; + --tertiary-text-color: #EEEEEE; + --title-color: #EEEEEE; + --bg-color: #2b2f3a; + --favorite-icon-color: #FFEA00; + --card-bg-color: #2e3440; + --secondary-card-bg-color: rgba(59, 66, 82, 0.75); + --scrollbar-color: #4b566a; + --scrollbar-color-hover: #4b566a; + --side-nav-color: #2e3440; + --side-nav-hover-color: #3b4252; + --side-nav-active-color: #3b4252; + --search-bar-color: #4b566a; + --logo-icon: url("../../_icons/iconNordicLightSmall.png"); + --logo-text: url("../../_icons/textNordicLightSmall.png"); +} + .mainRed, .mainPink, .mainPurple, diff --git a/src/renderer/views/Channel/Channel.css b/src/renderer/views/Channel/Channel.css index e2b9b521360b6..a1324d2bb8237 100644 --- a/src/renderer/views/Channel/Channel.css +++ b/src/renderer/views/Channel/Channel.css @@ -217,6 +217,23 @@ } } +@media only screen and (max-width: 680px) { + .channelInfo { + flex-direction: column; + margin-block: 20px 10px; + } + .card { + max-inline-size: none; + inline-size: 100%; + } + .channelInfoActionsContainer { + flex-direction: row-reverse; + justify-content: left; + gap: 10px; + margin-block-start: 5px; + } +} + @media only screen and (max-width: 400px) { .channelInfo { justify-content: center; @@ -224,7 +241,11 @@ } .channelInfoActionsContainer { - flex-direction: column-reverse; + justify-content: center; + } + + .channelLineContainer { + padding-inline-start: 0; } .thumbnailContainer { diff --git a/src/renderer/views/Channel/Channel.js b/src/renderer/views/Channel/Channel.js index 9b5171584c099..3c33f4b508569 100644 --- a/src/renderer/views/Channel/Channel.js +++ b/src/renderer/views/Channel/Channel.js @@ -26,6 +26,7 @@ import { import { getLocalChannel, getLocalChannelId, + parseLocalChannelHeader, parseLocalChannelShorts, parseLocalChannelVideos, parseLocalCommunityPosts, @@ -33,6 +34,10 @@ import { parseLocalListVideo, parseLocalSubscriberCount } from '../../helpers/api/local' +import { + addPublishedDatesInvidious, + addPublishedDatesLocal +} from '../../helpers/subscriptions' export default defineComponent({ name: 'Channel', @@ -172,6 +177,13 @@ export default defineComponent({ return this.subscriptionInfo !== null }, + isSubscribedInAnyProfile: function () { + const profileList = this.$store.getters.getProfileList + + // check the all channels profile + return profileList[0].subscriptions.some((channel) => channel.id === this.id) + }, + videoLiveSelectNames: function () { return [ this.$t('Channel.Videos.Sort Types.Newest'), @@ -534,90 +546,22 @@ export default defineComponent({ return } - let channelId - let subscriberText = null - let tags = [] - - switch (channel.header.type) { - case 'C4TabbedHeader': { - // example: Linus Tech Tips - // https://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw - - /** - * @type {import('youtubei.js').YTNodes.C4TabbedHeader} - */ - const header = channel.header - - channelId = header.author.id - channelName = header.author.name - channelThumbnailUrl = header.author.best_thumbnail.url - subscriberText = header.subscribers?.text - break - } - case 'CarouselHeader': { - // examples: Music and YouTube Gaming - // https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ - // https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg - - /** - * @type {import('youtubei.js').YTNodes.CarouselHeader} - */ - const header = channel.header - - /** - * @type {import('youtubei.js').YTNodes.TopicChannelDetails} - */ - const topicChannelDetails = header.contents.find(node => node.type === 'TopicChannelDetails') - channelName = topicChannelDetails.title.text - subscriberText = topicChannelDetails.subtitle.text - channelThumbnailUrl = topicChannelDetails.avatar[0].url - - if (channel.metadata.external_id) { - channelId = channel.metadata.external_id - } else { - channelId = topicChannelDetails.subscribe_button.channel_id - } - break - } - case 'InteractiveTabbedHeader': { - // example: Minecraft - Topic - // https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg - - /** - * @type {import('youtubei.js').YTNodes.InteractiveTabbedHeader} - */ - const header = channel.header - channelName = header.title.text - channelId = this.id - channelThumbnailUrl = header.box_art.at(-1).url - - const badges = header.badges.map(badge => badge.label).filter(tag => tag) - tags.push(...badges) - break - } - case 'PageHeader': { - // example: YouTube Gaming (an A/B test at the time of writing) - // https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg + const parsedHeader = parseLocalChannelHeader(channel) - /** - * @type {import('youtubei.js').YTNodes.PageHeader} - */ - const header = channel.header + const channelId = parsedHeader.id ?? this.id + const subscriberText = parsedHeader.subscriberText ?? null + let tags = parsedHeader.tags - channelName = header.content.title.text - channelThumbnailUrl = header.content.image.image[0].url - channelId = this.id + channelThumbnailUrl = parsedHeader.thumbnailUrl ?? this.subscriptionInfo?.thumbnail + channelName = parsedHeader.name ?? this.subscriptionInfo?.name - break - } - } - - if (channelThumbnailUrl.startsWith('//')) { + if (channelThumbnailUrl?.startsWith('//')) { channelThumbnailUrl = `https:${channelThumbnailUrl}` } this.channelName = channelName this.thumbnailUrl = channelThumbnailUrl + this.bannerUrl = parsedHeader.bannerUrl ?? null this.isFamilyFriendly = !!channel.metadata.is_family_safe if (channel.metadata.tags) { @@ -648,12 +592,6 @@ export default defineComponent({ this.updateSubscriptionDetails({ channelThumbnailUrl, channelName, channelId }) - if (channel.header.banner?.length > 0) { - this.bannerUrl = channel.header.banner[0].url - } else { - this.bannerUrl = null - } - let relatedChannels = channel.channels.map(({ author }) => ({ name: author.name, id: author.id, @@ -839,9 +777,20 @@ export default defineComponent({ return } - this.latestVideos = parseLocalChannelVideos(videosTab.videos, channel.header.author) + this.latestVideos = parseLocalChannelVideos(videosTab.videos, this.id, this.channelName) this.videoContinuationData = videosTab.has_continuation ? videosTab : null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && this.latestVideos.length > 0 && this.videoSortBy === 'newest') { + addPublishedDatesLocal(this.latestVideos) + this.updateSubscriptionVideosCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, the store will get angry at us for modifying it outside of the store, + // when the user clicks load more + videos: [...this.latestVideos] + }) + } } catch (err) { console.error(err) const errorMessage = this.$t('Local API Error (Click to copy)') @@ -864,7 +813,7 @@ export default defineComponent({ */ const continuation = await this.videoContinuationData.getContinuation() - this.latestVideos = this.latestVideos.concat(parseLocalChannelVideos(continuation.videos, this.channelInstance.header.author)) + this.latestVideos = this.latestVideos.concat(parseLocalChannelVideos(continuation.videos, this.id, this.channelName)) this.videoContinuationData = continuation.has_continuation ? continuation : null } catch (err) { console.error(err) @@ -897,9 +846,19 @@ export default defineComponent({ return } - this.latestShorts = parseLocalChannelShorts(shortsTab.videos, channel.header.author) + this.latestShorts = parseLocalChannelShorts(shortsTab.videos, this.id, this.channelName) this.shortContinuationData = shortsTab.has_continuation ? shortsTab : null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && this.latestShorts.length > 0 && this.shortSortBy === 'newest') { + // As the shorts tab API response doesn't include the published dates, + // we can't just write the results to the subscriptions cache like we do with videos and live (can't sort chronologically without the date). + // However we can still update the metadata in the cache such as the view count and title that might have changed since it was cached + this.updateSubscriptionShortsCacheWithChannelPageShorts({ + channelId: this.id, + videos: this.latestShorts + }) + } } catch (err) { console.error(err) const errorMessage = this.$t('Local API Error (Click to copy)') @@ -922,7 +881,7 @@ export default defineComponent({ */ const continuation = await this.shortContinuationData.getContinuation() - this.latestShorts.push(...parseLocalChannelShorts(continuation.videos, this.channelInstance.header.author)) + this.latestShorts.push(...parseLocalChannelShorts(continuation.videos, this.id, this.channelName)) this.shortContinuationData = continuation.has_continuation ? continuation : null } catch (err) { console.error(err) @@ -955,9 +914,20 @@ export default defineComponent({ return } - this.latestLive = parseLocalChannelVideos(liveTab.videos, channel.header.author) + this.latestLive = parseLocalChannelVideos(liveTab.videos, this.id, this.channelName) this.liveContinuationData = liveTab.has_continuation ? liveTab : null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && this.latestLive.length > 0 && this.liveSortBy === 'newest') { + addPublishedDatesLocal(this.latestLive) + this.updateSubscriptionLiveCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, the store will get angry at us for modifying it outside of the store, + // when the user clicks load more + videos: [...this.latestLive] + }) + } } catch (err) { console.error(err) const errorMessage = this.$t('Local API Error (Click to copy)') @@ -980,7 +950,7 @@ export default defineComponent({ */ const continuation = await this.liveContinuationData.getContinuation() - this.latestLive.push(...parseLocalChannelVideos(continuation.videos, this.channelInstance.header.author)) + this.latestLive.push(...parseLocalChannelVideos(continuation.videos, this.id, this.channelName)) this.liveContinuationData = continuation.has_continuation ? continuation : null } catch (err) { console.error(err) @@ -1127,6 +1097,16 @@ export default defineComponent({ } this.videoContinuationData = response.continuation || null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && !more && this.latestVideos.length > 0 && this.videoSortBy === 'newest') { + addPublishedDatesInvidious(this.latestVideos) + this.updateSubscriptionVideosCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, it will also contain all the next pages + videos: [...this.latestVideos] + }) + } }).catch((err) => { console.error(err) const errorMessage = this.$t('Invidious API Error (Click to copy)') @@ -1176,6 +1156,17 @@ export default defineComponent({ } this.shortContinuationData = response.continuation || null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && !more && this.latestShorts.length > 0 && this.shortSortBy === 'newest') { + // As the shorts tab API response doesn't include the published dates, + // we can't just write the results to the subscriptions cache like we do with videos and live (can't sort chronologically without the date). + // However we can still update the metadata in the cache e.g. adding the duration, as that isn't included in the RSS feeds + // and updating the view count and title that might have changed since it was cached + this.updateSubscriptionShortsCacheWithChannelPageShorts({ + channelId: this.id, + videos: this.latestShorts + }) + } }).catch((err) => { console.error(err) const errorMessage = this.$t('Invidious API Error (Click to copy)') @@ -1217,6 +1208,17 @@ export default defineComponent({ } this.liveContinuationData = response.continuation || null this.isElementListLoading = false + + if (this.isSubscribedInAnyProfile && !more && this.latestLive.length > 0 && this.liveSortBy === 'newest') { + addPublishedDatesInvidious(this.latestLive) + this.updateSubscriptionLiveCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, the store will get angry at us for modifying it outside of the store, + // when the user clicks load more + videos: [...this.latestLive] + }) + } }).catch((err) => { console.error(err) const errorMessage = this.$t('Invidious API Error (Click to copy)') @@ -1272,7 +1274,7 @@ export default defineComponent({ return } - this.latestPlaylists = playlistsTab.playlists.map(playlist => parseLocalListPlaylist(playlist, channel.header.author)) + this.latestPlaylists = playlistsTab.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.playlistContinuationData = playlistsTab.has_continuation ? playlistsTab : null this.isElementListLoading = false } catch (err) { @@ -1297,7 +1299,7 @@ export default defineComponent({ */ const continuation = await this.playlistContinuationData.getContinuation() - const parsedPlaylists = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.channelInstance.header.author)) + const parsedPlaylists = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.latestPlaylists = this.latestPlaylists.concat(parsedPlaylists) this.playlistContinuationData = continuation.has_continuation ? continuation : null } catch (err) { @@ -1395,7 +1397,7 @@ export default defineComponent({ return } - this.latestReleases = releaseTab.playlists.map(playlist => parseLocalListPlaylist(playlist, channel.header.author)) + this.latestReleases = releaseTab.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.releaseContinuationData = releaseTab.has_continuation ? releaseTab : null this.isElementListLoading = false } catch (err) { @@ -1420,7 +1422,7 @@ export default defineComponent({ */ const continuation = await this.releaseContinuationData.getContinuation() - const parsedReleases = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.channelInstance.header.author)) + const parsedReleases = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.latestReleases = this.latestReleases.concat(parsedReleases) this.releaseContinuationData = continuation.has_continuation ? continuation : null } catch (err) { @@ -1508,7 +1510,7 @@ export default defineComponent({ return } - this.latestPodcasts = podcastTab.playlists.map(playlist => parseLocalListPlaylist(playlist, channel.header.author)) + this.latestPodcasts = podcastTab.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.podcastContinuationData = podcastTab.has_continuation ? podcastTab : null this.isElementListLoading = false } catch (err) { @@ -1519,7 +1521,7 @@ export default defineComponent({ }) if (this.backendPreference === 'local' && this.backendFallback) { showToast(this.$t('Falling back to Invidious API')) - this.getChannelPodcastsInvidious() + this.channelInvidiousPodcasts() } else { this.isLoading = false } @@ -1533,7 +1535,7 @@ export default defineComponent({ */ const continuation = await this.podcastContinuationData.getContinuation() - const parsedPodcasts = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.channelInstance.header.author)) + const parsedPodcasts = continuation.playlists.map(playlist => parseLocalListPlaylist(playlist, this.id, this.channelName)) this.latestPodcasts = this.latestPodcasts.concat(parsedPodcasts) this.releaseContinuationData = continuation.has_continuation ? continuation : null } catch (err) { @@ -1634,6 +1636,19 @@ export default defineComponent({ this.latestCommunityPosts = parseLocalCommunityPosts(posts) this.communityContinuationData = communityTab.has_continuation ? communityTab : null + + if (this.latestCommunityPosts.length > 0) { + this.latestCommunityPosts.forEach(post => { + post.authorId = this.id + }) + this.updateSubscriptionPostsCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, the store will get angry at us for modifying it outside of the store, + // when the user clicks load more + posts: [...this.latestCommunityPosts] + }) + } } catch (err) { console.error(err) const errorMessage = this.$t('Local API Error (Click to copy)') @@ -1685,6 +1700,19 @@ export default defineComponent({ this.latestCommunityPosts = posts } this.communityContinuationData = continuation + + if (this.isSubscribedInAnyProfile && !more && this.latestCommunityPosts.length > 0) { + this.latestCommunityPosts.forEach(post => { + post.authorId = this.id + }) + this.updateSubscriptionPostsCacheByChannel({ + channelId: this.id, + // create a copy so that we only cache the first page + // if we use the same array, the store will get angry at us for modifying it outside of the store, + // when the user clicks load more + posts: [...this.latestCommunityPosts] + }) + } }).catch(async (err) => { console.error(err) const errorMessage = this.$t('Invidious API Error (Click to copy)') @@ -1859,7 +1887,7 @@ export default defineComponent({ if (item.type === 'Video') { return parseLocalListVideo(item) } else { - return parseLocalListPlaylist(item, this.channelInstance.header.author) + return parseLocalListPlaylist(item, this.id, this.channelName) } }) @@ -1924,7 +1952,11 @@ export default defineComponent({ ...mapActions([ 'showOutlines', - 'updateSubscriptionDetails' + 'updateSubscriptionDetails', + 'updateSubscriptionVideosCacheByChannel', + 'updateSubscriptionLiveCacheByChannel', + 'updateSubscriptionShortsCacheWithChannelPageShorts', + 'updateSubscriptionPostsCacheByChannel' ]) } }) diff --git a/src/renderer/views/Channel/Channel.vue b/src/renderer/views/Channel/Channel.vue index 59c2f0230b39d..83d79062c8801 100644 --- a/src/renderer/views/Channel/Channel.vue +++ b/src/renderer/views/Channel/Channel.vue @@ -421,7 +421,7 @@
diff --git a/src/renderer/views/Playlist/Playlist.js b/src/renderer/views/Playlist/Playlist.js index 768ee8fc5e8ba..e4fcb162bfdc2 100644 --- a/src/renderer/views/Playlist/Playlist.js +++ b/src/renderer/views/Playlist/Playlist.js @@ -62,6 +62,9 @@ export default defineComponent({ getPlaylistInfoDebounce: function() {}, playlistInEditMode: false, + playlistInVideoSearchMode: false, + videoSearchQuery: '', + promptOpen: false, } }, @@ -106,7 +109,7 @@ export default defineComponent({ moreVideoDataAvailable() { if (this.isUserPlaylistRequested) { - return this.userPlaylistVisibleLimit < this.videoCount + return this.userPlaylistVisibleLimit < this.sometimesFilteredUserPlaylistItems.length } else { return this.continuationData !== null } @@ -125,17 +128,29 @@ export default defineComponent({ return this.selectedUserPlaylist?._id !== this.quickBookmarkPlaylistId }, + sometimesFilteredUserPlaylistItems() { + if (!this.isUserPlaylistRequested) { return this.playlistItems } + if (this.processedVideoSearchQuery === '') { return this.playlistItems } + + return this.playlistItems.filter((v) => { + return v.title.toLowerCase().includes(this.processedVideoSearchQuery) + }) + }, visiblePlaylistItems: function () { if (!this.isUserPlaylistRequested) { + // No filtering for non user playlists yet return this.playlistItems } - if (this.userPlaylistVisibleLimit < this.videoCount) { - return this.playlistItems.slice(0, this.userPlaylistVisibleLimit) + if (this.userPlaylistVisibleLimit < this.sometimesFilteredUserPlaylistItems.length) { + return this.sometimesFilteredUserPlaylistItems.slice(0, this.userPlaylistVisibleLimit) } else { - return this.playlistItems + return this.sometimesFilteredUserPlaylistItems } - } + }, + processedVideoSearchQuery() { + return this.videoSearchQuery.trim().toLowerCase() + }, }, watch: { $route () { @@ -271,7 +286,7 @@ export default defineComponent({ const dateString = new Date(result.updated * 1000) this.lastUpdated = dateString.toLocaleDateString(this.currentLocale, { year: 'numeric', month: 'short', day: 'numeric' }) - this.allPlaylistItems = result.videos + this.playlistItems = result.videos this.isLoading = false }).catch((err) => { diff --git a/src/renderer/views/Playlist/Playlist.scss b/src/renderer/views/Playlist/Playlist.scss index e8c2b7681d952..939f3a5cc4a5c 100644 --- a/src/renderer/views/Playlist/Playlist.scss +++ b/src/renderer/views/Playlist/Playlist.scss @@ -7,7 +7,6 @@ box-sizing: border-box; block-size: calc(100vh - 132px); margin-inline-end: 1em; - overflow-y: auto; padding: 10px; position: sticky; inset-block-start: 96px; diff --git a/src/renderer/views/Playlist/Playlist.vue b/src/renderer/views/Playlist/Playlist.vue index 69fca4917c3ca..0f030d676a69a 100644 --- a/src/renderer/views/Playlist/Playlist.vue +++ b/src/renderer/views/Playlist/Playlist.vue @@ -28,6 +28,9 @@ }" @enter-edit-mode="playlistInEditMode = true" @exit-edit-mode="playlistInEditMode = false" + @search-video-mode-on="playlistInVideoSearchMode = true" + @search-video-mode-off="playlistInVideoSearchMode = false" + @search-video-query-change="(v) => videoSearchQuery = v" @prompt-open="promptOpen = true" @prompt-close="promptOpen = false" /> @@ -39,51 +42,62 @@ + - -
+

+ {{ $t("User Playlists['Empty Search Message']") }} +

+
- @@ -186,6 +186,7 @@ User Playlists: Save: حفظ Search in Playlists: البحث في قوائم التشغيل N playlists selected: تم تحديد {playlistCount} + Added {count} Times: تمت إضافة {count} الوقت | تمت إضافة {count} مرة CreatePlaylistPrompt: Toast: There is already a playlist with this name. Please pick a different name.: توجد @@ -276,6 +277,7 @@ Settings: Catppuccin Mocha: كاتبوتشين موكا Pastel Pink: الباستيل الوردي Hot Pink: وردي فاقع + Nordic: بلدان الشمال الأوروبي Main Color Theme: Main Color Theme: 'لون السِمة الأساسي' Red: 'أحمر' @@ -517,8 +519,8 @@ Settings: Hide Upcoming Premieres: إخفاء العروض الأولى القادمة Hide Channels: إخفاء مقاطع الفيديو من القنوات Hide Channels Placeholder: معرف القناة - Display Titles Without Excessive Capitalisation: عرض العناوين بدون احرف كبيرة - بشكل مفرط + Display Titles Without Excessive Capitalisation: عرض العناوين بدون استخدام الأحرف + الكبيرة وعلامات الترقيم بشكل مفرط Hide Featured Channels: إخفاء القنوات المميزة Hide Channel Playlists: إخفاء قوائم تشغيل القناة Hide Channel Community: إخفاء مجتمع القناة @@ -930,6 +932,7 @@ Video: Pause on Current Video: توقف مؤقتًا على الفيديو الحالي Unhide Channel: عرض القناة Hide Channel: إخفاء القناة + More Options: المزيد من الخيارات Videos: #& Sort By Sort By: @@ -1006,7 +1009,7 @@ Up Next: 'التالي' Local API Error (Click to copy): 'خطأ API المحلي (انقر للنسخ)' Invidious API Error (Click to copy): 'خطأ Invidious API ( انقر للنسخ)' Falling back to Invidious API: 'التراجع إلى Invidious API' -Falling back to the local API: 'التراجع إلى API المحلي' +Falling back to Local API: 'التراجع إلى API المحلي' Subscriptions have not yet been implemented: 'لم يتم تنفيذ الاشتراكات بعد' Loop is now disabled: 'تم تعطيل التكرار' Loop is now enabled: 'تم تمكين التكرار' @@ -1130,11 +1133,6 @@ Starting download: بدء تنزيل "{videoTitle}" Screenshot Success: تم حفظ لقطة الشاشة كا"{filePath}" Screenshot Error: فشل أخذ لقطة للشاشة. {error} New Window: نافذة جديدة -Age Restricted: - Type: - Channel: القناة - Video: فيديو - This {videoOrPlaylist} is age restricted: 'هذا {videoOrPlaylist} مقيد بالعمر' Channels: Count: تم العثور على قناة (قنوات) {number}. Unsubscribed: 'تمت إزالة {channelName} من اشتراكاتك' @@ -1171,3 +1169,7 @@ Trimmed input must be at least N characters long: يجب أن يكون طول ا حرفًا واحدًا على الأقل | يجب أن يبلغ طول الإدخال المقتطع {length} من الأحرف على الأقل Tag already exists: العلامة "{tagName}" موجودة بالفعل +Age Restricted: + This channel is age restricted: هذه القناة مقيدة بالعمر + This video is age restricted: هذا الفيديو مقيد بالفئة العمرية +Close Banner: إغلاق الشعار diff --git a/static/locales/be.yaml b/static/locales/be.yaml index de57d1d0a21d3..8473113723766 100644 --- a/static/locales/be.yaml +++ b/static/locales/be.yaml @@ -813,7 +813,7 @@ Tooltips: Local API Error (Click to copy): '' Invidious API Error (Click to copy): '' Falling back to Invidious API: '' -Falling back to the local API: '' +Falling back to Local API: '' This video is unavailable because of missing formats. This can happen due to country unavailability.: '' Subscriptions have not yet been implemented: '' Unknown YouTube url type, cannot be opened in app: '' @@ -833,11 +833,6 @@ Canceled next video autoplay: '' Default Invidious instance has been set to {instance}: '' Default Invidious instance has been cleared: '' 'The playlist has ended. Enable loop to continue playing': '' -Age Restricted: - This {videoOrPlaylist} is age restricted: '' - Type: - Channel: '' - Video: '' External link opening has been disabled in the general settings: '' Downloading has completed: '' Starting download: '' diff --git a/static/locales/bg.yaml b/static/locales/bg.yaml index cde9c8a377987..e0454b566edf5 100644 --- a/static/locales/bg.yaml +++ b/static/locales/bg.yaml @@ -1023,7 +1023,7 @@ Up Next: 'Следващ' Local API Error (Click to copy): 'Грешка в локалния интерфейс (щракнете за копиране)' Invidious API Error (Click to copy): 'Грешка в Invidious интерфейса (щракнете за копиране)' Falling back to Invidious API: 'Връщане към Invidious интерфейса' -Falling back to the local API: 'Връщане към локалния интерфейс' +Falling back to Local API: 'Връщане към локалния интерфейс' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Видеото не е достъпно поради липсващи формати. Това може да се дължи на ограничен достъп за страната.' @@ -1148,12 +1148,6 @@ Downloading failed: Имаше проблем при изтеглянето на Screenshot Error: Снимката на екрана е неуспешна. {error} Screenshot Success: Запазена снимка на екрана като "{filePath}" New Window: Нов прозорец -Age Restricted: - This {videoOrPlaylist} is age restricted: Този {videoOrPlaylist} е с възрастово - ограничение - Type: - Channel: Канал - Video: Видео Channels: Count: Намерени са {number} канала. Unsubscribe: Отписване diff --git a/static/locales/bn.yaml b/static/locales/bn.yaml index 8288ad17422eb..82cb20befde09 100644 --- a/static/locales/bn.yaml +++ b/static/locales/bn.yaml @@ -135,10 +135,6 @@ External link opening has been disabled in the general settings: সাধার বহিঃসংযোগ খোলা নিষ্ক্রিয় রাখা হয়েছে Are you sure you want to open this link?: তুমি কি এই সংযোগটি খোলার ব্যাপারে নিশ্চিত? Preferences: পছন্দসমূহ -Age Restricted: - Type: - Channel: চ্যানেল - Video: ভিডিও Most Popular: অতিপরিচিত Channels: Search bar placeholder: চ্যানেল খুঁজুন diff --git a/static/locales/ckb.yaml b/static/locales/ckb.yaml index dbde21cea041a..10df3f5a8a224 100644 --- a/static/locales/ckb.yaml +++ b/static/locales/ckb.yaml @@ -829,7 +829,7 @@ Tooltips: Local API Error (Click to copy): '' Invidious API Error (Click to copy): '' Falling back to Invidious API: '' -Falling back to the local API: '' +Falling back to Local API: '' This video is unavailable because of missing formats. This can happen due to country unavailability.: '' Subscriptions have not yet been implemented: '' Unknown YouTube url type, cannot be opened in app: '' @@ -849,11 +849,6 @@ Canceled next video autoplay: '' Default Invidious instance has been set to {instance}: '' Default Invidious instance has been cleared: '' 'The playlist has ended. Enable loop to continue playing': '' -Age Restricted: - This {videoOrPlaylist} is age restricted: '' - Type: - Channel: 'کەناڵ' - Video: 'ڤیدیۆ' External link opening has been disabled in the general settings: '' Downloading has completed: '' Starting download: '' diff --git a/static/locales/cs.yaml b/static/locales/cs.yaml index fab5bbc22d745..386b60ddbb639 100644 --- a/static/locales/cs.yaml +++ b/static/locales/cs.yaml @@ -146,6 +146,7 @@ User Playlists: Select a playlist to add your N videos to: Vyberte playlist, do kterého přidat vaše video | Vyberte playlist, do kterého přidat vašich {videoCount} videí N playlists selected: Vybráno {playlistCount} + Added {count} Times: Přidáno {count}krát | Přidáno {count}krát SinglePlaylistView: Toast: There were no videos to remove.: Nejsou zde žádná videa k odstranění. @@ -234,7 +235,7 @@ Settings: General Settings: General Settings: 'Obecné nastavení' Check for Updates: 'Kontrolovat aktualizace' - Check for Latest Blog Posts: 'Kontrolovat nejnovější příspěvky blogů' + Check for Latest Blog Posts: 'Kontrolovat nejnovější příspěvky na blogu' Fallback to Non-Preferred Backend on Failure: 'Při chybě přepnout na nepreferovaný backend' Enable Search Suggestions: 'Zapnout návrhy vyhledávání' @@ -292,6 +293,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Hot Pink: Horká růžová Pastel Pink: Pastelově růžová + Nordic: Nordic Main Color Theme: Main Color Theme: 'Hlavní barva motivu' Red: 'Červená' @@ -443,7 +445,7 @@ Settings: Hide Channels: Skrýt videa z kanálů Hide Channels Placeholder: ID kanálu Display Titles Without Excessive Capitalisation: Zobrazit názvy bez nadměrného - použití velkých písmen + použití velkých písmen a interpunkce Hide Featured Channels: Skrýt doporučené kanály Hide Channel Playlists: Skrýt playlisty kanálu Hide Channel Community: Skrýt komunitu kanálu @@ -925,6 +927,7 @@ Video: Pause on Current Video: Pozastavit na současném videu Unhide Channel: Zobrazit kanál Hide Channel: Skrýt kanál + More Options: Další možnosti Videos: #& Sort By Sort By: @@ -1024,10 +1027,10 @@ Tooltips: otevřít ve FreeTube.\nVe výchozím nastavení otevře FreeTube odkaz ve vašem výchozím prohlížeči.\n" Player Settings: - Force Local Backend for Legacy Formats: 'Funguje pouze v případě, že je výchozím - nastavením API Invidious. Je-li povoleno, spustí se místní API a použije starší + Force Local Backend for Legacy Formats: 'Funguje pouze v případě, že je jako výchozí + nastaveno API Invidious. Je-li povoleno, spustí se místní API a použije starší formáty místo těch, které vrátí Invidious. Může pomoci, pokud videa z Invidious - nemohou být přehrána kvůli regionálnímu omezení.' + nemohou být přehrána z důvodu regionálních omezení.' Proxy Videos Through Invidious: 'Připojí se k Invidious, aby poskytoval videa namísto přímého připojení k YouTube. Toto přepíše předvolby API.' Default Video Format: 'Nastavte formáty použité při přehrávání videa. Formáty @@ -1089,7 +1092,7 @@ Tooltips: Local API Error (Click to copy): 'Chyba lokálního API (kliknutím zkopírujete)' Invidious API Error (Click to copy): 'Chyba Invidious API (kliknutím zkopírujete)' Falling back to Invidious API: 'Přepínám na Invidious API' -Falling back to the local API: 'Přepínám na lokální API' +Falling back to Local API: 'Přepínám na lokální API' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Toto video není k dispozici z důvodu chybějících formátů. K tomu může dojít z důvodu nedostupnosti země.' @@ -1128,11 +1131,6 @@ Downloading has completed: Bylo dokončeno stahování "{videoTitle}" Downloading failed: Došlo k problému při stahování "{videoTitle}" Starting download: Zahájení stahování "{videoTitle}" New Window: Nové okno -Age Restricted: - This {videoOrPlaylist} is age restricted: Toto {videoOrPlaylist} je omezeno věkem - Type: - Channel: kanál - Video: Video Channels: Channels: Kanály Title: Seznam kanálů @@ -1169,3 +1167,7 @@ Channel Unhidden: Kanál {channel} odebrán z filtrů kanálů Trimmed input must be at least N characters long: Oříznutý vstup musí být dlouhý alespoň 1 znak | Oříznutý vstup musí být dlouhý alespoň {length} znaků Tag already exists: Štítek „{tagName}“ již existuje +Close Banner: Zavřít panel +Age Restricted: + This channel is age restricted: Tento kanál je omezen věkem + This video is age restricted: Toto video je omezeno věkem diff --git a/static/locales/cy.yaml b/static/locales/cy.yaml index 922555bdab267..6f277d93c3d35 100644 --- a/static/locales/cy.yaml +++ b/static/locales/cy.yaml @@ -831,7 +831,7 @@ Tooltips: Local API Error (Click to copy): '' Invidious API Error (Click to copy): '' Falling back to Invidious API: '' -Falling back to the local API: '' +Falling back to Local API: '' This video is unavailable because of missing formats. This can happen due to country unavailability.: '' Subscriptions have not yet been implemented: '' Unknown YouTube url type, cannot be opened in app: '' @@ -851,11 +851,6 @@ Canceled next video autoplay: '' Default Invidious instance has been set to {instance}: '' Default Invidious instance has been cleared: '' 'The playlist has ended. Enable loop to continue playing': '' -Age Restricted: - This {videoOrPlaylist} is age restricted: '' - Type: - Channel: 'Sianel' - Video: 'Fideo' External link opening has been disabled in the general settings: '' Downloading has completed: '' Starting download: '' diff --git a/static/locales/da.yaml b/static/locales/da.yaml index ba0d7a074b3af..b38b566573cd2 100644 --- a/static/locales/da.yaml +++ b/static/locales/da.yaml @@ -769,7 +769,7 @@ Up Next: 'Næste' Local API Error (Click to copy): 'Lokal API-Fejl (Klik for at kopiere)' Invidious API Error (Click to copy): 'Invidious-API-Fejl (Klik for at kopiere)' Falling back to Invidious API: 'Falder tilbage til Invidious-API' -Falling back to the local API: 'Falder tilbage til den lokale API' +Falling back to Local API: 'Falder tilbage til den lokale API' Subscriptions have not yet been implemented: 'Abonnementer er endnu ikke blevet implementerede' Loop is now disabled: 'Gentagelse er nu deaktiveret' Loop is now enabled: 'Gentagelse er nu aktiveret' @@ -858,11 +858,6 @@ Default Invidious instance has been cleared: Standard Invidious-instans er bleve Are you sure you want to open this link?: Er du sikker på at du vil åbne dette link? Search Bar: Clear Input: Ryd Input -Age Restricted: - Type: - Video: Video - Channel: Kanal - This {videoOrPlaylist} is age restricted: Denne {videoOrPlaylist} er aldersbegrænset Downloading failed: Der var et problem med at downloade "{videoTitle}" Unknown YouTube url type, cannot be opened in app: Ukendt YouTube URL-type, kan ikke åbnes i appen diff --git a/static/locales/de-DE.yaml b/static/locales/de-DE.yaml index f67cb6fef43fc..74d8ce1291610 100644 --- a/static/locales/de-DE.yaml +++ b/static/locales/de-DE.yaml @@ -294,6 +294,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Hot Pink: Pink Pastel Pink: Pastellrosa + Nordic: Nordic Main Color Theme: Main Color Theme: Hauptfarbe des Farbschemas Red: Rot @@ -1013,7 +1014,7 @@ Up Next: Nächster Titel Local API Error (Click to copy): Lokaler API-Fehler (Zum Kopieren anklicken) Invidious API Error (Click to copy): Invidious-API-Fehler (Zum Kopieren anklicken) Falling back to Invidious API: Rückgriff auf Invidious-API -Falling back to the local API: Rückgriff auf lokale API +Falling back to Local API: Rückgriff auf lokale API This video is unavailable because of missing formats. This can happen due to country unavailability.: Dieses Video ist aufgrund fehlender Formate nicht verfügbar. Zugriffsbeschränkungen im Land kann dafür der Grund sein. @@ -1203,11 +1204,6 @@ Downloading failed: Beim Herunterladen von „{videoTitle}“ gab es ein Problem Screenshot Success: Bildschirmfoto als „{filePath}“ gespeichert Screenshot Error: Bildschirmfoto fehlgeschlagen. {error} New Window: Neues Fenster -Age Restricted: - Type: - Video: Video - Channel: Kanal - This {videoOrPlaylist} is age restricted: Dieses {videoOrPlaylist} ist altersbeschränkt Channels: Channels: Kanäle Title: Kanalliste @@ -1244,4 +1240,4 @@ Channel Unhidden: '{channel} wurde aus dem Kanalfilter entfernt' Trimmed input must be at least N characters long: Gekürzte Eingaben müssen mindestens 1 Zeichen lang sein | Gekürzte Eingaben müssen mindestens {length} Zeichen lang sein -Tag already exists: Der Tag "{tagName}" existiert bereits +Tag already exists: Die Markierung „{tagName}“ existiert bereits diff --git a/static/locales/el.yaml b/static/locales/el.yaml index 0c00398776d61..31e8a2fe01ecf 100644 --- a/static/locales/el.yaml +++ b/static/locales/el.yaml @@ -945,7 +945,7 @@ Local API Error (Click to copy): 'Τοπικό σφάλμα Διεπαφής π Invidious API Error (Click to copy): 'Σφάλμα Διεπαφής προγραμματισμού εφαρμογής Invidious(*API) (Κάντε κλικ για αντιγραφή)' Falling back to Invidious API: 'Επιστροφή στο Invidious API' -Falling back to the local API: 'Επιστροφή στη τοπική Διεπαφή προγραμματισμού εφαρμογής +Falling back to Local API: 'Επιστροφή στη τοπική Διεπαφή προγραμματισμού εφαρμογής (API)' Subscriptions have not yet been implemented: 'Οι συνδρομές δεν έχουν ακόμη υλοποιηθεί' Loop is now disabled: 'Η επανάληψη είναι πλέον απενεργοποιημένη' @@ -1097,12 +1097,6 @@ Chapters: Chapters: Κεφάλαια 'Chapters list visible, current chapter: {chapterName}': 'Ορατή λίστα κεφαλαίων, τρέχον κεφάλαιο: {chapterName}' -Age Restricted: - This {videoOrPlaylist} is age restricted: Αυτό το {videoOrPlaylist} έχει περιορισμό - ηλικίας - Type: - Channel: Κανάλι - Video: Βίντεο Ok: Εντάξει Preferences: Προτιμήσεις Screenshot Success: Αποθηκευμένο στιγμιότυπο οθόνης ως "{filePath}" diff --git a/static/locales/en-US.yaml b/static/locales/en-US.yaml index 5ce6ffd92f88a..76597566762e4 100644 --- a/static/locales/en-US.yaml +++ b/static/locales/en-US.yaml @@ -32,6 +32,7 @@ Back: Back Forward: Forward Open New Window: Open New Window Go to page: Go to {page} +Close Banner: Close Banner Version {versionNumber} is now available! Click for more details: Version {versionNumber} is now available! Click for more details @@ -186,6 +187,8 @@ User Playlists: EarliestPlayedFirst: 'Earliest Played' SinglePlaylistView: + Search for Videos: Search for Videos + Toast: This video cannot be moved up.: This video cannot be moved up. This video cannot be moved down.: This video cannot be moved down. @@ -213,6 +216,8 @@ User Playlists: Search in Playlists: Search in Playlists Save: Save + Added {count} Times: 'Added {count} Time | Added {count} Times' + Toast: You haven't selected any playlist yet.: You haven't selected any playlist yet. "{videoCount} video(s) added to 1 playlist": "1 video added to 1 playlist | {videoCount} videos added to 1 playlist" @@ -299,6 +304,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastel Pink Hot Pink: Hot Pink + Nordic: Nordic Main Color Theme: Main Color Theme: Main Color Theme Red: Red @@ -453,7 +459,7 @@ Settings: Hide Video Description: Hide Video Description Hide Comments: Hide Comments Hide Profile Pictures in Comments: Hide Profile Pictures in Comments - Display Titles Without Excessive Capitalisation: Display Titles Without Excessive Capitalisation + Display Titles Without Excessive Capitalisation: Display Titles Without Excessive Capitalisation And Punctuation Hide Live Streams: Hide Live Streams Hide Upcoming Premieres: Hide Upcoming Premieres Hide Sharing Actions: Hide Sharing Actions @@ -724,6 +730,7 @@ Channel: Hide Answers: Hide Answers Video hidden by FreeTube: Video hidden by FreeTube Video: + More Options: More Options Mark As Watched: Mark As Watched Remove From History: Remove From History Video has been marked as watched: Video has been marked as watched @@ -957,7 +964,7 @@ Tooltips: By default FreeTube will open the clicked link in your default browser. Player Settings: Force Local Backend for Legacy Formats: Only works when the Invidious API is your - default. When enabled, the local API will run and use the legacy formats returned + default. When enabled, the Local API will run and use the legacy formats returned by that instead of the ones returned by Invidious. Helps when the videos returned by Invidious don't play due to country restrictions. Proxy Videos Through Invidious: Will connect to Invidious to serve videos instead @@ -1011,7 +1018,7 @@ Tooltips: Local API Error (Click to copy): Local API Error (Click to copy) Invidious API Error (Click to copy): Invidious API Error (Click to copy) Falling back to Invidious API: Falling back to Invidious API -Falling back to the local API: Falling back to the local API +Falling back to Local API: Falling back to Local API This video is unavailable because of missing formats. This can happen due to country unavailability.: This video is unavailable because of missing formats. This can happen due to country unavailability. @@ -1035,10 +1042,8 @@ Default Invidious instance has been cleared: Default Invidious instance has been 'The playlist has ended. Enable loop to continue playing': 'The playlist has ended. Enable loop to continue playing' Age Restricted: - This {videoOrPlaylist} is age restricted: This {videoOrPlaylist} is age restricted - Type: - Channel: Channel - Video: Video + This channel is age restricted: This channel is age restricted + This video is age restricted: This video is age restricted External link opening has been disabled in the general settings: 'External link opening has been disabled in the general settings' Downloading has completed: '"{videoTitle}" has finished downloading' Starting download: 'Starting download of "{videoTitle}"' diff --git a/static/locales/en_GB.yaml b/static/locales/en_GB.yaml index 5c6b5c5ec283b..5b9b51b1d9ef2 100644 --- a/static/locales/en_GB.yaml +++ b/static/locales/en_GB.yaml @@ -43,6 +43,8 @@ Global: View Count: 1 view | {count} views Watching Count: 1 watching | {count} watching Channel Count: 1 channel | {count} channels + Input Tags: + Length Requirement: Tag must be at least {number} characters long Version {versionNumber} is now available! Click for more details: 'Version {versionNumber} is now available! Click for more details' Download From Site: 'Download from site' @@ -119,14 +121,14 @@ Playlists: 'Playlists' User Playlists: Your Playlists: 'Your playlists' Playlist Message: This page is not reflective of fully working playlists. It only - lists videos that you have saved or favourited. When the work has finished, all - videos currently here will be migrated to a ‘Favourites’ playlist. + lists videos that you have saved or made a Favourite. When the work has finished, + all videos currently here will be migrated to a ‘Favourites’ playlist. Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Your saved videos are empty. Click on the save button on the corner of a video to have it listed here Search bar placeholder: Search in playlist Empty Search Message: There are no videos in this playlist that match your search - Create New Playlist: Create new playlist + Create New Playlist: Create new Playlist Add to Playlist: Add to playlist This playlist currently has no videos.: This playlist currently has no videos. Move Video Down: Move video down @@ -167,6 +169,14 @@ User Playlists: There was an issue with updating this playlist.: There was an issue with updating this playlist. There were no videos to remove.: There were no videos to remove. + Reverted to use {oldPlaylistName} for quick bookmark: Reverted to use {oldPlaylistName} + for quick bookmark + This playlist is now used for quick bookmark: This playlist is now used for + quick bookmark + This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: This + playlist is now used for quick bookmark instead of {oldPlaylistName}. Click + here to undo + Quick bookmark disabled: Quick bookmark disabled AddVideoPrompt: N playlists selected: '{playlistCount} selected' Search in Playlists: Search in playlists @@ -175,11 +185,21 @@ User Playlists: "{videoCount} video(s) added to 1 playlist": 1 video added to 1 playlist | {videoCount} videos added to 1 playlist You haven't selected any playlist yet.: You haven't selected any playlist yet. + "{videoCount} video(s) added to {playlistCount} playlists": 1 video added to + {playlistCount} playlists | {videoCount} videos added to {playlistCount} + playlists Select a playlist to add your N videos to: Select a playlist to add your video to | Select a playlist to add your {videoCount} videos to CreatePlaylistPrompt: - New Playlist Name: New playlist name + New Playlist Name: New Playlist name Create: Create + Toast: + Playlist {playlistName} has been successfully created.: Playlist {playlistName} + has been successfully created. + There was an issue with creating the playlist.: There was an problem when creating + the playlist. + There is already a playlist with this name. Please pick a different name.: There + is already a Playlist with this name. Please pick a different name. You have no playlists. Click on the create new playlist button to create a new one.: You have no playlists. Click on the create new playlist button to create a new one. Move Video Up: Move video up @@ -193,6 +213,9 @@ User Playlists: Are you sure you want to delete this playlist? This cannot be undone: Are you sure you want to delete this playlist? This cannot be undone. Add to Favorites: Add to {playlistName} + Remove from Favorites: Remove from {playlistName} + Enable Quick Bookmark With This Playlist: Enable quick bookmark with this playlist + Disable Quick Bookmark: Disable quick bookmark History: # On History Page History: 'History' @@ -230,38 +253,39 @@ Settings: Hidden: Hidden 'Invidious Instance (Default is https://invidious.snopyta.org)': 'Invidious Instance (Default is https://invidious.snopyta.org)' - Region for Trending: 'Region for Trending' + Region for Trending: 'Region for trending' #! List countries View all Invidious instance information: View all Invidious instance information System Default: System default External Player: External Player External Player Executable: Custom External Player Executable Clear Default Instance: Clear default instance - Set Current Instance as Default: Set Current Instance as Default + Set Current Instance as Default: Set current instance as default Current instance will be randomized on startup: Current instance will be randomised - on startup + on Startup No default instance has been set: No default instance has been set The currently set default instance is {instance}: The currently set default instance is {instance} Current Invidious Instance: Current Invidious Instance External Link Handling: - No Action: No Action - Ask Before Opening Link: Ask Before Opening Link - Open Link: Open Link - External Link Handling: External Link Handling + No Action: No action + Ask Before Opening Link: Ask before opening link + Open Link: Open link + External Link Handling: External link handling Theme Settings: - Theme Settings: 'Theme Settings' + Theme Settings: 'Theme settings' Match Top Bar with Main Color: 'Match top bar with main colour' Base Theme: Base Theme: 'Base theme' Black: 'Black' Dark: 'Dark' - System Default: 'System Default' + System Default: 'System default' Light: 'Light' Dracula: 'Dracula' Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastel pink Hot Pink: Hot pink + Nordic: Nordic Main Color Theme: Main Color Theme: 'Main colour theme' Red: 'Red' @@ -307,7 +331,7 @@ Settings: Disable Smooth Scrolling: Disable smooth scrolling Expand Side Bar by Default: Expand side bar by default Hide Side Bar Labels: Hide side bar labels - Hide FreeTube Header Logo: Hide FreeTube Header Logo + Hide FreeTube Header Logo: Hide FreeTube header logo Player Settings: Player Settings: 'Player settings' Force Local Backend for Legacy Formats: 'Force local back-end for legacy formats' @@ -581,6 +605,7 @@ Settings: Remove Password: Remove password Password Settings: Password settings Set Password: Set password + Expand All Settings Sections: Expand all settings sections About: #On About page About: About @@ -951,7 +976,7 @@ Up Next: 'Up Next' Local API Error (Click to copy): 'Local API Error (Click to copy)' Invidious API Error (Click to copy): 'Invidious API Error (Click to copy)' Falling back to Invidious API: 'Falling back to Invidious API' -Falling back to the local API: 'Falling back to the local API' +Falling back to Local API: 'Falling back to Local API' Subscriptions have not yet been implemented: 'Subscriptions have not yet been implemented' Loop is now disabled: 'Loop is now disabled' Loop is now enabled: 'Loop is now enabled' @@ -983,7 +1008,7 @@ Tooltips: Proxy Videos Through Invidious: Will connect to Invidious to serve videos instead of making a direct connection to YouTube. Overrides API preference. Force Local Backend for Legacy Formats: Only works when the Invidious API is your - default. When enabled, the local API will run and use the legacy formats returned + default. When enabled, the Local API will run and use the legacy formats returned by that instead of the ones returned by Invidious. Helps when the videos returned by Invidious don’t play due to country restrictions. Scroll Playback Rate Over Video Player: While the cursor is over the video, press @@ -1067,17 +1092,15 @@ New Window: New window Channels: Empty: Your channel list is currently empty. Unsubscribe: Unsubscribe - Unsubscribed: '{channelName} has been removed from your subscriptions' - Unsubscribe Prompt: Are you sure you want to unsubscribe from ‘{channelName}’? + Unsubscribed: '{channelName} has been removed from your Subscriptions' + Unsubscribe Prompt: Are you sure you want to Unsubscribe from ‘{channelName}’? Title: Channel list Search bar placeholder: Search channels Channels: Channels Count: '{number} channel(s) found.' Age Restricted: - This {videoOrPlaylist} is age restricted: This {videoOrPlaylist} is age restricted - Type: - Video: Video - Channel: Channel + This channel is age restricted: This channel is age restricted + This video is age restricted: This video is age restricted Chapters: 'Chapters list visible, current chapter: {chapterName}': 'Chapters list visible, current chapter: {chapterName}' @@ -1099,3 +1122,5 @@ Playlist will pause when current video is finished: Playlist will pause when cur Playlist will not pause when current video is finished: Playlist will not pause when current video is finished Go to page: Go to {page} +Tag already exists: ‘{tagName}’ tag already exists +Close Banner: Close Banner diff --git a/static/locales/es-MX.yaml b/static/locales/es-MX.yaml index dc169144d7a62..61ee2146e64ee 100644 --- a/static/locales/es-MX.yaml +++ b/static/locales/es-MX.yaml @@ -678,7 +678,7 @@ Local API Error (Click to copy): 'Error de la API local (Presione para copiar)' Invidious API Error (Click to copy): 'Error de la API de Invidious (Presione para copiar)' Falling back to Invidious API: 'Recurriendo a la API de Invidious' -Falling back to the local API: 'Recurriendo a la API local' +Falling back to Local API: 'Recurriendo a la API local' Subscriptions have not yet been implemented: 'Las suscripciones aún no se han implementado' Loop is now disabled: 'El bucle esta desactivado' Loop is now enabled: 'El bucle esta activado' diff --git a/static/locales/es.yaml b/static/locales/es.yaml index 09c74e9462cbe..cd081e8b88611 100644 --- a/static/locales/es.yaml +++ b/static/locales/es.yaml @@ -142,6 +142,7 @@ User Playlists: a la que añadir su vídeo | Seleccione una lista de reproducción a la que añadir sus {videoCount} vídeos N playlists selected: '{playlistCount} seleccionada' + Added {count} Times: Añadido {count} vez | Añadido {count} veces SinglePlaylistView: Toast: There were no videos to remove.: No había vídeos que eliminar. @@ -287,6 +288,7 @@ Settings: Catppuccin Mocha: Catppuccin Moca Pastel Pink: Rosa pastel Hot Pink: Rosa fuerte + Nordic: Nórdico Main Color Theme: Main Color Theme: 'Color principal' Red: 'Rojo' @@ -531,8 +533,8 @@ Settings: Hide Upcoming Premieres: Ocultar los próximos estrenos Hide Channels: Ocultar vídeos de los canales Hide Channels Placeholder: ID del canal - Display Titles Without Excessive Capitalisation: Mostrar títulos sin demasiadas - mayúsculas + Display Titles Without Excessive Capitalisation: Mostrar títulos sin mayúsculas + ni signos de puntuación excesivos Hide Featured Channels: Ocultar canales recomendados Hide Channel Playlists: Ocultar las listas de reproducción de los canales Hide Channel Community: Ocultar canales de la comunidad @@ -954,6 +956,7 @@ Video: Pause on Current Video: Pausa en el vídeo actual Unhide Channel: Mostrar el canal Hide Channel: Ocultar el canal + More Options: Más opciones Videos: #& Sort By Sort By: @@ -1037,7 +1040,7 @@ Local API Error (Click to copy): 'Error de la API local (Clic para copiar el có Invidious API Error (Click to copy): 'Error de la API de Invidious (Clic para copiar el código)' Falling back to Invidious API: 'Recurriendo a la API de Invidious' -Falling back to the local API: 'Recurriendo a la API local' +Falling back to Local API: 'Recurriendo a la API local' Subscriptions have not yet been implemented: 'Todavía no se han implementado las suscripciones' Loop is now disabled: 'Reproducción en bucle desactivada' Loop is now enabled: 'Reproducción en bucle activada' @@ -1076,10 +1079,11 @@ Tooltips: Proxy Videos Through Invidious: Se conectará a Invidious para obtener vídeos en lugar de conectar directamente con YouTube. Sobreescribirá la preferencia de API. - Force Local Backend for Legacy Formats: Solo funciona cuando la API de Invidious - es la predeterminada. la API local se ejecutará y usará los formatos heredados - en lugar de Invidious. Esto ayudará cuando Invidious no pueda reproducir un - vídeo por culpa de las restricciones regionales. + Force Local Backend for Legacy Formats: Sólo funciona cuando la API de Invidious + es la predeterminada. Si está activada, la API local se ejecutará y utilizará + los formatos heredados devueltos por ella en lugar de los devueltos por Invidious. + Es útil cuando los vídeos devueltos por Invidious no se reproducen debido a + restricciones nacionales. Scroll Playback Rate Over Video Player: Cuando el cursor esté sobre el vídeo, presiona y mantén la tecla Control (Comando en Mac) y desplaza la rueda del ratón hacia arriba o abajo para cambiar la velocidad de reproducción. Presiona @@ -1183,12 +1187,6 @@ Channels: Unsubscribe: Cancelar la suscripción Unsubscribed: '{channelName} ha sido eliminado de tus suscripciones' Unsubscribe Prompt: ¿Está seguro/segura de querer desuscribirse de «{channelName}»? -Age Restricted: - Type: - Channel: Canal - Video: Vídeo - This {videoOrPlaylist} is age restricted: Este {videoOrPlaylist} tiene restricción - de edad Clipboard: Copy failed: Error al copiar al portapapeles Cannot access clipboard without a secure connection: No se puede acceder al portapapeles @@ -1215,3 +1213,7 @@ Channel Unhidden: '{channel} eliminado del filtro de canales' Tag already exists: La etiqueta "{tagName}" ya existe Trimmed input must be at least N characters long: La entrada recortada debe tener al menos 1 carácter | La entrada recortada debe tener al menos {length} caracteres +Close Banner: Cerrar el banner +Age Restricted: + This channel is age restricted: Este canal está restringido por edad + This video is age restricted: Este vídeo está restringido por edad diff --git a/static/locales/et.yaml b/static/locales/et.yaml index c70d8e3072a68..8a375cdb3993c 100644 --- a/static/locales/et.yaml +++ b/static/locales/et.yaml @@ -161,6 +161,7 @@ User Playlists: Select a playlist to add your N videos to: Vali esitusloend, kuhu soovid oma video lisada | Vali esitusloend, kuhu soovid oma {videoCount} videot lisada N playlists selected: '{playlistCount} valitud' + Added {count} Times: Lisatud {count} kord | Lisatud {count} korda SinglePlaylistView: Toast: There were no videos to remove.: Ei leidnud ühtegi videot, mida saaks eemaldada. @@ -286,6 +287,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastelne roosa Hot Pink: Säravroosa + Nordic: Põhjala Main Color Theme: Main Color Theme: 'Põhiline värviteema' Red: 'Punane' @@ -496,7 +498,7 @@ Settings: Hide Channels: Peida kanalites leiduvad videod Hide Channels Placeholder: Kanali tunnus Display Titles Without Excessive Capitalisation: Näita pealkirju ilma liigsete - suurtähtedeta + suurtähtede ja kirjavahemärkideta Sections: General: Üldist Side Bar: Külgpaan @@ -883,6 +885,7 @@ Video: Pause on Current Video: Peata hetkel esitatav video Unhide Channel: Näita kanalit Hide Channel: Peida kanal + More Options: Veel valikuid Videos: #& Sort By Sort By: @@ -963,7 +966,7 @@ Up Next: 'Järgmisena' Local API Error (Click to copy): 'Kohaliku API viga (kopeerimiseks klõpsi)' Invidious API Error (Click to copy): 'Invidious''e API viga (kopeerimiseks klõpsi)' Falling back to Invidious API: 'Varuvariandina kasutan Invidious''e API''t' -Falling back to the local API: 'Varuvariandina kasutan kohalikku API''t' +Falling back to Local API: 'Varuvariandina kasutan kohalikku API''t' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Kuna vajalikke vorminguid ei leidu, siis see video pole saadaval. Niisugune viga võib juhtuda ka maapiirangute tõttu.' @@ -1092,11 +1095,6 @@ Channels: Unsubscribe: Loobu tellimusest Unsubscribed: '{channelName} on sinu tellimustest eemaldatud' Unsubscribe Prompt: Kas oled kindel, et soovid „{channelName}“ tellimusest loobuda? -Age Restricted: - This {videoOrPlaylist} is age restricted: See {videoOrPlaylist} on vanusepiiranguga - Type: - Channel: Kanal - Video: Video Screenshot Success: Kuvatõmmis on salvestatud faili „{filePath}“ Clipboard: Copy failed: Lõikelauale kopeerimine ei õnnestunud @@ -1124,3 +1122,7 @@ Channel Unhidden: '{channel} on eemaldatud kanalite filtrist' Tag already exists: Silt „{tagName}“ on juba olemas Trimmed input must be at least N characters long: Kärbitud sisend peab olema vähemalt 1 tähemärgi pikkune | Kärbitud sisend peab olema vähemalt {length} tähemärgi pikkune +Age Restricted: + This channel is age restricted: Kanali vaatamisel on vanusepiirang + This video is age restricted: Video vaatamisel on vanusepiirang +Close Banner: Sulge rekaampilt diff --git a/static/locales/eu.yaml b/static/locales/eu.yaml index 206b613e3f36a..1c5f78063fecb 100644 --- a/static/locales/eu.yaml +++ b/static/locales/eu.yaml @@ -34,6 +34,17 @@ Forward: 'Aurrera' Global: Videos: 'Bideoak' + Counts: + Subscriber Count: 1.harpideduna| {count} harpidedun + Watching Count: 1. ikuslea | {count} ikusle + Channel Count: 1. kanala ! {count} kanal + Video Count: 1. bideoa | {count} bideo + View Count: 1. ikustaldia | {count} ikustaldi + Live: Zuzenekoa + Shorts: Laburrak + Input Tags: + Length Requirement: Etiketak {zenbaki} karaktere izan behar ditu gutxienez + Community: Komunitatea Version {versionNumber} is now available! Click for more details: '{versionNumber} bertsioa erabilgarri! Klikatu azalpen gehiagorako' Download From Site: 'Webgunetik jaitsi' @@ -90,6 +101,14 @@ Subscriptions: Refresh Subscriptions: 'Harpidetzak freskatu' Load More Videos: 'Bideo gehiago kargatu' Error Channels: Akatsak dituzten kateak + Disabled Automatic Fetching: Harpidetza-bilaketa automatikoa desgaitu duzu. Freskatu + harpidetzak hemen ikusteko. + Empty Channels: Harpidetutako kanalek ez dute bideorik. + Empty Posts: Harpidetutako kanalek ez dute argitalpenik. + Load More Posts: Kargatu mezu gehiago + Subscriptions Tabs: Harpidetzen fitxak + All Subscription Tabs Hidden: Harpidetza fitxa guztiak ezkutatuta daude. Hemen edukia + ikusteko, erakutsi fitxa batzuk "{azpisection}" ataleko "{settingsSection}"-ean. More: 'Gehiago' Trending: Trending: 'Joerak' @@ -111,6 +130,99 @@ User Playlists: Search bar placeholder: Bilatu Erreprodukzio-zerrendan Empty Search Message: Erreprodukzio-zerrenda honetan ez dago zure bilaketarekin bat datorren bideorik + Remove Watched Videos: Kendu ikusitako bideoak + You have no playlists. Click on the create new playlist button to create a new one.: Ez + duzu erreprodukzio-zerrendarik. Egin klik sortu erreprodukzio-zerrenda berria + botoian berri bat sortzeko. + This playlist currently has no videos.: Erreprodukzio-zerrenda honek ez du bideorik. + Create New Playlist: Sortu erreprodukzio zerrenda berria + Add to Playlist: Gehitu erreprodukzio zerrendara + Add to Favorites: Gehitu {playlistName}-ra + Remove from Favorites: Kendu {playlistName}tik + Move Video Up: Mugitu bideoa gora + Move Video Down: Mugitu bideoa behera + Remove from Playlist: Kendu erreprodukzio zerrendatik + Playlist Name: Erreprodukzio zerrendaren izena + Playlist Description: Erreprodukzio-zerrendaren deskribapena + Save Changes: Gorde aldaketak + Cancel: Utzi + Edit Playlist Info: Editatu erreprodukzio zerrendaren informazioa + Copy Playlist: Kopiatu Erreprodukzio zerrenda + CreatePlaylistPrompt: + New Playlist Name: Erreprodukzio-zerrendaren izen berria + Toast: + Playlist {playlistName} has been successfully created.: '{playlistName} erreprodukzio-zerrenda + behar bezala sortu da.' + There was an issue with creating the playlist.: Arazo bat izan da erreprodukzio-zerrenda + sortzearekin. + There is already a playlist with this name. Please pick a different name.: Badago + dagoeneko izen honekin erreprodukzio-zerrenda bat. Mesedez, aukeratu beste + izen bat. + Create: Sortu + Enable Quick Bookmark With This Playlist: Gaitu laster-marka azkarra erreprodukzio-zerrenda + honekin + Disable Quick Bookmark: Desgaitu laster-marka azkarra + Sort By: + NameDescending: Z-A + LatestCreatedFirst: Sortu berria + EarliestCreatedFirst: Lehenen sortuak + LatestPlayedFirst: Duela gutxi erreproduzitua + EarliestPlayedFirst: Lehenen erreproduzitua + Sort By: Ordenatu honen arabera + NameAscending: A-Z + EarliestUpdatedFirst: Lehenen eguneratuak + LatestUpdatedFirst: Eguneratu berriak + Delete Playlist: Ezabatu erreprodukzio zerrenda + Are you sure you want to delete this playlist? This cannot be undone: Ziur erreprodukzio-zerrenda + ezabatu nahi duzula? Hau ezin da desegin. + SinglePlaylistView: + Toast: + Playlist has been updated.: Erreprodukzio-zerrenda eguneratu da. + "{videoCount} video(s) have been removed": bideo 1 kendu da | {videoCount} bideo + kendu dira + This video cannot be moved up.: Bideo hau ezin da gora eraman. + This video cannot be moved down.: Bideoa ezin da behera eraman. + Video has been removed: Bideoa kendu da + There was a problem with removing this video: Arazo bat izan da bideoa kentzean + This playlist is now used for quick bookmark: Erreprodukzio-zerrenda hau laster-markak + egiteko erabiltzen da orain + Quick bookmark disabled: Laster-marka azkarra desgaituta dago + This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Erreprodukzio-zerrenda + hau laster-marketarako erabiltzen da orain {oldPlaylistName}-ren ordez. Egin + klik hemen desegiteko + Reverted to use {oldPlaylistName} for quick bookmark: '{oldPlaylistName} erabili + da berriro azkar markatzeko' + Some videos in the playlist are not loaded yet. Click here to copy anyway.: Erreprodukzio-zerrendako + bideo batzuk oraindik ez dira kargatu. Egin klik hemen kopiatzeko hala ere. + Playlist name cannot be empty. Please input a name.: Erreprodukzio zerrendaren + izena ezin da hutsik egon. Mesedez, idatzi izena. + There was an issue with updating this playlist.: Arazo bat izan da erreprodukzio-zerrenda + eguneratzean. + There were no videos to remove.: Ez zegoen kentzeko bideorik. + This playlist is protected and cannot be removed.: Erreprodukzio-zerrenda hau + babestuta dago eta ezin da kendu. + Playlist {playlistName} has been deleted.: '{playlistName} erreprodukzio-zerrenda + ezabatu da.' + This playlist does not exist: Erreprodukzio-zerrenda hau ez da existitzen + AddVideoPrompt: + Added {count} Times: Gehitu da {count} Time | {count} aldiz gehitu da + Toast: + "{videoCount} video(s) added to 1 playlist": Bideo 1 gehitu da erreprodukzio-zerrenda + batera | {videoCount} bideo gehitu dira erreprodukzio-zerrenda batera + You haven't selected any playlist yet.: Oraindik ez duzu erreprodukzio zerrendarik + hautatu. + "{videoCount} video(s) added to {playlistCount} playlists": Bideo 1 gehitu da + {playlistCount} erreprodukzio zerrendetan | {videoCount} bideo gehitu dira + {playlistCount} erreprodukzio-zerrendetan + Select a playlist to add your N videos to: Hautatu erreprodukzio-zerrenda zure + bideoa -ra gehitzeko | Hautatu erreprodukzio-zerrenda zure {videoCount} bideoak + gehitzeko + N playlists selected: '{playlistCount} hautatuta' + Search in Playlists: Bilatu erreprodukzio-zerrendetan + Save: Gorde + Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Ziur + ikusitako bideo guztiak erreprodukzio-zerrenda honetatik kendu nahi dituzula? + Hau ezin da desegin. History: # On History Page History: 'Historikoa' @@ -147,6 +259,8 @@ Settings: Beginning: 'Hasiera' Middle: 'Erdian' End: 'Bukaera' + Hidden: Ezkutatuta + Blur: Lausotzea View all Invidious instance information: 'Invidious instantzia guztien informazioa ikusi' Region for Trending: 'Joeren eskualdea' @@ -179,6 +293,9 @@ Settings: Dracula: Drakula System Default: Sistemak lehenetsia Catppuccin Mocha: Catppuccin Motxa + Nordic: nordikoa + Pastel Pink: Pastel arrosa + Hot Pink: Arrosa beroa Main Color Theme: Main Color Theme: 'Oinarrizko koloreen gaia' Red: 'Gorria' @@ -221,6 +338,7 @@ Settings: Secondary Color Theme: 'Gaiaren bigarren mailako kolorea' #* Main Color Theme Hide Side Bar Labels: Ezkutatu alboko barraren etiketak + Hide FreeTube Header Logo: Ezkutatu FreeTube goiburuko logotipoa Player Settings: Player Settings: 'Erreprodukzioaren ezarpenak' Force Local Backend for Legacy Formats: 'Behartu backend lokala Legacy formatuentzat' @@ -272,6 +390,11 @@ Settings: Display Play Button In Video Player: Bistaratu Erreproduzitzeko botoia bideo erreproduzitzailean Max Video Playback Rate: Gehienezko bideoen erreprodukzio-tasa Video Playback Rate Interval: Bideo Erreprodukzio-tasa tartea + Comment Auto Load: + Comment Auto Load: Iruzkin karga automatikoa + Skip by Scrolling Over Video Player: Saltatu bideo-erreproduzitzailean korrituz + Enter Fullscreen on Display Rotate: Sartu pantaila osoko pantaila biratu pantailan + Allow DASH AV1 formats: Baimendu DASH AV1 formatuak Privacy Settings: Privacy Settings: 'Pribatutasunari buruzko ezarpenak' Remember History: 'Historikoa oroitu' @@ -289,11 +412,20 @@ Settings: Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Ziur al zaude zure profil eta harpidetza guztiak ezabatu nahi dituzula? Ezingo duzu atzera egin.' + All playlists have been removed: Erreprodukzio-zerrenda guztiak kendu dira + Save Watched Videos With Last Viewed Playlist: Gorde ikusitako bideoak ikusitako + azken erreprodukzio-zerrendarekin + Remove All Playlists: Kendu erreprodukzio-zerrenda guztiak + Are you sure you want to remove all your playlists?: Ziur erreprodukzio-zerrenda + guztiak kendu nahi dituzula? Subscription Settings: Subscription Settings: 'Harpidetzen ezarpenak' Hide Videos on Watch: 'Ikusten ari zaren bideoa ezkutatu' Fetch Feeds from RSS: 'RSS jarioak eskuratu' Manage Subscriptions: 'Harpidetzak kudeatu' + Fetch Automatically: Eskuratu jarioa automatikoki + Only Show Latest Video for Each Channel: Erakutsi soilik kanal bakoitzeko azken + bideoa Distraction Free Settings: Distraction Free Settings: 'Oharkabetasunak ekiditeko ezarpenak' Hide Video Views: 'Bideoen ikustaldi kopurua ezkutatu' @@ -310,6 +442,38 @@ Settings: Hide Video Description: Bideoaren deskribapena ezkutatu Hide Comments: Iruzkinak ezkutatu Hide Live Streams: Zuzeneko emanaldiak ezkutatu + Sections: + Side Bar: Alboko Barra + Subscriptions Page: Harpidetzak Orria + Channel Page: Kanalaren Orria + General: Orokorra + Watch Page: Ikusi Orria + Hide Profile Pictures in Comments: Ezkutatu profileko argazkiak iruzkinetan + Display Titles Without Excessive Capitalisation: Bistaratu izenburuak gehiegizko + letra larriz eta puntuaziorik gabe + Hide Channels Placeholder: Kanalaren IDa + Hide Channel Playlists: Ezkutatu kanaleko erreprodukzio-zerrendak + Hide Channel Community: Ezkutatu kanalaren komunitatea + Hide Channel Podcasts: Ezkutatu kanaleko podcastak + Hide Videos and Playlists Containing Text: Ezkutatu testua duten bideoak eta erreprodukzio-zerrendak + Hide Channels: Ezkutatu bideoak kanaletatik + Hide Upcoming Premieres: Ezkutatu datozen estreinaldiak + Hide Subscriptions Videos: Ezkutatu harpidetza-bideoak + Hide Subscriptions Shorts: Ezkutatu bideo laburren harpidetzak + Hide Channel Releases: Ezkutatu kanalen kaleratzeak + Hide Chapters: Ezkutatu kapituluak + Hide Channels Invalid: Emandako kanalaren IDa baliogabea da + Hide Channels API Error: Errore bat gertatu da emandako IDa duen erabiltzailea + berreskuratzean. Mesedez, egiaztatu berriro IDa zuzena den. + Hide Channels Already Exists: Kanalaren IDa badago jada + Hide Channel Shorts: Ezkutatu kanalaren bideo laburrak + Hide Videos and Playlists Containing Text Placeholder: Hitza, Hitzaren zatia edo + esaldia + Hide Subscriptions Live: Ezkutatu zuzenekoen harpidetzak + Hide Subscriptions Community: Ezkutatu harpidetzen komunitateak + Hide Featured Channels: Ezkutatu nabarmendutako kanalak + Hide Channels Disabled Message: Kanal batzuk IDa erabiliz blokeatu dira eta ez + dira prozesatu. Eginbidea blokeatuta dago ID horiek eguneratzen ari diren bitartean Data Settings: Data Settings: 'Datuen ezarpenak' Select Import Type: 'Hautatu Inportazio mota' @@ -357,6 +521,18 @@ Settings: esportatu dira Playlist insufficient data: Ez da datu nahikorik "{playlist}" erreprodukzio zerrendarentzat, elementutik ateratzen + History File: Historikoaren fitxategia + Playlist File: Erreprodukzio-zerrendaren fitxategia + Export Playlists For Older FreeTube Versions: + Label: Esportatu erreprodukzio zerrendak FreeTube bertsio zaharretarako + Tooltip: "Aukera honek erreprodukzio-zerrenda guztietako bideoak \"Gogokoak\"\ + \ izeneko erreprodukzio-zerrenda batera esportatzen ditu.\nNola esportatu + eta inportatu bideoak erreprodukzio-zerrendetan FreeTube-ren bertsio zaharrago + baterako:\n 1. Esportatu zure erreprodukzio zerrendak aukera hau gaituta.\n + 2. Ezabatu lehendik dituzun erreprodukzio-zerrenda guztiak Pribatutasun-ezarpenetan + dagoen Kendu zerrenda guztiak aukera erabiliz.\n 3. Abiarazi FreeTube-ren + bertsio zaharra eta inportatu esportatutako erreprodukzio-zerrendak.\"" + Subscription File: Harpidetza Fitxategia Proxy Settings: Proxy Settings: 'Proxy-aren ezarpenak' Enable Tor / Proxy: 'Tor / Proxy ahalbidetu' @@ -381,6 +557,10 @@ Settings: External Player: Kanpoko erreproduzitzailea Custom External Player Executable: Lehenetsitako kanpo erreproduzitzailea exekutagarria Custom External Player Arguments: Lehenetsitako kanpo erreproduzitzailea argudioak + Ignore Default Arguments: Ez ikusi lehenetsitako argudioak + Players: + None: + Name: Bat ere ez Download Settings: Download Settings: Deskargen ezarpenak Ask Download Path: Deskargaren ibilbidea galdetu @@ -402,11 +582,31 @@ Settings: 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': Babesleak blokeatzeko API Url (lehenetsia https://sponsor.ajay.app da) SponsorBlock Settings: Babesleak blokeatzeko ezarpenak + UseDeArrowTitles: Erabili DeArrow bideo-izenburuak + UseDeArrowThumbnails: Erabili DeArrow irudi txikietarako + 'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': DeArrow + Thumbnail Generator API URLa (lehenetsia https://dearrow-thumb.ajay.app da) Parental Control Settings: Show Family Friendly Only: Erakutsi familientzat aproposa dena bakarrik Hide Unsubscribe Button: Harpidetza kendu botoia ezkutatu Parental Control Settings: Gurasoen kontrolaren ezarpenak Hide Search Bar: Bilaketa barra ezkutatu + Password Dialog: + Password: Pasahitza + Password Incorrect: Pasahitza okerra + Unlock: Desblokeatu + Enter Password To Unlock: Sartu pasahitza ezarpenak desblokeatzeko + Experimental Settings: + Replace HTTP Cache: Ordeztu HTTP cachea + Experimental Settings: Ezarpen esperimentalak + Warning: Ezarpen hauek esperimentalak dira, aktibatuta dauden bitartean hutsegiteak + eragin ditzakete. Oso gomendagarria da babeskopiak egitea. Erabili zure ardurapean! + Password Settings: + Password Settings: Pasahitz ezarpenak + Set Password To Prevent Access: Ezarri pasahitz bat ezarpenetara sarbidea galarazteko + Remove Password: Pasahitza ezabatu + Set Password: Ezarri pasahitza + Expand All Settings Sections: Zabaldu ezarpen guztien atalak About: #On About page About: 'Honi buruz' @@ -436,6 +636,7 @@ About: these people and projects: 'Hurrengo pertsonak eta proiektuak' Donate: 'Donazioa egin' + Discussions: Eztabaidak Profile: Profile Select: 'Hautatu profila' Profile Filter: 'Profilaren iragazkiak' @@ -480,6 +681,12 @@ Profile: batetik ezabatuko.' #On Channel Page Profile Settings: Profilaren ezarpenak + Close Profile Dropdown: Itxi goitibeherako profila + Open Profile Dropdown: Ireki goitibeherako profila + Toggle Profile List: Aldatu profilen zerrenda + Edit Profile Name: Editatu profilaren izena + Create Profile Name: Sortu profilaren izena + Profile Name: Profilaren izena Channel: Subscribe: 'Harpidetu' Unsubscribe: 'Harpidetza kendu' @@ -510,6 +717,39 @@ Channel: About: 'Honi buruz' Channel Description: 'Kanalaren deskribapena' Featured Channels: 'Nabarmendutako kanalak' + Joined: Bat eginda + Location: Kokapena + Tags: + Tags: Etiketak + Search for: Bilatu "{tag}" + Details: Xehetasunak + This channel does not exist: Kanal hau ez da existitzen + This channel is age-restricted and currently cannot be viewed in FreeTube.: Kanal + hau adin mugatuta dago eta une honetan ezin da ikusi FreeTube-n. + Shorts: + This channel does not currently have any shorts: Une honetan kanal honek ez du + bideo laburrik + Releases: + This channel does not currently have any releases: Une honetan kanal honek ez + du argitalpenik + Releases: Argitalpenak + Community: + Hide Answers: Erantzunak ezkutatu + votes: '{votes} bozka' + This channel currently does not have any posts: Une honetan kanal honek ez du + argitalpenik + Reveal Answers: Erantzunak agerian utzi + Video hidden by FreeTube: FreeTube-k ezkutatutako bideoa + Channel Tabs: Kanalaren fitxak + This channel does not allow searching: Kanal honek ez du bilaketarik onartzen + Live: + Live: Zuzenekoak + This channel does not currently have any live streams: Kanal honek ez du zuzeneko + erreprodukziorik + Podcasts: + Podcasts: Podcastak + This channel does not currently have any podcasts: Une honetan kanal honek ez + du podcastik Video: Mark As Watched: 'Ikusitako gisa jarri' Remove From History: 'Historikotik ezabatu' @@ -592,6 +832,7 @@ Video: Years: 'Urteak' Ago: 'Duela' Upcoming: 'Estreinaldiak' + In less than a minute: Minutu bat baino gutxiagoan Published on: 'Noiz argitaratua' Streamed on: 'Noiz zuzenean emana' Started streaming on: 'Noiz hasi zen zuzenekoa' @@ -636,6 +877,16 @@ Video: intro: Sarrera Skipped segment: Saltatu egin da segmentua Premieres on: Estreinaldiak + Hide Channel: Kanala ezkutatu + Unhide Channel: Kanala erakutsi + Premieres: Estreinaldiak + 'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Zuzeneko + txata ez dago erabilgarri zuzeneko honentzat. Baliteke igo duenak desgaitu izana. + Show Super Chat Comment: Erakutsi Super txat iruzkina + Pause on Current Video: Gelditu uneko bideoa + More Options: Aukera gehiago + Upcoming: Datozenak + Scroll to Bottom: Joan Beherantz Videos: #& Sort By Sort By: @@ -685,6 +936,7 @@ Share: YouTube Channel URL copied to clipboard: 'Youtube-ko kanalaren URL-a arbelean itsatsi da' + Share Channel: Kanala partekatu Mini Player: 'Erreproduzitzaile txikia' Comments: Comments: 'Iruzkinak' @@ -710,6 +962,10 @@ Comments: Show More Replies: Erantzun gehiago erakutsi And others: eta bestelakoak Pinned by: Honengatik ainguratuta + Hearted: Bihotzez + From {channelName}: '{channelName}-tik' + View {replyCount} replies: Ikusi {replyCount} erantzunak + Subscribed: Harpidetuta Up Next: 'Hurrengoa' #Tooltips @@ -749,11 +1005,19 @@ Tooltips: eta mantendu (Komando tekla MAC-etan) eta ondoren saguaren ezkerreko botoia sakatu, lehenetsitako erreprodukzio tasara itzultzeko (1x baldin eta ezarpenetan aldaketarik egin ez bada). + Skip by Scrolling Over Video Player: Erabili korritze-gurpila bideoa saltatzeko, + MPV estiloa. + Allow DASH AV1 formats: DASH AV1 formatuak DASH H.264 formatuak baino itxura hobea + izan dezake. DASH AV1 formatuek potentzia gehiago behar dute erreproduzitzeko! + Ez daude bideo guztietan eskuragarri, kasu horietan erreproduzitzaileak DASH + H.264 formatuak erabiliko ditu ordez. Subscription Settings: Fetch Feeds from RSS: 'Posible denean, Freetube-k bere lehenetsitako metodoa erabili beharrean RSS-ak baliatuko ditu zure harpidetzen jariora konektatzeko. RSS arinagoa izateaz gain, IP-en blokeoak saihesten ditu. Aldiz, zuzenekoaren egoeraren edo bideoaren iraupenaren informaziorik ez du ematen, besteak beste' + Fetch Automatically: Gaituta dagoenean, FreeTubek automatikoki eskuratuko du zure + harpidetza-jarioa leiho berri bat irekitzen denean eta profila aldatzean. Privacy Settings: Remove Video Meta Files: 'Gaituta dagoenean, FreeTube-k automatikoki ezabatzen ditu bideoen erreprodukzioan sortutako metafitxategiak, bistaratze orria ixten @@ -772,11 +1036,34 @@ Tooltips: Individious-en ezarpenek ez dituzte kanpo erreproduzitzaileak trabatzen. Custom External Player Arguments: Komando-lerroko argumentu pertsonalizatuak, puntu eta komaz bereizita (';'), kanpoko erreproduzitzailera pasatzea nahi duzu. + Ignore Default Arguments: Ez bidali argumentu lehenetsirik kanpoko erreproduzitzaileari + bideoaren URLaz gain (adibidez, erreprodukzio-tasa, erreprodukzio-zerrendaren + URLa, etab.). Argumentu pertsonalizatuak transmitituko dira oraindik. + Distraction Free Settings: + Hide Channels: Sartu kanalaren ID bat bideo, erreprodukzio-zerrenda eta kanala + bera bilaketetan, joeran, ezagunenetan eta gomendagarrienetan ager ez dadin + ezkutatzeko. Sartutako kanalaren IDak guztiz bat etorri behar du eta maiuskulak + eta minuskulak bereizten ditu. + Hide Videos and Playlists Containing Text: Idatzi hitz bat, hitz-zati bat edo + esaldi bat (maiuskulak eta minuskulak bereizten ez diren) jatorrizko izenburuak + FreeTube osoan duten bideo eta erreprodukzio-zerrenda guztiak ezkutatzeko, historia, + zure erreprodukzio-zerrendak eta erreprodukzio-zerrenden barneko bideoak soilik + kenduta. + Hide Subscriptions Live: Ezarpen hau aplikazio osorako "{appWideSetting}" ezarpenak + ordezkatzen du, "{settingsSection}" ataleko "{azpisekzioa}" atalean + Experimental Settings: + Replace HTTP Cache: Electron-en diskoan oinarritutako HTTP cachea desgaitzen du + eta memoriako irudien cache pertsonalizatua gaitu. RAM erabilera handitzea ekarriko + du. + SponsorBlock Settings: + UseDeArrowThumbnails: Ordeztu bideoaren miniaturak DeArrow-en miniaturaz. + UseDeArrowTitles: Ordeztu bideoen izenburuak DeArrow-en erabiltzaileek bidalitako + tituluekin. Local API Error (Click to copy): 'Tokiko API-ak huts egin du (klikatu kopiatzeko)' Invidious API Error (Click to copy): 'Individious-eko APIak huts egin du (klikatu kopiatzeko)' Falling back to Invidious API: 'Individious-eko APIra itzultzen' -Falling back to the local API: 'Tokiko APIra itzultzen' +Falling back to Local API: 'Tokiko APIra itzultzen' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Bideo hau ez dago erabilgarri, zenbait formatu eskas baitira. Honakoa zure herrialdean erabilgarri ez dagoelako gerta daiteke.' @@ -827,9 +1114,34 @@ Channels: Unsubscribe Prompt: Ziur al zaude "{channelName}"-ren harpidetza kendu nahi duzula? Count: '{number} kanal aurkitu dira.' Empty: Zure kanalen zerrenda hutsik da. -Age Restricted: - This {videoOrPlaylist} is age restricted: Honako {videoOrPlaylist} adin muga du - Type: - Channel: Kanala - Video: Bideoa Preferences: Hobespenak +Go to page: Joan {page}-ra +Close Banner: Itxi iragarkia +Age Restricted: + This channel is age restricted: Kanal hau adin mugatuta dago + This video is age restricted: Bideo hau adin mugatuta dago +Playlist will not pause when current video is finished: Erreprodukzio-zerrenda ez + da etengo uneko bideoa amaitzen denean +Playlist will pause when current video is finished: Erreprodukzio-zerrenda pausatu + egingo da uneko bideoa amaitzen denean +Channel Unhidden: '{channel} kanalaren iragazkitik kendu da' +Clipboard: + Cannot access clipboard without a secure connection: Ezin da arbelera sartu konexio + segururik gabe + Copy failed: Ezin izan da kopiatu arbelean +Tag already exists: '"{tagName}" etiketa badago jada' +Trimmed input must be at least N characters long: Moztutako sarrerak karaktere bat + izan behar du gutxienez | Moztutako sarrerak gutxienez {length} karaktere izan behar + ditu +Chapters: + 'Chapters list hidden, current chapter: {chapterName}': 'Kapituluen zerrenda ezkutatuta + dago, uneko kapitulua: {chapterName}' + Chapters: Kapituluak + 'Chapters list visible, current chapter: {chapterName}': 'Kapituluen zerrenda ikusgai, + uneko kapitulua: {chapterName}' +Hashtag: + Hashtag: Traola + This hashtag does not currently have any videos: Traola honek ez du bideorik une + honetan +Ok: Ados +Channel Hidden: '{channel} gehitu da kanalaren iragazkian' diff --git a/static/locales/fa.yaml b/static/locales/fa.yaml index fd125828790af..7d62641c54218 100644 --- a/static/locales/fa.yaml +++ b/static/locales/fa.yaml @@ -900,12 +900,6 @@ Screenshot Success: اسکرین شات به عنوان «{filePath}» ذخیر Ok: تایید Downloading has completed: دانلود '{videoTitle}' به پایان رسید Loop is now enabled: حلقه اکنون فعال است -Age Restricted: - Type: - Video: ویدیو - Channel: کانال - This {videoOrPlaylist} is age restricted: این {videoOrPlaylist} دارای محدودیت سنی - است Shuffle is now enabled: Shuffle اکنون فعال است Falling back to Invidious API: بازگشت به Invidious API Local API Error (Click to copy): خطای Local API (برای کپی کلیک کنید) @@ -913,7 +907,7 @@ Shuffle is now disabled: Shuffle اکنون غیرفعال است Canceled next video autoplay: پخش خودکار ویدیوی بعدی لغو شد Unknown YouTube url type, cannot be opened in app: نوع URL ناشناخته YouTube، در برنامه باز نمی شود -Falling back to the local API: بازگشت به API محلی +Falling back to Local API: بازگشت به API محلی This video is unavailable because of missing formats. This can happen due to country unavailability.: این ویدیو به دلیل عدم وجود قالب در دسترس نیست. این ممکن است به دلیل در دسترس نبودن کشور اتفاق بیفتد. diff --git a/static/locales/fi.yaml b/static/locales/fi.yaml index a141cd51d5d8b..9bd141deb8442 100644 --- a/static/locales/fi.yaml +++ b/static/locales/fi.yaml @@ -175,6 +175,7 @@ User Playlists: on luotu. Add to Favorites: Lisää soittolistaan {playlistName} Remove from Favorites: Poista soittolistalta {playlistName} + Remove Watched Videos: Poista katsotut videot History: # On History Page History: 'Historia' @@ -903,7 +904,7 @@ Up Next: 'Seuraavaksi' Local API Error (Click to copy): 'Paikallinen API-virhe (Kopioi napsauttamalla)' Invidious API Error (Click to copy): 'Invidious API-virhe (Kopioi napsauttamalla)' Falling back to Invidious API: 'Palaa takaisin Invidious-sovellusliittymään' -Falling back to the local API: 'Palaa takaisin paikalliseen sovellusliittymään' +Falling back to Local API: 'Palaa takaisin paikalliseen sovellusliittymään' Subscriptions have not yet been implemented: 'Tilauksia ei ole vielä jalkautettu' Loop is now disabled: 'Silmukka on poistettu käytöstä' Loop is now enabled: 'Silmukka on nyt käytössä' @@ -1063,11 +1064,6 @@ Downloading has completed: Videon "{videoTitle}" lataus on valmis Starting download: Aloitetaan lataamaan "{videoTitle}" Screenshot Success: Kuvakaappaus tallennettu nimellä ”{filePath}” New Window: Uusi Ikkuna -Age Restricted: - This {videoOrPlaylist} is age restricted: Tämä {videoOrPlaylist} on ikärajoitettu - Type: - Video: Video - Channel: Kanava Screenshot Error: Ruutukaappaus epäonnistui. {error} Channels: Channels: Kanavat diff --git a/static/locales/fr-FR.yaml b/static/locales/fr-FR.yaml index 242445b0a6335..2fbb3856c1067 100644 --- a/static/locales/fr-FR.yaml +++ b/static/locales/fr-FR.yaml @@ -145,9 +145,10 @@ User Playlists: You haven't selected any playlist yet.: Vous n'avez pas encore sélectionné de liste de lecture. "{videoCount} video(s) added to {playlistCount} playlists": 1 vidéo ajoutée - à {playlistCount} liste de lecture | {videoCount} vidéos ajoutées à {playlistCount} - listes de lecture. + à {playlistCount} listes de lecture | {videoCount} vidéos ajoutées à {playlistCount} + listes de lecture N playlists selected: '{playlistCount} Sélectionnée(s)' + Added {count} Times: Ajouté {count} Fois | Ajouté {count} Fois SinglePlaylistView: Toast: There were no videos to remove.: Il n'y avait aucune vidéo à supprimer. @@ -299,6 +300,7 @@ Settings: Catppuccin Mocha: Catppuccin Moka Pastel Pink: Rose pastel Hot Pink: Rose vif + Nordic: Nordic Main Color Theme: Main Color Theme: 'Couleur principale du thème' Red: 'Rouge' @@ -467,7 +469,7 @@ Settings: sûr(e) de vouloir supprimer tous les abonnements et les profils ? Cette action est définitive. Remove All Subscriptions / Profiles: Supprimer tous les Abonnements / Profils - Automatically Remove Video Meta Files: Suppression automatiquement les métafichiers + Automatically Remove Video Meta Files: Supprimer automatiquement les métafichiers vidéo Save Watched Videos With Last Viewed Playlist: Sauvegarder les vidéos regardées avec la dernière liste de lecture vue @@ -556,7 +558,7 @@ Settings: Hide Channels: Masquer les vidéos des chaînes Hide Channels Placeholder: Identifiant de la chaîne Display Titles Without Excessive Capitalisation: Afficher les titres sans majuscules - excessives + ni ponctuation excessives Hide Channel Playlists: Masquer les listes de lecture des chaînes Hide Featured Channels: Masquer les chaînes en vedette Hide Channel Community: Masquer la communauté de la chaîne @@ -945,6 +947,7 @@ Video: Pause on Current Video: Pause sur la vidéo en cours Hide Channel: Cacher la chaîne Unhide Channel: Rétablir la chaîne + More Options: Plus d'options Videos: #& Sort By Sort By: @@ -1029,7 +1032,7 @@ Up Next: 'À suivre' Local API Error (Click to copy): 'Erreur d''API locale (Cliquez pour copier)' Invidious API Error (Click to copy): 'Erreur d''API Invidious (Cliquez pour copier)' Falling back to Invidious API: 'Revenir à l''API Invidious' -Falling back to the local API: 'Revenir à l''API locale' +Falling back to Local API: 'Revenir à l''API locale' Subscriptions have not yet been implemented: 'Les abonnements n''ont pas encore été implémentés' Loop is now disabled: 'La boucle est maintenant désactivée' @@ -1225,12 +1228,6 @@ Download folder does not exist: 'Le répertoire "$" de téléchargement n''exist Screenshot Success: Capture d'écran enregistrée sous « {filePath} » Screenshot Error: La capture d'écran a échoué. {error} New Window: Nouvelle fenêtre -Age Restricted: - Type: - Video: Vidéo - Channel: Chaîne - This {videoOrPlaylist} is age restricted: Ce {videoOrPlaylist} est soumis à une - limite d'âge Channels: Channels: Chaînes Title: Liste des chaînes @@ -1265,4 +1262,8 @@ Channel Hidden: '{channel} ajouté au filtre de chaîne' Channel Unhidden: '{channel} retiré du filtre de chaîne' Trimmed input must be at least N characters long: L'entrée tronquée doit comporter au moins 1 caractère | L'entrée tronquée doit comporter au moins {length} caractères -Tag already exists: La balise "{tagName}" existe déjà +Tag already exists: L'étiquette « {tagName} » existe déjà +Age Restricted: + This channel is age restricted: Cette chaîne est soumise à des restrictions d'âge + This video is age restricted: Cette vidéo est soumise à des restrictions d'âge +Close Banner: Fermer la bannière diff --git a/static/locales/gl.yaml b/static/locales/gl.yaml index 6138c6079e9a8..fd4cf960da73e 100644 --- a/static/locales/gl.yaml +++ b/static/locales/gl.yaml @@ -36,6 +36,10 @@ Global: Videos: 'Vídeos' Community: Comunidade + Shorts: Cortos + Input Tags: + Length Requirement: A etiqueta debe ser de polo menos {number} caracteres. + Live: En vivo Version {versionNumber} is now available! Click for more details: 'A versión {versionNumber} está dispoñible! Fai clic para veres máis detalles' Download From Site: 'Descargar do sitio' @@ -656,8 +660,8 @@ Video: nesta versión.' 'Chat is disabled or the Live Stream has ended.': 'O chat foi desactivado ou a transmisión en vivo rematou.' - Live chat is enabled. Chat messages will appear here once sent.: 'Chat en vivo - activado. As mensaxes aparecerán aquí ao seren enviadas.' + Live chat is enabled. Chat messages will appear here once sent.: 'Chat en vivo activado. As + mensaxes aparecerán aquí ao seren enviadas.' 'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': 'Chat en vivo actualmente non soportado coa API de Invidious. Precísase dunha conexión directa con YouTube.' @@ -844,9 +848,9 @@ Tooltips: as chamadas da aplicacion.' Region for Trending: 'A rexión das tendencias permíteche escoller os vídeos máis populares nun Estado.' - External Link Handling: "Escolla o comportamento predeterminado cando se fai clic\ - \ nunha ligazón, que non se pode abrir en FreeTube.\nDe forma predeterminada,\ - \ FreeTube abrirá a ligazón na que premeches no teu navegador predeterminado.\n" + External Link Handling: "Escolla o comportamento predeterminado cando se fai clic + nunha ligazón, que non se pode abrir en FreeTube.\nDe forma predeterminada, + FreeTube abrirá a ligazón na que premeches no teu navegador predeterminado.\n" Player Settings: Force Local Backend for Legacy Formats: 'Só funcionará se a API de Invidious está escollida por defecto. Cando estea activa, a API local usará formatos antigos @@ -907,7 +911,7 @@ Tooltips: Local API Error (Click to copy): 'Erro de API local (Preme para copiar)' Invidious API Error (Click to copy): 'Erro de API Invidious (Preme para copiar)' Falling back to Invidious API: 'Recorrendo á API Invidious' -Falling back to the local API: 'Recorrendo á API local' +Falling back to Local API: 'Recorrendo á API local' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Este vídeo non está dispoñible porque faltan formatos. Isto pode ocorrer debido á non dispoñibilidade do país.' @@ -954,12 +958,6 @@ Downloading has completed: '"{videoTitle}" rematou de descargarse' External link opening has been disabled in the general settings: A apertura das ligazóns externas desactivouse na configuración xeral Starting download: Comenzando a descarga de "{videoTitle}" -Age Restricted: - Type: - Channel: Canle - Video: Vídeo - This {videoOrPlaylist} is age restricted: Esta {videoOrPlaylist} ten restricións - de idade Default Invidious instance has been cleared: Borrouse a instancia predeterminada de Invidious Screenshot Error: Produciuse un erro na captura de pantalla. {error} @@ -977,3 +975,4 @@ Chapters: capítulo actual: {chapterName}' Screenshot Success: Captura da pantalla gardada como "{filePath}" Ok: De acordo +Go to page: Ir a {page} diff --git a/static/locales/gsw.yaml b/static/locales/gsw.yaml index 2bb07638058e2..e964dc53aab8e 100644 --- a/static/locales/gsw.yaml +++ b/static/locales/gsw.yaml @@ -49,4 +49,3 @@ Settings: SponsorBlock Settings: {} Channel: {} Tooltips: {} -Age Restricted: {} diff --git a/static/locales/he.yaml b/static/locales/he.yaml index 83e9419123c02..7e353cc407fa7 100644 --- a/static/locales/he.yaml +++ b/static/locales/he.yaml @@ -874,7 +874,7 @@ Up Next: 'הסרטון הבא' Local API Error (Click to copy): 'בעיה ב־API המקומי (יש ללחוץ להעתקה)' Invidious API Error (Click to copy): 'בעיה ב־API של Invidious (יש ללחוץ להעתקה)' Falling back to Invidious API: 'מתבצעת נסיגה ל־API של Invidious' -Falling back to the local API: 'מתבצעת נסיגה ל־API המקומי' +Falling back to Local API: 'מתבצעת נסיגה ל־API המקומי' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'חסרות תצורות לסרטון הזה. הדבר יכול להיגרם בגלל חוסר זמינות למדינה.' Subscriptions have not yet been implemented: 'מנגנון המינויים עדיין לא מוכן' @@ -980,11 +980,6 @@ Playing Next Video Interval: הסרטון הבא יתחיל מייד. לחיצה Screenshot Success: צילום המסך נשמר בתור „{filePath}” Screenshot Error: צילום המסך נכשל. {error} New Window: חלון חדש -Age Restricted: - Type: - Channel: ערוץ - Video: סרטון - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} זה מוגבל בגיל' Channels: Search bar placeholder: חיפוש ערוצים Empty: רשימת הערוצים שלך ריקה כרגע. diff --git a/static/locales/hr.yaml b/static/locales/hr.yaml index a57585b8ac84d..0c6dd7454b002 100644 --- a/static/locales/hr.yaml +++ b/static/locales/hr.yaml @@ -195,6 +195,7 @@ User Playlists: videa dodana u 1 zbirku Select a playlist to add your N videos to: Odaberi zbirku za dodavanje tvog videa | Odaberi zbirku za dodavanje tvojih {videoCount} videa + Added {count} Times: Dodano {count} puta | Dodano {count} puta CreatePlaylistPrompt: Create: Stvori Toast: @@ -272,11 +273,12 @@ Settings: Black: 'Crna' Dark: 'Tamna' Light: 'Svijetla' - Dracula: 'Drakula' + Dracula: 'Dracula' System Default: Standard sustava Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastelno ružičasta Hot Pink: Vruća ružičasta + Nordic: Nordic Main Color Theme: Main Color Theme: 'Glavna boja teme' Red: 'Crvena' @@ -521,7 +523,7 @@ Settings: Hide Channels: Sakrij videa iz kanala Hide Channels Placeholder: ID kanala Display Titles Without Excessive Capitalisation: Prikaži naslove bez pretjeranog - korištenja velikih slova + korištenja velikih slova i interpunkcije Hide Featured Channels: Sakrij istaknute kanale Hide Channel Playlists: Sakrij kanal zbirki Hide Channel Community: Sakrij kanal zajednice @@ -927,7 +929,7 @@ Video: Resolution: Razlučivost Player Dimensions: Dimenzije playera Bitrate: Brzina prijenosa - Volume: Glasnoća + Volume: Direktorij Bandwidth: Propusnost Buffered: Učitano u memoriju Mimetype: Mimetype @@ -942,6 +944,7 @@ Video: Pause on Current Video: Zaustavi trenutačni video Unhide Channel: Prikaži kanal Hide Channel: Sakrij kanal + More Options: Više opcija Videos: #& Sort By Sort By: @@ -1022,7 +1025,7 @@ Up Next: 'Sljedeći' Local API Error (Click to copy): 'Greška lokalnog sučelja (pritisni za kopiranje)' Invidious API Error (Click to copy): 'Greška Invidious sučelja (pritisni za kopiranje)' Falling back to Invidious API: 'Koristit će se Invidious sučelje' -Falling back to the local API: 'Koristit će se lokalno sučelje' +Falling back to Local API: 'Koristit će se lokalno sučelje' Subscriptions have not yet been implemented: 'Pretplate još nisu implementirane' Loop is now disabled: 'Ponavljanje je sada deaktivirano' Loop is now enabled: 'Ponavljanje je sada aktivirano' @@ -1053,7 +1056,7 @@ Tooltips: Proxy Videos Through Invidious: Za reprodukciju videa povezat će se s Invidiousom umjesto izravnog povezivanja s YouTubeom. Zanemaruje postavke sučelja. Force Local Backend for Legacy Formats: Radi samo, kad se Invidious postavi kao - standardno sučelje. Kada je aktivirano, lokalno sučelje će pokretati i koristiti + standardno sučelje. Kada je aktivirano, lokalno API sučelje će pokretati i koristiti stare formate umjesto onih koje dostavlja Invidious. Pomaže u slučajevima, kad je reprodukcija videa koje dostavlja Invidious u zemlji zabranjena/ograničena. Scroll Playback Rate Over Video Player: Dok se pokazivač nalazi na videu, pritisni @@ -1148,11 +1151,6 @@ Starting download: Početak preuzimanja „{videoTitle}” Screenshot Success: Snimka ekrana je spremljena pod „{filePath}” Screenshot Error: Neuspjela snimka ekrana. {error} New Window: Novi prozor -Age Restricted: - This {videoOrPlaylist} is age restricted: Ovaj {videoOrPlaylist} je dobno ograničen - Type: - Channel: Kanal - Video: Video Channels: Channels: Kanali Title: Popis kanala @@ -1187,3 +1185,7 @@ Channel Unhidden: '{channel} je uklonjen iz filtra kanala' Trimmed input must be at least N characters long: Skraćeni unos mora imati barem 1 znak | Skraćeni unos mora imati barem {length} znaka Tag already exists: Oznaka „{tagName}” već postoji +Age Restricted: + This channel is age restricted: Ovaj je dobno ograničeni kanal + This video is age restricted: Ovaj je dobno ograničeni video +Close Banner: Zatvori natpis diff --git a/static/locales/hu.yaml b/static/locales/hu.yaml index 0d431f89843d0..14f4d75982eb3 100644 --- a/static/locales/hu.yaml +++ b/static/locales/hu.yaml @@ -1,5 +1,5 @@ # Put the name of your locale in the same language -Locale Name: 'English (US)' +Locale Name: 'Magyar' FreeTube: 'FreeTube' # Currently on Subscriptions, Playlists, and History 'This part of the app is not ready yet. Come back later when progress has been made.': >- @@ -147,12 +147,13 @@ User Playlists: lejátszási listákhoz "{videoCount} video(s) added to 1 playlist": 1 videó hozzáadva 1 lejátszási listához | {videoCount} videó hozzáadása 1 lejátszási listához - You haven't selected any playlist yet.: Még nem választott ki lejátszási listát - sem. + You haven't selected any playlist yet.: Még nem választott ki egyetlen lejátszási + listát sem. Select a playlist to add your N videos to: Válasszon ki egy lejátszási listát a videó hozzáadásához | Válasszon ki egy lejátszási listát a {videoCount} videó hozzáadásához N playlists selected: '{playlistCount} Kiválasztott' + Added {count} Times: Hozzáadva {count} Alkalommal | Hozzáadva {count} Alkalommal SinglePlaylistView: Toast: There were no videos to remove.: Nem voltak eltávolítható videók. @@ -296,6 +297,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pasztell rózsaszín Hot Pink: Forró rózsaszín + Nordic: Skandináv Main Color Theme: Main Color Theme: 'Fő színtéma' Red: 'Vörös' @@ -533,14 +535,14 @@ Settings: Hide Playlists: Lejátszási listák elrejtése Hide Video Description: Videó leírásának elrejtése Hide Comments: Megjegyzések elrejtése - Hide Live Streams: Élő adatfolyamok elrejtése + Hide Live Streams: Élő közvetítések elrejtése Hide Sharing Actions: Megosztási műveletek elrejtése Hide Chapters: Fejezetek elrejtése Hide Upcoming Premieres: Közelgő első előadások elrejtése Hide Channels: Videók elrejtése a csatornákból Hide Channels Placeholder: Csatornaazonosító - Display Titles Without Excessive Capitalisation: Címek megjelenítése túlzott nagybetűk - nélkül + Display Titles Without Excessive Capitalisation: Jelenítse meg a címeket túlzott + nagybetűs írás és írásjelek nélkül Hide Featured Channels: Kiemelt csatornák elrejtése Hide Channel Playlists: Csatorna lejátszási listák elrejtése Hide Channel Community: Csatornaközösség elrejtése @@ -952,6 +954,7 @@ Video: Pause on Current Video: Jelenlegi videó szüneteltetése Unhide Channel: Csatorna megjelenítése Hide Channel: Csatorna elrejtése + More Options: További beállítások Videos: #& Sort By Sort By: @@ -1036,7 +1039,7 @@ Up Next: 'Következő' Local API Error (Click to copy): 'Helyi-API hiba (kattintson a másoláshoz)' Invidious API Error (Click to copy): 'Invidious-API hiba (Kattintson a másoláshoz)' Falling back to Invidious API: 'Invidious-API visszatérve' -Falling back to the local API: 'Helyi-API visszatérve' +Falling back to Local API: 'Helyi-API visszatérve' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Ez a videó hiányzó formátumok miatt nem érhető el. Ez az ország nem elérhetősége miatt következhet be.' @@ -1088,10 +1091,10 @@ Tooltips: videókat szolgáltasson, ahelyett, hogy közvetlen kapcsolatot létesítene a YouTube szolgáltatással. Felülbírálja az API beállítást. Force Local Backend for Legacy Formats: Csak akkor működik, ha az Invidious API - az alapértelmezett. Ha engedélyezve van, a helyi API futni fog, és az általa - visszaadott örökölt formátumokat fogja használni az Invidious által visszaadottak - helyett. Segít, ha az Invidious által visszaküldött videókat nem lehet lejátszani - az ország korlátozása miatt. + az alapértelmezett. Ha engedélyezve van, a helyi API fut, és az általa visszaadott + régi formátumokat használja az Invidious által visszaadottak helyett. Segít, + ha az Invidious által visszaküldött videók nem játszódnak le az országos korlátozások + miatt. Scroll Playback Rate Over Video Player: Amíg a kurzor a videó felett van, nyomja meg és tartsa lenyomva a Control billentyűt (Mac gépen a Command billentyű), és görgesse az egér görgőjét előre vagy hátra a lejátszási sebesség szabályozásához. @@ -1170,11 +1173,6 @@ Channels: Unsubscribe: Leiratkozás Unsubscribed: '{channelName} eltávolítva az feliratkozásáiból' Unsubscribe Prompt: Biztosan le szeretne iratkozni a(z) „{channelName}” csatornáról? -Age Restricted: - Type: - Video: Videó - Channel: Csatorna - This {videoOrPlaylist} is age restricted: A(z) {videoOrPlaylist} korhatáros Downloading failed: Hiba történt a(z) „{videoTitle}” letöltése során Starting download: „{videoTitle}” letöltésének indítása Downloading has completed: A(z) „{videoTitle}” letöltése befejeződött @@ -1207,3 +1205,7 @@ Trimmed input must be at least N characters long: A vágott bemenetnek legalább hosszúnak kell lennie | A vágott bemenetnek legalább {length} karakter hosszúnak kell lennie Tag already exists: '„{tagName}” címke már létezik' +Close Banner: Banner bezárása +Age Restricted: + This channel is age restricted: Ez a csatorna korhatáros + This video is age restricted: Ez a videó korhatáros diff --git a/static/locales/id.yaml b/static/locales/id.yaml index 999003a20429b..b471e1b32a715 100644 --- a/static/locales/id.yaml +++ b/static/locales/id.yaml @@ -753,7 +753,7 @@ Up Next: 'Akan Datang' Local API Error (Click to copy): 'API Lokal Galat (Klik untuk menyalin)' Invidious API Error (Click to copy): 'API Invidious Galat (Klik untuk menyalin)' Falling back to Invidious API: 'Kembali ke API Invidious' -Falling back to the local API: 'Kembali ke API lokal' +Falling back to Local API: 'Kembali ke API lokal' Subscriptions have not yet been implemented: 'Langganan masih belum diterapkan' Loop is now disabled: 'Putar-Ulang sekarang dimatikan' Loop is now enabled: 'Putar-Ulang sekarang diaktifkan' diff --git a/static/locales/is.yaml b/static/locales/is.yaml index d97840fcefbb2..5434496d6416f 100644 --- a/static/locales/is.yaml +++ b/static/locales/is.yaml @@ -44,6 +44,8 @@ Global: Subscriber Count: 1 áskrifandi | {count} áskrifendur View Count: 1 áhorf | {count} áhorf Watching Count: 1 að horfa | {count} að horfa + Input Tags: + Length Requirement: Merki þarf að vera a.m.k. {number} stafa langt Version {versionNumber} is now available! Click for more details: 'Útgáfa {versionNumber} er tiltæk! Smelltu til að skoða nánar' Download From Site: 'Sækja af vefsvæði' @@ -174,6 +176,14 @@ User Playlists: Some videos in the playlist are not loaded yet. Click here to copy anyway.: Sum myndskeið í spilunarlistanum hafa ekki enn hlaðist inn. Smelltu hér til að afrita samt. + This playlist is now used for quick bookmark: Þessi spilunarlisti er núna notaður + undir flýtibókamerki + Quick bookmark disabled: Flýtibókamerki óvirk + This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Þessi + spilunarlisti er núna notaður undir flýtibókamerki í stað {oldPlaylistName}. + Smelltu hér til að afturkalla + Reverted to use {oldPlaylistName} for quick bookmark: Snéri aftur í að nota + {oldPlaylistName} undir flýtibókamerki AddVideoPrompt: N playlists selected: '{playlistCount} valin' Search in Playlists: Leita í spilunarlistum @@ -187,6 +197,7 @@ User Playlists: | {videoCount} myndskeiðum bætt við 1 spilunarlista Select a playlist to add your N videos to: Veldu spilunarlista til að bæta myndskeiðinu þínu á | Veldu spilunarlista til að bæta {videoCount}̣ myndskeiðunum þínum á + Added {count} Times: Bætt við {count} sinni | Bætt við {count} sinnum CreatePlaylistPrompt: Create: Búa til New Playlist Name: Heiti á nýjum spilunarlista @@ -209,6 +220,10 @@ User Playlists: Delete Playlist: Eyða spilunarlista Are you sure you want to delete this playlist? This cannot be undone: Ertu viss um að þú viljir eyða þessum spilunarlista? Aðgerðin er ekki afturkallanleg. + Add to Favorites: Bæta á {playlistName} + Remove from Favorites: Fjarlægja af {playlistName} + Enable Quick Bookmark With This Playlist: Virkja flýtibókamerki með þessum spilunarlista + Disable Quick Bookmark: Eyða flýtibókamerki History: # On History Page History: 'Áhorf' @@ -283,6 +298,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastelbleikt Hot Pink: Dimmbleikt + Nordic: Norrænt Main Color Theme: Main Color Theme: 'Aðallitur þema' Red: 'Rautt' @@ -436,6 +452,7 @@ Settings: Hide Channels: Fela myndskeið úr rásum Hide Channels Placeholder: Auðkenni rásar Display Titles Without Excessive Capitalisation: Birta titla án umfram-hástafa + og greinarmerkja Sections: Side Bar: Hliðarspjald Channel Page: Rásasíða @@ -461,6 +478,9 @@ Settings: Hide Channels Already Exists: Auðkenni rásar er þegar til Hide Channels API Error: Villa við að ná í notanda með uppgefið auðkenni. Athugaðu aftur hvort auðkennið ré rétt. + Hide Videos and Playlists Containing Text: Fela myndskeið og spilunarlista sem + innihalda texta + Hide Videos and Playlists Containing Text Placeholder: Orð, orðhluti eða setning Data Settings: Data Settings: 'Stillingar gagna' Select Import Type: 'Veldu tegund innflutnings' @@ -721,6 +741,7 @@ Channel: Reveal Answers: Birta svör Hide Answers: Fela svör votes: '{votes} atkvæði' + Video hidden by FreeTube: Myndskeið falið af FreeTube Shorts: This channel does not currently have any shorts: Þessi rás er í augnablikinu ekki með neinar stuttmyndir @@ -878,6 +899,7 @@ Video: Pause on Current Video: Setja núverandi myndskeið í bið Unhide Channel: Birta rás Hide Channel: Fela rás + More Options: Fleiri valkostir Videos: #& Sort By Sort By: @@ -1043,7 +1065,7 @@ Local API Error (Click to copy): 'Villa í staðværu API-kerfisviðmóti (smell Invidious API Error (Click to copy): 'Villa í Invidious API-kerfisviðmóti (smella til að afrita)' Falling back to Invidious API: 'Nota til vara Invidious API-kerfisviðmót' -Falling back to the local API: 'Nota til vara staðvært API-kerfisviðmót' +Falling back to Local API: 'Nota til vara staðvært API-kerfisviðmót' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Þetta myndskeiðer ekki tiltækt vegna þess að það vantar skráasnið. Þetta getur gest ef þau eru ekki tiltæk í viðkomandi landi.' @@ -1084,11 +1106,6 @@ Starting download: Byrja að sækja "{videoTitle}" Downloading failed: Vandamál kom upp við að sækja "{videoTitle}" Screenshot Error: Skjámyndataka mistókst. {error} Screenshot Success: Vistaði skjámynd sem "{filePath}" -Age Restricted: - Type: - Channel: Rás - Video: Myndskeið - This {videoOrPlaylist} is age restricted: Þetta {videoOrPlaylist} er með aldurstakmörkunum New Window: Nýr gluggi Channels: Search bar placeholder: Leita í rásum @@ -1122,3 +1139,8 @@ Playlist will not pause when current video is finished: Spilunarlisti mun ekki f Go to page: Fara á {page} Channel Hidden: '{channel} bætt við rásasíu' Channel Unhidden: '{channel} fjarlægt úr rásasíu' +Close Banner: Loka borða +Age Restricted: + This video is age restricted: Þetta myndskeið er með aldurstakmörkunum + This channel is age restricted: Þessi rás er með aldurstakmörkunum +Tag already exists: '"{tagName}" merkið er þegar til staðar' diff --git a/static/locales/it.yaml b/static/locales/it.yaml index 39ad919c263a2..f09d519e0cf72 100644 --- a/static/locales/it.yaml +++ b/static/locales/it.yaml @@ -143,6 +143,7 @@ User Playlists: Select a playlist to add your N videos to: Seleziona una playlist a cui aggiungere il tuo video | Seleziona una playlist a cui aggiungere i tuoi {videoCount} video N playlists selected: '{playlistCount} selezionate' + Added {count} Times: Aggiunto {count} volta | Aggiunti {count} volte SinglePlaylistView: Toast: There were no videos to remove.: Non c'erano video da rimuovere. @@ -287,6 +288,7 @@ Settings: Catppuccin Mocha: Cappuccino moka Pastel Pink: Rosa pastello Hot Pink: Rosa caldo + Nordic: Nordico Main Color Theme: Main Color Theme: 'Colore principale del tema' Red: 'Rosso' @@ -536,8 +538,8 @@ Settings: Hide Upcoming Premieres: Nascondi le prossime Première Hide Channels: Nascondi i video dai canali Hide Channels Placeholder: ID del canale - Display Titles Without Excessive Capitalisation: Visualizza i titoli senza un - uso eccessivo di maiuscole + Display Titles Without Excessive Capitalisation: Visualizza i titoli senza maiuscole + e punteggiatura eccessive Hide Featured Channels: Nascondi i canali in evidenza Hide Channel Playlists: Nascondi le playlist del canale Hide Channel Community: Nascondi la comunità del canale @@ -913,6 +915,7 @@ Video: Pause on Current Video: Pausa sul video attuale Unhide Channel: Mostra canale Hide Channel: Nascondi canale + More Options: Più opzioni Videos: #& Sort By Sort By: @@ -996,7 +999,7 @@ Up Next: 'Prossimi video' Local API Error (Click to copy): 'Errore API Locale (Clicca per copiare)' Invidious API Error (Click to copy): 'Errore API Invidious (Clicca per copiare)' Falling back to Invidious API: 'Torno alle API Invidious' -Falling back to the local API: 'Torno alle API locali' +Falling back to Local API: 'Torno alle API locali' Subscriptions have not yet been implemented: 'Le Iscrizioni non sono ancora state implementate' Loop is now disabled: 'Il loop è ora disabilitato' @@ -1177,13 +1180,6 @@ Starting download: Avvio del download di "{videoTitle}" Downloading failed: Si è verificato un problema durante il download di "{videoTitle}" Screenshot Success: Screenshot salvato come "{filePath}" Screenshot Error: Screenshot non riuscito. {error} -Age Restricted: - The currently set default instance is {instance}: Questo {instance} è limitato dall'età - Type: - Channel: Canale - Video: Video - This {videoOrPlaylist} is age restricted: Questo {videoOrPlaylist} ha limiti di - età New Window: Nuova finestra Channels: Unsubscribed: '{channelName} è stato rimosso dalle tue iscrizioni' @@ -1220,3 +1216,7 @@ Channel Unhidden: '{channel} rimosso dal filtro canali' Tag already exists: Il tag "{tagName}" esiste già Trimmed input must be at least N characters long: L'input troncato deve essere lungo almeno 1 carattere | L'input troncato deve essere lungo almeno {length} caratteri +Age Restricted: + This video is age restricted: Questo video è soggetto a limiti di età + This channel is age restricted: Questo canale è soggetto a limiti di età +Close Banner: Chiudi banner diff --git a/static/locales/ja.yaml b/static/locales/ja.yaml index 9136a3fdc96d7..f851625cbf295 100644 --- a/static/locales/ja.yaml +++ b/static/locales/ja.yaml @@ -114,6 +114,10 @@ User Playlists: このページは、完全に動作する動画リストではありません。保存またはお気に入りと設定した動画のみが表示されます。操作が完了すると、現在ここにあるすべての動画は「お気に入り」の動画リストに移動します。 Search bar placeholder: 動画リスト内の検索 Empty Search Message: この再生リストに、検索に一致する動画はありません + This playlist currently has no videos.: 存在、この再生リストには動画があっていません。 + Create New Playlist: 新規再生リストを作られる + Sort By: + NameAscending: A-Z History: # On History Page History: '履歴' @@ -276,7 +280,7 @@ Settings: Folder Button: フォルダーの選択 Enter Fullscreen on Display Rotate: 横画面時にフルスクリーンにする Skip by Scrolling Over Video Player: 動画プレーヤーでスクロールしてスキップ可能にする - Allow DASH AV1 formats: DASH AV1形式を許可する + Allow DASH AV1 formats: DASH AV1形式を許可 Comment Auto Load: Comment Auto Load: コメント自動読み込み Subscription Settings: @@ -794,7 +798,7 @@ Up Next: '次の動画' Local API Error (Click to copy): '内部 API エラー(クリックするとコピー)' Invidious API Error (Click to copy): 'Invidious API エラー(クリックするとコピー)' Falling back to Invidious API: '代替の Invidious API に切替' -Falling back to the local API: '代替の内部 API に切替' +Falling back to Local API: '代替の内部 API に切替' Subscriptions have not yet been implemented: '登録チャンネルは未実装です' Loop is now disabled: 'ループ再生を無効にしました' Loop is now enabled: 'ループ再生を有効にしました' @@ -850,7 +854,7 @@ The playlist has been reversed: 再生リストを逆順にしました A new blog is now available, {blogTitle}. Click to view more: '新着ブログ公開、{blogTitle}。クリックしてブログを読む' Download From Site: サイトからダウンロード Version {versionNumber} is now available! Click for more details: 最新バージョン {versionNumber} - 配信中! 詳細はクリックして確認してください + 配信中!詳細はクリックして確認してください This video is unavailable because of missing formats. This can happen due to country unavailability.: この動画は、動画形式の情報が利用できないため再生できません。再生が許可されていない国で発生します。 Tooltips: Subscription Settings: @@ -866,8 +870,8 @@ Tooltips: Scroll Playback Rate Over Video Player: カーソルが動画上にあるとき、Ctrl キー(Mac では Command キー)を押したまま、マウスホイールを前後にスクロールして再生速度を調整します。Control キー(Mac では Command キー)を押したままマウスを左クリックすると、すぐにデフォルトの再生速度(設定を変更していない場合は 1 x)に戻ります。 Skip by Scrolling Over Video Player: スクロール ホイールを使用して、ビデオ、MPV スタイルをスキップします。 - Allow DASH AV1 formats: DASH H.264形式よりDASH AV1形式の方がきれいに見える可能性があるけど、再生には必要な電力がより多い。全ての動画でDASH - AV1を利用できないため、プレイヤーはDASH H.264形式に自動変更する場合があります。 + Allow DASH AV1 formats: DASH H.264形式よりもDASH AV1形式の方がきれいに見える可能性がありますが、再生にはより多くの処理能力が必要となります。DASH + AV1形式を使用できない場合、プレイヤーはDASH H.264形式を自動で使用します。 General Settings: Invidious Instance: FreeTube が使用する Invidious API の接続先サーバーです。 Preferred API Backend: FreeTube が youtube からデータを取得する方法を選択します。「内部 API」とはアプリから取得する方法です。「Invidious @@ -913,12 +917,6 @@ Are you sure you want to open this link?: このリンクを開きますか? Starting download: '"{videoTitle}" のダウンロードを開始します' Downloading has completed: '"{videoTitle}" のダウンロードが終了しました' Downloading failed: '"{videoTitle}" のダウンロード中に問題が発生しました' -Age Restricted: - The currently set default instance is {instance}: '{instance} は 18 歳以上の視聴者向け動画です' - Type: - Channel: チャンネル - Video: 動画 - This {videoOrPlaylist} is age restricted: この {videoOrPlaylist} は年齢制限があります Channels: Channels: チャンネル Unsubscribe: 登録解除 @@ -947,3 +945,5 @@ Hashtag: This hashtag does not currently have any videos: このハッシュタグには現在動画がありません Playlist will pause when current video is finished: 現在のビデオが終了すると、プレイリストは停止します Playlist will not pause when current video is finished: 現在のビデオが終了しても、プレイリストは停止しません +Close Banner: バナーを閉じる +Go to page: '{page}に行く' diff --git a/static/locales/ko.yaml b/static/locales/ko.yaml index 31e708ce5288f..48ab70bc08ce1 100644 --- a/static/locales/ko.yaml +++ b/static/locales/ko.yaml @@ -761,7 +761,7 @@ Tooltips: Local API Error (Click to copy): '로컬 API 오류(복사하려면 클릭)' Invidious API Error (Click to copy): 'Invidious API 오류(복사하려면 클릭)' Falling back to Invidious API: 'Invidious API로 대체' -Falling back to the local API: '로컬 API로 대체' +Falling back to Local API: '로컬 API로 대체' This video is unavailable because of missing formats. This can happen due to country unavailability.: '이 동영상은 형식이 누락되어 사용할 수 없습니다. 이는 국가를 사용할 수 없기 때문에 발생할 수 있습니다.' Subscriptions have not yet been implemented: '구독이 아직 구현되지 않았습니다' @@ -804,11 +804,6 @@ Channels: Unsubscribe Prompt: '"{channelName}"에서 구독을 취소하시겠습니까?' Count: '{number} 채널이 발견되었습니다.' Unsubscribed: '{channelName} 구독에서 제거되었습니다' -Age Restricted: - Type: - Video: 비디오 - Channel: 채널 - The currently set default instance is {instance}: 이 {instance}는 연령 제한입니다 Downloading has completed: '"{videoTitle}" 다운로드가 완료되었습니다' Starting download: '"{videoTitle}" 다운로드를 시작하는 중' Downloading failed: '"{videoTitle}"를 다운로드하는 동안 문제가 발생했습니다' diff --git a/static/locales/lt.yaml b/static/locales/lt.yaml index d3ba59417dcd5..47fd7d1ba9379 100644 --- a/static/locales/lt.yaml +++ b/static/locales/lt.yaml @@ -41,6 +41,9 @@ Global: Counts: Subscriber Count: 1 prenumeruoti | {count} prenumeratorių Channel Count: 1 kanalas | {count} kanalai + Video Count: 1 vaizdo įrašas | {count} vaizdo įrašai + View Count: 1 peržiūrėti | {count} peržiūrų + Watching Count: 1 žiūri | {count} žiūri Version {versionNumber} is now available! Click for more details: 'Versija {versionNumber} jau prieinama! Spustelėkite, jei norite gauti daugiau informacijos' Download From Site: 'Atsisiųsti iš svetainės' @@ -842,7 +845,7 @@ Local API Error (Click to copy): 'Vietinė API klaida (spustelėkite, jei norite Invidious API Error (Click to copy): 'Invidious API klaida (spustelėkite, jei norite kopijuoti)' Falling back to Invidious API: 'Grįžtama prie Invidious API' -Falling back to the local API: 'Grįžtama prie vietinio API' +Falling back to Local API: 'Grįžtama prie vietinio API' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Šis vaizdo įrašas nepasiekiamas, nes trūksta formatų. Tai gali nutikti dėl to, kad šalis yra nepasiekiama.' @@ -887,12 +890,6 @@ Channels: Unsubscribe: Atšaukti prenumeratą Unsubscribed: '{channelName} buvo pašalintas iš jūsų prenumeratų' Unsubscribe Prompt: Ar tikrai norite atšaukti {channelName} prenumeratą? -Age Restricted: - Type: - Channel: Kanalas - Video: Vaizdo įrašas - This {videoOrPlaylist} is age restricted: Šis {videoOrPlaylist} ribojamas pagal - amžių Downloading has completed: „{videoTitle}“ atsisiuntimas baigtas Starting download: Pradedamas „{videoTitle}“ atsisiuntimas Downloading failed: Atsisiunčiant „{videoTitle}“ kilo problema @@ -910,3 +907,4 @@ Clipboard: be saugaus ryšio Preferences: Nuostatos Go to page: Eiti į {page} +Close Banner: Uždaryti baneris diff --git a/static/locales/lv.yaml b/static/locales/lv.yaml index c08d4259a0616..130bb3cbfbf46 100644 --- a/static/locales/lv.yaml +++ b/static/locales/lv.yaml @@ -828,7 +828,7 @@ Tooltips: Local API Error (Click to copy): '' Invidious API Error (Click to copy): '' Falling back to Invidious API: '' -Falling back to the local API: '' +Falling back to Local API: '' This video is unavailable because of missing formats. This can happen due to country unavailability.: '' Subscriptions have not yet been implemented: '' Unknown YouTube url type, cannot be opened in app: '' @@ -848,11 +848,6 @@ Canceled next video autoplay: '' Default Invidious instance has been set to {instance}: '' Default Invidious instance has been cleared: '' 'The playlist has ended. Enable loop to continue playing': '' -Age Restricted: - This {videoOrPlaylist} is age restricted: '' - Type: - Channel: '' - Video: '' External link opening has been disabled in the general settings: '' Downloading has completed: '' Starting download: '' diff --git a/static/locales/nb_NO.yaml b/static/locales/nb_NO.yaml index 06f3b86aa4417..86ec5a9de0b30 100644 --- a/static/locales/nb_NO.yaml +++ b/static/locales/nb_NO.yaml @@ -784,7 +784,7 @@ Up Next: 'Neste' Local API Error (Click to copy): 'Lokal API-feil (Klikk her for å kopiere)' Invidious API Error (Click to copy): 'Invidious-API-feil (Klikk her for å kopiere)' Falling back to Invidious API: 'Faller tilbake til Invidious-API-et' -Falling back to the local API: 'Faller tilbake til det lokale API-et' +Falling back to Local API: 'Faller tilbake til det lokale API-et' Subscriptions have not yet been implemented: 'Abonnement har ikke blitt implementert enda' Loop is now disabled: 'Gjenta er nå deaktivert' @@ -947,11 +947,6 @@ Channels: Unsubscribe: Opphev abonnement Unsubscribed: '{channelName} ble fjernet fra dine abonnementer' Unsubscribe Prompt: Opphev abonnement på «{channelName}»? -Age Restricted: - Type: - Channel: Kanal - Video: Video - This {videoOrPlaylist} is age restricted: Denne {videoOrPlaylist} er aldersbegrenset Chapters: Chapters: Kapitler 'Chapters list visible, current chapter: {chapterName}': 'Kapittelliste synlig. diff --git a/static/locales/nl.yaml b/static/locales/nl.yaml index 6f6d323369fb7..2ae36cb08995e 100644 --- a/static/locales/nl.yaml +++ b/static/locales/nl.yaml @@ -45,6 +45,8 @@ Global: Watching Count: 1 aan het kijken | {count} aan het kijken Channel Count: 1 kanaal | {count} kanalen Community: Gemeenschap + Input Tags: + Length Requirement: Tag moet minstens {number} tekens lang zijn Search / Go to URL: 'Zoeken / Ga naar URL' # In Filter Button Search Filters: @@ -135,12 +137,88 @@ User Playlists: LatestCreatedFirst: On­langs aan­gemaakt NameDescending: Z - A NameAscending: A - Z + EarliestPlayedFirst: Eerst gespeeld + EarliestCreatedFirst: Eerst aangemaakt + LatestUpdatedFirst: Laatst bijgewerkt + EarliestUpdatedFirst: Eerst bijgewerkt + LatestPlayedFirst: Meest recent afgespeeld CreatePlaylistPrompt: Create: Aanmaken + New Playlist Name: Naam voor nieuwe afspeel­lijst + Toast: + Playlist {playlistName} has been successfully created.: Afspeel­lijst ‘{playlistName}’ + is succes­vol aan­gemaakt. + There was an issue with creating the playlist.: Er is een probleem opgetreden + bij het maken van de afspeel­lijst. + There is already a playlist with this name. Please pick a different name.: Er + is al een afspeel­lijst met deze naam. Kies een andere naam. AddVideoPrompt: Save: Opslaan + N playlists selected: '{playlistCount} geselecteerd' + Search in Playlists: Zoeken in afspeel­lijsten + Toast: + You haven't selected any playlist yet.: U heeft nog geen afspeel­lijst geselecteerd. + "{videoCount} video(s) added to 1 playlist": 1 video toegevoegd aan een afspeellijst + | {videoCount} video's toegevoegd aan een afspeellijst + "{videoCount} video(s) added to {playlistCount} playlists": 1 video toe­gevoegd + aan {playlistCount} afspeel­lijsten | {videoCount} video's toe­gevoegd aan + {playlistCount} afspeel­lijsten + Select a playlist to add your N videos to: Selecteer een afspeellijst om uw video + aan toe te voegen | Selecteer een afspeellijst om uw {videoCount} video's aan + toe te voegen + Added {count} Times: '{count} keer toe­gevoegd | {count} keer toe­gevoegd' Save Changes: Wijzigingen opslaan Copy Playlist: Afspeel­lijst kopiëren + Create New Playlist: Nieuwe afspeel­lijst aanmaken + Add to Playlist: Toevoegen aan afspeel­lijst + Move Video Up: Video omhoog verplaatsen + Move Video Down: Video omlaag verplaatsen + Remove from Playlist: Verwijderen uit afspeellijst + Edit Playlist Info: Afspeel­lijst­info bewerken + Remove Watched Videos: Bekeken video's verwijderen + Add to Favorites: Toevoegen aan {playlistName} + Remove from Favorites: Verwijderen uit {playlistName} + Disable Quick Bookmark: Snelle bladwijzers uitschakelen + SinglePlaylistView: + Toast: + Video has been removed: Video is verwijderd + Quick bookmark disabled: Snelle bladwijzers uitgeschakeld + Playlist has been updated.: De afspeel­lijst is bijgewerkt. + This video cannot be moved up.: Deze video kan niet omhoog verplaatst worden. + This video cannot be moved down.: Deze video kan niet omlaag verplaatst worden. + Playlist {playlistName} has been deleted.: Afspeel­lijst ‘{playlistName}’ is + verwijderd. + This playlist does not exist: Deze afspeel­lijst bestaat niet + There were no videos to remove.: Er zijn geen video's om te verwijderen. + There was a problem with removing this video: Er is een probleem opgetreden + bij het verwijderen van deze video + This playlist is now used for quick bookmark: Deze afspeel­lijst wordt nu gebruikt + voor snelle blad­wijzers + This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Deze + afspeellijst wordt nu gebruikt voor snelle bladwijzers in plaats van {oldPlaylistName}. + Druk hier om ongedaan te maken + Reverted to use {oldPlaylistName} for quick bookmark: Terug­gekeerd naar het + gebruik van {oldPlaylistName} voor snelle blad­wijzers + Some videos in the playlist are not loaded yet. Click here to copy anyway.: Sommige + video's in de afspeel­lijst zijn nog niet geladen. Druk hier om toch te kopiëren. + "{videoCount} video(s) have been removed": 1 video verwijderd | {videoCount} + video's verwijderd + This playlist is protected and cannot be removed.: Deze afspeel­lijst is beschermd + en kan niet worden verwijderd. + Playlist name cannot be empty. Please input a name.: De naam van de afspeel­lijst + mag niet leeg zijn. Voer een naam in. + There was an issue with updating this playlist.: Er is een probleem opgetreden + bij het bij­werken van deze afspeel­lijst. + You have no playlists. Click on the create new playlist button to create a new one.: U + heeft geen afspeellijsten. Druk op de knop om er één aan te maken. + This playlist currently has no videos.: Deze afspeel­lijst bevat geen video's. + Enable Quick Bookmark With This Playlist: Snelle blad­wijzers inschakelen voor deze + afspeel­lijst + Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Weet + u zeker dat u alle bekeken video's uit deze afspeel­lijst wilt verwijderen? Dit + kan niet ongedaan gemaakt worden. + Are you sure you want to delete this playlist? This cannot be undone: Weet u zeker + dat u deze afspeel­lijst wilt verwijderen? Dit kan niet ongedaan gemaakt worden. History: # On History Page History: 'Geschiedenis' @@ -209,6 +287,7 @@ Settings: Catppuccin Mocha: Catppuccin-mokka Pastel Pink: Pastel­roze Hot Pink: Heet-roze + Nordic: Noords Main Color Theme: Main Color Theme: 'Primaire themakleur' Red: 'Rood' @@ -333,12 +412,18 @@ Settings: verwijderen Save Watched Videos With Last Viewed Playlist: Houd bekeken video's bij met de afspeellijst ‘Laatst bekeken’ + Remove All Playlists: Alle afspeel­lijsten verwijderen + All playlists have been removed: Alle afspeel­lijsten zijn verwijderd + Are you sure you want to remove all your playlists?: Weet u zeker dat u al uw + afspeel­lijsten wilt verwijderen? Subscription Settings: Subscription Settings: 'Abonnement­instellingen' Hide Videos on Watch: 'Bekeken video''s verbergen' Manage Subscriptions: 'Abonnementen beheren' Fetch Feeds from RSS: Verzamel feeds via RSS Fetch Automatically: Haal feed automatisch op + Only Show Latest Video for Each Channel: Alleen nieuwste video voor elk kanaal + tonen Advanced Settings: Advanced Settings: 'Geavanceerde Instellingen' Enable Debug Mode (Prints data to the console): 'Schakel Debug Modus in (Print @@ -415,6 +500,14 @@ Settings: Subscription File: Abonnementenbestand History File: Geschiedenisbestand Playlist File: Afspeellijstbestand + Export Playlists For Older FreeTube Versions: + Label: Afspeel­lijsten exporteren voor oudere FreeTube-versies + Tooltip: "Deze optie exporteert video's van alle afspeel­lijsten naar één afspeel­lijst + met de naam ‘Favorieten’.\nVideo's exporteren en importeren in afspeel­lijsten + voor een oudere versie van FreeTube:\n1. Exporteer uw afspeel­lijsten met + deze optie ingeschakeld.\n2. Verwijder al uw bestaande afspeel­lijsten met + de optie ‘Alle afspeel­lijsten verwijderen’ onder ‘Privacy­instellingen’.\n + 3. Start de oudere versie van FreeTube en importeer de geëxporteerde afspeel­lijsten." Distraction Free Settings: Hide Live Chat: Livechat verbergen Hide Popular Videos: Populaire video's verbergen @@ -431,8 +524,8 @@ Settings: Hide Video Description: Video-omschrijving verbergen Hide Comments: Opmerkingen verbergen Hide Live Streams: Verberg rechtstreekse uitzendingen - Display Titles Without Excessive Capitalisation: Toon titels zonder overmatig - hoofdlettergebruik + Display Titles Without Excessive Capitalisation: Titels tonen zonder overmatig + hoofdletter­gebruik en inter­punctie Sections: Side Bar: Zijbalk General: Algemeen @@ -456,6 +549,16 @@ Settings: Hide Profile Pictures in Comments: Profielfoto's in opmerkingen verbergen Hide Subscriptions Community: Abonnement­gemeenschappen verbergen Hide Channels Already Exists: Kanaal ID bestaat reeds + Hide Channels Invalid: Opgegeven kanaal-id is ongeldig + Hide Videos and Playlists Containing Text Placeholder: Woord, woord­fragment of + zin + Hide Videos and Playlists Containing Text: Video's en afspeel­lijsten die tekst + bevatten verbergen + Hide Channels API Error: Fout bij het ophalen van de gebruiker met de opgegeven + ID. Controleer nog­maals of de ID correct is. + Hide Channels Disabled Message: Sommige kanalen zijn geblokkeerd met behulp van + ID en zijn niet verwerkt. De functie is geblokkeerd terwijl deze ID's worden + bij­gewerkt The app needs to restart for changes to take effect. Restart and apply change?: De app moet opnieuw worden gestart om veranderingen aan te brengen. Wilt u de app opnieuw starten en veranderingen toepassen? @@ -490,6 +593,9 @@ Settings: Do Nothing: Niets doen Category Color: Categorie­kleur UseDeArrowTitles: DeArrow-videotitels gebruiken + UseDeArrowThumbnails: DeArrow gebruiken voor miniaturen + 'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': API-URL + van DeArrow-miniatuur­generator (standaard is https://dearrow-thumb.ajay.app) External Player Settings: Custom External Player Arguments: Aangepaste argumenten voor externe videospeler Custom External Player Executable: Uitvoerbaar bestand van externe videospeler @@ -501,6 +607,7 @@ Settings: Players: None: Name: Geen + Ignore Default Arguments: Standaard­argumenten negeren Download Settings: Choose Path: Pad kiezen Download Settings: Downloadinstellingen @@ -529,6 +636,7 @@ Settings: Password Incorrect: Wachtwoord onjuist Unlock: Ontgrendelen Enter Password To Unlock: Voer wachtwoord in om instellingen te ontgrendelen + Expand All Settings Sections: Alle instellingen­secties uitvouwen About: #On About page About: 'Over' @@ -641,6 +749,7 @@ Channel: votes: '{votes} stemmen' This channel currently does not have any posts: Dit kanaal heeft momenteel geen posts + Video hidden by FreeTube: Video verborgen door FreeTube Releases: Releases: Uitgaven This channel does not currently have any releases: Dit kanaal heeft momenteel @@ -794,6 +903,7 @@ Video: is niet beschikbaar voor deze stream. Mogelijk is deze uitgeschakeld door de uploader. Hide Channel: Kanaal verbergen Unhide Channel: Kanaal tonen + More Options: Meer opties Videos: #& Sort By Sort By: @@ -877,7 +987,7 @@ Up Next: 'Volgende' Local API Error (Click to copy): 'Fout in lokale API (Klik om te kopiëren)' Invidious API Error (Click to copy): 'Fout in API van Invidious (Klik op te kopiëren)' Falling back to Invidious API: 'Terugvallen op Invidious API' -Falling back to the local API: 'Terugvallen op lokale API' +Falling back to Local API: 'Terugvallen op lokale API' Subscriptions have not yet been implemented: 'Abonnementen zijn nog niet geïmplementeerd' Loop is now disabled: 'Herhalen is nu uitgeschakeld' Loop is now enabled: 'Herhalen is nu ingeschakeld' @@ -937,6 +1047,10 @@ Profile: Profile Settings: Profielinstellingen Toggle Profile List: Profiellijst omschakelen Profile Name: Profiel­naam + Edit Profile Name: Profiel­naam wijzigen + Create Profile Name: Profiel­naam aanmaken + Close Profile Dropdown: Profiel­menu sluiten + Open Profile Dropdown: Profiel­menu openen A new blog is now available, {blogTitle}. Click to view more: Een nieuwe blogpost is beschikbaar, {blogTitle}. Klik voor meer informatie Download From Site: Van website downloaden @@ -952,10 +1066,10 @@ Tooltips: Legacy gaat niet hoger dan 720p maar gebruikt minder bandbreedte. Audio zal alleen het geluid streamen. Force Local Backend for Legacy Formats: Dit zal alleen werken wanneer Invidious - is geselecteerd als de standaard API. Wanneer ingeschakeld zal de lokale API - legacy video indelingen gebruiken in plaats van de video indeling die worden - teruggegeven door Invidious. Dit kan helpen wanneer een video die wordt gestreamed - via Invidious niet afspeelt in verband met regio restricties. + is geselecteerd als de standaard-API. Wanneer ingeschakeld zal de lokale API + legacy video­indelingen gebruiken in plaats van de video­indeling die worden + terug­gegeven door Invidious. Dit kan helpen wanneer een video die wordt gestreamed + via Invidious niet afspeelt in verband met regio­restricties. Proxy Videos Through Invidious: FreeTube zal verbinden met Invidious en daar de video's downloaden in de plaats van de video's rechtstreeks bij YouTube vandaan te halen. Dit overschrijft de ingestelde API voorkeur. @@ -1010,16 +1124,23 @@ Tooltips: in de gekozen externe videospeler kan worden geopend. Let op: Invidious-instellingen beïnvloeden externe videospelers niet.' DefaultCustomArgumentsTemplate: "(standaard: ‘{defaultCustomArguments}’)" + Ignore Default Arguments: Stuurt geen standaard­argumenten naar de externe speler, + afgezien van de video-URL (bij­voorbeeld afspeel­snelheid, afspeellijst-URL, + enz.). Aan­gepaste argumenten worden nog steeds door­gegeven. Distraction Free Settings: - Hide Channels: Voer een kanaalnaam of kanaal-ID in om alle video's, afspeellijsten - en het kanaal zelf te verbergen zodat ze niet worden weergegeven in zoeken, - trending, populairst en aanbevolen. De ingevoerde kanaalnaam moet volledig overeenkomen - en is hoofdlettergevoelig. + Hide Channels: Voer een kanaal-ID in om alle video's, afspeel­lijsten en het kanaal + zelf te verbergen zodat ze niet worden weer­gegeven in zoeken, trending, populairst + en aan­bevolen. De ingevoerde kanaal-ID moet volledig overeen­komen en is hoofdletter­gevoelig. Hide Subscriptions Live: Deze instelling wordt overschreven door de app-brede instelling ‘{appWideSetting}’, in het gedeelte ‘{subsection}’ van ‘{settingsSection}’ + Hide Videos and Playlists Containing Text: Voer een woord, woord­fragment of woord­groep + in (niet hoofdletter­gevoelig) om alle video's en afspeel­lijsten waarvan de + oorspronkelijke titel dit bevat, in heel FreeTube te verbergen, met uit­zondering + van alleen geschiedenis, uw afspeel­lijsten en video's in afspeel­lijsten. SponsorBlock Settings: UseDeArrowTitles: Vervangt videotitels met door gebruikers ingediende titels van DeArrow. + UseDeArrowThumbnails: Video­miniaturen vervangen met miniaturen van DeArrow. Experimental Settings: Replace HTTP Cache: Schakelt de schijfgebaseerde HTTP-cache van Electron uit en schakelt een aangepaste afbeeldings­cache in het geheugen in. Zal leiden tot @@ -1048,12 +1169,6 @@ Downloading failed: Probleem bij download van "{videoTitle}" Download folder does not exist: De download map "$" bestaat niet. Valt terug op "vraag map" modus. New Window: Nieuw venster -Age Restricted: - The currently set default instance is {instance}: Deze {instance} is leeftijdsbeperkt - Type: - Channel: Kanaal - Video: Video - This {videoOrPlaylist} is age restricted: Deze {videoOrPlaylist} heeft een leeftijdsbeperking Screenshot Success: Schermafbeelding opgeslagen als "{filePath}" Channels: Title: Kanaal­lijst @@ -1085,4 +1200,13 @@ Playlist will pause when current video is finished: Afspeellijst zal pauzeren wa de huidige video is afgelopen Playlist will not pause when current video is finished: Afspeellijst zal niet pauzeren wanneer de huidige video is afgelopen -Go to page: Naar pagina {page} +Go to page: Ga naar {page} +Tag already exists: Tag ‘{tagName}’ bestaat al +Channel Unhidden: ‘{channel}’ verwijderd uit kanaal­filter +Channel Hidden: ‘{channel}’ toe­gevoegd aan kanaal­filter +Close Banner: Banier sluiten +Age Restricted: + This channel is age restricted: Dit kanaal 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 + 1 teken lang zijn | Bij­gesneden invoer moet minimaal {length} tekens lang zijn diff --git a/static/locales/nn.yaml b/static/locales/nn.yaml index 096db71c1912c..8e454d553c7cc 100644 --- a/static/locales/nn.yaml +++ b/static/locales/nn.yaml @@ -770,9 +770,9 @@ Tooltips: Invidious Instance: 'Invidious-førekomsten som FreeTube vil kople til for API-kall.' Region for Trending: 'Trendsregionen lar deg enkelt velje kva lands populære videoar du ynskjer å vise.' - External Link Handling: "Vel kva FreeTube skal gjer, når ein trykker på ei lenke,\ - \ som ikkje kan bli opna av FreeTube. \nFreeTube vil vanlegvis opne lenka i\ - \ din standardnettlesar.\n" + External Link Handling: "Vel kva FreeTube skal gjer, når ein trykker på ei lenke, + som ikkje kan bli opna av FreeTube. \nFreeTube vil vanlegvis opne lenka i din + standardnettlesar.\n" Player Settings: Force Local Backend for Legacy Formats: 'Fungerer berre med Invidious-API-et som standard. Når det er påslått, vil det lokale API-et køyre og bruke dei utdaterte @@ -825,7 +825,7 @@ Tooltips: Local API Error (Click to copy): 'Lokal API-feil (Klikk her for å kopiere)' Invidious API Error (Click to copy): 'Invidious-API-feil (Klikk her for å kopiere)' Falling back to Invidious API: 'Faller tilbake til Invidious-API-et' -Falling back to the local API: 'Faller tilbake til det lokale API-et' +Falling back to Local API: 'Faller tilbake til det lokale API-et' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Denne videoen er utilgjengeleg grunna manglande format. Dette kan skuldast tilgangsavgrensingar i ditt land.' @@ -868,11 +868,6 @@ Channels: Unsubscribe Prompt: Er du sikker på at du vil avslutte abonnementet på "{channelName}"? Unsubscribe: Opphev abonnement Screenshot Success: Lagra skjermbilete som "{filePath}" -Age Restricted: - This {videoOrPlaylist} is age restricted: Denne {videoOrPlaylist} er alderavgrensa - Type: - Video: Video - Channel: Kanal Screenshot Error: Skjermbilete feila. {error} Downloading has completed: Nedlastinga av "{videoTitle}" er fullført Ok: OK diff --git a/static/locales/or.yaml b/static/locales/or.yaml index 516c71bc3e6a0..357cce54e39c4 100644 --- a/static/locales/or.yaml +++ b/static/locales/or.yaml @@ -109,4 +109,3 @@ Channel: Video: External Player: {} Tooltips: {} -Age Restricted: {} diff --git a/static/locales/pl.yaml b/static/locales/pl.yaml index d07c3209a655b..98b036de92eab 100644 --- a/static/locales/pl.yaml +++ b/static/locales/pl.yaml @@ -143,6 +143,7 @@ User Playlists: dodać swój film | Wybierz playlistę, do której chcesz dodać swoje {videoCount} film(y/ów) N playlists selected: Zaznaczono {playlistCount} + Added {count} Times: Dodano {count} raz | Dodano {count} razy SinglePlaylistView: Toast: There were no videos to remove.: Nie było żadnych filmów do usunięcia. @@ -284,6 +285,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Hot Pink: Gorący róż Pastel Pink: Pastelowy róż + Nordic: Nordycki Main Color Theme: Main Color Theme: 'Główny kolor motywu' Red: 'Czerwony' @@ -533,8 +535,8 @@ Settings: Hide Upcoming Premieres: Schowaj nadchodzące premiery Hide Channels: Schowaj filmy z kanałów Hide Channels Placeholder: ID kanału - Display Titles Without Excessive Capitalisation: Wyświetlaj tytuły bez nadmiernych - wielkich liter + Display Titles Without Excessive Capitalisation: Wyświetlaj tytuły nie nadużywając + wielkich liter i interpunkcji Hide Channel Community: Schowaj społeczność kanału Hide Channel Shorts: Schowaj filmy Short kanału Hide Featured Channels: Schowaj polecane kanały @@ -916,6 +918,7 @@ Video: Pause on Current Video: Zatrzymaj po tym filmie Unhide Channel: Pokaż kanał Hide Channel: Ukryj kanał + More Options: Więcej opcji Videos: #& Sort By Sort By: @@ -998,7 +1001,7 @@ Up Next: 'Następne' Local API Error (Click to copy): 'Błąd lokalnego API (kliknij by skopiować)' Invidious API Error (Click to copy): 'Błąd API Invidious (kliknij by skopiować)' Falling back to Invidious API: 'Wycofywanie do API Invidious' -Falling back to the local API: 'Wycofywanie do lokalnego API' +Falling back to Local API: 'Wycofywanie do lokalnego API' Subscriptions have not yet been implemented: 'Subskrypcje nie zostały jeszcze wprowadzone' Loop is now disabled: 'Zapętlenie jest teraz wyłączone' Loop is now enabled: 'Zapętlenie jest teraz włączone' @@ -1180,13 +1183,6 @@ Download folder does not exist: Katalog pobierania "$" nie istnieje. Przełączo tryb "pytaj o folder". Screenshot Error: Wykonanie zrzutu nie powiodło się. {error} Screenshot Success: Zapisano zrzut ekranu jako „{filePath}” -Age Restricted: - Type: - Channel: kanał - Video: film - The currently set default instance is {instance}: Ten {instance} ma ograniczenie - wiekowe - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} ma ograniczenie wiekowe' New Window: Nowe okno Channels: Title: Lista kanałów @@ -1223,3 +1219,7 @@ Channel Unhidden: '{channel} usunięty z filtra kanału' Tag already exists: Tag „{tagName}” już istnieje Trimmed input must be at least N characters long: Przycięte wyrażenie musi mieć przynajmniej 1 znak | Przycięte wyrażenie musi mieć przynajmniej {length} znaki/ów +Age Restricted: + This video is age restricted: Ten film ma ograniczenie wiekowe + This channel is age restricted: Ten kanał ma ograniczenie wiekowe +Close Banner: Zamknij Baner diff --git a/static/locales/pt-BR.yaml b/static/locales/pt-BR.yaml index a4ad27157ffb0..63af61b5f9d7f 100644 --- a/static/locales/pt-BR.yaml +++ b/static/locales/pt-BR.yaml @@ -1,8 +1,8 @@ FreeTube: 'FreeTube' # Currently on Subscriptions, Playlists, and History 'This part of the app is not ready yet. Come back later when progress has been made.': >- - Esta parte do aplicativo ainda não está pronta. Volte mais tarde quando já houver - progresso. + Esta parte do aplicativo ainda não está pronta. Volte mais tarde quando o progresso + tiver sido feito. # Webkit Menu Bar File: 'Arquivo' @@ -13,7 +13,7 @@ Redo: 'Refazer' Cut: 'Cortar' Copy: 'Copiar' Paste: 'Colar' -Delete: 'Apagar' +Delete: 'Excluir' Select all: 'Selecionar tudo' Reload: 'Recarregar' Force Reload: 'Forçar recarga' @@ -40,7 +40,7 @@ Global: Counts: Video Count: Contagem de videos Channel Count: Contagem de Canais - Subscriber Count: 1 assinante | {count} assinantes + Subscriber Count: 1 inscrito | {count} inscritos View Count: 1 visualização | {count} visualizações Watching Count: 1 assistindo | {count} assistindo Input Tags: @@ -72,7 +72,7 @@ Search Filters: Movies: Filmes Duration: Duration: 'Duração' - All Durations: 'Qualquer duração' + All Durations: 'Todas as durações' Short (< 4 minutes): 'Curto (< 4 minutos)' Long (> 20 minutes): 'Longo (> 20 minutos)' # On Search Page @@ -87,7 +87,7 @@ Subscriptions: Subscriptions: 'Inscrições' Latest Subscriptions: 'Últimas inscrições' 'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'Sua - lista de inscrições está vazia. Comece a se inscrever para as ver aqui.' + lista de inscrições está vazia no momento. Adicione algumas para vê-las aqui.' 'Getting Subscriptions. Please wait.': 'Buscando inscrições. Por favor, aguarde.' Refresh Subscriptions: Atualizar inscrições 'Getting Subscriptions. Please wait.': Obtendo inscrições. Por favor, espere. @@ -96,14 +96,14 @@ Subscriptions: perfil tem um grande número de inscrições. Forçando RSS para evitar limitação de rede Error Channels: Canais com erros - Disabled Automatic Fetching: Você desativou a busca automática de assinaturas. Atualize-as - para vê-las aqui. - Empty Channels: No momento, seus canais inscritos não têm vídeos. + Disabled Automatic Fetching: Você desativou a busca automática de inscrições. Atualize + as inscrições para vê-las aqui. + Empty Channels: Atualmente, os canais em que você está inscrito não possuem vídeos. Subscriptions Tabs: Abas de inscrição All Subscription Tabs Hidden: Todos as abas de inscrição estão ocultas. Para ver o conteúdo aqui, exiba algumas abas na seção "{subsection}" em "{settingsSection}". Load More Posts: Carregar mais posts - Empty Posts: No momento, seus canais inscritos não têm nenhum post. + Empty Posts: Atualmente, os canais em que você está inscrito não possuem postagens. Trending: Trending: 'Em alta' Trending Tabs: Abas de Tendências @@ -118,13 +118,14 @@ User Playlists: Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Os seus vídeos salvos estão vazios. Clique no botão salvar no canto de um vídeo para que ele seja listado aqui - Playlist Message: Esta página não reflete playlists totalmente funcionais. Ele só - lista vídeos que você salvou ou favoritou. Quando o trabalho estiver concluído, - todos os vídeos atualmente aqui serão migrados para uma playlist 'Favoritos'. + Playlist Message: Esta página não reflete playlists totalmente funcionais. Ela lista + apenas os vídeos que você salvou ou adicionou aos favoritos. Quando o trabalho + terminar, todos os vídeos atualmente aqui serão migrados para uma playlist em + "Favoritos". Search bar placeholder: Pesquisar na playlist Empty Search Message: Não há vídeos nesta playlist que correspondam à sua pesquisa You have no playlists. Click on the create new playlist button to create a new one.: Você - não tem playlists. Clique no botão "criar playlist" para criar uma. + não tem playlists. Clique no botão "Criar playlist" para criar uma. This playlist currently has no videos.: Esta playlist não tem vídeos atualmente. Create New Playlist: Criar nova playlist Add to Playlist: Adicionar à playlist @@ -207,6 +208,7 @@ User Playlists: N playlists selected: '{playlistCount} selecionadas' Search in Playlists: Pesquisar nas playlists Save: Salvar + Added {count} Times: Adicionado {count} vez | Adicionado {count} vezes Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Tem certeza de que deseja remover todos os vídeos assistidos desta playlist? Isto não pode ser desfeito. @@ -215,7 +217,7 @@ History: # On History Page History: 'Histórico' Watch History: 'Histórico de visualizações' - Your history list is currently empty.: 'Seu Histórico está vazio no momento.' + Your history list is currently empty.: 'Seu histórico está vazio no momento.' Search bar placeholder: Pesquisar no histórico Empty Search Message: Não há vídeos no seu histórico que correspondam à sua pesquisa Settings: @@ -246,26 +248,26 @@ Settings: Blur: Desfocar 'Invidious Instance (Default is https://invidious.snopyta.org)': 'Instância do Invidious (A padrão é https://invidious.snopyta.org)' - Region for Trending: 'Região para o “Em alta”' + Region for Trending: 'Região da Tendência' #! List countries - Check for Updates: Checar por atualizações + Check for Updates: Buscar por atualizações Check for Latest Blog Posts: Verificar se há novas postagens no blog View all Invidious instance information: Ver todas as informações da instância Invidious - System Default: Padrão do Sistema + System Default: Padrão do sistema No default instance has been set: Nenhuma instância padrão foi definida The currently set default instance is {instance}: A instância padrão atualmente definida é {instance} - Current instance will be randomized on startup: A instância atual será randomizada + Current instance will be randomized on startup: A instância atual será aleatória na inicialização Set Current Instance as Default: Definir instância atual como padrão Clear Default Instance: Limpar instância padrão - Current Invidious Instance: Instância do Invidious atual + Current Invidious Instance: Instância Invidious atual External Link Handling: No Action: Nenhuma ação Ask Before Opening Link: Perguntar antes de abrir o link Open Link: Abrir Link - External Link Handling: Manuseio de link externo + External Link Handling: Tratamento de link externo Theme Settings: Theme Settings: 'Configurações de aparência' Match Top Bar with Main Color: 'Usar a cor principal para a barra superior' @@ -279,6 +281,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Rosa Pastel Hot Pink: Rosa Choque + Nordic: Nordico Main Color Theme: Main Color Theme: 'Cor principal' Red: 'Vermelha' @@ -304,7 +307,7 @@ Settings: Dracula Purple: 'Drácula Roxa' Dracula Red: 'Drácula Vermelha' Dracula Yellow: 'Drácula Amarelo' - Catppuccin Mocha Rosewater: Catppuccin Mocha Rosewater + Catppuccin Mocha Rosewater: Catppuccin Mocha Água de Rosas Catppuccin Mocha Flamingo: Catppuccin Mocha Flamingo Catppuccin Mocha Mauve: Catppuccin Mocha Mauve Catppuccin Mocha Pink: Catppuccin Mocha Rosa @@ -317,23 +320,23 @@ Settings: Catppuccin Mocha Yellow: Catppuccin Mocha Amarelo Catppuccin Mocha Sky: Catppuccin Mocha Céu Catppuccin Mocha Teal: Catppuccin Mocha Verde-azulado - Catppuccin Mocha Lavender: Catppuccin moka lavanda + Catppuccin Mocha Lavender: Catppuccin Mocha Lavanda Secondary Color Theme: 'Cor secundária' #* Main Color Theme UI Scale: Escala da Interface de Usuário - Disable Smooth Scrolling: Desativar Rolagem Suave - Expand Side Bar by Default: Expandir Barra Lateral por Padrão - Hide Side Bar Labels: Ocultar etiquetas da barra lateral - Hide FreeTube Header Logo: Esconder o logotipo do cabeçalho do FreeTube + Disable Smooth Scrolling: Desativar rolagem suave + Expand Side Bar by Default: Expandir barra lateral por padrão + Hide Side Bar Labels: Ocultar título na barra lateral + Hide FreeTube Header Logo: Ocultar logotipo FreeTube na barra superior Player Settings: - Player Settings: 'Configurações do vídeo' + Player Settings: 'Configurações do player' Force Local Backend for Legacy Formats: 'Forçar motor local para formatos legados' Remember History: 'Lembrar do histórico' Play Next Video: 'Reproduzir próximo vídeo' Turn on Subtitles by Default: 'Ativar legendas por padrão' - Autoplay Videos: 'Reproduzir automaticamente' + Autoplay Videos: 'Reprodução automática dos vídeos' Proxy Videos Through Invidious: 'Usar o Invidious como proxy' - Autoplay Playlists: 'Reproduzir listas automaticamente' + Autoplay Playlists: 'Reprodução automática das playlists' Enable Theatre Mode by Default: 'Habilitar modo teatro por padrão' Default Volume: 'Volume padrão' Default Playback Rate: 'Velocidade de reprodução' @@ -356,18 +359,17 @@ Settings: 8k: '8k' Playlist Next Video Interval: Intervalo do próximo vídeo da lista de reprodução Next Video Interval: Próximo intervalo de vídeo - Display Play Button In Video Player: Exibir botão de reprodução no tocador de - vídeo - Scroll Volume Over Video Player: Rolar volume sobre o reprodutor de vídeo + Display Play Button In Video Player: Mostrar botão "Reproduzir" no centro do player + Scroll Volume Over Video Player: Rolar volume sobre o player de vídeo Fast-Forward / Rewind Interval: Intervalo de avanço / retrocesso rápido - Scroll Playback Rate Over Video Player: Rolar a taxa de reprodução sobre o reprodutor + Scroll Playback Rate Over Video Player: Rolar a taxa de reprodução sobre o player de vídeo Max Video Playback Rate: Taxa máxima de reprodução de vídeo Video Playback Rate Interval: Intervalo da taxa de reprodução de vídeo Screenshot: File Name Label: Padrão de nome de arquivo Enable: Ativar captura de tela - Ask Path: Perguntar onde salvar + Ask Path: Perguntar onde salvar os arquivos Folder Label: Pasta de captura de tela Folder Button: Selecionar pasta Error: @@ -381,13 +383,13 @@ Settings: do vídeo 3 dígitos. %i ID do vídeo. Você também pode usar "\" ou "/" para criar subpastas. Enter Fullscreen on Display Rotate: Entrar em tela cheia ao girar a tela - Skip by Scrolling Over Video Player: Pular rolando o tocador de vídeo + Skip by Scrolling Over Video Player: Ignorar ao deslocar por cima do player Allow DASH AV1 formats: Permitir formatos DASH AV1 Comment Auto Load: Comment Auto Load: Carregar automaticamente os comentários Subscription Settings: Subscription Settings: 'Configurações de inscrições' - Hide Videos on Watch: 'Esconder vídeos após assisti-los' + Hide Videos on Watch: 'Ocultar vídeos após assisti-los' Subscriptions Export Format: Subscriptions Export Format: 'Formato de exportação das inscrições' #& Freetube @@ -398,7 +400,7 @@ Settings: Export Subscriptions: 'Exportar inscrições' How do I import my subscriptions?: 'Como posso importar minhas inscrições?' Fetch Feeds from RSS: Buscar Informações através de RSS - Fetch Automatically: Obter o feed automaticamente + Fetch Automatically: Buscar feed automaticamente Only Show Latest Video for Each Channel: Exibe apenas o vídeo mais recente de cada canal Advanced Settings: @@ -429,21 +431,21 @@ Settings: #& No Privacy Settings: - Watch history has been cleared: Histórico de visualizações foi limpo - Are you sure you want to remove your entire watch history?: Queres realmente remover - todo o teu histórico de visualizações? + Watch history has been cleared: Histórico de visualizações foi apagado + Are you sure you want to remove your entire watch history?: Tem certeza de que + deseja remover todo o seu histórico de visualizações? Remove Watch History: Remover histórico - Search cache has been cleared: O cache de buscas foi limpo - Are you sure you want to clear out your search cache?: Queres realmente limpar - teu cache de buscas? + Search cache has been cleared: Cache de pesquisas foi apagado + Are you sure you want to clear out your search cache?: Tem certeza de que deseja + limpar o cache de pesquisa? Clear Search Cache: Limpar cache de buscas Save Watched Progress: Salvar progresso de visualização Remember History: Lembrar histórico Privacy Settings: Configurações de privacidade Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Tem - certeza de que quer apagar todas as inscrições e perfis? Esta ação não pode - ser desfeita. - Remove All Subscriptions / Profiles: Remover Todas as Inscrições / Perfis + certeza de que deseja remover todas as inscrições e perfis? Isto não pode ser + desfeito. + Remove All Subscriptions / Profiles: Remover todas as inscrições ou perfis Automatically Remove Video Meta Files: Remover automaticamente os metarquivos de vídeo Save Watched Videos With Last Viewed Playlist: Salvar vídeos assistidos com a @@ -457,40 +459,40 @@ Settings: sucesso Invalid history file: Arquivo de histórico inválido One or more subscriptions were unable to be imported: Uma ou mais inscrições não - foram possíveis serem importadas + foram importadas All subscriptions have been successfully imported: Todas as inscrições foram importadas com sucesso - Select Import Type: Selecione o tipo de importação + Select Import Type: Selecionar tipo de importação Data Settings: Configurações de dados - Export History: Exportar Histórico - Import History: Importar Histórico + Export History: Exportar histórico + Import History: Importar histórico Export NewPipe: Exportar NewPipe Export YouTube: Exportar YouTube Export FreeTube: Exportar FreeTube - Export Subscriptions: Exportar Inscrições + Export Subscriptions: Exportar inscrições Check for Legacy Subscriptions: Verificar se há inscrições em formato antigo Import NewPipe: Importar NewPipe Import YouTube: Importar YouTube Import FreeTube: Importar FreeTube - Import Subscriptions: Importar Inscrições + Import Subscriptions: Importar inscrições Select Export Type: Escolher tipo de exportação How do I import my subscriptions?: Como importo minhas inscrições? Unknown data key: Chave de dados desconhecida - Unable to write file: O arquivo não pôde ser escrito + Unable to write file: O arquivo não pôde ser salvo Unable to read file: O arquivo não pôde ser lido All watched history has been successfully exported: Todo o histórico de visualizações foi exportado com sucesso All watched history has been successfully imported: Todo o histórico de visualizações foi importado com sucesso - History object has insufficient data, skipping item: O objeto Histórico tem dados - insuficientes, pulando item + History object has insufficient data, skipping item: O histórico tem dados insuficientes, + pulando item This might take a while, please wait: Este processo pode demorar, por favor espere Invalid subscriptions file: Arquivo de inscrições inválido All subscriptions and profiles have been successfully imported: Todas as inscrições e perfis foram importados com sucesso - Profile object has insufficient data, skipping item: O objeto Perfil possui dados - insuficientes, pulando item - Manage Subscriptions: Administrar Inscrições + Profile object has insufficient data, skipping item: O perfil tem dados insuficientes, + ignorando o item + Manage Subscriptions: Administrar inscrições Import Playlists: Importar playlists Export Playlists: Exportar playlists Playlist insufficient data: Dados insuficientes para a playlist "{playlist}", @@ -499,9 +501,9 @@ Settings: com sucesso All playlists has been successfully imported: Todas as playlists foram importadas com sucesso - Subscription File: Arquivo de assinaturas + Subscription File: Arquivo de inscrições History File: Arquivo de histórico - Playlist File: Arquivo de Lista + Playlist File: Arquivo de playlist Export Playlists For Older FreeTube Versions: Label: Exportar playlists para versões mais antigas do FreeTube Tooltip: "Esta opção exporta vídeos de todas as playlists para uma playlist @@ -511,27 +513,27 @@ Settings: Remover todas as playlists\" em \"Configurações de privacidade\".\n3. Inicie a versão mais antiga do FreeTube e importe as playlists exportadas." Distraction Free Settings: - Hide Live Chat: Esconder chat ao vivo - Hide Popular Videos: Esconder vídeos populares - Hide Trending Videos: Esconder vídeos em alta - Hide Recommended Videos: Esconder vídeos recomendados - Hide Comment Likes: Esconder curtidas dos comentários + Hide Live Chat: Ocultar chat ao vivo + Hide Popular Videos: Ocultar vídeos populares + Hide Trending Videos: Ocultar vídeos em alta + Hide Recommended Videos: Ocultar vídeos recomendados + Hide Comment Likes: Ocultar "curtidas" em comentários Distraction Free Settings: Configurações de Modo sem Distração - Hide Channel Subscribers: Ocultar Assinantes do Canal - Hide Video Likes And Dislikes: Ocultar curtidas e desgostos do vídeo - Hide Video Views: Ocultar Visualizações de Vídeo - Hide Active Subscriptions: Ocultar Inscrições Ativas + Hide Channel Subscribers: Ocultar número de inscritos + Hide Video Likes And Dislikes: Ocultar "curtidas" em vídeo + Hide Video Views: Ocultar visualizações de vídeo + Hide Active Subscriptions: Ocultar inscrições ativas Hide Playlists: Ocultar playlist Hide Video Description: Ocultar descrição do vídeo Hide Sharing Actions: Ocultar ações de compartilhamento Hide Comments: Ocultar comentários Hide Live Streams: Ocultar transmissões ao vivo Hide Chapters: Ocultar capítulos - Hide Upcoming Premieres: Ocultar as Próximas Estréias + Hide Upcoming Premieres: Ocultar próximas estréias Hide Channels Placeholder: ID do Canal - Display Titles Without Excessive Capitalisation: Mostrar Títulos sem Capitalização - Excessiva - Hide Channels: Ocultar Vídeos dos Canais + Display Titles Without Excessive Capitalisation: Mostrar títulos sem capitalização + excessiva nem pontuação + Hide Channels: Ocultar vídeos dos canais Sections: Side Bar: Barra lateral Channel Page: Página do canal @@ -541,15 +543,15 @@ Settings: Hide Featured Channels: Ocultar canais em destaque Hide Channel Playlists: Ocultar playlists de canais Hide Channel Community: Ocultar comunidade do canal - Hide Channel Shorts: Ocultar Shorts do Canal + Hide Channel Shorts: Ocultar "Shorts" do canal Hide Channel Podcasts: Ocultar podcasts do canal Hide Channel Releases: Ocultar lançamentos do canal Hide Subscriptions Videos: Ocultar vídeos de inscrições - Hide Subscriptions Shorts: Ocultar Shorts de Inscrições - Hide Subscriptions Live: Ocultar inscrições de transmissões ao vivo - Hide Profile Pictures in Comments: Esconder imagens do perfil nos comentários + Hide Subscriptions Shorts: Ocultar "Shorts" de inscrições + Hide Subscriptions Live: Ocultar transmissões ao vivo de inscrições + Hide Profile Pictures in Comments: Ocultar imagens de perfil nos comentários Blur Thumbnails: Desfocar Miniaturas - Hide Subscriptions Community: Ocultar comunidade inscritas + Hide Subscriptions Community: Ocultar comunidade de inscrições Hide Channels Invalid: ID de canal fornecido é inválido Hide Channels Disabled Message: Alguns canais foram bloqueados por ID e não foram processados. O recurso é bloqueado enquanto esses IDs estão sendo atualizados @@ -570,10 +572,10 @@ Settings: Test Proxy: Testar Proxy Clicking on Test Proxy will send a request to: Clicando em Test Proxy, será enviado uma solicitação para - Proxy Port Number: Número da Porta de Proxy + Proxy Port Number: Porta do Proxy Proxy Host: Host do Proxy - Proxy Protocol: Protocolo de Proxy - Enable Tor / Proxy: Ativar Tor / Proxy + Proxy Protocol: Protocolo do Proxy + Enable Tor / Proxy: Ativar Tor/Proxy Proxy Settings: Configurações de Proxy Error getting network information. Is your proxy configured properly?: Erro ao obter informações da rede. Seu proxy está configurado corretamente? @@ -584,8 +586,8 @@ Settings: são pulados 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': URL da API SponsorBlock (o padrão é https://sponsor.ajay.app) - Enable SponsorBlock: Ativar o Bloqueio de Patrocinadores - SponsorBlock Settings: Configurações de Bloqueio de Patrocinadores + Enable SponsorBlock: Ativar SponsorBlock + SponsorBlock Settings: Configurações SponsorBlock Skip Options: Show In Seek Bar: Mostrar na barra de busca Prompt To Skip: Solicitar para pular @@ -609,7 +611,7 @@ Settings: Ignore Default Arguments: Ignorar argumentos padrão Download Settings: Download Settings: Configurações de download - Ask Download Path: Peça o caminho de download + Ask Download Path: Perguntar onde salvar o download Choose Path: Escolha o caminho Open in web browser: Abrir no navegador web Download in app: Baixar no aplicativo @@ -620,19 +622,19 @@ Settings: Parental Control Settings: Configurações de Controle Parental Hide Unsubscribe Button: Ocultar botão de cancelamento de inscrição Experimental Settings: - Experimental Settings: Configurações Experimentais + Experimental Settings: Configurações experimentais Warning: Essas configurações são experimentais, elas podem causar travamentos enquanto ativadas. Fazer backups é altamente recomendado. Use por sua conta e risco! Replace HTTP Cache: Repor Cache HTTP Password Settings: Password Settings: Configurações de senha - Set Password: Definir Senha + Set Password: Definir senha Remove Password: Remover senha Set Password To Prevent Access: Defina uma senha para impedir o acesso às configurações Password Dialog: Unlock: Desbloquear - Password Incorrect: Senha Incorreta + Password Incorrect: Senha incorreta Password: Senha Enter Password To Unlock: Digite a senha para desbloquear as configurações Expand All Settings Sections: Expandir todas as seções de configurações @@ -689,8 +691,8 @@ About: Mastodon: Mastodon Email: E-mail Blog: Blog - Website: Site web - Please check for duplicates before posting: Verifique se há duplicatas antes de + Website: Site + Please check for duplicates before posting: Verifique se há duplicações antes de postar Discussions: Discussões Channel: @@ -710,7 +712,7 @@ Channel: Oldest: 'Antigos' Most Popular: 'Mais populares' Playlists: - Playlists: 'Listas' + Playlists: 'Playlists' This channel does not currently have any playlists: 'Este canal não possui nenhuma lista no momento' Sort Types: @@ -738,18 +740,18 @@ Channel: Community: This channel currently does not have any posts: Neste momento, este canal não tem publicações - votes: '{votes} Votos' + votes: '{votes} votos' Reveal Answers: Revelar respostas Hide Answers: Ocultar respostas Video hidden by FreeTube: Vídeo escondido pelo FreeTube - Channel Tabs: Abas dos Canais + Channel Tabs: Abas de canais Live: Live: Ao vivo This channel does not currently have any live streams: Este canal não tem nenhuma transmissão ao vivo no momento Shorts: - This channel does not currently have any shorts: Este canal não tem atualmente - nenhum short + This channel does not currently have any shorts: Este canal não tem nenhum "Shorts" + no momento Podcasts: Podcasts: Podcasts This channel does not currently have any podcasts: Este canal não possui podcasts @@ -762,7 +764,7 @@ Video: Mark As Watched: 'Marcar como assistido' Remove From History: 'Remover do histórico' Video has been marked as watched: 'O vídeo foi marcado como assistido' - Video has been removed from your history: 'O vídeo foi removido do teu histórico' + Video has been removed from your history: 'O vídeo foi removido do seu histórico' Open in YouTube: 'Abrir no YouTube' Copy YouTube Link: 'Copiar link do YouTube' Open YouTube Embedded Player: 'Abrir vídeo incorporado do YouTube' @@ -779,7 +781,7 @@ Video: Live Chat is currently not supported in this build.: 'Chat ao vivo não é suportado nessa versão.' 'Chat is disabled or the Live Stream has ended.': 'O chat está desativado ou a transmissão - ao vivo se encerrou.' + ao vivo terminou.' Live chat is enabled. Chat messages will appear here once sent.: 'Chat ao vivo habilitado. As mensagens irão aparecer uma vez enviadas.' 'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': 'O @@ -798,20 +800,20 @@ Video: Oct: 'Out' Nov: 'Nov' Dec: 'Dez' - Second: 'segundo' - Seconds: 'segundos' - Hour: 'hora' - Hours: 'horas' - Day: 'dia' - Days: 'dias' - Week: 'semana' - Weeks: 'semanas' - Month: 'mês' - Months: 'meses' - Year: 'ano' - Years: 'anos' - Ago: 'Atrás' - Upcoming: 'Futuramente em' + Second: 'Segundo' + Seconds: 'Segundos' + Hour: 'Hora' + Hours: 'Horas' + Day: 'Dia' + Days: 'Dias' + Week: 'Semana' + Weeks: 'Semanas' + Month: 'Mês' + Months: 'Meses' + Year: 'Ano' + Years: 'Anos' + Ago: 'atrás' + Upcoming: 'Estreia em' Minutes: Minutos Minute: Minuto Less than a minute: Menos de um minuto @@ -828,17 +830,17 @@ Video: High: Alta audio only: somente áudio video only: somente vídeo - Download Video: Baixar Vídeo + Download Video: Baixar vídeo Starting soon, please refresh the page to check again: Vai começar em breve, favor atualizar a página para verificar novamente Autoplay: Reprodução Automática - Play Previous Video: Reproduzir o Vídeo Anterior - Play Next Video: Reproduzir o Próximo Vídeo + Play Previous Video: Reproduzir vídeo anterior + Play Next Video: Reproduzir próximo vídeo Reverse Playlist: Inverter ordem da playlist Shuffle Playlist: Playlist aleatória Loop Playlist: Repetir playlist Copy Invidious Channel Link: Copiar link do canal no Invidious - Open Channel in Invidious: Abrir Canal no Invidious + Open Channel in Invidious: Abrir canal no Invidious Copy YouTube Channel Link: Copiar o link do canal no YouTube Open Channel in YouTube: Abrir canal no YouTube Video has been removed from your saved list: O vídeo foi removido da sua lista de @@ -853,12 +855,12 @@ Video: outro: Conclusão intro: Introdução sponsor: Patrocinador - filler: Enchimento + filler: Preenchimento recap: Recapitulação Skipped segment: Segmentos pulados External Player: Unsupported Actions: - shuffling playlists: embaralhar playlists + shuffling playlists: embaralhando playlists opening specific video in a playlist (falling back to opening the video): abrir um vídeo específico em uma playlist (voltar à abertura do vídeo) reversing playlists: revertendo playlists @@ -885,7 +887,7 @@ Video: Video statistics are not available for legacy videos: As estatísticas de vídeo não estão disponíveis para vídeos mais antigos Video ID: ID do vídeo - Player Dimensions: Dimensões do reprodutor + Player Dimensions: Dimensões do player Bitrate: Taxa de bits Volume: Volume Bandwidth: Largura de banda @@ -894,15 +896,16 @@ Video: Dropped / Total Frames: Quadros perdidos / Total de quadros Premieres in: Estréias em Premieres: Estreia - Scroll to Bottom: Rolar para o final - Show Super Chat Comment: Mostrar Comentários do Super Chat + Scroll to Bottom: Ir para o final + Show Super Chat Comment: Mostrar comentários do Super Chat Upcoming: Em breve 'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': O bate-papo ao vivo não está disponível para esta transmissão. Pode ter sido desativado pelo responsável. Pause on Current Video: Pausar no vídeo atual - Unhide Channel: Mostrar Canal - Hide Channel: Ocultar o canal + Unhide Channel: Mostrar canal + Hide Channel: Ocultar canal + More Options: Mais opções Videos: #& Sort By Sort By: @@ -934,34 +937,34 @@ Change Format: este vídeo Share: Share Video: 'Compartilhar vídeo' - Share Playlist: 'Compartilhar Lista' + Share Playlist: 'Compartilhar playlist' Copy Link: 'Copiar link' Open Link: 'Abrir link' Copy Embed: 'Copiar incorporado' Open Embed: 'Abrir incorporado' # On Click - Invidious URL copied to clipboard: 'O URL do Invidious está na área de transferência' - Invidious Embed URL copied to clipboard: 'O URL incorporado do Invidious está na - área de transferência' - YouTube URL copied to clipboard: 'O URL do YouTube está na área de transferência' - YouTube Embed URL copied to clipboard: 'O URL incorporado do YouTube está na área - de transferência' + Invidious URL copied to clipboard: 'URL Invidious copiado para a área de transferência' + Invidious Embed URL copied to clipboard: 'URL incorporado do Invidious copiado para + a área de transferência' + YouTube URL copied to clipboard: 'O URL do YouTube copiado para a área de transferência' + YouTube Embed URL copied to clipboard: 'O URL incorporado do YouTube copiado para + a área de transferência' YouTube Channel URL copied to clipboard: URL do Canal Youtube copiado para a área de transferência - Invidious Channel URL copied to clipboard: URL do Canal Invidious copiado para a + Invidious Channel URL copied to clipboard: URL do canal Invidious copiado para a área de transferência - Include Timestamp: Incluir Marcação de Tempo - Share Channel: Compartilhar Canal -Mini Player: 'Visualizador Pequeno' + Include Timestamp: Incluir marcação de tempo + Share Channel: Compartilhar canal +Mini Player: 'Mini Player' Comments: Comments: 'Comentários' Click to View Comments: 'Mostrar comentários' Getting comment replies, please wait: 'Buscando respostas, por favor, aguarde' Show Comments: 'Mostrar comentários' - Hide Comments: 'Esconder comentários' + Hide Comments: 'Ocultar comentários' # Context: View 10 Replies, View 1 Reply View: 'Ver' - Hide: 'Esconder' + Hide: 'Ocultar' Replies: 'Respostas' Reply: 'Resposta' There are no comments available for this video: 'Não há comentários disponíveis @@ -972,7 +975,7 @@ Comments: Top comments: Melhores comentários Sort by: Ordenar por There are no more comments for this video: Não há mais comentários para este vídeo - Show More Replies: Mostrar Mais Respostas + Show More Replies: Mostrar mais respostas Pinned by: Fixado por And others: e outros From {channelName}: de {channelName} @@ -986,7 +989,7 @@ Up Next: 'Próximo' Local API Error (Click to copy): 'Erro da API local (clique para copiar)' Invidious API Error (Click to copy): 'Erro da API do Invidious (clique para copiar)' Falling back to Invidious API: 'Recorrendo à API do Invidious' -Falling back to the local API: 'Recorrendo à API local' +Falling back to Local API: 'Recorrendo à API local' Subscriptions have not yet been implemented: 'Inscrições ainda não foram implementadas' Loop is now disabled: 'O ciclo foi desativado' Loop is now enabled: 'O ciclo está ativado' @@ -1000,56 +1003,56 @@ Canceled next video autoplay: 'Auto-reprodução foi cancelada para o próximo v Yes: 'Sim' No: 'Não' -Locale Name: português (BR) +Locale Name: Português (BR) Profile: - Delete Profile: Deletar Perfil - Update Profile: Atualizar Perfil - Profile Preview: Visualização do Perfil - Color Picker: Selecionador de Cores - Create New Profile: Criar novo Perfil - All Channels: Todos os Canais - All subscriptions will also be deleted.: Todas as inscrições serão também deletadas. - Profile could not be found: O perfil não pôde ser encontrado - Are you sure you want to delete this profile?: Tem certeza de que quer apagar este + Delete Profile: Excluir perfil + Update Profile: Atualizar perfil + Profile Preview: Pré-visualização do perfil + Color Picker: Seletor de cores + Create New Profile: Criar novo perfil + All Channels: Todos os canais + All subscriptions will also be deleted.: Todas as inscrições serão também excluídas. + Profile could not be found: Perfil não encontrado + Are you sure you want to delete this profile?: Tem certeza de que quer excluir este perfil? - Make Default Profile: Tornar Perfil Padrão - Create Profile: Criar Perfil - Custom Color: Cor Personalizada - Edit Profile: Editar Perfil - Profile Manager: Gerenciador de Perfis - Profile Select: Seleção de Perfil + Make Default Profile: Tornar perfil padrão + Create Profile: Criar perfil + Custom Color: Cor personalizada + Edit Profile: Editar perfil + Profile Manager: Gerenciador de perfis + Profile Select: Seleção de perfil Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: Tem - certeza de que quer apagar os canais slecionados? Esta ação não vai apagar os + certeza de que quer apagar os canais selecionados? Esta ação não vai excluir os canais de nenhum outro perfil. ? This is your primary profile. Are you sure you want to delete the selected channels? The same channels will be deleted in any profile they are found in. - : Este é o seu perfil principal. Tem certeza de que quer apagar os canais selecionados? - Os mesmos vão ser apagados em qualquer perfil em que se encontrem. + : Este é o seu perfil principal. Tem certeza de que quer excluir os canais selecionados? + Os mesmos vão ser excluídos em qualquer perfil em que se encontrem. No channel(s) have been selected: Nenhum canal foi selecionado - Add Selected To Profile: Adicionar Selecionado ao Perfil - Delete Selected: Apagar Selecionados - Select None: Selecionar Nenhum - Select All: Selecionar Todos + Add Selected To Profile: Adicionar selecionado ao perfil + Delete Selected: Excluir selecionados + Select None: Selecionar nenhum + Select All: Selecionar todos '{number} selected': '{number} selecionado' - Other Channels: Outros Canais + Other Channels: Outros canais Subscription List: Lista de Inscrições '{profile} is now the active profile': '{profile} é agora o perfil ativo' Your default profile has been changed to your primary profile: Seu perfil padrão - foi mudado para o seu perfil principal + foi alterado para seu perfil principal Removed {profile} from your profiles: '{profile} foi removido dos seus perfis' Your default profile has been set to {profile}: Seu perfil padrão foi definido como {profile} Profile has been updated: Perfil atualizado Profile has been created: Perfil criado - Your profile name cannot be empty: Seu nome de perfil não pode ficar em branco - Profile Filter: Filtro de Perfil - Profile Settings: Configurações de Perfil - Toggle Profile List: Ativar/Desativar Lista de Perfis + Your profile name cannot be empty: O nome do seu perfil não pode ficar vazio + Profile Filter: Filtro de perfil + Profile Settings: Configurações de perfil + Toggle Profile List: Alternar lista de perfis Profile Name: Nome do perfil - Edit Profile Name: Editar o nome do perfil + Edit Profile Name: Editar nome do perfil Create Profile Name: Criar nome de perfil - Open Profile Dropdown: Abrir Menu Suspenso de Perfil - Close Profile Dropdown: Fechar Menu Suspenso de Perfil + Open Profile Dropdown: Abrir menu do perfil + Close Profile Dropdown: Fechar menu do perfil Version {versionNumber} is now available! Click for more details: A versão {versionNumber} já está disponível! Clique para mais detalhes A new blog is now available, {blogTitle}. Click to view more: 'Um novo blog está disponível, @@ -1062,7 +1065,7 @@ This video is unavailable because of missing formats. This can happen due to cou Tooltips: Subscription Settings: Fetch Feeds from RSS: Quando ativado, o FreeTube usará RSS em vez de seu método - padrão para obter o feed de sua assinatura. O RSS é mais rápido e evita bloqueio + padrão para obter o feed de sua inscrição. O RSS é mais rápido e evita bloqueio de IP, mas não fornece certas informações como duração do vídeo ou status ao vivo Fetch Automatically: Quando habilitado, o FreeTube buscará automaticamente seu @@ -1074,11 +1077,10 @@ Tooltips: áudio são para transmissões sem vídeo. Proxy Videos Through Invidious: Conectar-se-á ao Invidious para obter vídeos em vez de fazer uma conexão direta com o YouTube. Ignora a preferência da API. - Force Local Backend for Legacy Formats: Só funciona quando a API do Invidious - é predefinida. Quando ativada, a API local será executada e usará os formatos - antigos retornados por ela em vez dos retornados pelo Invidious. É útil quando - os vídeos retornados pelo Invidious não são reproduzidos devido a restrições - de país. + Force Local Backend for Legacy Formats: Funciona apenas quando a API do Invidious + é o padrão. Quando ativada, a API Local será executada e usará os formatos herdados + retornados por ela, em vez dos retornados pelo Invidious. Ajuda quando os vídeos + retornados pelo Invidious não são reproduzidos devido a restrições do país. Scroll Playback Rate Over Video Player: Com o cursor sobre o vídeo, pressione e segure a tecla Control (tecla Command no Mac) e role a roda do mouse para frente ou para trás para controlar a taxa de reprodução. Pressione e segure @@ -1089,7 +1091,7 @@ Tooltips: estilo MPV. Allow DASH AV1 formats: Os formatos DASH AV1 podem ter melhor aspecto do que os formatos DASH H.264. Os formatos DASH AV1 requerem mais potência para reprodução! - Eles não estão disponíveis em todos os vídeos, e nesses casos o reprodutor usará + Eles não estão disponíveis em todos os vídeos, e nesses casos o player usará os formatos DASH H.264. General Settings: Region for Trending: A região de tendências lhe permite de escolher quais vídeos @@ -1113,7 +1115,7 @@ Tooltips: é fechada. External Player Settings: Custom External Player Arguments: Quaisquer argumentos de linha de comando personalizados, - separados por ponto e vírgula (';'), você deseja que seja passado para o reprodutor + separados por ponto e vírgula (';'), você deseja que seja passado para o player externo. Ignore Warnings: Suprime os avisos para quando o player externo atual não suporta a ação atual (por exemplo, reverter playlist, etc.). @@ -1131,16 +1133,16 @@ Tooltips: Replace HTTP Cache: Desabilita o cache HTTP baseado em disco do Electron e habilita um cache de imagem em memória personalizado. Levará ao aumento do uso de RAM. Distraction Free Settings: - Hide Channels: Digite um nome ou ID de canal para ocultar todos os vídeos, as - listas de reprodução e o próprio canal dos resultados da busca, tendências, - mais populares e recomendados. O nome do canal digitado deve coincidir exatamente, - observando maiúsculas e minúsculas. + Hide Channels: Insira o ID de um canal para impedir que todos os vídeos, playlists + e o próprio canal apareçam nas pesquisas, tendências, mais populares e recomendados. + O ID do canal inserido deve ser uma correspondência completa e diferenciar maiúsculas + de minúsculas. Hide Subscriptions Live: Esta definição é substituída pela definição de toda a aplicação "{appWideSetting}", na seção "{subsection}" da "{settingsSection}" - Hide Videos and Playlists Containing Text: Insira uma palavra, trecho de palavra + Hide Videos and Playlists Containing Text: Insira uma palavra, trecho de uma palavra ou frase (sem distinção entre maiúsculas e minúsculas) para ocultar todos os vídeos e playlists cujos títulos originais a contenham em todo o FreeTube, excluindo - apenas Histórico, Suas playlists e vídeos dentro das playlists. + apenas histórico, suas playlists e vídeos dentro das playlists. SponsorBlock Settings: UseDeArrowTitles: Substituir títulos de vídeo por títulos enviados pelo usuário a partir do DeArrow. @@ -1173,24 +1175,16 @@ Channels: Search bar placeholder: Buscar canais Empty: Sua lista de canais está vazia no momento. Unsubscribe: Cancelar inscrição - Unsubscribed: '{channelName} foi removido de suas assinaturas' + Unsubscribed: '{channelName} foi removido de suas inscrições' Unsubscribe Prompt: Tem certeza de que quer cancelar a sua inscrição de "{channelName}"? Count: '{number} canal(is) encontrado(s).' -Age Restricted: - The currently set default instance is {instance}: Este {instance} tem restrição - de idade - Type: - Channel: Canal - Video: Vídeo - This {videoOrPlaylist} is age restricted: Esse(a) {videoOrPlaylist} tem restrição - de idade -Screenshot Success: Captura de tela salva como "{filePath}" +Screenshot Success: Captura de tela salva em "{filePath}" Screenshot Error: Falha na captura de tela. {error} Preferences: Preferências Clipboard: - Copy failed: Copiar para a área de transferência falhou - Cannot access clipboard without a secure connection: Não pode acessar a área de - transferência sem uma conexão segura + Copy failed: Falha ao copiar para a área de transferência + Cannot access clipboard without a secure connection: Não é possível acessar a área + de transferência sem uma conexão segura Chapters: 'Chapters list visible, current chapter: {chapterName}': 'Lista visível de capítulos, capítulo atual: {chapterName}' @@ -1212,3 +1206,7 @@ Channel Unhidden: '{channel} removido do filtro do canal' Trimmed input must be at least N characters long: A entrada cortada deve ter pelo menos 1 caractere | A entrada cortada precisa ter pelo menos {length} caracteres Tag already exists: A tag "{tagName}" já existe +Close Banner: Fechar Banner +Age Restricted: + This channel is age restricted: Este canal tem restrição de idade + This video is age restricted: Este vídeo tem restrição de idade diff --git a/static/locales/pt-PT.yaml b/static/locales/pt-PT.yaml index 276c3c1a06061..679ca1b774360 100644 --- a/static/locales/pt-PT.yaml +++ b/static/locales/pt-PT.yaml @@ -1035,7 +1035,7 @@ Tooltips: Local API Error (Click to copy): Erro na API local (clique para copiar) Invidious API Error (Click to copy): Erro na API Invidious (clique para copiar) Falling back to Invidious API: Ocorreu um erro e vamos usar a API Invidious -Falling back to the local API: Ocorreu um erro e vamos usar a API local +Falling back to Local API: Ocorreu um erro e vamos usar a API local This video is unavailable because of missing formats. This can happen due to country unavailability.: Este vídeo não está disponível porque faltam formatos. Isto pode acontecer devido à indisponibilidade no seu país. @@ -1083,13 +1083,6 @@ Channels: Unsubscribe: Anular subscrição Unsubscribed: '{channelName} foi removido das suas subscrições' Unsubscribe Prompt: Tem a certeza de que pretende anular a subscrição de "{channelName}"? -Age Restricted: - The currently set default instance is {instance}: Este {instance} tem restrição - de idade - Type: - Channel: Canal - Video: Vídeo - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} tem restrição de idade' Downloading has completed: '"{videoTitle}" foi descarregado' Starting download: A descarregar "{videoTitle}" Downloading failed: Ocorreu um erro ao descarregar "{videoTitle}" diff --git a/static/locales/pt.yaml b/static/locales/pt.yaml index a2004dfa1e31e..fc38aa0afb6b6 100644 --- a/static/locales/pt.yaml +++ b/static/locales/pt.yaml @@ -43,6 +43,8 @@ Global: Subscriber Count: 1 assinante | {count} assinantes View Count: 1 visualização | {contagem} visualizações Watching Count: 1 a assistir | {count} a assistir + Input Tags: + Length Requirement: A etiqueta tem que ter, pelo menos, {number} caracteres Version {versionNumber} is now available! Click for more details: 'A versão {versionNumber} está disponível! Clique aqui para mais informações.' Download From Site: 'Descarregar do site' @@ -175,6 +177,9 @@ User Playlists: Playlist {playlistName} has been deleted.: A lista de reprodução {playlistName} foi eliminada. This playlist does not exist: Esta lista de reprodução não existe + This playlist is now used for quick bookmark: Esta lista de reprodução é agora + usada como marcador rápido + Quick bookmark disabled: Marcador rápido desativado AddVideoPrompt: Search in Playlists: Pesquisar nas listas de reprodução Save: Guardar @@ -212,6 +217,9 @@ User Playlists: Playlist Description: Descrição da lista de reprodução Add to Favorites: Adicionar a {playlistName} Remove from Favorites: Remover de {playlistName} + Enable Quick Bookmark With This Playlist: Ativar marcador rápido para esta lista + de reprodução + Disable Quick Bookmark: Desativar marcador rápido History: # On History Page History: 'Histórico' @@ -279,6 +287,7 @@ Settings: Catppuccin Mocha: Cappuccino mocha Pastel Pink: Rosa pastel Hot Pink: Rosa choque + Nordic: Nórdico Main Color Theme: Main Color Theme: 'Cor principal' Red: 'Vermelho' @@ -516,6 +525,8 @@ Settings: Category Color: Cor da categoria UseDeArrowTitles: Utilizar títulos de vídeo DeArrow UseDeArrowThumbnails: Usar 'DeArrow' para miniaturas + 'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': 'URL + da API do gerador de miniaturas DeArrow (padrão: https://dearrow-thumb.ajay.app)' Proxy Settings: Error getting network information. Is your proxy configured properly?: Erro ao obter informações da rede. O seu proxy está configurado corretamente? @@ -579,6 +590,10 @@ Settings: Hide Channels Already Exists: Este ID já existe Hide Channels API Error: Não foi possível obter o utilizador através do ID. Verifique se o ID indicado está correto. + Hide Videos and Playlists Containing Text Placeholder: Palavra, fragmento de palavra + ou frase + Hide Videos and Playlists Containing Text: Ocultar vídeos e listas de reprodução + que contenham textos External Player Settings: Custom External Player Arguments: Argumentos do reprodutor externo Custom External Player Executable: Executável do reprodutor externo @@ -779,6 +794,7 @@ Channel: Hide Answers: Ocultar respostas Reveal Answers: Revelar respostas votes: '{votes} votos' + Video hidden by FreeTube: Freetube ocultou este vídeo Live: Live: Em direto This channel does not currently have any live streams: Este canal não tem, atualmente, @@ -1021,7 +1037,7 @@ Up Next: 'A seguir' Local API Error (Click to copy): 'Erro na API local (clique para copiar)' Invidious API Error (Click to copy): 'Erro na API Invidious (clique para copiar)' Falling back to Invidious API: 'Ocorreu um erro e vamos usar a API Invidious' -Falling back to the local API: 'Ocorreu um erro e vamos usar a API local' +Falling back to Local API: 'Ocorreu um erro e vamos usar a API local' Subscriptions have not yet been implemented: 'As subscrições ainda não foram implementadas' Loop is now disabled: 'Repetição desativada' Loop is now enabled: 'Repetição ativada' @@ -1126,6 +1142,7 @@ Tooltips: SponsorBlock Settings: UseDeArrowTitles: Substituir títulos de vídeo por títulos enviados pelo utilizador a partir do DeArrow. + UseDeArrowThumbnails: Substituir miniaturas do vídeo por miniaturas DeArrow. Search Bar: Clear Input: Limpar entrada Are you sure you want to open this link?: Tem a certeza de que deseja abrir a ligação? @@ -1136,13 +1153,6 @@ Downloading failed: Ocorreu um erro ao descarregar "{videoTitle}" Downloading has completed: '"{videoTitle}" foi descarregado' Screenshot Success: Captura de ecrã guardada como "{filePath}" Screenshot Error: Erro ao capturar o ecrã. {error} -Age Restricted: - The currently set default instance is {instance}: Este {instance} tem restrição - de idade - Type: - Channel: Canal - Video: Vídeo - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} tem restrição de idade' New Window: Nova janela Channels: Count: '{number} canais encontrados.' @@ -1176,3 +1186,4 @@ Playlist will not pause when current video is finished: A lista de reprodução Channel Hidden: '{channel} adicionado ao filtro do canal' Go to page: Ir para {page} Channel Unhidden: '{channel} removido do filtro do canal' +Tag already exists: '"{tagName}" já existe' diff --git a/static/locales/ro.yaml b/static/locales/ro.yaml index 74fcdd752fb30..652aad2d9771c 100644 --- a/static/locales/ro.yaml +++ b/static/locales/ro.yaml @@ -42,6 +42,8 @@ Global: View Count: 1 vizionare | {count} vizionări Channel Count: 1 canal | {count} canale Watching Count: 1 se uită | {count} se uită + Input Tags: + Length Requirement: Tag-ul trebuie să aibă cel puțin {number} caractere Version {versionNumber} is now available! Click for more details: 'Versiunea {versionNumber} este acum disponibilă! Click pentru mai multe detalii' Download From Site: 'Descărcați de pe site' @@ -108,6 +110,8 @@ Subscriptions: All Subscription Tabs Hidden: Toate filele de abonament sunt ascunse. Pentru a vedea conținutul aici, vă rugăm să afișați unele file din secțiunea "{subsection}” din "{settingsSection}”. + Empty Posts: Canalele tale abonate nu au momentan nicio postare. + Load More Posts: Încarcă mai multe postări Trending: Trending: 'Tendințe' Trending Tabs: File în tendințe @@ -853,7 +857,7 @@ Up Next: 'În continuare' Local API Error (Click to copy): 'Eroare API locală (Faceți clic pentru a copia)' Invidious API Error (Click to copy): 'Eroare API Invidious (Faceți clic pentru a copia)' Falling back to Invidious API: 'Revenine la Invidious API' -Falling back to the local API: 'Revenire la API-ul local' +Falling back to Local API: 'Revenire la API-ul local' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Acest videoclip nu este disponibil din cauza lipsei de formate. Acest lucru se poate întâmpla din cauza indisponibilității țării.' @@ -972,14 +976,6 @@ Starting download: Se începe descărcarea a "{videoTitle}" Downloading failed: A existat o problemă la descărcarea "{videoTitle}" Downloading has completed: '"{videoTitle}" s-a terminat de descărcat' New Window: Fereastră nouă -Age Restricted: - The currently set default instance is {instance}: Acest {instance} este restricționat - datorită vârstei - Type: - Channel: Canal - Video: Video - This {videoOrPlaylist} is age restricted: Acest {videoOrPlaylist} are restricții - de vârstă Channels: Channels: Canale Title: Listă de canale @@ -1011,3 +1007,5 @@ Playlist will pause when current video is finished: Lista de redare se va între când videoclipul curent este terminat Playlist will not pause when current video is finished: Lista de redare nu se va întrerupe când videoclipul curent este terminat +Go to page: Mergeți la {page} +Close Banner: Închideți bannerul diff --git a/static/locales/ru.yaml b/static/locales/ru.yaml index f980c8eb2df98..f1cec0bf7130d 100644 --- a/static/locales/ru.yaml +++ b/static/locales/ru.yaml @@ -955,7 +955,7 @@ Local API Error (Click to copy): 'Ошибка локального набора Invidious API Error (Click to copy): 'Ошибка набора функций Invidious (Нажмите, чтобы скопировать)' Falling back to Invidious API: 'Возврат к набору функций Invidious' -Falling back to the local API: 'Возврат к локальному набору функций' +Falling back to Local API: 'Возврат к локальному набору функций' Subscriptions have not yet been implemented: 'Подписки еще не реализованы' Loop is now disabled: 'Повторение теперь отключено' Loop is now enabled: 'Повторение теперь включено' @@ -1089,9 +1089,9 @@ Tooltips: позволяющий открыть видео (подборку, если поддерживается) во внешнем проигрывателе. Внимание, настройки Invidious не применяются ко внешним проигрывателям. DefaultCustomArgumentsTemplate: "(По умолчанию: '{defaultCustomArguments}')" - Ignore Default Arguments: Не отправлять какие-либо умолчательные аргументы во - внешний проигрыватель кроме адреса видео (например, частота проигрывания, адрес - подборки и подобное). Пользовательские аргументы всё ещё будут передаваться. + Ignore Default Arguments: 'Не передавать никаких аргументов внешнему проигрывателю + по умолчанию, кроме адреса видео (напр.: частота проигрывания, адрес списка + воспроизведения и т. д.). Пользовательские аргументы всё ещё будут передаваться.' Experimental Settings: Replace HTTP Cache: Отключает дисковый HTTP-кэш Electron и включает пользовательский кэш изображений в памяти. Приведёт к увеличению использования оперативной памяти. @@ -1128,13 +1128,6 @@ Downloading failed: Возникла проблема с загрузкой «{v Screenshot Success: Снимок экрана сохранён как «{filePath}» Screenshot Error: Снимок экрана не удался. {error} New Window: Новое окно -Age Restricted: - The currently set default instance is {instance}: У {instance} ограничение по возрасту - Type: - Channel: Канал - Video: Видео - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} имеет ограничение по - возрасту' Channels: Title: Список каналов Count: '{number} канал(ов) найдено.' diff --git a/static/locales/sk.yaml b/static/locales/sk.yaml index 97bf0b728ef05..1882ad07665cf 100644 --- a/static/locales/sk.yaml +++ b/static/locales/sk.yaml @@ -646,7 +646,7 @@ Up Next: 'Nasledujúci' Local API Error (Click to copy): 'Local API chyba (kliknutím skopírujete)' Invidious API Error (Click to copy): 'Invidious API chyba (kliknutím skopírujete)' Falling back to Invidious API: 'Návrat k Invidious API' -Falling back to the local API: 'Návrat k local API' +Falling back to Local API: 'Návrat k local API' Subscriptions have not yet been implemented: 'Odbery ešte nie sú implementované' Loop is now disabled: 'Opakovanie je teraz deaktivované' Loop is now enabled: 'Opakovanie je teraz povolené' diff --git a/static/locales/sl.yaml b/static/locales/sl.yaml index 9390224e5b9f4..0d49e669876e7 100644 --- a/static/locales/sl.yaml +++ b/static/locales/sl.yaml @@ -709,7 +709,7 @@ Up Next: 'Naslednje na sporedu' Local API Error (Click to copy): 'Napaka lokalnega APV (kliknite za kopiranje)' Invidious API Error (Click to copy): 'Napaka Invidious APV (kliknite za kopiranje)' Falling back to Invidious API: 'Začasno bo uporabljen Invidious APV' -Falling back to the local API: 'Začasno bo uporabljen lokalni APV' +Falling back to Local API: 'Začasno bo uporabljen lokalni APV' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Videoposnetek zaradi mankajočih oblik ni dostopen. To se lahko zgodi, ko v vaši državi ni na razpolago.' Subscriptions have not yet been implemented: 'Naročnine še niso bile implementirane' diff --git a/static/locales/sm.yaml b/static/locales/sm.yaml index 8984390b1663f..e80aadef6dabb 100644 --- a/static/locales/sm.yaml +++ b/static/locales/sm.yaml @@ -814,7 +814,7 @@ Tooltips: Local API Error (Click to copy): '' Invidious API Error (Click to copy): '' Falling back to Invidious API: '' -Falling back to the local API: '' +Falling back to Local API: '' This video is unavailable because of missing formats. This can happen due to country unavailability.: '' Subscriptions have not yet been implemented: '' Unknown YouTube url type, cannot be opened in app: '' @@ -834,11 +834,6 @@ Canceled next video autoplay: '' Default Invidious instance has been set to {instance}: '' Default Invidious instance has been cleared: '' 'The playlist has ended. Enable loop to continue playing': '' -Age Restricted: - This {videoOrPlaylist} is age restricted: '' - Type: - Channel: '' - Video: '' External link opening has been disabled in the general settings: '' Downloading has completed: '' Starting download: '' diff --git a/static/locales/sr.yaml b/static/locales/sr.yaml index c948239758631..17e74ec1bc1ff 100644 --- a/static/locales/sr.yaml +++ b/static/locales/sr.yaml @@ -149,6 +149,7 @@ User Playlists: да додате видео снимак | Изаберите плејлисту на коју желите да додате {videoCount} видео снимака N playlists selected: 'Изабрано: {playlistCount}' + Added {count} Times: Додато {count} пут | Додато {count} пута SinglePlaylistView: Toast: There were no videos to remove.: Није било видео снимака за уклањање. @@ -296,6 +297,7 @@ Settings: Hot Pink: Врућа розе Catppuccin Mocha: Catppuccin Mocha System Default: Системски подразумевано + Nordic: Нордичка Main Color Theme: Main Color Theme: 'Главна тема боја' Red: 'Црвена' @@ -466,7 +468,7 @@ Settings: Hide Subscriptions Live: Сакриј стримове уживо канала које пратите Hide Subscriptions Shorts: Сакриј Shorts снимке канала које пратите Display Titles Without Excessive Capitalisation: Прикажи наслове без претераног - коришћења великих слова + писања великих слова и интерпункције Hide Featured Channels: Сакриј истакнуте канале Hide Profile Pictures in Comments: Сакриј слике профила у коментарима Hide Upcoming Premieres: Сакриј предстојеће премијере @@ -883,6 +885,7 @@ Video: уживо није доступно за овај стрим. Можда га је онемогућио аутор. Unhide Channel: Прикажи канал Hide Channel: Сакриј канал + More Options: Више опција Tooltips: Subscription Settings: Fetch Feeds from RSS: 'Када је омогућено, FreeTube ће користити RSS уместо свог @@ -970,11 +973,6 @@ Tooltips: Subscriptions have not yet been implemented: 'Праћења још увек нису имплементирана' Open New Window: Отвори нови прозор Shuffle is now disabled: Мешање је сада онемогућено -Age Restricted: - Type: - Video: Видео снимак - Channel: Канал - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} је старосно ограничен(а)' New Window: Нови прозор Clipboard: Copy failed: Копирање у привремену меморију није успело @@ -1044,7 +1042,7 @@ Share: меморију YouTube Embed URL copied to clipboard: YouTube уграђени URL је копиран у привремену меморију -Falling back to the local API: Повратак на локални API +Falling back to Local API: Повратак на локални API Unknown YouTube url type, cannot be opened in app: Непозната врста YouTube URL адресе, не може се отворити у апликацији Search Bar: @@ -1118,3 +1116,7 @@ Channel Unhidden: '{channel} је уклоњен из филтера канал Trimmed input must be at least N characters long: Исечени унос мора да има најмање 1 знак | Исечени унос мора да има најмање {length} знакова Tag already exists: Ознака „{tagName}“ већ постоји +Close Banner: Затвори банер +Age Restricted: + This channel is age restricted: Овај канал је ограничен према узрасту + This video is age restricted: Овај видео снимак је ограничен према узрасту diff --git a/static/locales/sv.yaml b/static/locales/sv.yaml index 76b8c7417482e..1f8c8fac041f4 100644 --- a/static/locales/sv.yaml +++ b/static/locales/sv.yaml @@ -916,7 +916,7 @@ Up Next: 'Kommer härnäst' Local API Error (Click to copy): 'Lokalt API-fel (Klicka för att kopiera koden)' Invidious API Error (Click to copy): 'Invidious API-fel (Klicka för att kopiera koden)' Falling back to Invidious API: 'Faller tillbaka till Invidious API' -Falling back to the local API: 'Faller tillbaka till lokal API' +Falling back to Local API: 'Faller tillbaka till lokal API' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Den här videon är inte tillgänglig på grund av format som saknas. Detta kan hända på grund av landets otillgänglighet.' @@ -1037,11 +1037,6 @@ Preferences: Preferenser Ok: Okej Screenshot Success: Sparade skärmdump som "{filePath}" Screenshot Error: Skärmdump misslyckades {felkod} -Age Restricted: - Type: - Channel: Kanal - Video: Video - This {videoOrPlaylist} is age restricted: Denna {videoOrPlaylist} är åldersbegränsad Clipboard: Cannot access clipboard without a secure connection: Har inte tillgång till urklipp utan en säker anslutning diff --git a/static/locales/ti.yaml b/static/locales/ti.yaml index c6f189c432bf0..4de64898df59f 100644 --- a/static/locales/ti.yaml +++ b/static/locales/ti.yaml @@ -1,5 +1,5 @@ # Put the name of your locale in the same language -Locale Name: 'እንግሊዘኛ (us)' +Locale Name: 'ትግርኛ' FreeTube: 'FreeTube' # Currently on Subscriptions, Playlists, and History 'This part of the app is not ready yet. Come back later when progress has been made.': >- diff --git a/static/locales/tig.yaml b/static/locales/tig.yaml index e5aea5ac5cd51..5b8c6ca9b80d2 100644 --- a/static/locales/tig.yaml +++ b/static/locales/tig.yaml @@ -11,4 +11,3 @@ Channel: About: {} Video: {} Tooltips: {} -Age Restricted: {} diff --git a/static/locales/tr.yaml b/static/locales/tr.yaml index 3be02d386ded2..57c6cd8f0c179 100644 --- a/static/locales/tr.yaml +++ b/static/locales/tr.yaml @@ -191,6 +191,7 @@ User Playlists: | {videoCount} video 1 oynatma listesine eklendi N playlists selected: '{playlistCount} Seçildi' Search in Playlists: Oynatma Listelerinde Ara + Added {count} Times: '{count} Defa Eklendi | {count} Defa Eklendi' CreatePlaylistPrompt: New Playlist Name: Yeni Oynatma Listesi Adı Create: Oluştur @@ -288,6 +289,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastel Pembe Hot Pink: Sıcak Pembe + Nordic: Nord Main Color Theme: Main Color Theme: 'Ana Renk Teması' Red: 'Kırmızı' @@ -531,8 +533,8 @@ Settings: Hide Upcoming Premieres: Yaklaşan İlk Gösterimleri Gizle Hide Channels Placeholder: Kanal Kimliği Hide Channels: Kanallardan Videoları Gizle - Display Titles Without Excessive Capitalisation: Başlıkları Aşırı Büyük Harf Kullanmadan - Görüntüle + Display Titles Without Excessive Capitalisation: Başlıkları Aşırı Büyük Harf ve + Noktalama İşaretleri Kullanmadan Görüntüle Hide Featured Channels: Öne Çıkan Kanalları Gizle Hide Channel Playlists: Kanal Oynatma Listelerini Gizle Hide Channel Community: Kanal Topluluğunu Gizle @@ -959,6 +961,7 @@ Video: Pause on Current Video: Geçerli Videoda Duraklat Unhide Channel: Kanalı Göster Hide Channel: Kanalı Gizle + More Options: Daha Fazla Seçenek Videos: #& Sort By Sort By: @@ -1039,7 +1042,7 @@ Up Next: 'Sonraki' Local API Error (Click to copy): 'Yerel API Hatası (Kopyalamak için tıklayın)' Invidious API Error (Click to copy): 'Invidious API Hatası (Kopyalamak için tıklayın)' Falling back to Invidious API: 'Invidious API''ye geri dönülüyor' -Falling back to the local API: 'Yerel API''ye geri dönülüyor' +Falling back to Local API: 'Yerel API''ye geri dönülüyor' Subscriptions have not yet been implemented: 'Abonelikler henüz uygulanmadı' Loop is now disabled: 'Döngü artık devre dışı' Loop is now enabled: 'Döngü artık etkin' @@ -1170,12 +1173,6 @@ Download folder does not exist: İndirme dizini "$" mevcut değil. "Klasör sor" Screenshot Success: Ekran görüntüsü "{filePath}" olarak kaydedildi Screenshot Error: Ekran görüntüsü başarısız oldu. {error} New Window: Yeni Pencere -Age Restricted: - The currently set default instance is {instance}: Bu {instance} yaş kısıtlamalıdır - Type: - Channel: Kanal - Video: Video - This {videoOrPlaylist} is age restricted: Bu {videoOrPlaylist} yaş kısıtlamalıdır Channels: Empty: Kanal listeniz şu anda boş. Channels: Kanallar @@ -1211,3 +1208,7 @@ Channel Unhidden: '{channel} kanal filtresinden kaldırıldı' Trimmed input must be at least N characters long: Kırpılan girdi en az 1 karakter uzunluğunda olmalıdır | Kırpılan girdi en az {length} karakter uzunluğunda olmalıdır Tag already exists: '"{tagName}" etiketi zaten var' +Close Banner: Afişi Kapat +Age Restricted: + This video is age restricted: Bu videoda yaş sınırlaması var + This channel is age restricted: Bu kanalda yaş sınırlaması var diff --git a/static/locales/uk.yaml b/static/locales/uk.yaml index 10dcb2b84b6a3..a69e6c904fe94 100644 --- a/static/locales/uk.yaml +++ b/static/locales/uk.yaml @@ -43,6 +43,8 @@ Global: Subscriber Count: 1 підписник | {count} підписників View Count: 1 перегляд | {count} переглядів Watching Count: 1 глядач | {count} глядачів + Input Tags: + Length Requirement: Тег повинен мати довжину не менше {number} символів Version {versionNumber} is now available! Click for more details: 'Доступна нова версія {versionNumber}! Натисніть, щоб переглянути подробиці' Download From Site: 'Завантажити з сайту' @@ -116,17 +118,36 @@ Trending: Music: Музика Default: Типово Most Popular: 'Найпопулярніші' -Playlists: 'Добірки' +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: Збережені відео порожні. Клацніть на кнопку збереження у куті відео, щоб воно було перелічено тут - Playlist Message: Ця сторінка не показує повністю робочих добірок. На ній перелічено - лише відео, які ви зберегли або вибрали. Коли робота завершиться, усі відео, які - зараз знаходяться тут, буде переміщено до добірки "Вибране". + Playlist Message: Ця сторінка не показує повністю робочих списків відтворення. На + ній перелічено лише відео, які ви зберегли або вибрали. Коли робота завершиться, + усі відео, які зараз знаходяться тут, буде переміщено до списку відтворення "Вибране". Search bar placeholder: Шукати у добірці Empty Search Message: Немає відео в цій добірці, які відповідають вашому запиту + Create New Playlist: Створити новий список відтворення + Add to Playlist: Додати список відтворення + Remove from Favorites: Вилучити з {playlistName} + Move Video Up: Посунути відео вгору + Move Video Down: Посунути відео вниз + Remove from Playlist: Вилучити зі списку відтворення + Playlist Description: Опис списку відтворення + Save Changes: Зберегти зміни + Cancel: Скасувати + Copy Playlist: Скопіювати список відтворення + You have no playlists. Click on the create new playlist button to create a new one.: У + вас немає списків відтворення. Натисніть на кнопку створити новий список відтворення, + щоб створити його. + This playlist currently has no videos.: Наразі у цьому списку відтворення немає + відео. + Add to Favorites: Додати до {playlistName} + Playlist Name: Назва списку відтворення + Edit Playlist Info: Змінити інформацію списку відтворення + Remove Watched Videos: Вилучити з переглянутих відео History: # On History Page History: 'Історія' @@ -321,8 +342,8 @@ Settings: Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Справді хочете вилучити всі підписки та профілі? Цю дію не можна скасувати.' Automatically Remove Video Meta Files: Автоматично вилучати метафайли відео - Save Watched Videos With Last Viewed Playlist: Зберегти переглянуті відео в добірку, - яку ви переглядали останнім часом + Save Watched Videos With Last Viewed Playlist: Зберегти переглянуті відео у список + відтворення, який ви переглядали останнім часом Subscription Settings: Subscription Settings: 'Налаштування підписки' Hide Videos on Watch: 'Ховати відео при перегляді' @@ -342,7 +363,7 @@ Settings: Hide Popular Videos: 'Не показувати популярні відео' Hide Live Chat: 'Не показувати живий чат' Hide Active Subscriptions: Сховати активні підписки - Hide Playlists: Сховати добірки + Hide Playlists: Сховати списки відтворення Hide Video Description: Сховати опис відео Hide Comments: Сховати коментарі Hide Sharing Actions: Сховати дії поширення @@ -354,7 +375,7 @@ Settings: Display Titles Without Excessive Capitalisation: Показувати заголовки без надмірно великих літер Hide Featured Channels: Сховати пропоновані канали - Hide Channel Playlists: Сховати добірки з каналів + Hide Channel Playlists: Сховати списки відтворення каналу Hide Channel Community: Сховати спільноту каналу Hide Channel Shorts: Сховати Shorts каналу Sections: @@ -414,13 +435,13 @@ Settings: Unknown data key: 'Невідомий ключ даних' How do I import my subscriptions?: 'Як імпортувати свої підписки?' Manage Subscriptions: Керування підписками - Playlist insufficient data: Недостатньо даних для добірки "{playlist}", пропуск - елемента - All playlists has been successfully exported: Усі добірки успішно експортовано + Playlist insufficient data: Недостатньо даних для списку відтворення "{playlist}", + пропуск елемента + All playlists has been successfully exported: Усі списки відтворення успішно експортовано Import Playlists: Імпорт добірок Export Playlists: Експорт добірок - All playlists has been successfully imported: Усі добірки успішно імпортовано - Playlist File: Файл добірки + All playlists has been successfully imported: Усі списки відтворення успішно імпортовано + Playlist File: Файл списку відтворення Subscription File: Файл підписки History File: Файл історії Advanced Settings: {} @@ -590,7 +611,7 @@ Channel: Oldest: 'Найдавніші' Most Popular: 'Найпопулярніші' Playlists: - Playlists: 'Добірки' + Playlists: 'Списки відтворення' This channel does not currently have any playlists: 'Цей канал наразі не має добірок' Sort Types: Last Video Added: 'Останнє додане відео' @@ -646,9 +667,9 @@ Video: Open Channel in Invidious: 'Відкрити канал у Invidious' Copy Invidious Channel Link: 'Копіювати посилання на канал Invidious' Views: 'Перегляди' - Loop Playlist: 'Зациклити добірку' - Shuffle Playlist: 'Перемішати добірку' - Reverse Playlist: 'Змінити напрямок добірки' + Loop Playlist: 'Повторювати список відтворення' + Shuffle Playlist: 'Перемішати список відтворення' + Reverse Playlist: 'Зворотний напрямок списку відтворення' Play Next Video: 'Відтворити наступне відео' Play Previous Video: 'Відтворити попереднє відео' Watched: 'Переглянуто' @@ -739,7 +760,7 @@ Video: starting video at offset: запуск відео зі зміщенням UnsupportedActionTemplate: '{externalPlayer} не підтримує: {action}' OpeningTemplate: Відкриття {videoOrPlaylist} у {externalPlayer}... - playlist: добірка + playlist: список відтворення video: відео OpenInTemplate: Відкрити у {externalPlayer} Premieres on: Прем'єри @@ -782,7 +803,7 @@ Videos: #& Playlists Playlist: #& About - View Full Playlist: 'Переглянути всю добірку' + View Full Playlist: 'Переглянути весь список відтворення' Videos: 'Відео' View: 'Перегляд' Views: 'Переглядів' @@ -791,7 +812,7 @@ Playlist: # On Video Watch Page #* Published #& Views - Playlist: Добірка + Playlist: Список відтворення Toggle Theatre Mode: 'Перемкнути режим театру' Change Format: Change Media Formats: 'Зміна форматів відео' @@ -804,7 +825,7 @@ Change Format: відео' Share: Share Video: 'Поділитися відео' - Share Playlist: 'Поділитися добіркою' + Share Playlist: 'Поділитися списком відтворення' Include Timestamp: 'Включити позначку часу' Copy Link: 'Копіювати посилання' Open Link: 'Відкрити посилання' @@ -915,8 +936,8 @@ Tooltips: програвач можна знайти за допомогою змінної середовища PATH. Якщо потрібно, тут можна призначити нетиповий шлях. External Player: Якщо обрано зовнішній програвач, з'явиться піктограма для відкриття - відео (добірка, якщо підтримується) у зовнішньому програвачі, на мініатюрі. - Увага, налаштування Invidious не застосовуються до сторонніх програвачів. + відео (список відтворення, якщо підтримується) у зовнішньому програвачі, на + мініатюрі. Увага, налаштування Invidious не застосовуються до сторонніх програвачів. DefaultCustomArgumentsTemplate: "(Типово: '{defaultCustomArguments}')" Experimental Settings: Replace HTTP Cache: Вимикає дисковий HTTP-кеш Electron і вмикає власний кеш зображень @@ -932,7 +953,7 @@ Tooltips: Local API Error (Click to copy): 'Помилка локального API (натисніть, щоб скопіювати)' Invidious API Error (Click to copy): 'Помилка Invidious API (натисніть, щоб скопіювати)' Falling back to Invidious API: 'Повернення до API Invidious' -Falling back to the local API: 'Повернення до локального API' +Falling back to Local API: 'Повернення до локального API' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Це відео недоступне через відсутність форматів. Це може статися через недоступність країни.' @@ -941,12 +962,12 @@ Loop is now disabled: 'Цикл вимкнено' Loop is now enabled: 'Цикл увімкнено' Shuffle is now disabled: 'Випадковий порядок вимкнено' Shuffle is now enabled: 'Випадковий порядок увімкнено' -The playlist has been reversed: 'Добірку обернено' +The playlist has been reversed: 'Список відтворення обернено' Playing Next Video: 'Відтворення наступного відео' Playing Previous Video: 'Відтворення попереднього відео' Canceled next video autoplay: 'Скасовано автовідтворення наступного відео' -'The playlist has ended. Enable loop to continue playing': 'Добірка завершилася. Увімкніть - цикл, щоб продовжити відтворення' +'The playlist has ended. Enable loop to continue playing': 'Список відтворення завершився. + Увімкніть повторення, щоб продовжити відтворення' Yes: 'Так' No: 'Ні' @@ -977,13 +998,6 @@ Download folder does not exist: Каталог завантаження "$" не Screenshot Success: Знімок екрана збережено як «{filePath}» Screenshot Error: Не вдалося зробити знімок екрана. {error} New Window: Нове вікно -Age Restricted: - The currently set default instance is {instance}: Цей {instance} має обмеження за - віком - Type: - Video: Відео - Channel: Канал - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} має вікове обмеження' Channels: Count: 'Знайдено каналів: {number}.' Empty: Ваш список каналів наразі порожній. @@ -1008,10 +1022,11 @@ Ok: Гаразд Hashtag: Hashtag: Хештег This hashtag does not currently have any videos: За цим хештегом наразі немає відео -Playlist will pause when current video is finished: Добірка призупиняється, коли поточне - відео завершено -Playlist will not pause when current video is finished: Добірка не призупиняється, +Playlist will pause when current video is finished: Список відтворення призупиняється, + коли поточне відео завершено +Playlist will not pause when current video is finished: Список відтворення не призупиняється, коли поточне відео завершено Channel Hidden: '{channel} додано до фільтра каналу' Go to page: Перейти до {page} Channel Unhidden: '{channel} вилучено з фільтра каналу' +Close Banner: Закрити банер diff --git a/static/locales/ur.yaml b/static/locales/ur.yaml index 6cd0a27a527ff..cd84b24059f31 100644 --- a/static/locales/ur.yaml +++ b/static/locales/ur.yaml @@ -230,10 +230,6 @@ Default Invidious instance has been cleared: 'ڈیفالٹ Invidious مثال ک گیا ہے۔' 'The playlist has ended. Enable loop to continue playing': 'پلے لسٹ ختم ہو گئی ہے۔ فعال کھیل جاری رکھنے کے لیے لوپ' -Age Restricted: - Type: - Channel: 'چینل' - Video: 'ویڈیو' External link opening has been disabled in the general settings: 'عام ترتیبات میں بیرونی لنک کھولنے کو غیر فعال کر دیا گیا ہے۔' Downloading has completed: '"{videoTitle}" نے ڈاؤن لوڈ مکمل کر لیا ہے۔' diff --git a/static/locales/vi.yaml b/static/locales/vi.yaml index 250c13c23e7db..b84a3936b3d24 100644 --- a/static/locales/vi.yaml +++ b/static/locales/vi.yaml @@ -1,4 +1,4 @@ -Locale Name: Tiếng Anh +Locale Name: Tiếng Việt FreeTube: 'FreeTube' # Currently on Subscriptions, Playlists, and History 'This part of the app is not ready yet. Come back later when progress has been made.': >- @@ -18,7 +18,7 @@ Select all: 'Chọn tất cả' Reload: 'Tải lại' Force Reload: 'Buộc tải lại' Toggle Developer Tools: 'Chuyển đổi công cụ phát triển' -Actual size: 'Kích thước thực sự' +Actual size: 'Kích thước thực' Zoom in: 'Phóng to' Zoom out: 'Thu nhỏ' Toggle fullscreen: 'Chuyển đổi toàn màn hình' @@ -36,6 +36,15 @@ Global: # Search Bar Live: Trực tiếp Shorts: Shorts + Community: Cộng đồng + Counts: + Subscriber Count: 1 người đăng ký | {count} người đăng ký + View Count: 1 lượt xem | {count} lượt xem + Channel Count: 1 kênh | {count} kênh + Video Count: 1 video | {count} video + Watching Count: 1 lượt xem | {count} lượt xem + Input Tags: + Length Requirement: 1 đang xem | {count} đang xem Search / Go to URL: 'Tìm kiếm / Đi đến URL' # In Filter Button Search Filters: @@ -45,7 +54,7 @@ Search Filters: Most Relevant: 'Liên quan nhất' Rating: 'Đánh giá' Upload Date: 'Ngày tải lên' - View Count: 'Lượng xem' + View Count: 'Lượt xem' Time: Time: 'Thời gian' Any Time: 'Mọi lúc' @@ -62,11 +71,12 @@ Search Filters: #& Playlists Movies: Phim ảnh Duration: - Duration: 'Thời hạn' - All Durations: 'Tất cả thời hạn' + Duration: 'Thời lượng' + All Durations: 'Tất cả thời lượng' Short (< 4 minutes): 'Ngắn (<4 phút)' Long (> 20 minutes): 'Dài (> 20 phút)' # On Search Page + Medium (4 - 20 minutes): Vừa (4 - 20 phút) Search Results: 'Kết quả tìm kiếm' Fetching results. Please wait: 'Đang lấy kết quả. Xin hãy chờ' Fetch more results: 'Lấy thêm kết quả' @@ -80,18 +90,26 @@ Subscriptions: sách Đăng ký đang trống. Bắt đầu thêm đăng ký để xem chúng tại đây.' 'Getting Subscriptions. Please wait.': 'Đang lấy Đăng ký. Vui lòng đợi.' 'Getting Subscriptions. Please wait.': Đang lấy Đăng ký. Vui lòng chờ. - Load More Videos: Load thêm video - Refresh Subscriptions: Refresh đăng ký - This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: Kênh - này có nhiều người đăng ký. Buộc RSS để tránh bị giới hạn - Error Channels: Các kênh lỗi + Load More Videos: Tải thêm video + Refresh Subscriptions: Tải lại đăng ký + This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: Hồ + sơ này có nhiều đăng ký.  Đang buộc RSS để tránh bị giới hạn + Error Channels: Các kênh có lỗi + Subscriptions Tabs: Trang đăng ký + Disabled Automatic Fetching: Bạn đã vô hiệu hóa tự động tải đăng ký. Hãy tải lại + danh sách đăng ký để xem chúng tại đây. + All Subscription Tabs Hidden: Tất cả các trang đăng ký đăng bị ẩn. Để xem nội dung + ở đây, vui lòng bỏ ẩn một số trang ở trong mục "{subsection}" của "{settingsSection}". + Load More Posts: Tải thêm bài đăng + Empty Channels: Các kênh bạn đăng ký hiện chưa đăng video nào. + Empty Posts: Các kênh bạn đăng ký hiện chưa đăng bài đăng nào. Trending: Trending: 'Xu hướng' Movies: Phim Music: Âm nhạc Default: Mặc định Gaming: Trò chơi - Trending Tabs: Tab Xu hướng + Trending Tabs: Trang Xu hướng Most Popular: 'Phổ biến nhất' Playlists: 'Danh sách phát' User Playlists: @@ -104,12 +122,103 @@ User Playlists: Playlist Message: Trang này không liệt kê tất cả danh sách video bạn đã theo giỏi. Nó chỉ hiển thị các video mà bạn đã lưu hoặc thêm vào mục yêu thích. Khi xong việc, tất cả các video trên trang này sẽ được chuyển vào danh sách 'yêu thích'. + Remove from Playlist: Xóa khỏi danh sách phát + Playlist Name: Tên danh sách phát + Save Changes: Lưu thay đổi + Remove Watched Videos: Xóa video đã xem + Sort By: + LatestUpdatedFirst: Được cập nhật gần đây + LatestPlayedFirst: Được phát gần đây + Sort By: Sắp xếp theo + EarliestUpdatedFirst: Được cập nhật sớm nhất + NameAscending: A-Z + NameDescending: Z-A + LatestCreatedFirst: Được tạo gần đây + EarliestCreatedFirst: Được tạo sớm nhất + EarliestPlayedFirst: Được phát sớm nhất + SinglePlaylistView: + Toast: + Video has been removed: Video đã được xóa + There was an issue with updating this playlist.: Đã có vấn đề xảy ra trong khi + cập nhập danh sách phát. + Reverted to use {oldPlaylistName} for quick bookmark: Đã quay lại dùng {oldPlaylistName} + cho dấu trang nhanh + Quick bookmark disabled: Đã tắt dấu trang nhanh + Some videos in the playlist are not loaded yet. Click here to copy anyway.: Một + số video trong danh sách phát này chưa được tải, bạn vẫn có thể nhấn vào đây + để sao chép. + This playlist is protected and cannot be removed.: Danh sách phát này được bảo + vệ và không thể bị xóa. + Playlist {playlistName} has been deleted.: Danh sách phát {playlistName} đã + được xóa. + This playlist does not exist: Danh sách phát này không tồn tại + This video cannot be moved up.: Video này không thể được chuyển lên. + This video cannot be moved down.: Video này không thể được chuyển xuống. + There was a problem with removing this video: Đã có vấn để xảy ra trong khi + xóa video này + This playlist is now used for quick bookmark: Danh sách này giờ đang được dùng + để tạo dấu trang nhanh + This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Danh + sách này giờ đang được dùng để tạo dấu trang nhanh thay vì {oldPlaylistName}. + Nhấn đây để hoàn tác + Playlist name cannot be empty. Please input a name.: Tên danh sách phát không + thể để trống. Vui lòng nhập một tên. + Playlist has been updated.: Danh sách phát đã được cập nhật. + "{videoCount} video(s) have been removed": 1 video đã được xóa | {videoCount} + video đã được xóa + There were no videos to remove.: Không có video nào để xóa. + You have no playlists. Click on the create new playlist button to create a new one.: Bạn + đang không có danh sách phát nào. Nhấn vào nút tạo danh sách phát mới để tạo một + cái mới. + This playlist currently has no videos.: Danh sách phát này hiện không có video nào. + Edit Playlist Info: Chỉnh sửa thông tin danh sách phát + Are you sure you want to delete this playlist? This cannot be undone: Bạn có chắc + muốn xóa danh sách phát này?Việc này không thể hoàn tác. + CreatePlaylistPrompt: + Create: Tạo mới + Toast: + Playlist {playlistName} has been successfully created.: Danh sách phát {playlistName} + đã được tạo thành công. + There was an issue with creating the playlist.: Đã có vấn đề xảy ra trong khi + tạo danh sách phát này. + There is already a playlist with this name. Please pick a different name.: Hiện + đã có danh sách phát với tên này rồi. Vui lòng chọn một cái tên khác. + New Playlist Name: Tên danh sách phát mới + AddVideoPrompt: + Select a playlist to add your N videos to: Chọn một danh sách phát để lưu video + này vào | Chọn một danh sách phát để lưu {videoCount} video này vào + N playlists selected: Đã chọn {playlistCount} + Search in Playlists: Tìm trong danh sách phát + Toast: + "{videoCount} video(s) added to {playlistCount} playlists": Đã thêm 1 video + vào {playlistCount} danh sách phát | Đã thêm {videoCount} video vào {playlistCount} + danh sách phát + You haven't selected any playlist yet.: Bạn đang chưa chọn danh sách phát nào. + "{videoCount} video(s) added to 1 playlist": Đã thêm 1 video vào 1 danh sách + phát | Đã thêm {videoCount} vào 1 danh sách phát + Save: Lưu + Create New Playlist: Tạo danh sách phat mới + Playlist Description: Mô tả danh sách phát + Copy Playlist: Sao chép danh sách phát + Enable Quick Bookmark With This Playlist: Bật dấu trang nhanh với danh sách phát + này + Add to Playlist: Thêm vào danh sách phát + Cancel: Hủy bỏ + Add to Favorites: Thêm vào {playlistName} + Remove from Favorites: Xóa khỏi {playlistName} + Move Video Down: Chuyển video xuống + Move Video Up: Chuyển video lên + Disable Quick Bookmark: Tắt dấu trang nhanh + Delete Playlist: Xóa danh sách phát + Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Bạn + có chắc muốn xóa tất cả các video đã xem khỏi danh sách phát này? Việc này không + thể được hoàn tác. History: # On History Page History: 'Lịch sử' Watch History: 'Lịch sử xem' Your history list is currently empty.: Lịch sử của bạn hiện đang trống. - Search bar placeholder: Tìm kiếm trong Lịch sử + Search bar placeholder: Tìm trong lịch sử Empty Search Message: Không có video nào trong lịch sử của bạn trùng với những gì bạn đang tìm kiếm Settings: @@ -123,8 +232,8 @@ Settings: Default Landing Page: 'Trang mặc định' Locale Preference: 'Ngôn ngữ' Preferred API Backend: - Preferred API Backend: 'Backend API' - Local API: 'Local API' + Preferred API Backend: 'API Backend' + Local API: 'API địa phương' Invidious API: 'API Invidious' Video View Type: Video View Type: 'Kiểu xem video' @@ -133,16 +242,18 @@ Settings: Thumbnail Preference: Thumbnail Preference: 'Thumbnail' Default: 'Mặc định' - Beginning: 'Lúc đầu' - Middle: 'Chính giữa' - End: 'Đầu cuối' + Beginning: 'Đầu' + Middle: 'Giữa' + End: 'Cuối' + Blur: Làm mờ + Hidden: Ẩn 'Invidious Instance (Default is https://invidious.snopyta.org)': 'Phiên bản Invidious (Mặc định là https://invidious.snopyta.org)' Region for Trending: 'Phổ biến theo quốc gia' #! List countries - Check for Latest Blog Posts: Check Blog post mới nhất + Check for Latest Blog Posts: Kiểm tra bài đăng mới nhất Check for Updates: Kiểm tra cập nhật - Current Invidious Instance: Phiên bản invidious hiện tại + Current Invidious Instance: Phiên bản Invidious hiện tại The currently set default instance is {instance}: Phiên bản Invidious mặc định hiện được đặt thành {instance} No default instance has been set: Không có phiên bản mặc định nào được đặt @@ -156,7 +267,7 @@ Settings: No Action: Không hành động External Link Handling: Xử lý liên kết bên ngoài View all Invidious instance information: Xem tất cả thông tin phiên bản Invidious - System Default: Mặc định Hệ thống + System Default: Mặc định hệ thống Theme Settings: Theme Settings: 'Cài đặt chủ đề' Match Top Bar with Main Color: 'Khớp thanh trên cùng với màu chính' @@ -165,34 +276,37 @@ Settings: Black: 'Đen' Dark: 'Tối' Light: 'Sáng' - Dracula: 'Ma cà rồng' + Dracula: 'Dracula' System Default: Mặc định hệ thống - Catppuccin Mocha: Catppuccin Mocha - Màu cà phê + Catppuccin Mocha: Catppuccin Mocha + Nordic: Nordic + Pastel Pink: Hồng phấn tiên + Hot Pink: Hồng nóng bỏng Main Color Theme: Main Color Theme: 'Màu chủ đề chính' Red: 'Đỏ' Pink: 'Hồng' Purple: 'Tím' - Deep Purple: 'Tím Đậm' - Indigo: 'Xanh Đậm' - Blue: 'Xanh' - Light Blue: 'Xanh Nhạt' - Cyan: 'Lục Lam' + Deep Purple: 'Tím đậm' + Indigo: 'Chàm' + Blue: 'Xanh lam' + Light Blue: 'Xanh nước biển' + Cyan: 'Xanh lơ' Teal: 'Xanh mòng két' - Green: 'Xanh Lá' - Light Green: 'Xanh Lợt' - Lime: 'Vôi' + Green: 'Xanh lục' + Light Green: 'Xanh lợt' + Lime: 'Vàng chanh' Yellow: 'Vàng' - Amber: 'Hổ Phách' + Amber: 'Hổ phách' Orange: 'Cam' - Deep Orange: 'Cam Đậm' - Dracula Cyan: 'Ma cà rồng Lục Lam' - Dracula Green: 'Ma cà rồng Xanh Lá' - Dracula Orange: 'Ma cà rồng Cam' - Dracula Pink: 'Ma cà rồng Hồng' - Dracula Purple: 'Ma cà rồng Tím' - Dracula Red: 'Ma cà rồng Đỏ' - Dracula Yellow: 'Ma cà rồng Vàng' + Deep Orange: 'Cam đậm' + Dracula Cyan: 'Xanh lơ Dracula' + Dracula Green: 'Xanh lục Dracula' + Dracula Orange: 'Cam Dracula' + Dracula Pink: 'Hồng Dracula' + Dracula Purple: 'Tím Dracula' + Dracula Red: 'Đỏ Dracula' + Dracula Yellow: 'Vàng Dracula' Catppuccin Mocha Rosewater: Catppuccin Mocha Rosewater Màu hoa hồng Catppuccin Mocha Flamingo: Catppuccin Mocha Flamingo Màu hồng hạc Catppuccin Mocha Pink: Catppuccin Mocha Pink Màu hồng hạc @@ -207,13 +321,13 @@ Settings: Catppuccin Mocha Sapphire: Catppuccin Mocha Sapphire màu xanh Catppuccin Mocha Lavender: Catppuccin Mocha Lavender Màu tím nhạt Catppuccin Mocha Blue: Catppuccin Mocha Blue Màu xanh - Secondary Color Theme: 'Màu chủ đề thứ hai' + Secondary Color Theme: 'Màu chủ đề phụ' #* Main Color Theme UI Scale: Tỉ lệ UI Disable Smooth Scrolling: Tắt cuộn mượt Expand Side Bar by Default: Mở rộng thanh bên theo mặc định - Hide Side Bar Labels: Ẩn Nhãn Thanh Bên - Hide FreeTube Header Logo: Ẩn Logo FreeTube trên thanh trên + Hide Side Bar Labels: Ẩn nhãn thanh bên + Hide FreeTube Header Logo: Ẩn logo FreeTube trên thanh trên Player Settings: Player Settings: 'Cài đặt trình phát' Force Local Backend for Legacy Formats: 'Bắt buộc Local Backend cho định dạng @@ -221,14 +335,14 @@ Settings: Remember History: 'Nhớ lịch sử' Play Next Video: 'Phát video tiếp theo' Turn on Subtitles by Default: 'Bật phụ đề theo mặc định' - Autoplay Videos: 'Tự phát videos' + Autoplay Videos: 'Tự phát video' Proxy Videos Through Invidious: 'Proxy video qua Invidious' Autoplay Playlists: 'Danh sách tự động phát' Enable Theatre Mode by Default: 'Bật chế độ rạp hát theo mặc định' Default Volume: 'Âm lượng mặc định' Default Playback Rate: 'Tốc độ phát mặc định' Default Video Format: - Default Video Format: 'Định dạng video theo mặc định' + Default Video Format: 'Định dạng video mặc định' Dash Formats: 'Định dạng DASH' Legacy Formats: 'Định dạng Legacy' Audio Formats: 'Định dạng âm thanh' @@ -244,21 +358,21 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' - Scroll Playback Rate Over Video Player: Tốc độ Phát lại Cuộn qua Trình phát Video - Scroll Volume Over Video Player: Cuộn Âm lượng qua Trình phát Video + Scroll Playback Rate Over Video Player: Con lăn chuột điểu chỉnh tốc độ phát lại + Scroll Volume Over Video Player: Con lăn chuột điểu chỉnh âm lượng Display Play Button In Video Player: Hiển thị nút phát trong trình phát video Next Video Interval: Khoảng thời gian Video Tiếp theo Fast-Forward / Rewind Interval: Khoảng thời gian tua đi / tua lại Screenshot: - Enable: Bật chức năng Chụp màn hình + Enable: Bật chức năng chụp màn hình Format Label: Định dạng chụp màn hình Quality Label: Chất lượng chụp màn hình - File Name Label: Kiểu tên tệp - Folder Label: Chụp màn hình thư mục + File Name Label: Mẫu tên tệp + Folder Label: Thư mục ảnh chụp màn hình Ask Path: Yêu cầu thứ mục lưu Folder Button: Chọn thư mục Error: - Empty File Name: Tên tệp. trống + Empty File Name: Tên tệp trống Forbidden Characters: Các ký từ bị cấm File Name Tooltip: Bạn có thể dùng các biến số dưới đây. %Y Năm 4 chữ số. %M Tháng 2 chữ số. %D Ngày 2 chữ số. %H Giờ 2 chữ số. %N Phút 2 chữ số. %S Giây @@ -266,8 +380,12 @@ Settings: 3 chữ số. %i Video ID. Bạn cũng có thể dùng dấu "\" hoặc "/" để tạo các thư mục con. Max Video Playback Rate: Tốc độ phát lại tối đa - Video Playback Rate Interval: khoảng cách phát lại video + Video Playback Rate Interval: Khoảng cách tốc độ phát Enter Fullscreen on Display Rotate: Bật toàn màn hình khi xoay + Comment Auto Load: + Comment Auto Load: Tự động tải bình luận + Skip by Scrolling Over Video Player: Tua video bằng con lăn chuột + Allow DASH AV1 formats: Cho phép định dạng DASH AV1 Subscription Settings: Subscription Settings: 'Cài đặt đăng ký' Hide Videos on Watch: 'Ẩn video khi đã xem' @@ -280,8 +398,9 @@ Settings: Import Subscriptions: 'Nhập đăng ký' Export Subscriptions: 'Xuất đăng ký' How do I import my subscriptions?: 'Làm sao để nhập đăng ký của tôi?' - Fetch Feeds from RSS: Lấy feeds từ RSS + Fetch Feeds from RSS: Cập nhật bảng tin qua RSS Fetch Automatically: Tự động làm mới bảng tin + Only Show Latest Video for Each Channel: Chỉ hiện video mới nhất cho mỗi kênh Advanced Settings: Advanced Settings: 'Cài đặt nâng cao' Enable Debug Mode (Prints data to the console): 'Bật chế độ Debug (Ghi data ra @@ -310,27 +429,27 @@ Settings: Data Settings: How do I import my subscriptions?: Làm sao để tôi nhập đăng ký? - Unknown data key: Key data không xác định - Unable to write file: Không thể viết file - Unable to read file: Không thể đọc file + Unknown data key: Key dữ liệu không xác định + Unable to write file: Không thể viết tệp + Unable to read file: Không thể đọc tệp All watched history has been successfully exported: Tất cả lịch sử xem đã được xuất ra thành công All watched history has been successfully imported: Tất cả lịch sử xem đã được nhập vào thành công - History object has insufficient data, skipping item: Lịch sử object không đủ dữ - liệu, bỏ qua + History object has insufficient data, skipping item: Lịch sử không đủ dữ liệu, + đang bỏ qua mục này Subscriptions have been successfully exported: Đăng ký đã được xuất thành công - Invalid history file: File lịch sử không hợp lệ + Invalid history file: Tệp lịch sử không hợp lệ This might take a while, please wait: Điều này có thể tốn thời gian, xin hãy chờ - Invalid subscriptions file: File đăng ký không hợp lệ - One or more subscriptions were unable to be imported: Một hay hơn đăng ký không + Invalid subscriptions file: Tệp đăng ký không hợp lệ + One or more subscriptions were unable to be imported: Một hay nhiều đăng ký không thể nhập All subscriptions have been successfully imported: Tất cả đăng ký đã được nhập vào thành công - All subscriptions and profiles have been successfully imported: Tất cả đăng ký - và profiles đã được nhập vào thành công - Profile object has insufficient data, skipping item: Profile object không đủ dữ - liệu, bỏ qua + All subscriptions and profiles have been successfully imported: Tất cả các đăng + ký và hồ sơ đã được nhập thành công + Profile object has insufficient data, skipping item: Hồ sơ không đủ dữ liệu, đang + bỏ qua mục này Export History: Xuất lịch sử Import History: Nhập lịch sử Export NewPipe: Xuất NewPipe @@ -344,9 +463,9 @@ Settings: Import Subscriptions: Nhập đăng ký Select Export Type: Chọn kiểu xuất ra Select Import Type: Chọn kiểu nhập vào - Data Settings: Dữ liệu + Data Settings: Cài đặt dữ liệu Manage Subscriptions: Quản lý đăng ký - Import Playlists: Thêm danh sách phát + Import Playlists: Nhập danh sách phát All playlists has been successfully imported: Tất cả các danh sách phát đã được thêm vào thành công All playlists has been successfully exported: Tất cả các danh sách phát đã được @@ -354,36 +473,64 @@ Settings: Playlist insufficient data: Dữ liệu bị thiếu cho danh sách phát "{playlist}", bỏ qua mục này Export Playlists: Xuất danh sách phát - History File: Tệp Lịch sử - Playlist File: Tệp Danh sách phát + History File: Tệp lịch sử + Playlist File: Tệp danh sách phát + Subscription File: Tệp đăng ký + Export Playlists For Older FreeTube Versions: + Label: Xuất danh sách phát cho các phiên bản FreeTube cũ hơn + Tooltip: "Tùy chọn này sẽ gộp tất cả các danh sách phát vào một danh sách phát + mang tên 'Ưa thích'.\nCách để nhập & xuất video trong danh sách phát cho một + phiên bản cũ hơn của FreeTube:\n1. Xuất danh sách phát với tùy chọn này được + bật.\n2. Xóa tất cả các danh sách phát qua tùy chọn Xóa tất cả danh sách phát + trong mục Cài đặt quyền riêng tư.\n3. Mở phiên bản cũ hơn và nhập danh sách + phát đã được xuất ra." Distraction Free Settings: - Hide Live Chat: Giấu live chat - Hide Popular Videos: Giấu video phổ biến - Hide Trending Videos: Giấu video xu hướng - Hide Recommended Videos: Giấu video nên xem - Hide Comment Likes: Giấu bình luận like - Hide Channel Subscribers: Giấu số người đăng ký - Hide Video Likes And Dislikes: Giấu thích và không thích - Hide Video Views: Giấu lượt xem - Distraction Free Settings: Chế độ không phân tâm - Hide Active Subscriptions: Ẩn Đăng ký Hiện hoạt + Hide Live Chat: Ẩn live chat + Hide Popular Videos: Ẩn video phổ biến + Hide Trending Videos: Ẩn video xu hướng + Hide Recommended Videos: Ẩn video tiếp theo + Hide Comment Likes: Ẩn lượt thích bình luận + Hide Channel Subscribers: Ẩn số người đăng ký + Hide Video Likes And Dislikes: Ẩn lượt thích và không thích + Hide Video Views: Ẩn lượt xem + Distraction Free Settings: Cài đặt không phân tâm + Hide Active Subscriptions: Ẩn đăng ký hiện hoạt Hide Playlists: Ẩn danh sách phát Hide Comments: Ẩn bình luận Hide Live Streams: Ẩn phát trực tiếp Hide Video Description: Ẩn mổ tả video - Hide Sharing Actions: Ẩn hoạt động chia sẻ + Hide Sharing Actions: Ẩn nút chia sẻ Sections: General: Chung + Side Bar: Thanh bên + Channel Page: Trang kênh + Subscriptions Page: Trang đăng ký + Watch Page: Trang trình chiếu video Hide Channel Playlists: Ẩn danh sách phát của kênh Hide Featured Channels: Ẩn các kênh nổi bật - Hide Channels Placeholder: Tên kênh hoặc ID - Hide Profile Pictures in Comments: Ẩn ảnh đại diện trong Bình luận + Hide Channels Placeholder: ID kênh + Hide Profile Pictures in Comments: Ẩn ảnh đại diện trong bình luận Hide Chapters: Ẩn các chương - Hide Channels: Ẩn các videos khỏi kênh + Hide Channels: Ẩn các video khỏi kênh + Hide Channel Releases: Ẩn nhạc của kênh + Hide Videos and Playlists Containing Text: Ẩn các video và danh sách phát có chứa + Hide Channels Invalid: ID kênh không hợp lệ + Hide Channel Community: Ẩn cộng đồng của kênh + Hide Channel Shorts: Ẩn short của kênh + Hide Subscriptions Shorts: Ẩn short từ các đăng ký + Hide Subscriptions Live: Ẩn video phát trực tiếp từ các đăng ký + Hide Upcoming Premieres: Ẩn video sắp ra mắt + Hide Channel Podcasts: Ẩn podcast của kênh + Hide Subscriptions Community: Ẩn bài đăng cộng đồng từ các đăng ký + Hide Channels Already Exists: ID kênh đã tồn tại + Hide Videos and Playlists Containing Text Placeholder: Từ, tiếng, hoặc cụm từ + Hide Subscriptions Videos: Ẩn video từ các đăng ký + Display Titles Without Excessive Capitalisation: Hiển thị tiêu đề không viết hoa + quá mức Privacy Settings: Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Bạn - có muốn xóa toàn bộ đăng ký và profiles không? Điều này không thể phục hồi. - Remove All Subscriptions / Profiles: Xóa bỏ tất cả đăng ký / Profiles + có muốn xóa toàn bộ đăng ký và hồ sơ không? Điều này không thể phục hồi. + Remove All Subscriptions / Profiles: Xóa tất cả đăng ký / hồ sơ Watch history has been cleared: Lịch sử xem đã được xóa Are you sure you want to remove your entire watch history?: Bạn có thực sự muốn xóa toàn bộ lịch sử xem? @@ -391,58 +538,70 @@ Settings: Search cache has been cleared: Bộ đệm của tìm kiếm đã xóa Are you sure you want to clear out your search cache?: Bạn có chắc là muốn xóa bộ đệm của tìm kiếm? - Clear Search Cache: Xóa Tìm kiếm cache + Clear Search Cache: Xóa cache tìm kiếm Save Watched Progress: Lưu quá trình xem Remember History: Nhớ lịch sử - Privacy Settings: Thiết lập quyền riêng tư - Automatically Remove Video Meta Files: Tự động xúa các tệp meta video - The app needs to restart for changes to take effect. Restart and apply change?: App - cần khởi động lại để chỉnh sửa có hiệu nghiệm. Khởi động lại và áp đặt? + Privacy Settings: Cài đặt quyền riêng tư + Automatically Remove Video Meta Files: Tự động xóa các tệp meta video + Remove All Playlists: Xóa tất cả danh sách phát + Are you sure you want to remove all your playlists?: Bạn có chắc muốn xóa tất + cả các danh sách phát không? + All playlists have been removed: Đã xóa tất cả các danh sách phát + Save Watched Videos With Last Viewed Playlist: Lưu video đã xem với danh sách + phát được xem lần cuối + The app needs to restart for changes to take effect. Restart and apply change?: Ứng + dụng cần được khởi động lại để chỉnh sửa có hiệu nghiệm. Khởi động lại và áp dụng + cài đặt? Proxy Settings: - Proxy Host: Máy chủ Proxy + Proxy Host: Máy chủ proxy Region: Vùng Country: Quốc gia Proxy Settings: Cài đặt proxy Enable Tor / Proxy: Bật Tor / Proxy Proxy Protocol: Giao thức proxy - Proxy Port Number: Số Cổng Proxy + Proxy Port Number: Số cổng proxy City: Thành phố - Ip: Ip + Ip: IP Your Info: Thông tin của bạn Error getting network information. Is your proxy configured properly?: Lỗi nhận thông tin mạng. Proxy của bạn đã được cài đặc đúng cách chưa? - Clicking on Test Proxy will send a request to: Nhấn vào Proxy thử nghiệm sẽ gửi - yêu cầu đến - Test Proxy: Proxy thử nghiệm + Clicking on Test Proxy will send a request to: Nhấn vào Thử proxy sẽ gửi yêu cầu + đến + Test Proxy: Thử proxy SponsorBlock Settings: Enable SponsorBlock: Bật SponsorBlock - 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': SponsorBlock API - Url (Mặc định là https://sponsor.ajay.app) + 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': URL API SponsorBlock + (Mặc định là https://sponsor.ajay.app) Skip Options: - Skip Option: Tuỳ chọn lượt bỏ - Show In Seek Bar: Hiển thị trong thanh tìm kiếm - Auto Skip: Tự động lượt bỏ - Prompt To Skip: Nhắc nhở lượt bỏ - Do Nothing: Không làm gì hết + Skip Option: Tuỳ chọn bỏ qua + Show In Seek Bar: Hiển thị trong thanh tiến trình + Auto Skip: Tự động bỏ qua + Prompt To Skip: Nhắc nhở bỏ qua + Do Nothing: Không làm gì Notify when sponsor segment is skipped: Thông báo khi đoạn quảng cáo bị bỏ qua Category Color: Bản màu SponsorBlock Settings: Cài đặt SponsorBlock + 'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': URL + API ảnh xem trước DeArrow (Mặc định là https://dearrow-thumb.ajay.app) + UseDeArrowTitles: Dùng tiêu đề video từ DeArrow + UseDeArrowThumbnails: Dùng ảnh xem trước từ DeArrow External Player Settings: External Player Settings: Cài đặt trình phát video bên ngoài External Player: Trình phát video bên ngoài - Custom External Player Arguments: Chứng minh trình phát bên ngoài tùy chỉnh + Custom External Player Arguments: Tham số trình phát bên ngoài tùy chỉnh Ignore Unsupported Action Warnings: Bỏ qua các cảnh bảo tác vụ không được hổ trợ Custom External Player Executable: Chạy trình phát bên ngoài tuỳ chỉnh Players: None: Name: Trống + Ignore Default Arguments: Bỏ qua tham số mặc định Parental Control Settings: - Parental Control Settings: Cài đặt trình kiểm soát của phụ huynh - Hide Unsubscribe Button: Ẩn Nút Huỷ Đăng Ký - Show Family Friendly Only: Chỉ hiển thị những nội dung gia đình và thân thiện + Parental Control Settings: Cài đặt kiểm soát của phụ huynh + Hide Unsubscribe Button: Ẩn nút huỷ đăng ký + Show Family Friendly Only: Chỉ hiển thị nội dung thân thiện với gia đình Hide Search Bar: Ẩn thanh tìm kiếm Download Settings: - Download Behavior: Thói quen tải xuống + Download Behavior: Hành vi tải xuống Download in app: Tải xuống trong ứng dụng Open in web browser: Mở trên trình duyệt Ask Download Path: Yêu cầu đường dẫn tải xuống @@ -451,11 +610,11 @@ Settings: Password Dialog: Password: Mật khẩu Password Incorrect: Mật khẩu sai - Enter Password To Unlock: Nhập mật khẩu để mở Cài đặt + Enter Password To Unlock: Nhập mật khẩu để mở cài đặt Unlock: Mở khoá Password Settings: Set Password To Prevent Access: Đặt mặt khẩu để ngăn truy cập cài đặt - Password Settings: Cài đặt Mật khẩu + Password Settings: Cài đặt mật khẩu Remove Password: Xoá mật khẩu Set Password: Đặt mật khẩu Experimental Settings: @@ -463,6 +622,8 @@ Settings: cài đặt này có thể gây ra hoạt động bất ổn định. Hãy tạo phương án dự phòng trước khi bật! Experimental Settings: Cài đặt thử nghiệm + Replace HTTP Cache: Thay thế bộ đệm HTTP + Expand All Settings Sections: Mở rộng tất cả các mục tùy chọn About: #On About page About: 'Giới thiệu' @@ -496,29 +657,29 @@ About: #On Channel Page Mastodon: Mastodon - Email: Thư điện tử + Email: Email Source code: Mã nguồn FAQ: Câu hỏi thường gặp Report a problem: Báo cáo sự cố Licensed under the AGPLv3: Được cấp phép theo AGPLv3 - View License: Xem Giấy phép + View License: Xem giấy phép Help: Trợ giúp Translate: Phiên dịch Website: Trang web Blog: Blog - Credits: Tín dụng + Credits: Ghi công Donate: Quyên tặng GitHub issues: Sự cố GitHub FreeTube Wiki: FreeTube Wiki Beta: Thử nghiệm - Downloads / Changelog: Tải xuống / bản ghi changelog - GitHub releases: Phiên bản GitHub - Please check for duplicates before posting: Vui lòng kiểm tra các bản sao trước - khi đăng - Chat on Matrix: Trò chuyện trên Ma trận + Downloads / Changelog: Tải xuống / nhật ký thay đổi + GitHub releases: Tải xuống trên GitHub + Please check for duplicates before posting: Vui lòng kiểm tra trùng lặp trước khi + đăng + Chat on Matrix: Trò chuyện trên Matrix room rules: quy định phòng chat FreeTube is made possible by: FreeTube được tạo ra bởi - these people and projects: những người và dự án + these people and projects: những người và dự án này Please read the: Hãy đọc Discussions: Thảo luận Channel: @@ -551,6 +712,7 @@ Channel: Featured Channels: 'Kênh đặc sắc' Tags: Search for: Tìm kiếm cho "{tag}" + Tags: Thẻ Joined: Đã tham gia Location: Vị trí Details: Chi tiết @@ -572,10 +734,21 @@ Channel: votes: '{votes} bình chọn' Reveal Answers: Hiện Câu trả lời Hide Answers: Ẩn Câu trả lời + Video hidden by FreeTube: FreeTube đã ẩn video này Releases: Releases: Xuất bản + This channel does not currently have any releases: Kênh này hiện không có bất + kỳ bản phát hành nào This channel is age-restricted and currently cannot be viewed in FreeTube.: Kênh này là kênh giới hạn độ tuổi và hiện tại không thể xem được trên FreeTube. + Channel Tabs: Trang kênh + Shorts: + This channel does not currently have any shorts: Kênh này hiện không có video + shorts + Podcasts: + Podcasts: Podcast + This channel does not currently have any podcasts: Kênh này hiện không có podcast + nào Video: Open in YouTube: 'Mở trong Youtube' Copy YouTube Link: 'Sao chép liên kết Youtube' @@ -706,6 +879,13 @@ Video: 'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Trò chuyện trực tiếp hiện không khả dụng trên luồng phát này. Chủ sở hữu có thể đã tắt chức năng này. + Hide Channel: Ẩn kênh này + More Options: Tùy chọn khác + Pause on Current Video: Tạm dừng trên video hiện tại + Show Super Chat Comment: Hiển thị bình luận Super Chat + Upcoming: Sắp ra mắt + Premieres: Công chiếu + Unhide Channel: Hiển thị kênh này Videos: #& Sort By Sort By: @@ -750,6 +930,7 @@ Share: Include Timestamp: Có kèm dấu thời gian YouTube Channel URL copied to clipboard: Đã sao chép liên kết kênh Youtube Invidious Channel URL copied to clipboard: URL của kênh ưu tiên đã được sao chép + Share Channel: Chia sẻ kênh Mini Player: 'Trình phát Mini' Comments: Comments: 'Bình luận' @@ -776,13 +957,15 @@ Comments: Pinned by: Được ghim bởi Show More Replies: Hiện thêm câu trả lời View {replyCount} replies: Hiển thị {replyCount} câu trả lời + Hearted: Thả Tim + Subscribed: Đã đăng ký Up Next: 'Tiếp theo' # Toast Messages Local API Error (Click to copy): 'Local API lỗi (Nhấn để copy)' Invidious API Error (Click to copy): 'Invidious API lỗi (Nhấn để copy)' Falling back to Invidious API: 'Quay trở về Invidious API' -Falling back to the local API: 'Quay trở về local API' +Falling back to Local API: 'Quay trở về local API' Subscriptions have not yet been implemented: 'Danh sách đăng kí hiện chưa được áp đặt' Loop is now disabled: 'Lặp lại hiện đã tắt' @@ -824,24 +1007,30 @@ Profile: chỉnh về {profile}' Profile has been updated: Profile đã được cập nhật Profile has been created: Profile đã được tạo - Your profile name cannot be empty: Tên Profile của bạn không được để trống - Profile could not be found: Probile không thể tìm thấy được + Your profile name cannot be empty: Tên hồ sơ của bạn không được để trống + Profile could not be found: Hồ sơ không thể tìm thấy được All subscriptions will also be deleted.: Tất cả đăng ký đều sẽ bị xóa. - Are you sure you want to delete this profile?: Bạn có chắc là muốn xóa Profile này? - Delete Profile: Xóa Profile - Make Default Profile: Chọn làm Profile mặc định - Update Profile: Cập nhật Profile - Create Profile: Tạo Profile - Profile Preview: Xem trước Profile - Custom Color: Màu custom + Are you sure you want to delete this profile?: Bạn có chắc muốn xóa hồ sơ này? + Delete Profile: Xóa hồ sơ + Make Default Profile: Chọn làm hồ sơ mặc định + Update Profile: Cập nhật hồ sơ + Create Profile: Tạo hồ sơ + Profile Preview: Xem trước hồ sơ + Custom Color: Màu tùy chỉnh Color Picker: Chọn màu - Edit Profile: Chỉnh sửa Profile - Create New Profile: Tạo Profile mới - Profile Manager: Quản lý Profile + Edit Profile: Chỉnh sửa hồ sơ + Create New Profile: Tạo hồ sơ mới + Profile Manager: Quản lý hồ sơ All Channels: Tất cả kênh - Profile Select: Chọn Profile + Profile Select: Chọn hồ sơ Profile Filter: Bộ lọc hồ sơ - Profile Settings: Cài đặt hồ sơ cá nhân + Profile Settings: Cài đặt hồ sơ + Toggle Profile List: Mở/đóng danh sách hồ sơ + Edit Profile Name: Chỉnh sửa tên hồ sơ + Profile Name: Tên hồ sơ + Open Profile Dropdown: Mở danh sách hồ sơ + Create Profile Name: Tạo tên hồ sơ + Close Profile Dropdown: Đóng danh sách hồ sơ A new blog is now available, {blogTitle}. Click to view more: Một blog mới đã có, {blogTitle}. Nhấn để xem chi tiết Download From Site: Tải từ website @@ -853,15 +1042,15 @@ Search Bar: More: Thêm Are you sure you want to open this link?: Bạn có chắc là bạn muốn mở liên kết này không? -New Window: Cửa Sổ Mới +New Window: Cửa sổ mới Channels: Channels: Kênh Title: Danh sách kênh - Search bar placeholder: Tìm Kênh + Search bar placeholder: Tìm kênh Empty: Danh sách kênh của bạn hiện đang trống. Unsubscribed: '{channelName} đã bị xoá khỏi danh sách kênh đã đăng ký của bạn' Unsubscribe Prompt: Bạn có chắc răng bạn muốn huỷ đăng ký kênh "{channelName}"? - Unsubscribe: Huỷ đăng ký kênh + Unsubscribe: Huỷ đăng ký Count: '{number} kênh đã tìm được.' Tooltips: General Settings: @@ -896,6 +1085,12 @@ Tooltips: lui để kiểm soát tốc độ phát. Nhấn và giữ phím Control (Phím Command trên Mac) và nhấp chuột trái để lập tức trở về tốc độ phát mặc định (1x trừ khi nó đã được thay đổi trong cài đặt). + Skip by Scrolling Over Video Player: Sử dụng con lăn chuột để bỏ qua video, kiểu + MPV. + Allow DASH AV1 formats: Định dạng DASH AV1 có thể trông đẹp hơn định dạng DASH + H.264. Định dạng DASH AV1 yêu cầu nhiều năng lượng hơn để phát lại! Chúng không + có sẵn trên tất cả các video, trong những trường hợp đó trình phát sẽ sử dụng + định dạng DASH H.264 thay thế. External Player Settings: Custom External Player Arguments: Bất kỳ tham số dòng lệnh tùy chỉnh nào, được phân tách bằng dấu chấm phẩy (';'), bạn muốn được chuyển đến trình phát bên @@ -915,16 +1110,23 @@ Tooltips: thức mặc định để lấy nguồn cấp dữ liệu đăng ký của bạn. RSS nhanh hơn và tránh việc bị chặn IP, nhưng không cung cấp thông tin nhất định như thời lượng video hoặc trạng thái phát trực tiếp + Fetch Automatically: Khi được bật, FreeTube sẽ tự động tìm nạp nguồn cấp dữ liệu + đăng ký của bạn khi cửa sổ mới được mở và khi chuyển đổi hồ sơ. Privacy Settings: Remove Video Meta Files: Khi được bật lên, FreeTube sẽ tự động xóa các tệp meta được tạo trong quá trình phát lại video, khi trang xem bị đóng. -Age Restricted: - The currently set default instance is {instance}: '{instance} này bị giới hạn độ - tuổi' - Type: - Channel: Kênh - Video: Video - This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} bị giới hạn độ tuổi' + Distraction Free Settings: + Hide Channels: Nhập tên kênh hoặc ID kênh để ẩn tất cả video, danh sách phát và + chính kênh đó khỏi xuất hiện trong tìm kiếm, xu hướng, phổ biến nhất và được + đề xuất. Tên kênh đã nhập phải khớp hoàn toàn và có phân biệt chữ hoa chữ thường. + Hide Subscriptions Live: Cài đặt này bị ghi đè bởi cài đặt "{appWideSetting}" + trên toàn ứng dụng, trong phần "{subsection}" của "{settingsSection}" + SponsorBlock Settings: + UseDeArrowThumbnails: Thay thế thumbnail video bằng thumbnail gửi từ DeArrow. + UseDeArrowTitles: Thay thế tiêu đề video bằng tiêu đề do người dùng gửi từ DeArrow. + Experimental Settings: + Replace HTTP Cache: Tắt bộ nhớ đệm HTTP dựa trên đĩa của Electron và bật bộ nhớ + đệm hình ảnh trong bộ nhớ tùy chỉnh. Sẽ dẫn đến việc sử dụng RAM tăng lên. Hashtags have not yet been implemented, try again later: Thẻ hashtag chưa thể dùng được, hãy thử lại sau Playing Next Video Interval: Phát video tiếp theo ngay lập tức. Nhấn vào để hủy. | @@ -945,3 +1147,30 @@ Starting download: Bắt đầu tải xuống "{videoTitle}" Ok: Ok Clipboard: Copy failed: Sao chép vào bộ nhớ tạm thất bại + Cannot access clipboard without a secure connection: Không thể truy cập clipboard + nếu không có kết nối an toàn +Go to page: Đi đến {page} +Close Banner: Đóng thanh trên +Chapters: + 'Chapters list visible, current chapter: {chapterName}': 'Danh sách các chương hiển + thị, chương hiện tại: {chapterName}' + Chapters: Chương + 'Chapters list hidden, current chapter: {chapterName}': 'Danh sách các chương bị + ẩn, chương hiện tại: {chapterName}' +Channel Unhidden: '{channel} đã bị xóa khỏi bộ lọc kênh' +Tag already exists: Thẻ "{tagName}" đã tồn tại +Hashtag: + This hashtag does not currently have any videos: Hashtag này hiện không có bất kỳ + video nào + Hashtag: Hashtag +Age Restricted: + This channel is age restricted: Kênh này bị giới hạn độ tuổi + This video is age restricted: Video này bị giới hạn độ tuổi +Preferences: Tuỳ chỉnh +Playlist will not pause when current video is finished: Danh sách phát sẽ không tạm + dừng khi video hiện tại kết thúc +Channel Hidden: '{channel} đã thêm vào bộ lọc kênh' +Playlist will pause when current video is finished: Danh sách phát sẽ tạm dừng khi + video hiện tại kết thúc +Trimmed input must be at least N characters long: Dữ liệu nhập bị cắt bớt phải dài + ít nhất 1 ký tự | Dữ liệu nhập bị cắt bớt phải dài ít nhất {length} ký tự diff --git a/static/locales/zh-CN.yaml b/static/locales/zh-CN.yaml index 9d0a0632c375d..1ca6bdbc544b1 100644 --- a/static/locales/zh-CN.yaml +++ b/static/locales/zh-CN.yaml @@ -128,6 +128,7 @@ User Playlists: Select a playlist to add your N videos to: 选择一个播放列表来添加你的视频 | 选择一个播放列表来添加你的 {videoCount} 个视频 N playlists selected: 选中了 {playlistCount} 个播放列表 + Added {count} Times: 添加了 {count} 次 SinglePlaylistView: Toast: There were no videos to remove.: 没有可删除的视频。 @@ -249,6 +250,7 @@ Settings: Catppuccin Mocha: Catppuccin Mocha Pastel Pink: Pastel Pink Hot Pink: Hot Pink + Nordic: Nordic Main Color Theme: Main Color Theme: '主题色' Red: '红' @@ -468,7 +470,7 @@ Settings: Hide Upcoming Premieres: 隐藏即将到来的首映 Hide Channels: 隐藏频道中的视频 Hide Channels Placeholder: 频道ID - Display Titles Without Excessive Capitalisation: 不用过度大写字母的方式显示标题名称 + Display Titles Without Excessive Capitalisation: 去除标题中对字母大写和标点符号的过度使用 Hide Featured Channels: 隐藏精选频道 Hide Channel Playlists: 隐藏频道播放列表 Hide Channel Community: 隐藏频道社区 @@ -805,6 +807,7 @@ Video: Pause on Current Video: 当前视频播完后不自动播放列表中下一视频 Unhide Channel: 显示频道 Hide Channel: 隐藏频道 + More Options: 更多选项 Videos: #& Sort By Sort By: @@ -881,7 +884,7 @@ Up Next: 'Up Next' Local API Error (Click to copy): '本地API错误(点击复制)' Invidious API Error (Click to copy): 'Invidious API错误(点击复制)' Falling back to Invidious API: '回退到Invidious API' -Falling back to the local API: '回退到本地API' +Falling back to Local API: '回退到本地API' Subscriptions have not yet been implemented: '订阅功能尚未被推行' Loop is now disabled: '循环播放现在被禁用' Loop is now enabled: '循环播放现在被允许' @@ -1006,12 +1009,6 @@ Download folder does not exist: 下载目录“$”不存在,退回到 “询 Screenshot Error: 截屏失败。{error} Screenshot Success: 另存截屏为 “{filePath}” New Window: 新窗口 -Age Restricted: - Type: - Channel: 频道 - Video: 视频 - The currently set default instance is {instance}: 此 {instance} 有年龄限制 - This {videoOrPlaylist} is age restricted: 此 {videoOrPlaylist} 有年龄限制 Channels: Search bar placeholder: 搜索频道 Count: 找到了 {number} 个频道。 @@ -1041,3 +1038,7 @@ Channel Unhidden: 从频道过滤器删除了{channel} 频道 Tag already exists: '"{tagName}" 标签已存在' Trimmed input must be at least N characters long: 缩减输入的长度需至少为 1 个字符 | 缩减输入的长度需至少为 {length} 个字符 +Close Banner: 关闭横幅 +Age Restricted: + This video is age restricted: 此视频有年龄限制 + This channel is age restricted: 此频道有年龄限制 diff --git a/static/locales/zh-TW.yaml b/static/locales/zh-TW.yaml index 30b4ae5642182..a180c2a09e95b 100644 --- a/static/locales/zh-TW.yaml +++ b/static/locales/zh-TW.yaml @@ -170,6 +170,7 @@ User Playlists: 部影片新增至 1 個播放清單 "{videoCount} video(s) added to {playlistCount} playlists": 1 部影片新增至 {playlistCount} 個播放清單 | {videoCount} 部影片新增至 {playlistCount} 個播放清單 + Added {count} Times: 新增了 {count} 次 | 新增了 {count} 次 CreatePlaylistPrompt: New Playlist Name: 新播放清單名稱 Toast: @@ -245,11 +246,12 @@ Settings: Black: '黑色' Dark: '深色' Light: '淺色' - Dracula: '德古拉' + Dracula: 'Dracula' System Default: 系統預設值 Catppuccin Mocha: 卡布奇諾摩卡 Pastel Pink: 淡粉紅色 Hot Pink: 亮粉紅色 + Nordic: 北歐 Main Color Theme: Main Color Theme: '主題色' Red: '紅' @@ -469,7 +471,7 @@ Settings: Hide Upcoming Premieres: 隱藏即將到來的首映 Hide Channels Placeholder: 頻道 ID Hide Channels: 隱藏頻道中的影片 - Display Titles Without Excessive Capitalisation: 顯示沒有過多大寫的標題 + Display Titles Without Excessive Capitalisation: 顯示沒有過多大寫與標點符號的標題 Hide Featured Channels: 隱藏精選頻道 Hide Channel Playlists: 隱藏頻道播放清單 Hide Channel Community: 隱藏頻道社群 @@ -814,6 +816,7 @@ Video: Pause on Current Video: 暫停目前影片 Unhide Channel: 顯示頻道 Hide Channel: 隱藏頻道 + More Options: 更多選項 Videos: #& Sort By Sort By: @@ -890,7 +893,7 @@ Up Next: '觀看其他類似影片' Local API Error (Click to copy): '區域API錯誤(點擊複製)' Invidious API Error (Click to copy): 'Invidious API錯誤(點擊複製)' Falling back to Invidious API: '回退到Invidious API' -Falling back to the local API: '回退到區域API' +Falling back to Local API: '回退到區域API' Subscriptions have not yet been implemented: '訂閱功能尚未被推行' Loop is now disabled: '循環播放現在被停用' Loop is now enabled: '循環播放現在被啟用' @@ -1016,12 +1019,6 @@ Starting download: 正在開始下載「{videoTitle}」 Screenshot Success: 已儲存螢幕截圖為 "{filePath}" Screenshot Error: 螢幕截圖失敗。 {error} New Window: 新視窗 -Age Restricted: - The currently set default instance is {instance}: 此 {instance} 有年齡限制 - Type: - Channel: 頻道 - Video: 影片 - This {videoOrPlaylist} is age restricted: 此 {videoOrPlaylist} 有年齡限制 Channels: Channels: 頻道 Title: 頻道清單 @@ -1051,3 +1048,7 @@ Channel Unhidden: '{channel} 已從頻道過濾條件移除' Trimmed input must be at least N characters long: 修剪後的輸入必須至少有 1 個字元長 | 修剪後的輸入必須至少有 {length} 個字元長 Tag already exists: 「{tagName}」標籤已存在 +Close Banner: 關閉橫幅 +Age Restricted: + This channel is age restricted: 此頻道有年齡限制 + This video is age restricted: 此影片有年齡限制 diff --git a/yarn.lock b/yarn.lock index a7b93dd187220..2f58c0d006139 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,36 +28,36 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== +"@babel/core@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz#052c13b39144e21fdd1e03fc9b67e98976a1ebfc" - integrity sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g== +"@babel/eslint-parser@^7.23.10": + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2" + integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -269,10 +269,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" @@ -364,14 +364,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/highlight@^7.23.4": version "7.23.4" @@ -382,10 +382,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.23.5", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.23.5", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" @@ -789,14 +789,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" - integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== +"@babel/plugin-transform-object-rest-spread@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz#7b836ad0088fdded2420ce96d4e1d3ed78b71df1" + integrity sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w== dependencies: - "@babel/compat-data" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.23.3" @@ -939,14 +939,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" - integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== +"@babel/preset-env@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.0.tgz#11536a7f4b977294f0bdfad780f01a8ac8e183fc" + integrity sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" @@ -999,7 +999,7 @@ "@babel/plugin-transform-new-target" "^7.23.3" "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.24.0" "@babel/plugin-transform-object-super" "^7.23.3" "@babel/plugin-transform-optional-catch-binding" "^7.23.4" "@babel/plugin-transform-optional-chaining" "^7.23.4" @@ -1046,19 +1046,19 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.18.6", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.18.6", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1066,15 +1066,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.4.4": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1113,12 +1113,12 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@double-great/stylelint-a11y@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@double-great/stylelint-a11y/-/stylelint-a11y-3.0.0.tgz#da9eb5558f065a6488fe48f054fec64e4aae8aa1" - integrity sha512-MdBk83+r4R7AhycEGi4uueUh6rFJYIZzRrkt4Dtqc0lzNTQ101/1n54qES0SMMty/pqBYykPt/B4xdZO+wibeg== +"@double-great/stylelint-a11y@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@double-great/stylelint-a11y/-/stylelint-a11y-3.0.2.tgz#eddaa2c3ed952f285555eb5d7b00d7a493cac0ba" + integrity sha512-HPYUwHtn03cO7og4/hhBGyAJ8eF45HI20QQkIAWyiMPW68rigzltOiS98iBONznKXNwoSvMjlIX0q7JJeJnkDg== dependencies: - postcss "^8.4.32" + postcss "^8.4.33" "@electron/asar@^3.2.1": version "3.2.4" @@ -1145,10 +1145,10 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" - integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== +"@electron/notarize@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe" + integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== dependencies: debug "^4.1.1" fs-extra "^9.0.1" @@ -1166,10 +1166,10 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" - integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== +"@electron/universal@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== dependencies: "@electron/asar" "^3.2.1" "@malept/cross-spawn-promise" "^1.1.0" @@ -1206,10 +1206,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@fastify/busboy@^2.0.0": version "2.0.0" @@ -1247,13 +1247,13 @@ resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-2.0.10.tgz#b10721425d7efdee6d83fba21c64cad86fa51904" integrity sha512-OTETSXz+3ygD2OK2/vy82cmUBpuJqeOAg4gfnnv+f2Rir1tDIhQg026Q3NQxznq83ZLz8iNqGG9XJm26inpDeg== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1261,10 +1261,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1491,10 +1491,10 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" @@ -1508,10 +1508,10 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -1551,7 +1551,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": +"@types/express-serve-static-core@*": version "4.17.28" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== @@ -1560,13 +1560,23 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== +"@types/express-serve-static-core@^4.17.33": + version "4.17.43" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" @@ -1587,6 +1597,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/http-proxy@^1.17.8": version "1.17.9" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" @@ -1635,15 +1650,29 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/ms@*": version "0.7.31" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^18.11.18": - version "18.17.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.12.tgz#c6bd7413a13e6ad9cfb7e97dd5c4e904c1821e50" - integrity sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ== +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^20.9.0": + version "20.11.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" + integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -1675,30 +1704,39 @@ dependencies: "@types/node" "*" -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== +"@types/serve-static@*", "@types/serve-static@^1.15.5": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: + "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" @@ -1707,10 +1745,10 @@ resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== -"@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" @@ -2079,26 +2117,25 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.9.1: - version "24.9.1" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.9.1.tgz#bf3568529298b4de8595ed1acbb351fe27db5ba4" - integrity sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g== +app-builder-lib@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b" + integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== dependencies: - "7zip-bin" "~5.2.0" "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.1.0" + "@electron/notarize" "2.2.1" "@electron/osx-sign" "1.0.5" - "@electron/universal" "1.4.1" + "@electron/universal" "1.5.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "24.8.1" - builder-util-runtime "9.2.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chromium-pickle-js "^0.2.0" debug "^4.3.4" ejs "^3.1.8" - electron-publish "24.8.1" + electron-publish "24.13.1" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -2138,11 +2175,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" @@ -2366,15 +2398,13 @@ body-parser@1.20.0: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.0.11: - version "1.0.12" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" - integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== +bonjour-service@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" - multicast-dns "^7.2.4" + multicast-dns "^7.2.5" boolbase@^1.0.0: version "1.0.0" @@ -2448,24 +2478,24 @@ buffer@^5.1.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.2.3: - version "9.2.3" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c" - integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== +builder-util-runtime@9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" + integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@24.8.1: - version "24.8.1" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.8.1.tgz#594d45b0c86d1d17f5c7bebbb77405080b2571c2" - integrity sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw== +builder-util@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816" + integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.3" + builder-util-runtime "9.2.4" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" @@ -2497,6 +2527,13 @@ bundle-name@^3.0.0: dependencies: run-applescript "^5.0.0" +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2597,10 +2634,10 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2908,10 +2945,10 @@ css-functions-list@^3.2.1: resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== -css-loader@^6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b" - integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ== +css-loader@^6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" + integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== dependencies: icss-utils "^5.1.0" postcss "^8.4.33" @@ -3090,6 +3127,11 @@ default-browser-id@^3.0.0: bplist-parser "^0.2.0" untildify "^4.0.0" +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + default-browser@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" @@ -3100,6 +3142,14 @@ default-browser@^4.0.0: execa "^7.1.1" titleize "^3.0.0" +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -3121,11 +3171,6 @@ define-data-property@^1.0.1, define-data-property@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" @@ -3192,14 +3237,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.9.1: - version "24.9.1" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.9.1.tgz#04bf6c0dcd235f6214511f2358a78ed2b9379421" - integrity sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ== +dmg-builder@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55" + integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== dependencies: - app-builder-lib "24.9.1" - builder-util "24.8.1" - builder-util-runtime "9.2.3" + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -3220,11 +3265,6 @@ dmg-license@^1.0.11: smart-buffer "^4.0.2" verror "^1.10.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - dns-packet@^5.2.2: version "5.4.0" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" @@ -3356,16 +3396,16 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.9.1: - version "24.9.1" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.9.1.tgz#4aee03947963b829a7f48a850fe02c219311ef63" - integrity sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg== +electron-builder@^24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" + integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== dependencies: - app-builder-lib "24.9.1" - builder-util "24.8.1" - builder-util-runtime "9.2.3" + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chalk "^4.1.2" - dmg-builder "24.9.1" + dmg-builder "24.13.3" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -3396,14 +3436,14 @@ electron-is-dev@^2.0.0: resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz#833487a069b8dad21425c67a19847d9064ab19bd" integrity sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA== -electron-publish@24.8.1: - version "24.8.1" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.8.1.tgz#4216740372bf4297a429543402a1a15ce8c3560b" - integrity sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw== +electron-publish@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c" + integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.8.1" - builder-util-runtime "9.2.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" @@ -3414,13 +3454,13 @@ electron-to-chromium@^1.4.648: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz#c7b46c9010752c37bb4322739d6d2dd82354fbe4" integrity sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg== -electron@^28.2.0: - version "28.2.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-28.2.0.tgz#ecf7097d4a1e47dd08111c0229a9d03c44f485ad" - integrity sha512-22SylXQQ9IHtwLw4D+Z4Si7OUpeDtpHfJVTjy3yv53iLg5zJKKPOCWT4ZwgYGHQZ0eldyBrYBHF/P9FPd2CcVQ== +electron@^29.1.0: + version "29.1.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-29.1.0.tgz#37f0e4915226db3c87bc54b187795272bf61fc39" + integrity sha512-giJVIm0sWVp+8V1GXrKqKTb+h7no0P3ooYqEd34AD9wMJzGnAeL+usj+R0155/0pdvvP1mgydnA7lcaFA2M9lw== dependencies: "@electron/get" "^2.0.0" - "@types/node" "^18.11.18" + "@types/node" "^20.9.0" extract-zip "^2.0.1" emoji-regex@^10.0.0: @@ -3772,10 +3812,10 @@ eslint-plugin-promise@^6.1.1: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== -eslint-plugin-unicorn@^50.0.1: - version "50.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-50.0.1.tgz#e539cdb02dfd893c603536264c4ed9505b70e3bf" - integrity sha512-KxenCZxqSYW0GWHH18okDlOQcpezcitm5aOSz6EnobyJ6BIByiPDviQRjJIUAjG/tMN11958MxaQ+qCoU6lfDA== +eslint-plugin-unicorn@^51.0.1: + version "51.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz#3641c5e110324c3739d6cb98fc1b99ada39f477b" + integrity sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw== dependencies: "@babel/helper-validator-identifier" "^7.22.20" "@eslint-community/eslint-utils" "^4.4.0" @@ -3794,17 +3834,17 @@ eslint-plugin-unicorn@^50.0.1: semver "^7.5.4" strip-indent "^3.0.0" -eslint-plugin-vue@^9.20.1: - version "9.20.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz#7ed78846898574b2cd26939f28b0b87798a7b528" - integrity sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ== +eslint-plugin-vue@^9.22.0: + version "9.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.22.0.tgz#e8a625adb0b6ce3b65635dd74fec8345146f8e26" + integrity sha512-7wCXv5zuVnBtZE/74z4yZ0CM8AjH6bk4MQGm7hZjUC2DBppKU5ioeOk5LGSg/s9a1ZJnIsdPLJpXnu1Rc+cVHg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" nth-check "^2.1.1" - postcss-selector-parser "^6.0.13" - semver "^7.5.4" - vue-eslint-parser "^9.4.0" + postcss-selector-parser "^6.0.15" + semver "^7.6.0" + vue-eslint-parser "^9.4.2" xml-name-validator "^4.0.0" eslint-plugin-vuejs-accessibility@^2.2.1: @@ -3853,16 +3893,16 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4303,11 +4343,6 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4698,10 +4733,10 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== +html-entities@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-minifier-terser@^6.0.2: version "6.1.0" @@ -4971,10 +5006,10 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +ipaddr.js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== is-arguments@^1.0.4: version "1.1.1" @@ -5067,7 +5102,7 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-docker@^2.0.0, is-docker@^2.1.1: +is-docker@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== @@ -5118,6 +5153,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-network-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.0.1.tgz#a68061a20387e9144e145571bea693056a370b92" + integrity sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -5244,6 +5284,13 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -5492,72 +5539,72 @@ known-css-properties@^0.29.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== +launch-editor@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lazy-val@^1.0.4, lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== -lefthook-darwin-arm64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.1.tgz#387d245d39673ceede01da7de2a0d44d2c368e85" - integrity sha512-q6+sYr2Dpt6YnBGXRjMFcXZUnVB97nH+s7EP/tX8m9ewvQxLPqIiUPyAumfyJ2Siomkc5WgAinG+kT63VjUN3A== - -lefthook-darwin-x64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.1.tgz#a677f7262d29317964c96f13509c06d3bf54e93f" - integrity sha512-utm7FwtbW8SxGMALIw5/iG4loYS2FI0crDKp/YIamrZgQr6M4pS2C3rxGj5OwiHFIm3arVU+3VZywdvRLJAw0w== - -lefthook-freebsd-arm64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.1.tgz#3d527cfa40da0b57b2b81e853f7c11bd13fc618c" - integrity sha512-F2BoDnGznkJyn6lyhmXpu62yq7SMCeHAl3Bl8c+P6mXfmatjjxEpVmrzRuzKMPd/MRGpy2B/glkuyO4wZZazow== - -lefthook-freebsd-x64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.1.tgz#fbc9a5a7c2acaacc5494cf0e21083f21bad8057d" - integrity sha512-/NBjMUtnwvdc/p821sfPnZCbWZ6FQkAvnvjoaQu6tkajKZbZYSKsl7UtAicO0nT+79BQFt7TbaZjpua2T9tM5w== - -lefthook-linux-arm64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.1.tgz#5f50008da8fa164ba9d83542361a0c83429da6ae" - integrity sha512-ke+2ni/bmxgYJSRsH+uIYYfTLj2It7WP+mcF4rfJHRbzn5yDYIjFgylUMC2CgW5urS4DSbxcRIbAqLY3OXAHnw== - -lefthook-linux-x64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.6.1.tgz#a1370cbfc2def92ff7dd1f7dcc71bddca97a8286" - integrity sha512-/HLkl9jt3XRjT0RPaLpAgUQmvp4zV/KKZ/8x6xslPl89krv3ZkHKKrqeaHdhiengq3hzx3N+KbOfFcxBRzdT6A== - -lefthook-windows-arm64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.1.tgz#eaffe44e437182e417006ef7b68f49f219fb7e5e" - integrity sha512-RyQ8S4/45BpJpRPy7KsOuJeXQ5FOa7MASoPtOYvrXt4A8kayCv1jlGs7MTv3XJbUosCJhfNpw3ReeHVGfw1KIw== - -lefthook-windows-x64@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.6.1.tgz#c3da7ec991918543be69fe268e91dc5f77ec7548" - integrity sha512-poYLk2tfg1Ncr4aZeFuhHjv1qH6f9hX3tV1FOK2MfWkXkRTYPl6MF5h/ONMIv71BsLjGbAA7LNXM5Mj4/B//lQ== - -lefthook@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.6.1.tgz#56d35b18ba2231b93d669434c1bd52c4532299e9" - integrity sha512-1T+tk0V6ubZgiZJGi39QlLMAcgEw+lhoDeSpT3L8Y/f8nUpJW9ntcMOmt+uvMfQ3TVjNcR1r/Lhtm7gTqgdcPg== +lefthook-darwin-arm64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.4.tgz#3a2bd4ae1d0e44040f16b65ef3339f34cd7afe3d" + integrity sha512-dXIQXr02718sqJu8GwIFewEoFqxMReINy2nzVlx9X9pLEKylgIJ15K/hI3gMziZycAGaecQaWVOUh/yEKXM1zQ== + +lefthook-darwin-x64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.4.tgz#7b7e5d58c7a6a0ae8b144b8186b6b7d24e55d859" + integrity sha512-hPqoOPxpJFEKei7SyCbJUGXcz9u8Ir0GHQYkKKQA/8/dhkMOCQ91YbpeNozMnXcvFYcYaiDr+NB0bOZxn9DzAA== + +lefthook-freebsd-arm64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.4.tgz#91653afbc59971faad9da616d9575804157b64b9" + integrity sha512-9q/NBdZ41UL86AwGomW4AgIXviZZzZ1x8pWaWqwDeMc+l/JKwqEWPTbb2TVHzlk0rabZ2LEOLhx2RwYQXa9wcA== + +lefthook-freebsd-x64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.4.tgz#c625d6911cad392ba448f835d4c9f5957a872774" + integrity sha512-I4pJITBFf83lMxVEBgLkT3DF0uq0yo3I8YuB74dYOYzPhnNDr9IOp7CTT7KU7+hlMRRIWSvuup/ODsHP+J5Tfg== + +lefthook-linux-arm64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.4.tgz#2fa5bcaa953bd688906731fe2d1d2b1a8d437b06" + integrity sha512-Eh1rDmmH7IJbw5Wky+wWd6ZWPkL/mqJqts2BT/3m9/27GADPLaAVV8PMmjPbow8B+4leKdqM9xSr4L9Kte6/mA== + +lefthook-linux-x64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.6.4.tgz#5365dabce36906dcdcdfed7254f905cd810486da" + integrity sha512-prsTjZ2BwX21+Xk0/KVOi2OcZtFRtPqPbQ/nnrQNpFriDkMqp8s1uIywrAGtyG+LJ7YCPYVhgO5pZOQqp4zkEA== + +lefthook-windows-arm64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.4.tgz#a5a91617d74b0b0566029950a55f57954623e787" + integrity sha512-bJ+rkMMjJkKhRaCwSLX+5KaJgPoj5jIVBee8jOAXB1nPTlOCj6QJqeGqTLISr098SDhhEsmTbJoa+HyIBbs/ow== + +lefthook-windows-x64@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.6.4.tgz#1847ed07dbb9fc475921a2632c19bc5e22b81b7c" + integrity sha512-XMA4mN/l5fK0FsTCKX3KywJv2Zcb9ZZ8hDV4dnjI7X1/DkLkByIOZesZN/8p3Oxbzdc9dOFKozo8RiLUsV19Og== + +lefthook@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.6.4.tgz#e12df47dac2e5e08fa54a34f40138cbed1ce3160" + integrity sha512-to9j+24a65g6YR1mmwu+GaCm08oZGalc1rIHp4xJ6kMtYFCQO533UNLQaFcryNkcXeW+ZOc6MNY1eoQtd7/PQQ== optionalDependencies: - lefthook-darwin-arm64 "1.6.1" - lefthook-darwin-x64 "1.6.1" - lefthook-freebsd-arm64 "1.6.1" - lefthook-freebsd-x64 "1.6.1" - lefthook-linux-arm64 "1.6.1" - lefthook-linux-x64 "1.6.1" - lefthook-windows-arm64 "1.6.1" - lefthook-windows-x64 "1.6.1" + lefthook-darwin-arm64 "1.6.4" + lefthook-darwin-x64 "1.6.4" + lefthook-freebsd-arm64 "1.6.4" + lefthook-freebsd-x64 "1.6.4" + lefthook-linux-arm64 "1.6.4" + lefthook-linux-x64 "1.6.4" + lefthook-windows-arm64 "1.6.4" + lefthook-windows-x64 "1.6.4" levn@^0.4.1: version "0.4.1" @@ -5714,10 +5761,10 @@ m3u8-parser@4.8.0: "@videojs/vhs-utils" "^3.0.5" global "^4.4.0" -marked@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-11.2.0.tgz#fc908aeca962b721b0392ee4205e6f90ebffb074" - integrity sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw== +marked@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-12.0.0.tgz#051ea8c8c7f65148a63003df1499515a2c6de716" + integrity sha512-Vkwtq9rLqXryZnWaQc86+FHLC6tr/fycMfYAhiOIXkrNmeGAyhSxjqu0Rs1i0bBqw5u0S7+lV9fdH2ZSVaoa0w== matcher@^3.0.0: version "3.0.0" @@ -5746,12 +5793,12 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memfs@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" - integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== +memfs@^4.6.0: + version "4.7.6" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.7.6.tgz#ebb7c1c30e9ba4779ef452accdf8cec3f8ec04cf" + integrity sha512-PMxcVnZYdSFYZIzsbhd8XLvxrHaIarhyyfDQHThUwhAYAPDfDTvKhEjWbzPyGFr9CPvJJl+VUetfcnVVF9Wckg== dependencies: - fs-monkey "1.0.3" + tslib "^2.0.0" memorystream@^0.3.1: version "0.3.1" @@ -5852,12 +5899,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@^2.7.7: - version "2.7.7" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz#4acf02f362c641c38fb913bfcb7ca2fc4a7cf339" - integrity sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw== +mini-css-extract-plugin@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz#75245f3f30ce3a56dbdd478084df6fe475f02dc7" + integrity sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.0: version "1.0.1" @@ -5950,10 +5998,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19" - integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" @@ -6181,14 +6229,15 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-10.0.3.tgz#f60d8db49fa126c50aec751957fb5d7de3308d4f" + integrity sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A== dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" open@^9.1.0: version "9.1.0" @@ -6259,12 +6308,13 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +p-retry@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd" + integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA== dependencies: - "@types/retry" "0.12.0" + "@types/retry" "0.12.2" + is-network-error "^1.0.0" retry "^0.13.1" p-try@^2.0.0: @@ -6739,10 +6789,10 @@ postcss@^7.0.36: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.14, postcss@^8.4.32, postcss@^8.4.33: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== +postcss@^8.4.14, postcss@^8.4.33, postcss@^8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -7206,6 +7256,11 @@ run-applescript@^5.0.0: dependencies: execa "^5.0.0" +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7268,17 +7323,17 @@ sanitize-filename@^1.6.3: dependencies: truncate-utf8-bytes "^1.0.0" -sass-loader@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-14.0.0.tgz#fc8390f7cc16863622cd16f3ea07b36ba6ea8f91" - integrity sha512-oceP9wWbep/yRJ2+sMbCzk0UsXsDzdNis+N8nu9i5GwPXjy6v3DNB6TqfJLSpPO9k4+B8x8p/CEgjA9ZLkoLug== +sass-loader@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-14.1.1.tgz#2c9d2277c5b1c5fe789cd0570c046d8ad23cb7ca" + integrity sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw== dependencies: neo-async "^2.6.2" -sass@^1.70.0: - version "1.70.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.70.0.tgz#761197419d97b5358cb25f9dd38c176a8a270a75" - integrity sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ== +sass@^1.71.1: + version "1.71.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" + integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -7313,11 +7368,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" semver-compare@^1.0.0: @@ -7335,10 +7391,10 @@ semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.6, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.6, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -7463,10 +7519,10 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: version "1.0.4" @@ -7830,10 +7886,10 @@ stylelint-use-logical-spec@^5.0.1: resolved "https://registry.yarnpkg.com/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz#d5aa254d615d373f18214297c0b49a03a6ca5980" integrity sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA== -stylelint@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.2.0.tgz#60678f64d7660350fdd06415fd449f332b4fcbf6" - integrity sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA== +stylelint@^16.2.1: + version "16.2.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.2.1.tgz#895d6d42523c5126ec0895f0ca2a58febeb77e89" + integrity sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA== dependencies: "@csstools/css-parser-algorithms" "^2.5.0" "@csstools/css-tokenizer" "^2.2.3" @@ -7933,10 +7989,10 @@ svgo@^3.2.0: csso "^5.0.5" picocolors "^1.0.0" -swiper@^11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.0.5.tgz#6ed1ad06e6906ba42fd4b93d4988f0626a49046e" - integrity sha512-rhCwupqSyRnWrtNzWzemnBLMoyYuoDgGgspAm/8iBD3jCvAWycPLH4Z3TB0O5520DHLzMx94yUMH/B9Efpa48w== +swiper@^11.0.7: + version "11.0.7" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.0.7.tgz#fe51bb64546c2c21a1ec6914e7764af953443ded" + integrity sha512-cDfglW1B6uSmB6eB6pNmzDTNLmZtu5bWWa1vak0RU7fOI9qHjMzl7gVBvYSl34b0RU2N11HxxETJqQ5LeqI1cA== synckit@^0.6.0: version "0.6.2" @@ -7964,7 +8020,7 @@ table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -8096,7 +8152,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -8207,10 +8263,15 @@ underscore@1.13.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.19.1: - version "5.26.3" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" - integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== dependencies: "@fastify/busboy" "^2.0.0" @@ -8459,7 +8520,7 @@ vue-devtools@^5.1.4: resolved "https://registry.yarnpkg.com/vue-devtools/-/vue-devtools-5.1.4.tgz#265a7458ade2affb291739176964256b597fa302" integrity sha512-EBAEXvAHUinsPzoSiElps0JgtLXUnJXKIJbP6nfdz/R63VdKBMfJ34/rFip+4iT7iMbVS5lA4W6N1jq4Hj4LCg== -vue-eslint-parser@^9.0.1, vue-eslint-parser@^9.4.0, vue-eslint-parser@^9.4.2: +vue-eslint-parser@^9.0.1, vue-eslint-parser@^9.4.2: version "9.4.2" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d" integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ== @@ -8563,52 +8624,52 @@ webpack-cli@^5.1.4: rechoir "^0.8.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" - integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== +webpack-dev-middleware@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.0.0.tgz#13595dc038a400e3ac9c76f0c9a8c75a59a7d4da" + integrity sha512-tZ5hqsWwww/8DislmrzXE3x+4f+v10H1z57mA2dWFrILb4i3xX+dPhTkcdR0DLyQztrhF2AUmO5nN085UYjd/Q== dependencies: colorette "^2.0.10" - memfs "^3.4.1" + memfs "^4.6.0" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.15.1: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" +webpack-dev-server@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.2.tgz#3035972dae4b768de020f91418de471e4ef12b6c" + integrity sha512-IVj3qsQhiLJR82zVg3QdPtngMD05CYP/Am+9NG5QSl+XwUR/UPtFwllRBKrMwM9ttzFsC6Zj3DMgniPyn/Z0hQ== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" + bonjour-service "^1.2.1" + chokidar "^3.6.0" colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" - html-entities "^2.3.2" + html-entities "^2.4.0" http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + rimraf "^5.0.5" + schema-utils "^4.2.0" + selfsigned "^2.4.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" + webpack-dev-middleware "^7.0.0" + ws "^8.16.0" webpack-merge@^5.7.3: version "5.8.0" @@ -8631,10 +8692,10 @@ webpack-watch-external-files-plugin@^3.0.0: glob "10.3.10" path "0.12.7" -webpack@^5.90.0: - version "5.90.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e" - integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w== +webpack@^5.90.3: + version "5.90.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" + integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -8759,10 +8820,10 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +ws@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== xml-name-validator@^4.0.0: version "4.0.0" @@ -8849,10 +8910,10 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -youtubei.js@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/youtubei.js/-/youtubei.js-8.2.0.tgz#5b173f41fbe6240bb44cb733ce2c1f24e0b072ca" - integrity sha512-i/F4PEURSQmSYCQCo4dWKxOCZXhqkgAuGzNG2RUCtGSmlMX8TvwNewVD/JBjH/czdNmh9SJ00onNZMMxHbt+YA== +youtubei.js@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/youtubei.js/-/youtubei.js-9.1.0.tgz#bcf154c9fa21d3c8c1d00a5e10360d0a065c660e" + integrity sha512-C5GBJ4LgnS6vGAUkdIdQNOFFb5EZ1p3xBvUELNXmIG3Idr6vxWrKNBNy8ClZT3SuDVXaAJqDgF9b5jvY8lNKcg== dependencies: jintr "^1.1.0" tslib "^2.5.0"