diff --git a/src/main/index.js b/src/main/index.js index c2e8d1e9..8125c9a1 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -308,7 +308,7 @@ function runApp() { ipcMain.on('setBounds', (_e, data) => { const value = { - ...mainWindow.getBounds(), + ...mainWindow.getNormalBounds(), maximized: mainWindow.isMaximized() } diff --git a/src/renderer/components/ft-video-player/ft-video-player.js b/src/renderer/components/ft-video-player/ft-video-player.js index 4009c081..cc57f376 100644 --- a/src/renderer/components/ft-video-player/ft-video-player.js +++ b/src/renderer/components/ft-video-player/ft-video-player.js @@ -73,6 +73,7 @@ export default Vue.extend({ useDash: false, useHls: false, selectedDefaultQuality: '', + selectedQuality: '', maxFramerate: 0, activeSourceList: [], mouseTimeout: null, @@ -198,7 +199,8 @@ export default Vue.extend({ vhs: { limitRenditionByPlayerDimensions: false, smoothQualityChange: false, - allowSeeksWithinUnsafeLiveWindow: true + allowSeeksWithinUnsafeLiveWindow: true, + handlePartialData: true } } }) @@ -214,14 +216,12 @@ export default Vue.extend({ } if (this.useDash) { - this.dataSetup.plugins.httpSourceSelector = { - default: 'auto' - } + // this.dataSetup.plugins.httpSourceSelector = { + // default: 'auto' + // } - this.player.httpSourceSelector() - setTimeout(() => { - this.determineDefaultQualityDash() - }, 400) + // this.player.httpSourceSelector() + this.createDashQualitySelector(this.player.qualityLevels()) } if (this.autoplayVideos) { @@ -417,7 +417,7 @@ export default Vue.extend({ determineDefaultQualityDash: function () { if (this.defaultQuality === 'auto') { - return + this.setDashQualityLevel('auto') } this.player.qualityLevels().levels_.sort((a, b) => { @@ -433,27 +433,62 @@ export default Vue.extend({ } if (this.defaultQuality === quality) { - ql.enabled = true + this.setDashQualityLevel(height) } else if (upperLevel !== null) { const upperHeight = upperLevel.height const upperWidth = upperLevel.width const upperQuality = upperWidth < upperHeight ? upperWidth : upperHeight if (this.defaultQuality >= quality && this.defaultQuality < upperQuality) { - ql.enabled = true - } else { - ql.enabled = false + this.setDashQualityLevel(height) } } else if (index === 0 && quality > this.defaultQuality) { - ql.enabled = true + this.setDashQualityLevel(height) } else if (index === (arr.length - 1) && quality < this.defaultQuality) { - ql.enabled = true - } else { - ql.enabled = false + this.setDashQualityLevel(height) } }) }, + setDashQualityLevel: function (qualityLevel) { + if (this.selectedQuality === qualityLevel) { + return + } + this.player.qualityLevels().levels_.sort((a, b) => { + return a.height - b.height + }).forEach((ql, index, arr) => { + if (qualityLevel === 'auto' || ql.height === qualityLevel) { + ql.enabled = true + ql.enabled_(true) + } else { + ql.enabled = false + ql.enabled_(false) + } + }) + + const selectedQuality = qualityLevel === 'auto' ? 'auto' : qualityLevel + 'p' + + const qualityElement = document.getElementById('vjs-current-quality') + qualityElement.innerText = selectedQuality + this.selectedQuality = qualityLevel + + const qualityItems = $('.quality-item').get() + + $('.quality-item').removeClass('quality-selected') + + qualityItems.forEach((item) => { + const qualityText = $(item).find('.vjs-menu-item-text').get(0) + if (qualityText.innerText === selectedQuality) { + $(item).addClass('quality-selected') + } + }) + + // const currentTime = this.player.currentTime() + + // this.player.currentTime(0) + // this.player.currentTime(currentTime) + }, + enableDashFormat: function () { if (this.dashSrc === null) { console.log('No dash format available.') @@ -629,6 +664,58 @@ export default Vue.extend({ videojs.registerComponent('fullWindowButton', fullWindowButton) }, + createDashQualitySelector: function (levels) { + const v = this + if (levels.levels_.length === 0) { + setTimeout(() => { + this.createDashQualitySelector(this.player.qualityLevels()) + }, 200) + return + } + const VjsButton = videojs.getComponent('Button') + const dashQualitySelector = videojs.extend(VjsButton, { + constructor: function(player, options) { + VjsButton.call(this, player, options) + }, + handleClick: function(event) { + const selectedQuality = event.target.innerText + const quality = selectedQuality === 'auto' ? 'auto' : parseInt(selectedQuality.replace('p', '')) + v.setDashQualityLevel(quality) + // console.log(this.player().qualityLevels()) + }, + createControlTextEl: function (button) { + const beginningHtml = `
+ 1080p +
+
+
' + + let qualityHtml = `
  • + Auto + +
  • ` + + levels.levels_.sort((a, b) => { + return b.height - a.height + }).forEach((quality) => { + qualityHtml = qualityHtml + `
  • + ${quality.height}p + +
  • ` + }) + return $(button).html( + $(beginningHtml + qualityHtml + endingHtml).attr( + 'title', + 'Select Quality' + )) + } + }) + videojs.registerComponent('dashQualitySelector', dashQualitySelector) + this.player.controlBar.addChild('dashQualitySelector', {}, this.player.controlBar.children_.length - 1) + this.determineDefaultQualityDash() + }, + toggleFullWindow: function() { if (!this.player.isFullscreen_) { if (this.player.isFullWindow) { diff --git a/src/renderer/main.js b/src/renderer/main.js index 478f3121..9513d603 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -27,7 +27,7 @@ Vue.component('FontAwesomeIcon', FontAwesomeIcon) Vue.use(VueI18n) // List of locales approved for use -const activeLocales = ['en-US', 'en_GB', 'ar', 'bg', 'cs', 'da', 'de-DE', 'el', 'es', 'es-MX', 'fi', 'fr-FR', 'gl', 'he', 'hu', 'hr', 'id', 'it', 'ja', 'nl', 'pl', 'pt', 'pt-BR', 'pt-PT', 'ru', 'sk', 'sl', 'sv', 'tr', 'vi', 'zh-CN', 'zh-TW'] +const activeLocales = ['en-US', 'en_GB', 'ar', 'bg', 'cs', 'da', 'de-DE', 'el', 'es', 'es-MX', 'fi', 'fr-FR', 'gl', 'he', 'hu', 'hr', 'id', 'it', 'ja', 'nb_NO', 'nl', 'pl', 'pt', 'pt-BR', 'pt-PT', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'vi', 'zh-CN', 'zh-TW'] const messages = {} /* eslint-disable-next-line */ const fileLocation = isDev ? 'static/locales/' : `${__dirname}/static/locales/` diff --git a/src/renderer/videoJS.css b/src/renderer/videoJS.css index 767006db..3203ae64 100644 --- a/src/renderer/videoJS.css +++ b/src/renderer/videoJS.css @@ -643,6 +643,46 @@ body.vjs-full-window { display: none; } +.vjs-quality-level-value { + width: 100%; + height: 100%; +} + +.vjs-quality-level-value span { + line-height: 40px; +} + +.vjs-quality-level-value:hover + .vjs-quality-level-menu { + display: block; +} + +.vjs-quality-level-menu { + display: none; + position: absolute; + bottom: 30px; + left: -8px; + z-index: 5; + background-color: #151b17; + width: 50px; +} + +.vjs-quality-level-menu:hover { + display: block; +} + +.vjs-quality-level-menu .vjs-menu-item { + padding: 5px; +} + +.quality-selected { + background-color: var(--primary-color); + color: var(--text-with-main-color); +} + +.quality-selected:hover { + background-color: var(--primary-color-hover) !important; +} + .vjs-menu .vjs-menu-content { display: block; padding: 0; diff --git a/static/locales/bg.yaml b/static/locales/bg.yaml index ddaa2988..24d8ea43 100644 --- a/static/locales/bg.yaml +++ b/static/locales/bg.yaml @@ -30,10 +30,10 @@ Close: 'Затваряне' Back: 'Назад' Forward: 'Напред' -Version $ is now available! Click for more details: 'Версия $ е вече налична! Щракнете +Version $ is now available! Click for more details: 'Версия $ е вече налична! Кликнете за повече детайли' Download From Site: 'Сваляне от сайта' -A new blog is now available, $. Click to view more: 'Нова публикация в блога, $. Щракнете +A new blog is now available, $. Click to view more: 'Нова публикация в блога, $. Кликнете за преглед' # Search Bar @@ -90,7 +90,7 @@ Playlists: 'Плейлисти' User Playlists: Your Playlists: 'Вашите плейлисти' Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: Няма - запазени видеоклипове. За запазване щракнете в ъгъла на видеоклипа + запазени видеоклипове. За запазване кликнете в ъгъла на видеоклипа Playlist Message: Тази страница не отразява напълно работещи плейлисти. В него са изброени само видеоклипове, които сте запазили или избрали за любими. Когато работата приключи, всички видеоклипове, които в момента са тук, ще бъдат мигрирани в плейлист @@ -305,7 +305,7 @@ Settings: Ip: Ip Your Info: Вашата информация Test Proxy: Тестване на прокси - Clicking on Test Proxy will send a request to: Щракването върху "Тестване на прокси" + Clicking on Test Proxy will send a request to: Кликването върху "Тестване на прокси" ще изпрати заявка до Proxy Port Number: Номер на прокси порта Proxy Host: Прокси хост @@ -583,7 +583,7 @@ Share: Mini Player: 'Мини плейър' Comments: Comments: 'Коментари' - Click to View Comments: 'Щракнете, за да видите коментарите' + Click to View Comments: 'Кликнете, за да видите коментарите' Getting comment replies, please wait: 'Получаване на отговори на коментара, моля изчакайте' There are no more comments for this video: 'Към това видео няма повече коментари' @@ -603,8 +603,8 @@ Comments: Up Next: 'Следващ' # Toast Messages -Local API Error (Click to copy): 'Грешка в локалния интерфейс (щракнете за копиране)' -Invidious API Error (Click to copy): 'Грешка в Invidious интерфейса (щракнете за копиране)' +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: 'Връщане към локалния интерфейс' This video is unavailable because of missing formats. This can happen due to country unavailability.: 'Видеото @@ -658,6 +658,6 @@ Tooltips: Локалният интерфейс има вградено извличане. Invidious интерфейсът изисква Invidious сървър, към който да се свърже. More: Още -Playing Next Video Interval: Пускане на следващото видео веднага. Щракнете за отказ. - | Пускане на следващото видео след {nextVideoInterval} секунда. Щракнете за отказl. - | Пускане на следващото видео след {nextVideoInterval} секунди. Щракнете за отказ. +Playing Next Video Interval: Пускане на следващото видео веднага. Кликнете за отказ. + | Пускане на следващото видео след {nextVideoInterval} секунда. Кликнете за отказl. + | Пускане на следващото видео след {nextVideoInterval} секунди. Кликнете за отказ. diff --git a/static/locales/cs.yaml b/static/locales/cs.yaml index c623a18c..59a5ed67 100644 --- a/static/locales/cs.yaml +++ b/static/locales/cs.yaml @@ -192,7 +192,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' - Playlist Next Video Interval: Interval dalšího seznamu videí + Playlist Next Video Interval: Interval pro další video na playlistu Privacy Settings: Privacy Settings: 'Nastavení soukromí' Remember History: 'Zapamatovat historii' @@ -653,7 +653,7 @@ Canceled next video autoplay: 'Automatické přehrávání dalšího videa bylo Yes: 'Ano' No: 'Ne' -Playing Next Video Interval: Přehrávání dalšího videa v žádném čase. Kliknutím zrušíte. +Playing Next Video Interval: Přehrávání dalšího videa bez prodlevy Kliknutím zrušíte. | Přehrávání dalšího videa za {nextVideoInterval} s. Kliknutím zrušíte. | Přehrávání dalšího videa za {nextVideoInterval} s. Kliknutím zrušíte. More: Více diff --git a/static/locales/el.yaml b/static/locales/el.yaml index 5c767141..005ff3c8 100644 --- a/static/locales/el.yaml +++ b/static/locales/el.yaml @@ -190,6 +190,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Playlist Next Video Interval: Παύση μεταξύ Βίντεο στη λίστα αναπαραγωγής Privacy Settings: Privacy Settings: 'Ρυθμίσεις απορρήτου' Remember History: 'Διατήρηση ιστορικού' @@ -290,6 +291,7 @@ Settings: Hide Channel Subscribers: Απόκρυψη συνδρομών καναλιού Hide Video Views: Απόκρυψη προβολών βίντεο Hide Active Subscriptions: Απόκρυψη ενεργών συνδρομών + Hide Playlists: Απόκρυψη λιστών αναπαραγωγής The app needs to restart for changes to take effect. Restart and apply change?: Η εφαρμογή πρέπει να κάνει επανεκκίνηση για να εφαρμοστούν οι αλλαγές. Επανεκκίνηση και εφαρμογή αλλαγών; @@ -411,6 +413,7 @@ Profile: βέβαιοι ότι θέλετε να διαγράψετε τα επιλεγμένα κανάλια; Αυτό δε θα διαγράψει το κανάλι από οποιοδήποτε άλλο προφίλ.' #On Channel Page + Profile Filter: Φίλτρο προφίλ Channel: Subscriber: 'Συνδρομητής' Subscribers: 'Συνδρομητές' @@ -462,7 +465,7 @@ Video: View: 'Προβολή' Views: 'Προβολές' Loop Playlist: 'Επανάληψη λίστας αναπαραγωγής' - Shuffle Playlist: 'Τυχαία αναπαραγωγή' + Shuffle Playlist: 'Τυχαία σειρά στη λίστα αναπαραγωγής' Reverse Playlist: 'Αντιστροφή της λίστας αναπαραγωγής' Play Next Video: 'Αναπαραγωγή επόμενου βίντεο' Play Previous Video: 'Αναπαραγωγή προηγούμενου βίντεο' @@ -677,3 +680,8 @@ Tooltips: Invidious Instance: Το στιγμιότυπο Invidious στο οποίο το FreeTube θα συνδεθεί για κλήσεις διεπαφής. Καθαρίστε το παρόν στιγμιότυπο για να δείτε μια λίστα δημόσιων στιγμιότυπων προς επιλογή +Playing Next Video Interval: Αναπαραγωγή επόμενου βίντεο άμεσα. Κάντε κλικ για ακύρωση. + | Αναπαραγωγή επόμενου βίντεο σε {nextVideoInterval} δευτερόλεπτο. Κάντε κλικ για + ακύρωση. | Αναπαραγωγή επόμενου βίντεο σε {nextVideoInterval} δευτερόλεπτα. Κάντε + κλικ για ακύρωση. +More: Περισσότερα diff --git a/static/locales/hi.yaml b/static/locales/hi.yaml index f35c82f1..510154ca 100644 --- a/static/locales/hi.yaml +++ b/static/locales/hi.yaml @@ -90,15 +90,24 @@ Most Popular: 'सबसे ज़्यादा देखा हुआ' Playlists: 'प्लेलिस्टे (playlists)' User Playlists: Your Playlists: 'आपके प्लेलिस्टे' + Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: आपके + पास बचाए गए वीडियोए नहीं हैं। एक वीडियो के कोने पर सेव बटन पर क्लिक (click) करें, + यहां लिस्ट पर वही आएगा + Playlist Message: यह पृष्ठ पूरी तरह से काम करने वाली प्लेलिस्ट को प्रतिबिंबित नहीं + करता है। यह केवल उन वीडियो को सूचीबद्ध करता है जिन्हें आपने सहेजा है या पसंदीदा + है। जब काम समाप्त हो जाता है, तो वर्तमान में यहां सभी वीडियो 'पसंदीदा' प्लेलिस्ट + में स्थानांतरित हो जाएंगे। History: # On History Page - History: '' + History: 'इतिहास' Watch History: '' Your history list is currently empty.: '' Settings: # On Settings Page - Settings: '' - The app needs to restart for changes to take effect. Restart and apply change?: '' + Settings: 'स्थापना' + The app needs to restart for changes to take effect. Restart and apply change?: 'ऐप + को प्रभावी होने वाले परिवर्तनों के लिए पुनः आरंभ करने की आवश्यकता है। Restart + और परिवर्तन लागू करें?' General Settings: General Settings: '' Check for Updates: '' @@ -531,3 +540,4 @@ Canceled next video autoplay: '' Yes: '' No: '' +More: ज़्यादा diff --git a/static/locales/hr.yaml b/static/locales/hr.yaml index 87f49ed3..622710eb 100644 --- a/static/locales/hr.yaml +++ b/static/locales/hr.yaml @@ -185,6 +185,7 @@ Settings: 1440p: '1440 p' 4k: '4 k' 8k: '8 k' + Playlist Next Video Interval: Interval sljedećeg videa zbirke Privacy Settings: Privacy Settings: 'Postavke privatnosti' Remember History: 'Zapamti povijest' @@ -287,6 +288,7 @@ Settings: Hide Video Views: Sakrij broj gledanja videa Distraction Free Settings: Postavke za nesmetan rad Hide Active Subscriptions: Sakrij aktivne pretplate + Hide Playlists: Sakrij zbirke The app needs to restart for changes to take effect. Restart and apply change?: Promjene će se primijeniti nakon ponovnog pokeretanja programa. Ponovo pokrenuti program? Proxy Settings: @@ -410,6 +412,7 @@ Profile: $ selected: $ je odabran Other Channels: Ostali kanali Subscription List: Popis pretplata + Profile Filter: Filtar profila Channel: Subscriber: 'Pretplatnik' Subscribers: 'Pretplatnici' @@ -660,3 +663,7 @@ Tooltips: standardne metode za dohvaćanje podataka tvoje pretplate. RSS je brži i sprečava blokiranje IP adresa, ali ne pruža određene podatke kao što su trajanje videa ili stanja „uživo” +Playing Next Video Interval: Trenutna reprodukcija sljedećeg videa. Pritisni za prekid. + | Reprodukcija sljedećeg videa za {nextVideoInterval} sekunde. Pritisni za prekid. + | Reprodukcija sljedećeg videa za {nextVideoInterval} sekundi. Pritisni za prekid. +More: Još diff --git a/static/locales/ko.yaml b/static/locales/ko.yaml index 7b7ead49..c0b01508 100644 --- a/static/locales/ko.yaml +++ b/static/locales/ko.yaml @@ -126,6 +126,7 @@ Settings: (기본설정은 https://invidious.snopyta.org)' Region for Trending: '트렌드 국가' #! List countries + View all Invidious instance information: Indivious 서버의 전체 목록 보기 Theme Settings: Theme Settings: '테마 설정' Match Top Bar with Main Color: '상단바를 메인컬러와 동기화' @@ -185,6 +186,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Playlist Next Video Interval: 재생 목록 다음 비디오 간격 Privacy Settings: Privacy Settings: '개인정보 설정' Remember History: '기록 저장하기' @@ -213,36 +215,40 @@ Settings: Hide Trending Videos: '현재 트렌딩 영상 숨기기' Hide Popular Videos: '인기 영상 숨기기' Hide Live Chat: '실시간 댓글 숨기기' + Hide Playlists: 재생 목록 숨기기 + Hide Active Subscriptions: 활성 구독 숨기기 Data Settings: Data Settings: '데이터 설정' - Select Import Type: '구독 및 재생 목록 가져오기 형식 고르기' - Select Export Type: '구독 및 재생 목록 내보내기 형식 고르기' + Select Import Type: '가져오기 유형 선택' + Select Export Type: '내보내기 유형 선택' Import Subscriptions: '구독 목록 가져오기' - Import FreeTube: '구독 목록 가져오기: 형식 Freetube' - Import YouTube: '구독 목록 가져오기 형식: 유투브' - Import NewPipe: '구독 목록 가져오기 형식: NewPipe' - Check for Legacy Subscriptions: '' + Import FreeTube: 'FreeTube 가져오기' + Import YouTube: 'YouTube 가져오기' + Import NewPipe: 'NewPipe 가져오기' + Check for Legacy Subscriptions: '레거시 구독 확인' Export Subscriptions: '구독 목록 내보내기' - Export FreeTube: '구독 목록 내보내기 형식: FreeTube' - Export YouTube: '구독 목록 내보내기 형식: 유투브' - Export NewPipe: '구독 목록 내보내기 형식: NewPipe' + Export FreeTube: 'FreeTube 내보내기' + Export YouTube: 'YouTube 내보내기' + Export NewPipe: 'NewPipe 내보내기' Import History: '재생 기록 가져오기' Export History: '재생 기록 내보내기' - Profile object has insufficient data, skipping item: '' - All subscriptions and profiles have been successfully imported: '' - All subscriptions have been successfully imported: '' - One or more subscriptions were unable to be imported: '' - Invalid subscriptions file: '' - This might take a while, please wait: '' - Invalid history file: '' - Subscriptions have been successfully exported: '' - History object has insufficient data, skipping item: '' - All watched history has been successfully imported: '' - All watched history has been successfully exported: '' - Unable to read file: '' - Unable to write file: '' - Unknown data key: '' - How do I import my subscriptions?: '' + Profile object has insufficient data, skipping item: '프로필 개체에 데이터가 부족하여 항목을 건너뜁니다' + All subscriptions and profiles have been successfully imported: '모든 구독 및 프로필을 + 성공적으로 가져왔습니다' + All subscriptions have been successfully imported: '모든 구독을 성공적으로 가져왔습니다' + One or more subscriptions were unable to be imported: '하나 이상의 구독을 가져올 수 없습니다' + Invalid subscriptions file: '잘못된 구독 파일입니다' + This might take a while, please wait: '시간이 좀 걸릴 수 있습니다. 잠시 기다려 주십시오' + Invalid history file: '잘못된 기록 파일입니다' + Subscriptions have been successfully exported: '구독을 성공적으로 내보냈습니다' + History object has insufficient data, skipping item: '기록 개체에 데이터가 부족하여 항목을 건너뜁니다' + All watched history has been successfully imported: '시청한 모든 기록을 성공적으로 가져왔습니다' + All watched history has been successfully exported: '시청한 모든 기록이 성공적으로 내보내졌습니다' + Unable to read file: '파일을 읽을 수 없습니다' + Unable to write file: '파일을 쓸 수 없습니다' + Unknown data key: '알 수 없는 데이터 키입니다' + How do I import my subscriptions?: '구독을 가져오려면 어떻게 해야 합니까?' + Manage Subscriptions: 구독 관리 Advanced Settings: Advanced Settings: '' Enable Debug Mode (Prints data to the console): '' @@ -265,9 +271,24 @@ Settings: #& Yes #& No + Proxy Settings: + Error getting network information. Is your proxy configured properly?: 네트워크 정보를 + 가져오는 중 오류가 발생했습니다. 프록시가 올바르게 구성되어 있습니까? + City: 도시 + Region: 지역 + Country: 국가 + Ip: Ip + Your Info: 사용자 정보 + Test Proxy: 프록시 테스트 + Clicking on Test Proxy will send a request to: 프록시 테스트를 클릭하면 다음 주소로 요청이 전송됩니다 + Proxy Port Number: 프록시 포트 번호 + Proxy Host: 프록시 호스트 + Proxy Protocol: 프록시 프로토콜 + Enable Tor / Proxy: Tor / Proxy 사용 + Proxy Settings: 프록시 설정 About: #On About page - About: '' + About: '정보' #& About 'This software is FOSS and released under the GNU Affero General Public License v3.0.': '' @@ -287,51 +308,78 @@ About: Latest FreeTube News: '' + Donate: 기부 + these people and projects: 이 사람들과 프로젝트 + FreeTube is made possible by: FreeTube는 가능합니다 + Credits: 제작 + Translate: 번역 + room rules: 방 규정 + Please read the: 읽어주세요 + Chat on Matrix: 매트릭스 채팅 + Mastodon: Mastodon + Email: 이메일 + Blog: 블로그 + Website: 웹사이트 + Please check for duplicates before posting: 게시하기 전에 중복 항목을 확인하십시오 + GitHub issues: GitHub 이슈 + Report a problem: 문제 보고 + FAQ: FAQ + FreeTube Wiki: FreeTube Wiki + Help: 도움말 + GitHub releases: GitHub 릴리스 + Downloads / Changelog: 다운로드 / 변경 로그 + View License: 라이센스 보기 + Licensed under the AGPLv3: AGPLv3에 따라 라이센스가 부여됨 + Source code: 소스 코드 + Beta: 베타 Profile: - Profile Select: '' - All Channels: '' - Profile Manager: '' - Create New Profile: '' - Edit Profile: '' - Color Picker: '' - Custom Color: '' - Profile Preview: '' - Create Profile: '' - Update Profile: '' - Make Default Profile: '' - Delete Profile: '' - Are you sure you want to delete this profile?: '' - All subscriptions will also be deleted.: '' - Profile could not be found: '' - Your profile name cannot be empty: '' - Profile has been created: '' - Profile has been updated: '' - Your default profile has been set to $: '' - Removed $ from your profiles: '' - Your default profile has been changed to your primary profile: '' - $ is now the active profile: '' - Subscription List: '' - Other Channels: '' - $ selected: '' - Select All: '' - Select None: '' - Delete Selected: '' - Add Selected To Profile: '' - No channel(s) have been selected: '' + Profile Select: '프로필 선택' + All Channels: '모든 채널' + Profile Manager: '프로필 관리자' + Create New Profile: '새 프로파일 작성' + Edit Profile: '프로필 편집' + Color Picker: '색상 선택기' + Custom Color: '사용자 지정 색' + Profile Preview: '프로필 미리보기' + Create Profile: '프로필 작성' + Update Profile: '프로필 업데이트' + Make Default Profile: '기본 프로파일 만들기' + Delete Profile: '프로필 삭제' + Are you sure you want to delete this profile?: '이 프로필을 삭제하시겠습니까?' + All subscriptions will also be deleted.: '모든 구독도 삭제됩니다.' + Profile could not be found: '프로필을 찾을 수 없습니다' + Your profile name cannot be empty: '프로필 이름은 비워 둘 수 없습니다' + Profile has been created: '프로필이 생성되었습니다' + Profile has been updated: '프로필이 업데이트되었습니다' + Your default profile has been set to $: '기본 프로필이 $로 설정되었습니다' + Removed $ from your profiles: '프로필에서 $가 제거되었습니다' + Your default profile has been changed to your primary profile: '기본값 프로필이 기본 프로필로 + 변경되었습니다' + $ is now the active profile: '$가 현재 활성 프로필입니다' + Subscription List: '구독 목록' + Other Channels: '기타 채널' + $ selected: '$선택되었습니다' + Select All: '모두 선택' + Select None: '선택 안 함' + Delete Selected: '선택한 항목 삭제' + Add Selected To Profile: '프로필에 선택한 항목 추가' + No channel(s) have been selected: '선택된 채널이 없습니다' ? 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. - : '' - Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: '' + : '이것은 귀하의 기본 프로필입니다. 선택한 채널을 삭제하시겠습니까? 동일한 채널이 발견되는 모든 프로필에서 삭제됩니다.' + Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: '선택한 + 채널을 삭제하시겠습니까? 다른 프로파일에서는 채널이 삭제되지 않습니다.' #On Channel Page + Profile Filter: 프로필 필터 Channel: - Subscriber: '' - Subscribers: '' - Subscribe: '' - Unsubscribe: '' - Channel has been removed from your subscriptions: '' - Removed subscription from $ other channel(s): '' - Added channel to your subscriptions: '' - Search Channel: '' + Subscriber: '구독자' + Subscribers: '구독자' + Subscribe: '구독' + Unsubscribe: '구독 취소' + Channel has been removed from your subscriptions: '채널이 구독에서 제거되었습니다' + Removed subscription from $ other channel(s): '$ 다른 채널에서 구독을 제거했습니다' + Added channel to your subscriptions: '구독에 채널을 추가했습니다' + Search Channel: '채널 검색' Your search results have returned 0 results: '' Sort By: '' Videos: @@ -534,3 +582,4 @@ Canceled next video autoplay: '' Yes: '' No: '' +More: 더 보기 diff --git a/static/locales/nb_NO.yaml b/static/locales/nb_NO.yaml index 37c9c699..17b01624 100644 --- a/static/locales/nb_NO.yaml +++ b/static/locales/nb_NO.yaml @@ -184,6 +184,7 @@ Settings: 1440p: '1440p' 4k: 'UHD' 8k: '8k UHD' + Playlist Next Video Interval: Intervall for avspilling av neste i spilleliste Privacy Settings: Privacy Settings: 'Personvernsinnstillinger' Remember History: 'Husk historikk' @@ -300,6 +301,7 @@ Settings: Hide Popular Videos: Skjul populære videoer Hide Video Views: Skjul videovisninger Hide Live Chat: Gjem direktechat + Hide Playlists: Skjul spillelister The app needs to restart for changes to take effect. Restart and apply change?: Start programmet på ny for å bruke de nye endringene? About: @@ -607,6 +609,7 @@ Profile: Subscription List: Abonnementsliste Profile Preview: Profilforhåndsvisning Custom Color: Egendefinert farge + Profile Filter: Profilfilter This video is unavailable because of missing formats. This can happen due to country unavailability.: Denne videoen er utilgjengelig grunnet manglende formater. Dette kan skyldes tilgangbegrensninger i ditt land. @@ -645,3 +648,7 @@ The playlist has been reversed: Spillelisten har blitt snudd Download From Site: Last ned fra nettsiden Version $ is now available! Click for more details: Versjon $ er nå tilgjengelig. Klikk for flere detaljer. +Playing Next Video Interval: Spiller neste video nå. Klikk for å avbryte. | Spiller + neste video om {nextVideoInterval} sekund. Klikk for å avbryte. | Spiller neste + video om {nextVideoInterval} sekunder. Klikk for å avbryte. +More: Mer diff --git a/static/locales/ru.yaml b/static/locales/ru.yaml index b7770c24..19739547 100644 --- a/static/locales/ru.yaml +++ b/static/locales/ru.yaml @@ -186,6 +186,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Playlist Next Video Interval: Задержка перед автовоспроизведением Subscription Settings: Subscription Settings: 'Настройки подписки' Hide Videos on Watch: 'Скрыть видео после просмотра' @@ -290,6 +291,7 @@ Settings: Hide Video Likes And Dislikes: Скрыть лайки и дизлайки к видео Hide Video Views: Скрыть просмотры видео Hide Active Subscriptions: Скрыть активные подписки + Hide Playlists: Скрыть плейлисты The app needs to restart for changes to take effect. Restart and apply change?: Чтобы изменения вступили в силу, необходимо перезапустить приложение. Перезапустить и применить изменения? @@ -297,7 +299,7 @@ Settings: Error getting network information. Is your proxy configured properly?: Ошибка при получении информации о сети. Вы уверены, что прокси настроен правильно? Your Info: Ваша информация - Clicking on Test Proxy will send a request to: Нажмите на rкнопку "Протестировать + Clicking on Test Proxy will send a request to: Нажмите на кнопку "Протестировать соединение", чтобы отправить запрос на Test Proxy: Протестировать соединение Proxy Port Number: Порт прокси-сервера @@ -570,8 +572,8 @@ Loop is now disabled: 'Цикл теперь отключён' Loop is now enabled: 'Цикл теперь включён' Shuffle is now disabled: 'Перемешивание теперь отключено' Shuffle is now enabled: 'Перемешивание теперь включено' -Playing Next Video: 'Воспроизвести следующее видео' -Playing Previous Video: 'Воспроизвести предыдущее видео' +Playing Next Video: 'Воспроизведение следующего видео' +Playing Previous Video: 'Воспроизведение предыдущего видео' Playing next video in 5 seconds. Click to cancel: 'Воспроизведение следующего видео через 5 секунд. Нажмите, чтобы отменить.' Canceled next video autoplay: 'Отменено автовоспроизведение следующего видео' @@ -622,6 +624,7 @@ Profile: $ selected: $ выбрано Other Channels: Другие каналы Subscription List: Список подписок + Profile Filter: Фильтры профилей The playlist has been reversed: Плейлист был перевёрнут A new blog is now available, $. Click to view more: Теперь доступен новый блог $. Нажмите, чтобы увидеть больше @@ -648,10 +651,10 @@ Tooltips: из страны, которые вы хотите отображать. Не все отображаемые страны на самом деле поддерживаются YouTube Subscription Settings: - Fetch Feeds from RSS: Если этот параметр включен, FreeTube будет использовать - RSS вместо метода по умолчанию для получения вашего канала подписки. RSS работает - быстрее и предотвращает блокировку IP, но не предоставляет определенную информацию, - такую как продолжительность видео или статус в реальном времени + Fetch Feeds from RSS: Если этот параметр включен, FreeTube будет получать вашу + ленту подписок с помощью RSS, а не как обычно. RSS работает быстрее и предотвращает + блокировку IP, но не предоставляет определенную информацию, такую как продолжительность + видео или сведения о том, транслируется ли видео в реальном времени Player Settings: Default Video Format: Установите форматы, используемые при воспроизведении видео. Формат dash может воспроизводить более высокое качество. Устаревшие форматы @@ -664,3 +667,8 @@ Tooltips: устаревшие форматы, возвращаемые им, вместо форматов, возвращаемых Invidious. Помогает, когда видео, возвращенные Invidious, не воспроизводятся из-за ограничений страны +More: Больше +Playing Next Video Interval: Воспроизведение следующего видео без задержки. Нажмите + для отмены. | Воспроизведение следующего видео через {nextVideoInterval} сек. Нажмите + для отмены. | Воспроизведение следующего видео через {nextVideoInterval} сек. Нажмите + для отмены. diff --git a/static/locales/sk.yaml b/static/locales/sk.yaml index 6617565e..1a41eb01 100644 --- a/static/locales/sk.yaml +++ b/static/locales/sk.yaml @@ -105,7 +105,7 @@ Settings: Preferred API Backend: Preferred API Backend: 'Preferované API Backend' Local API: 'Lokálne API' - Invidious API: 'Invidious API' + Invidious API: 'API služby Invidious' Video View Type: Video View Type: 'Typ zobrazenia videa' Grid: 'Mriežka' @@ -184,6 +184,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Playlist Next Video Interval: Čas spustenia nasledujúceho videa v zozname videí Subscription Settings: Subscription Settings: 'Nastavenia Odberov' Hide Videos on Watch: 'Skryť videá po zhliadnutí' @@ -272,6 +273,7 @@ Settings: Hide Video Views: Skryť počet zhliadnutí Distraction Free Settings: Nastavenia nerušenia Hide Active Subscriptions: Skryť aktívne odbery + Hide Playlists: Skryť zoznamy videí Privacy Settings: Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Naozaj chcete odstrániť všetky odbery a profily? Toto je nenávratná akcia. @@ -356,7 +358,7 @@ About: room rules: pravidlá miestností Please read the: Prečítajte si Chat on Matrix: Napíšte nám na Matrix-e - Mastodon: Mastodon + Mastodon: Komunikačná platforma Mastodon Email: Elektronická pošta Blog: Blog Website: Webstránka @@ -649,9 +651,14 @@ Profile: Profile Manager: Správca profilov All Channels: Všetky kanály Profile Select: Vyberte profil + Profile Filter: Filter Profilov A new blog is now available, $. Click to view more: Nový príspevok na blogu je k dispozícií, $. Klikni pre viac informácií Download From Site: Stiahnuť zo stránky Version $ is now available! Click for more details: Je k dispozícií verzia $ ! Klikni pre viac informácií Locale Name: Slovenčina +Playing Next Video Interval: Prehrávanie ďalšieho videa za chvíľu. Kliknutím zrušíte. + | Prehráva sa ďalšie video o {nextVideoInterval} sekundu. Kliknutím zrušíte. | Prehráva + sa ďalšie video o {nextVideoInterval} sekúnd. Kliknutím zrušíte. +More: Viac diff --git a/static/locales/zh-TW.yaml b/static/locales/zh-TW.yaml index 510213a8..cf43977b 100644 --- a/static/locales/zh-TW.yaml +++ b/static/locales/zh-TW.yaml @@ -176,6 +176,7 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Playlist Next Video Interval: 播放清單 下一個影片間隔時間 Subscription Settings: Subscription Settings: '訂閱設定' Hide Videos on Watch: '觀看時隱藏影片' @@ -265,6 +266,7 @@ Settings: Hide Recommended Videos: 隱藏推薦影片 Hide Channel Subscribers: 隱藏頻道訂閱者 Hide Active Subscriptions: 隱藏作用中的訂閱 + Hide Playlists: 隱藏播放清單 The app needs to restart for changes to take effect. Restart and apply change?: 此變更需要重啟讓修改生效。重啟並且套用變更? Proxy Settings: Error getting network information. Is your proxy configured properly?: 取得網路資訊時發生錯誤。您的代理伺服器設定正確嗎? @@ -328,7 +330,7 @@ About: room rules: 聊天室規則 Please read the: 請閱讀 Chat on Matrix: 在 Matrix 上聊天 - Mastodon: Mastodon + Mastodon: Mastodon(長毛象/萬象) Please check for duplicates before posting: 提交前請檢查有無重複的問題 GitHub issues: GitHub 問題追蹤器 Report a problem: 回報問題 @@ -363,7 +365,7 @@ Channel: About: About: '關於' Channel Description: '頻道說明' - Featured Channels: '列出頻道' + Featured Channels: '推薦頻道' Added channel to your subscriptions: 已新增頻道至您的訂閱 Removed subscription from $ other channel(s): 從$個其他頻道移除訂閱 Channel has been removed from your subscriptions: 頻道已從您的訂閱中移除 @@ -420,7 +422,7 @@ Video: Minute: 分鐘 Published on: '發布於' # $ is replaced with the number and % with the unit (days, hours, minutes...) - Publicationtemplate: '$ %前' + Publicationtemplate: '$ % 前' #& Videos Video has been removed from your history: 影片已從您的歷史紀錄中移除 Video has been marked as watched: 影片標記為已觀看 @@ -445,7 +447,7 @@ Video: Open Channel in Invidious: 在Invidious開啟頻道 Copy YouTube Channel Link: 複製YouTube頻道連結 Open Channel in YouTube: 在YouTube開啟頻道 - Started streaming on: '開始直播時間:' + Started streaming on: '開始直播時間' Streamed on: 直播於 Video has been removed from your saved list: 影片已從您的播放清單移除 Video has been saved: 影片已儲存 @@ -500,7 +502,7 @@ Mini Player: '迷你播放器' Comments: Comments: '留言' Click to View Comments: '點擊查看留言' - Getting comment replies, please wait: '獲取留言中,請稍候...' + Getting comment replies, please wait: '擷取留言中,請稍候...' Show Comments: '查看留言' Hide Comments: '隱藏留言' # Context: View 10 Replies, View 1 Reply @@ -572,6 +574,7 @@ Profile: $ selected: $個選取的 Other Channels: 其他頻道 Subscription List: 訂閱清單 + Profile Filter: 設定檔篩選器 The playlist has been reversed: 播放清單已反轉 A new blog is now available, $. Click to view more: 已有新的部落格文章,$。點擊以檢視更多 Download From Site: 從網站下載 @@ -579,7 +582,7 @@ Version $ is now available! Click for more details: 版本更新囉! 最新版 This video is unavailable because of missing formats. This can happen due to country unavailability.: 沒有這個影片因為缺少格式。這個可能發生由於國家不可用。 Tooltips: Subscription Settings: - Fetch Feeds from RSS: 啟用後,FreeTube 將使用 RSS 而非預設方式來取得您的訂閱推送。RSS 更快而且可避免 IP 封鎖,但不提供某些訊息,如影片長度與即時狀態 + Fetch Feeds from RSS: 啟用後,FreeTube將使用RSS代替它的預設方法來抓取您的訂閱來源。RSS的速度較快,而且可以防止IP封鎖,但它可能不會提供某些資訊,例如影片長度或是直播狀態。 Player Settings: Default Video Format: 設定要用於影片播放的格式。Dash格式有更高的品質。傳統格式會限制在 720p但頻寬需求更低。音訊格式為僅有音訊的串流 Proxy Videos Through Invidious: 將連線到 Invidious而非直接連線到 YouTube 來提供影片。覆寫 API 偏好 @@ -593,3 +596,6 @@ Tooltips: Preferred API Backend: 選擇 FreeTube 要用於取得YouTube資料的伺服器。本地 API 是內建擷取器。Invidious API 需要 Invidious 伺服器才能連線。 Region for Trending: 發燒影片區域可以讓您選擇想要顯示哪個國家的發燒影片。 注意:並非所有國家都被YouTube支援 +Playing Next Video Interval: 馬上播放下一個影片。點擊取消。| 播放下一個影片的時間為{nextVideoInterval}秒。點擊取消。| + 播放下一個影片的時間為{nextVideoInterval}秒。點擊取消。 +More: 更多