From 889684d165771462c7d7df16c51c1ef794b0fdc4 Mon Sep 17 00:00:00 2001 From: Florent Date: Wed, 30 Oct 2024 13:07:14 +0000 Subject: [PATCH 01/33] Translated using Weblate (Breton) Currently translated at 73.5% (646 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index d28716423f11d..609f0e46efee6 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -511,7 +511,7 @@ Settings: Watch history has been cleared: 'Dilamet eo bet roll istor ar videoioù lennet' Remove All Subscriptions / Profiles: '' Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: '' - Remove All Playlists: '' + Remove All Playlists: 'Dilemel an holl rolloù-videoioù' All playlists have been removed: 'Lamet eo bet an holl rolloù-videoioù' Are you sure you want to remove all your playlists?: '' Subscription Settings: @@ -587,7 +587,12 @@ Settings: Export Playlists For Older FreeTube Versions: Label: 'Ezporzhiañ rolloù-videoioù evit stummoù kozh FreeTube' # |- = Keep newlines, No newline at end - Tooltip: | + Tooltip: |- + An dibarzh-mañ a ezporzh videoioù an holl rolloù-videoioù e-barzh ur roll-videoioù anvet « Favorites ». + Penaos ezporzhiañ & enporzhiañ videoioù e-barzh rolloù-videoioù gant stummoù kozh FreeTube : + 1. Ezporzhiañ ho rolloù-videoioù gant an dibarzh-mañ gweredekaet. + 2. Dilemel an holl rolloù-videoioù en ur implijout an dibarzh Dilemel an holl rolloù-videoioù dindan Prevezded. + 3. Loc'hañ stumm kozh FreeTube hag enporzhiañ ar rolloù-videoioù ezporzhiet." Profile object has insufficient data, skipping item: '' All subscriptions and profiles have been successfully imported: '' All subscriptions have been successfully imported: '' From ee68ef4669d8c6838c009fbaf99a57fae74bce26 Mon Sep 17 00:00:00 2001 From: Florent Date: Wed, 30 Oct 2024 15:51:04 +0000 Subject: [PATCH 02/33] Translated using Weblate (Breton) Currently translated at 74.3% (653 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 609f0e46efee6..8936f1d24d402 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -500,17 +500,21 @@ Settings: Privacy Settings: Privacy Settings: 'Prevezded' Remember History: 'Derc''hel soñj ar roll istor' - Save Watched Progress: '' - Save Watched Videos With Last Viewed Playlist: '' - Clear Search Cache: '' - Are you sure you want to clear out your search cache?: '' - Search cache has been cleared: '' + Save Watched Progress: 'Mirout araokadur al lenn' + Save Watched Videos With Last Viewed Playlist: 'Enrollañ ar videoioù lennet e-barzh + roll-videoioù diwezhañ sellet' + Clear Search Cache: 'Skarzhañ roll-istor an enklaskoù' + Are you sure you want to clear out your search cache?: 'Ha sur oc''h e faot deoc''h + skarzhañ roll-istor an enklaskoù ?' + Search cache has been cleared: 'Skarzhet eo bet roll-istor an enklaskoù' Remove Watch History: 'Dilemel ar roll istor' Are you sure you want to remove your entire watch history?: 'Ha sur oc''h e faot deoc''h dilemel ho roll istor a-bezh ?' Watch history has been cleared: 'Dilamet eo bet roll istor ar videoioù lennet' - Remove All Subscriptions / Profiles: '' - Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: '' + Remove All Subscriptions / Profiles: 'Dilemel an holl goumanantoù / profiloù' + Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Ha + sur oc''h e faot deoc''h dilemel an holl goumanantoù ha profiloù ? Ne c''hall + ket bezañ nullet.' Remove All Playlists: 'Dilemel an holl rolloù-videoioù' All playlists have been removed: 'Lamet eo bet an holl rolloù-videoioù' Are you sure you want to remove all your playlists?: '' From 52666dbe43aaec882b96d453a700cb0fbbad064b Mon Sep 17 00:00:00 2001 From: Vlad Yatsenko Date: Wed, 30 Oct 2024 21:41:25 +0000 Subject: [PATCH 03/33] Translated using Weblate (Ukrainian) Currently translated at 80.4% (706 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/uk/ --- static/locales/uk.yaml | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/static/locales/uk.yaml b/static/locales/uk.yaml index dd606b42ad325..900e17f4b4665 100644 --- a/static/locales/uk.yaml +++ b/static/locales/uk.yaml @@ -42,6 +42,8 @@ Global: Subscriber Count: 1 підписник | {count} підписників View Count: 1 перегляд | {count} переглядів Watching Count: 1 глядач | {count} глядачів + Like Count: 1 вподобання | {count} вподобань + Comment Count: 1 коментар | {count} коментарів Input Tags: Length Requirement: Тег повинен мати довжину не менше {number} символів Version {versionNumber} is now available! Click for more details: 'Доступна нова @@ -88,6 +90,17 @@ Search Filters: Fetch more results: 'Завантажити більше результатів' # Sidebar There are no more results for this search: Більше результатів для цього пошуку немає + Features: + Features: Функції + HD: HD + Subtitles: Субтитри + Live: Наживо + 4K: 4K + 360 Video: 360 Відео + Location: Розташування + HDR: HDR + VR180: VR180 + 3D: 3D Subscriptions: # On Subscriptions Page Subscriptions: 'Підписки' @@ -96,7 +109,9 @@ Subscriptions: профіль має велику кількість підписок. Використайте RSS щоб уникнути обмеження швидкості' 'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'Ваш - список Підписок на разі пустий. Почніть додавати підписки щоб побачити їх тут.' + список підписок наразі порожній. Якщо ви хочете імпортувати свої підписки, ви + можете перейти до Налаштувань Даних і вибрати Імпортувати Підписки або знайти + канал і підписатися на нього.' 'Getting Subscriptions. Please wait.': 'Отримання Підписок. Будь ласка, зачекайте.' Refresh Subscriptions: 'Оновити Підписки' Load More Videos: 'Завантажити більше відео' @@ -954,3 +969,15 @@ Channel Hidden: '{channel} додано до фільтра каналу' Go to page: Перейти до {page} Channel Unhidden: '{channel} вилучено з фільтра каналу' Close Banner: Закрити банер +Search character limit: Пошуковий запит перевищив ліміт у {searchCharacterLimit} символів +Feed: + Refresh Feed: Оновити {subscriptionName} +Search Listing: + Label: + 4K: 4K + Subtitles: Субтитри + 8K: 8K + VR180: VR180 + 360 Video: 360° + New: New + 3D: 3D From 14c21a2b5e5e0da2bef218797da58b999b3ad01b Mon Sep 17 00:00:00 2001 From: Gideon Wentink Date: Wed, 30 Oct 2024 20:11:29 +0000 Subject: [PATCH 04/33] Translated using Weblate (Afrikaans) Currently translated at 8.8% (78 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/af/ --- static/locales/af.yaml | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/static/locales/af.yaml b/static/locales/af.yaml index 6306fa567841c..b0329d2fa7eb8 100644 --- a/static/locales/af.yaml +++ b/static/locales/af.yaml @@ -936,21 +936,37 @@ Comments: Member: '' Subscribed: '' Hearted: '' -Up Next: '' +Up Next: 'Volgende' #Tooltips Tooltips: General Settings: - Preferred API Backend: '' - Fallback to Non-Preferred Backend on Failure: '' - Thumbnail Preference: '' - Invidious Instance: '' - Region for Trending: '' + Preferred API Backend: 'Kies die agterpunt wat FreeTube gebruik om data te versamel. + Die lokale API is ’n ingeboude uithaler. Die Invidious API moet met ’n Invidious-bediener + gekoppel word.' + Fallback to Non-Preferred Backend on Failure: 'Wanneer u voorkeur-API probleme + gee sal FreeTube outomaties terugval op die alternatiewe nie-voorkeur-API wanneer + hierdie instelling geaktiveer is.' + Thumbnail Preference: 'Alle duimnaels in FreeTube sal vervang word met ’n beeld + uit die video i.p.v. die verstek duimnael.' + Invidious Instance: 'Die Invidious-instansie waarmee FreeTube sal verbind om API-oproepe + te maak.' + Region for Trending: 'Met streek van neigings kan u kies welke land se gewilde + videos aan u vertoon moet word.' External Link Handling: | + Kies die verstek gedrag vir wanneer ’n skakel geklik word wat nie in FreeTube geopen kan word nie. + FreeTube sal die geklikte skakel by verstek in u verstek blaaier open. Player Settings: - Proxy Videos Through Invidious: '' - Default Video Format: '' - Scroll Playback Rate Over Video Player: '' + Proxy Videos Through Invidious: 'FreeTube sal verbind met Invidious en die video’s + van daar aflaai eerder as om ’n direkte verbinding met YouTube te maak.' + Default Video Format: 'Kies die formate wat gebruik word wanneer ’n video afspeel. + DASH-formate kan hoër kwaliteit afspeel. Legaat formate word beperk tot ’n maks + van 720p maar gebruik minder bandwydte. Oudio formate is slegs oudio strome.' + Scroll Playback Rate Over Video Player: 'Terwyl die muis oor die video is, druk + en hou die Control-toets (Command-toets op Mac) en rol met die muis om die afspeelsnelheid + te beheer. Druk en hou die Control-toets (Command-toets op Mac) en klik met + die linker muisknop om vinnig terug te keer na die verstek afspeelsnelheid (1x + tensy aangepas in die instellings).' Skip by Scrolling Over Video Player: 'Gebruik die rolwiel om deur die video te spoel, soos by MPV.' External Player Settings: From b9d6af3b6bd1b6c4ad0f180d89360ee9330324c8 Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 31 Oct 2024 06:50:03 +0000 Subject: [PATCH 05/33] Translated using Weblate (Breton) Currently translated at 74.4% (654 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 8936f1d24d402..071edc45eacc4 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -1051,7 +1051,11 @@ Tooltips: Player Settings: Proxy Videos Through Invidious: '' Default Video Format: '' - Scroll Playback Rate Over Video Player: '' + Scroll Playback Rate Over Video Player: 'Pa vez ar biz-red war ar video, dalc''hit + pouezet war an douchenn Ctrl (Command war Mac) ha dibunit rodellig al logodenn + war-raok pe war-gil evit cheñch ar feur lenn. Dalc''hit pouezet war an douchenn + Ctrl (Command war Mac) ha klikit war bouton kleiz al logodenn a-benn distreiñ + buan d''ar feur lenn dre ziouer (1x, nemet ma ''z eo bet kemmet en arventennoù).' Skip by Scrolling Over Video Player: '' External Player Settings: External Player: '' From 50394f325742e66f63968326feaf6e3a9b69c89b Mon Sep 17 00:00:00 2001 From: Fjuro Date: Thu, 31 Oct 2024 08:09:01 +0000 Subject: [PATCH 06/33] Translated using Weblate (Czech) Currently translated at 100.0% (878 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/cs/ --- static/locales/cs.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/locales/cs.yaml b/static/locales/cs.yaml index a100749bb7ff0..42f669b048eea 100644 --- a/static/locales/cs.yaml +++ b/static/locales/cs.yaml @@ -46,8 +46,8 @@ Global: Comment Count: 1 komentář | {count} komentářů Input Tags: Length Requirement: Štítek musí být dlouhý alespoň {number} znaků -Version {versionNumber} is now available! Click for more details: 'Verze {versionNumber} - je k dispozici! Klikněte pro více informací' +Version {versionNumber} is now available! Click for more details: 'Je k dispozici + verze {versionNumber}! Klikněte pro více informací' Download From Site: 'Stáhnout ze stránky' A new blog is now available, {blogTitle}. Click to view more: 'Je dostupný nový článek na blogu: {blogTitle}. Kliknutím zobrazíte více' From 62317c9ddb33cc59d7739a3d0f38b6c15b8b9f66 Mon Sep 17 00:00:00 2001 From: Gideon Wentink Date: Thu, 31 Oct 2024 08:55:31 +0000 Subject: [PATCH 07/33] Translated using Weblate (Afrikaans) Currently translated at 10.0% (88 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/af/ --- static/locales/af.yaml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/static/locales/af.yaml b/static/locales/af.yaml index b0329d2fa7eb8..bf9909faf6c4f 100644 --- a/static/locales/af.yaml +++ b/static/locales/af.yaml @@ -927,15 +927,18 @@ Comments: Replies: '' Show More Replies: '' Reply: '' - From {channelName}: '' - And others: '' - There are no comments available for this video: '' - Load More Comments: '' - No more comments available: '' - Pinned by: '' - Member: '' - Subscribed: '' - Hearted: '' + From {channelName}: 'van {channelName}' + And others: 'en ander' + There are no comments available for this video: 'Daar is geen reaksies beskikbaar + vir hierdie video nie' + Load More Comments: 'Laai nog kommentare' + No more comments available: 'Geen kommentare meer beskikbaar' + Pinned by: 'Vasgemaak deur' + Member: 'Lid' + Subscribed: 'Ingeteken' + Hearted: 'Met hart' + There are no comments available for this post: Daar is geen kommentare beskikbaar + vir hierdie plasing nie Up Next: 'Volgende' #Tooltips From 3e3e381eaa2afb2ddc66680fce92e471135009bb Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 31 Oct 2024 08:55:39 +0000 Subject: [PATCH 08/33] Translated using Weblate (Breton) Currently translated at 74.6% (655 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 071edc45eacc4..69c357c8a81aa 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -483,7 +483,11 @@ Settings: Folder Label: 'Teuliad an tapadennoù-skramm' Folder Button: 'Diuzañ un teuliad' File Name Label: 'Patrom anv restr' - File Name Tooltip: '' + File Name Tooltip: 'Gallout a rit implijout an argemmennoù da-heul. %Y Bloavezh + 4 sifr. %M Miz 2 sifr. %D Devezh 2 sifr. %H Eur 2 sifr. %N Munutennoù 2 sifr. + %S Eilennoù 2 sifr. %T Mili-eilennoù 3 sifr. %s Eilennoù ar video. %t Mili-eilennoù + ar video 3 sifr. %i ID ar video. Gallout a rit implijout ivez \ pe / evit + krouiñ teuliadoù.' Error: Forbidden Characters: 'Arouezennoù difennet' Empty File Name: '' From d5145d6996bc757d0d2ad5c143ff985f86846c6a Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 31 Oct 2024 10:27:38 +0000 Subject: [PATCH 09/33] Translated using Weblate (Breton) Currently translated at 74.9% (658 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 69c357c8a81aa..1c57debbbb988 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -1069,11 +1069,20 @@ Tooltips: Custom External Player Arguments: '' DefaultCustomArgumentsTemplate: "(Dre ziouer : '{defaultCustomArguments}')" Distraction Free Settings: - Hide Channels: '' + Hide Channels: 'Lakait ID ur chadenn evit mirout ouzh an holl videoioù, rolloù-videoioù + hag ar chadenn hec''h-unan da vezañ gwelet en enklaskoù, e roll ar videoioù + brudetañ, ar re vuiañ karet, hag ar re aliet. Ret eo d''an ID bezañ klot ha + ret eo doujañ d''ar pennlizherennoù.' Hide Subscriptions Live: '' - Hide Videos and Playlists Containing Text: '' + Hide Videos and Playlists Containing Text: 'Ebarzhit ur ger, lodenn ur ger pe + ur frazenn (o toujañ d''ar pennlizherennoù) evit kuzhat an holl videoioù & rolloù-videoioù + gant ar ger pe ar frazenn-mañ en titl orin war FreeTube, nemet er roll-istor, + e-barzh ho rolloù-videoioù hag ar videoioù e-barzh ar rolloù-videoioù.' Subscription Settings: - Fetch Feeds from RSS: '' + Fetch Feeds from RSS: 'Pa vez gweredekaet e vez implijet RSS gant FreeTube e-lec''h + e zoare dre ziouer evit adtapout ho kwazh koumanantiñ. Buanoc''h ez an traoù + gant an RSS ha ne vo ket stanket ar chomlec''h IP, met ne ginnig ket titouroù + ''zo evel padelezh ar video, statud ar video war-eeun, pe c''hoazh an evezhiadennoù' Fetch Automatically: '' Experimental Settings: Replace HTTP Cache: '' From cd618430cf3ea2ac0378d6126c9c2cc6ec617679 Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 31 Oct 2024 12:59:03 +0000 Subject: [PATCH 10/33] Translated using Weblate (Breton) Currently translated at 77.3% (679 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 56 +++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 1c57debbbb988..cc4872391c24b 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -139,7 +139,8 @@ Subscriptions: eo ho roll koumanantoù. Ma faot deoc''h enporzhiañ ho koumanantoù, e c''hellit mont da Arventennoù ar Roadennoù ha choaz Enporzhiañ ho koumanantoù, mod all e c''hellit klask chadennoù da goumanantiñ dezho.' - Disabled Automatic Fetching: '' + Disabled Automatic Fetching: 'Diweredekaet ho peus an adtapout koumanantoù ent emgefreek. + Hizivaat ar c''houmanantoù evit gwelet anezho.' Empty Channels: 'N''eus video ebet gant ar chadennoù heuliet ganeoc''h evit poent.' 'Getting Subscriptions. Please wait.': 'O kerc''hat ar c''houmanantoù. Gortozit mar plij.' @@ -355,14 +356,16 @@ Settings: End: 'Fin' Hidden: 'Kuzhet' Blur: 'Ruzed' - Current Invidious Instance: '' - The currently set default instance is {instance}: '' - No default instance has been set: '' - Current instance will be randomized on startup: '' - Set Current Instance as Default: '' - Clear Default Instance: '' - View all Invidious instance information: '' - Region for Trending: '' + Current Invidious Instance: 'Istañs Invidious bremanel' + The currently set default instance is {instance}: 'An istañs dre ziouer a zo {instance}' + No default instance has been set: 'N''eus istañs dre ziouer ebet choazet' + Current instance will be randomized on startup: 'Dargouezheket e vo un istañs + dre ziouer pa vo adloc''het' + Set Current Instance as Default: 'Lakaat an istañs implijet bremañ evel an hini + dre ziouer' + Clear Default Instance: 'Diverkañ an istañs dre ziouer' + View all Invidious instance information: 'Gwelet titouroù an holl istañsoù Invidious' + Region for Trending: 'Bro evit ar videoioù diouzh ar c''hiz' #! List countries External Link Handling: External Link Handling: '' @@ -544,7 +547,7 @@ Settings: Hide Channel Subscribers: '' Hide Comment Likes: '' Hide Recommended Videos: '' - Hide Trending Videos: '' + Hide Trending Videos: 'Kuzhat ar videoioù diouzh ar c''hiz' Hide Popular Videos: '' Hide Playlists: 'Kuzhat ar rolloù-videoioù' Hide Live Chat: '' @@ -928,7 +931,7 @@ Video: Stats: Stats: 'Stadegoù' Video ID: 'ID ar Video : {videoId}' - Media Formats: '' + Media Formats: 'Furmadoù ar media : {formats}' Resolution: 'Spisder : {width}x{height}@{frameRate}' Player Dimensions: 'Ment al lenner : {width}x{height}' Bitrate: 'Fonnder bit : {bitrate} kbps' @@ -976,13 +979,16 @@ Playlist: #& Views Toggle Theatre Mode: '' Change Format: - Change Media Formats: '' - Use Dash Formats: '' - Use Legacy Formats: '' - Use Audio Formats: '' - Dash formats are not available for this video: '' - Audio formats are not available for this video: '' - Legacy formats are not available for this video: '' + Change Media Formats: 'Cheñch furmad ar video' + Use Dash Formats: 'Implijout ar furmad DASH' + Use Legacy Formats: 'Implijout ar furmad Legacy' + Use Audio Formats: 'Implijout ar furmad aodio' + Dash formats are not available for this video: 'N''haller ket implijout ar furmad + DASH evit ar video-mañ' + Audio formats are not available for this video: 'N''haller ket implijout ar furmad + aodio evit ar video-mañ' + Legacy formats are not available for this video: 'N''haller ket implijout ar furmad + Legacy evit ar video-mañ' Share: Share Video: 'Rannañ ar video' Share Channel: 'Rannañ ar chadenn' @@ -1049,12 +1055,16 @@ Tooltips: Preferred API Backend: '' Fallback to Non-Preferred Backend on Failure: '' Thumbnail Preference: '' - Invidious Instance: '' - Region for Trending: '' + Invidious Instance: 'Istañs Invidious implijet gant FreeTube evit galvoù API.' + Region for Trending: 'Gant an dra-se e c''hallit dibab ar vro evit ar videoioù + diouzh ar c''hiz a faot deoc''h gwelet.' External Link Handling: | Player Settings: Proxy Videos Through Invidious: '' - Default Video Format: '' + Default Video Format: 'Arventennañ ar furmadoù implijet pa vez lennet ur video. + Ar furmadoù DASH a c''hell bezañ lennet gant ur c''halite uheloc''h. Bevennet + eo ar furmadoù Legacy da 720p d''ar muiañ met nebeutoc''h a vann- drafet a vez + implijet. Ar furmadoù aodio zo lanvioù aodio hepken.' Scroll Playback Rate Over Video Player: 'Pa vez ar biz-red war ar video, dalc''hit pouezet war an douchenn Ctrl (Command war Mac) ha dibunit rodellig al logodenn war-raok pe war-gil evit cheñch ar feur lenn. Dalc''hit pouezet war an douchenn @@ -1115,9 +1125,9 @@ Playing Next Video Interval: 'Lenn ar video da-heul a-benn nebeud-tre. Klikit ev | Lenn ar video da-heul a-benn {nextVideoInterval} eilenn. Klikit evit nullañ.' Canceled next video autoplay: 'Nullañ al lenn emgefreek da-heul' -Default Invidious instance has been set to {instance}: 'Eriol Invidious dre ziouer +Default Invidious instance has been set to {instance}: 'Istañs Invidious dre ziouer a zo bet lakaet da {instance}' -Default Invidious instance has been cleared: 'Diverket eo bet eriol Invidious dre +Default Invidious instance has been cleared: 'Diverket eo bet Istañs Invidious dre ziouer' 'The playlist has ended. Enable loop to continue playing': 'Echu eo ar roll-videoioù. Gweredekaat ar rodell evit kenderc''hel da lenn' From d84fda82471dc0acb1ec3835db7a6544beb03dde Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:27:28 -0400 Subject: [PATCH 11/33] change default locale to system (#6031) --- src/renderer/store/modules/settings.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/store/modules/settings.js b/src/renderer/store/modules/settings.js index 0e51cd7a9d148..b790b4da2abd4 100644 --- a/src/renderer/store/modules/settings.js +++ b/src/renderer/store/modules/settings.js @@ -309,9 +309,9 @@ const state = { const stateWithSideEffects = { currentLocale: { - defaultValue: 'en-US', + defaultValue: 'system', sideEffectsHandler: async function ({ dispatch }, value) { - const defaultLocale = 'en-US' + const fallbackLocale = 'en-US' let targetLocale = value if (value === 'system') { @@ -342,20 +342,20 @@ const stateWithSideEffects = { targetLocale = targetLocaleOptions[0] } else { // Go back to default value if locale is unavailable - targetLocale = defaultLocale + targetLocale = fallbackLocale // Translating this string isn't necessary // because the user will always see it in the default locale // (in this case, English (US)) - showToast(`Locale not found, defaulting to ${defaultLocale}`) + showToast(`Locale not found, defaulting to ${fallbackLocale}`) } } const loadPromises = [] - if (targetLocale !== defaultLocale) { + if (targetLocale !== fallbackLocale) { // "en-US" is used as a fallback for missing strings in other locales loadPromises.push( - loadLocale(defaultLocale) + loadLocale(fallbackLocale) ) } From dcb166ec2d7879a96e40579a38e124f9035b204f Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Thu, 31 Oct 2024 15:16:55 +0000 Subject: [PATCH 12/33] Translated using Weblate (Croatian) Currently translated at 99.2% (871 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/hr/ --- static/locales/hr.yaml | 68 ++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/static/locales/hr.yaml b/static/locales/hr.yaml index a183d3418e5b7..651f09ab7723f 100644 --- a/static/locales/hr.yaml +++ b/static/locales/hr.yaml @@ -41,8 +41,10 @@ Global: Video Count: 1 video | {count} videa Subscriber Count: 1 pretplatnik | {count} pretplatnika View Count: 1 prikaz | {count} prikaza - Watching Count: 1 praćenje | {count} praćenja + Watching Count: 1 gledatelj | {count} gledatelja Channel Count: 1 kanal | {count} kanala + Comment Count: 1 komentar | {count} komentara + Like Count: 1 lajk | {count} lajkova Input Tags: Length Requirement: Oznaka mora imati barem {number} znakova Search / Go to URL: 'Pretraži / Idi na URL' @@ -247,7 +249,7 @@ Settings: # On Settings Page Settings: 'Postavke' General Settings: - General Settings: 'Opće postavke' + General Settings: 'Opće' Fallback to Non-Preferred Backend on Failure: 'U slučaju problema koristi sekundarni pozadinski sustav' Enable Search Suggestions: 'Aktiviraj prijedloge pretrage' @@ -292,7 +294,7 @@ Settings: Label: Automatski učitaj sljedeću stranicu Tooltip: Automatski učitaj dodatne stranice i komentare. Theme Settings: - Theme Settings: 'Postavke teme' + Theme Settings: 'Tema' Match Top Bar with Main Color: 'Koristi glavnu boju u gornjoj traci' Base Theme: Base Theme: 'Osnova teme' @@ -362,7 +364,7 @@ Settings: Hide Side Bar Labels: Sakrij oznake bočnih traka Hide FreeTube Header Logo: Sakrij FreeTube logotip u zaglavlju Player Settings: - Player Settings: 'Postavke playera' + Player Settings: 'Player' Play Next Video: 'Reproduciraj sljedeći video' Turn on Subtitles by Default: 'Standardno uključi titlove' Autoplay Videos: 'Automatski reproduciraj videa' @@ -379,15 +381,15 @@ Settings: Default Quality: Default Quality: 'Standardna kvaliteta' Auto: 'Automatski' - 144p: '144 p' - 240p: '240 p' - 360p: '360 p' - 480p: '480 p' - 720p: '720 p' - 1080p: '1080 p' - 1440p: '1440 p' + 144p: '144p' + 240p: '240p' + 360p: '360p' + 480p: '480p' + 720p: '720p' + 1080p: '1080p' + 1440p: '1440p' 4k: '4k' - 8k: '8 k' + 8k: '8k' Playlist Next Video Interval: Interval sljedećeg videa zbirke Next Video Interval: Interval za sljedeći video Scroll Volume Over Video Player: Mijenjaj glasnoću u video playeru @@ -416,7 +418,7 @@ Settings: ekrana Skip by Scrolling Over Video Player: Preskoči pomicanjem preko video playera Privacy Settings: - Privacy Settings: 'Postavke privatnosti' + Privacy Settings: 'Privatnost' Remember History: 'Zapamti povijest' Save Watched Progress: 'Spremi napredak gledanja' Clear Search Cache: 'Isprazni predmemoriju pretrage' @@ -437,7 +439,7 @@ Settings: Are you sure you want to remove all your playlists?: Stvarno želiš ukloniti sve tvoje zbirke? Subscription Settings: - Subscription Settings: 'Postavke pretplata' + Subscription Settings: 'Pretplata' Hide Videos on Watch: 'Sakrij video nakon gledanja' Fetch Feeds from RSS: 'Dohvati feedove s RSS-a' Fetch Automatically: Automatski dohvati feed @@ -473,7 +475,7 @@ Settings: Import Subscriptions: Uvezi pretplate Select Export Type: Odaberi vrstu izvoza Select Import Type: Odaberi vrstu uvoza - Data Settings: Postavke podataka + Data Settings: Podaci How do I import my subscriptions?: Kako uvesti pretplate? Manage Subscriptions: Upravljaj pretplatama Import Playlists: Uvezi zbirke @@ -499,9 +501,9 @@ Settings: Hide Live Chat: Sakrij razgovor uživo Hide Popular Videos: Sakrij popularna videa Hide Comment Likes: Sakrij ocjene komentara - Hide Video Likes And Dislikes: Sakrij ocjenjivanje videa + Hide Video Likes And Dislikes: Sakrij broj sviđanja videa Hide Video Views: Sakrij broj gledanja videa - Distraction Free Settings: Postavke za nesmetan rad + Distraction Free Settings: Nesmetan rad Hide Active Subscriptions: Sakrij aktivne pretplate Hide Playlists: Sakrij zbirke Hide Comments: Sakrij komentare @@ -557,13 +559,13 @@ Settings: Proxy Host: Računalo posrednika Proxy Protocol: Protokol posrednika Enable Tor / Proxy: Aktiviraj Tor/Posrednik - Proxy Settings: Postavke posrednika + Proxy Settings: Posrednik SponsorBlock Settings: Notify when sponsor segment is skipped: Obavijesti kad se preskoči segment sponzora 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': URL API-a za blokiranja sponzora (standardno je https://sponsor.ajay.app) Enable SponsorBlock: Aktiviraj blokiranja sponzora - SponsorBlock Settings: Postavke blokiranja sponzora + SponsorBlock Settings: Blokiranja sponzora Skip Options: Auto Skip: Automatsko preskakanje Show In Seek Bar: Prikaži u traci napretka @@ -580,27 +582,27 @@ Settings: Custom External Player Executable: Izvršna datoteka prilagođenog eksternog playera Ignore Unsupported Action Warnings: Zanemari upozorenja o nepodržanim radnjama External Player: Vanjski player - External Player Settings: Postavke vanjskog playera + External Player Settings: Eksterni player Players: None: Name: Bez Ignore Default Arguments: Zanemari zadane argumente Download Settings: Choose Path: Odaberi stazu - Download Settings: Postavke preuzimanja - Ask Download Path: Zatraži stazu preuzimanja + Download Settings: Preuzimanje + Ask Download Path: Zatraži stazu za preuzimanja Download in app: Preuzmi u aplikaciji Open in web browser: Otvori u web-pregledniku Download Behavior: Ponašanje preuzimanja Parental Control Settings: - Parental Control Settings: Postavke roditeljskog nadzora + Parental Control Settings: Roditeljski nadzor Hide Unsubscribe Button: Sakrij gumb za odjavu Hide Search Bar: Sakrij traku pretrage Show Family Friendly Only: Prikaži samo prikladne za obitelji Experimental Settings: Warning: Ovo su eksperimentalne postavke. Kad su aktivirane mogu prouzročiti prekid programa. Preporučujemo spremanje sigurnosnih kopija. Koristi na vlastitu odgovornost! - Experimental Settings: Eksperimentalne postavke + Experimental Settings: Eksperimentalno Replace HTTP Cache: Zamijeni HTTP predmemoriju Password Dialog: Password Incorrect: Lozinka neispravna @@ -608,11 +610,12 @@ Settings: Enter Password To Unlock: Za otključavanje postavki upiši lozinku Password: Lozinka Password Settings: - Password Settings: Lozinka za postavke + Password Settings: Lozinka Set Password: Postavi lozinku Remove Password: Ukloni lozinku Set Password To Prevent Access: Postavi lozinku za sprečavanja pristupa postavkama Sort Settings Sections (A-Z): Razvrstaj odjeljke postavki (A-Z) + Return to Settings Menu: Vrati se na izbornik postavki About: #On About page About: 'Informacije' @@ -684,7 +687,7 @@ Profile: Other Channels: Ostali kanali Subscription List: Popis pretplata Profile Filter: Filtar profila - Profile Settings: Postavke profila + Profile Settings: Profil Toggle Profile List: Uključi/Isključi popis profila Profile Name: Ime profila Edit Profile Name: Uredi ime profila @@ -742,6 +745,7 @@ Channel: Hide Answers: Sakrij odgovore votes: '{votes} glasa' Video hidden by FreeTube: Video skriven od FreeTubea + View Full Post: Pogledaj cijeli post Shorts: This channel does not currently have any shorts: Ovaj kanal trenutačno nema kratka videa @@ -886,6 +890,7 @@ Video: broj kadrova: {totalFrames}' Bandwidth: 'Propusnost: {bandwidth} kbps' Player Dimensions: 'Veličina playera: {width}x{height}' + Buffered: 'Učitano: {bufferedPercentage}%' You appear to be offline: Čini se da ne postoji veza s internetom. Skipped segment: Preskočen segment „{segmentCategory}” Take Screenshot: Snimi snimku ekrana @@ -893,6 +898,12 @@ Video: Hide Stats: Sakrij statistiku Playback will resume automatically when your connection comes back: Reprodukcija će se automatski nastaviti nakon što se veza ponovo uspostavi. + TranslatedCaptionTemplate: '{language} (izvorni jezik prijevoda: {originalLanguage})' + Exit Full Window: Zatvori cjeloekranski prikaz + Theatre Mode: Kazališni modus + Audio Tracks: Audio snimke + Exit Theatre Mode: Zatvori kazališni modus + Full Window: Cjeloekranski prikaz Videos: #& Sort By Sort By: @@ -1147,5 +1158,10 @@ Search Listing: 4K: 4K Subtitles: Titlovi Closed Captions: Titlovi za gluhe + 8K: 8K + VR180: VR180 + 360 Video: 360° + New: Novi + 3D: 3D 'Blocked opening potentially unsafe URL': 'Blokirano je otvaranje potencijalno nesigurnog URL-a: „{url}”.' From dc1f2f70b44b5c07f5a88bf6f9c75ba86e36b5ff Mon Sep 17 00:00:00 2001 From: Gideon Wentink Date: Thu, 31 Oct 2024 17:08:26 +0000 Subject: [PATCH 13/33] Translated using Weblate (Afrikaans) Currently translated at 12.3% (108 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/af/ --- static/locales/af.yaml | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/static/locales/af.yaml b/static/locales/af.yaml index bf9909faf6c4f..fa80f602c8e54 100644 --- a/static/locales/af.yaml +++ b/static/locales/af.yaml @@ -902,31 +902,35 @@ Share: YouTube Channel URL copied to clipboard: '' Clipboard: Copy failed: '' - Cannot access clipboard without a secure connection: '' + Cannot access clipboard without a secure connection: 'Geen toegang tot knipbord + sonder ’n beveiligde verbinding' Chapters: - Chapters: '' - 'Chapters list visible, current chapter: {chapterName}': '' - 'Chapters list hidden, current chapter: {chapterName}': '' + Chapters: 'Hoofstukke' + 'Chapters list visible, current chapter: {chapterName}': 'Hoofstukke lys sigbare, + huidige hoofstuk: {chapterName}' + 'Chapters list hidden, current chapter: {chapterName}': 'Hoofstukke lys versteekte, + huidige hoofstuk: {chapterName}' -Mini Player: '' +Mini Player: 'Mini-speler' Comments: - Comments: '' - Click to View Comments: '' - Getting comment replies, please wait: '' - There are no more comments for this video: '' - Show Comments: '' - Hide Comments: '' - Sort by: '' - Top comments: '' - Newest first: '' - View {replyCount} replies: '' + Comments: 'Kommentare' + Click to View Comments: 'Klik om kommentare te sien' + Getting comment replies, please wait: 'Kommentare word opgehaal, wag asb.' + There are no more comments for this video: 'Daar is geen verdere kommentare vir + hierdie video nie' + Show Comments: 'Toon kommentare' + Hide Comments: 'Versteek kommentare' + Sort by: 'Sorteer volgens' + Top comments: 'Topkommentare' + Newest first: 'Nuutste eerste' + View {replyCount} replies: 'Sien {replyCount} antwoorde' # Context: View 10 Replies, View 1 Reply, View 1 Reply from Owner, View 2 Replies from Owner and others - View: '' - Hide: '' - Replies: '' - Show More Replies: '' - Reply: '' + View: 'Sien' + Hide: 'Versteek' + Replies: 'Antwoorde' + Show More Replies: 'Toon nog antwoorde' + Reply: 'Antwoord' From {channelName}: 'van {channelName}' And others: 'en ander' There are no comments available for this video: 'Daar is geen reaksies beskikbaar From 1427f257cf872cab681bfb69c2f3e473f1ced1c2 Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 31 Oct 2024 19:45:19 +0000 Subject: [PATCH 14/33] Translated using Weblate (Breton) Currently translated at 77.4% (680 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index cc4872391c24b..87d2e21461d73 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -277,7 +277,9 @@ User Playlists: This playlist does not exist: 'N''eus ket eus ar roll-videoioù-mañ' - This playlist has a video with a duration error: '' + This playlist has a video with a duration error: 'Bez ez eus ur video d''an + nebeutañ hep padelezh e-barzh ar roll-videoioù, rummet e vo evel ma vije goullo + ar padelezh.' AddVideoPrompt: Select a playlist to add your N videos to: 'Choazit ur roll-videoioù evit ouzhpennañ ho video e-barzh | Choazit ur roll-videoioù evit ouzhpennañ ho {videoCount} From 59eff14712ae3c65b1847ce69375f4ba66d2882a Mon Sep 17 00:00:00 2001 From: Gideon Wentink Date: Fri, 1 Nov 2024 09:44:53 +0000 Subject: [PATCH 15/33] Translated using Weblate (Afrikaans) Currently translated at 14.5% (128 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/af/ --- static/locales/af.yaml | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/static/locales/af.yaml b/static/locales/af.yaml index fa80f602c8e54..3dff0f77994d8 100644 --- a/static/locales/af.yaml +++ b/static/locales/af.yaml @@ -879,29 +879,33 @@ Playlist: Change Format: Change Media Formats: '' Use Dash Formats: '' - Use Legacy Formats: '' - Use Audio Formats: '' - Dash formats are not available for this video: '' - Audio formats are not available for this video: '' - Legacy formats are not available for this video: '' + Use Legacy Formats: 'Gebruik legaatformate' + Use Audio Formats: 'Gebruik oudioformate' + Dash formats are not available for this video: 'DASH-formate is nie beskikbaar vir + hierdie video nie' + Audio formats are not available for this video: 'Oudioformate is nie beskikbaar + vir hierdie video nie' + Legacy formats are not available for this video: 'Legaatformate is nie beskikbaar + vir hierdie video nie' Share: - Share Video: '' - Share Channel: '' - Share Playlist: '' - Include Timestamp: '' - Copy Link: '' - Open Link: '' - Copy Embed: '' - Open Embed: '' + Share Video: 'Deel video' + Share Channel: 'Deel kanaal' + Share Playlist: 'Deel afspeellys' + Include Timestamp: 'Sluit tydstempel in' + Copy Link: 'Kopieer skakel' + Open Link: 'Open skakel' + Copy Embed: 'Kopieer inbedskakel' + Open Embed: 'Open inbedskakel' # On Click - Invidious URL copied to clipboard: '' - Invidious Embed URL copied to clipboard: '' - Invidious Channel URL copied to clipboard: '' - YouTube URL copied to clipboard: '' - YouTube Embed URL copied to clipboard: '' - YouTube Channel URL copied to clipboard: '' + Invidious URL copied to clipboard: 'Invidious-URL is na knipbod gekopieer' + Invidious Embed URL copied to clipboard: 'Invidious-inbedskakel is na knipbord gekopieer' + Invidious Channel URL copied to clipboard: 'Invidious-kanaalskakel is na knipbord + gekopieer' + YouTube URL copied to clipboard: 'YouTube-skakel is na knipbord gekopieer' + YouTube Embed URL copied to clipboard: 'YouTube-inbedskakel is na knipbord gekopieer' + YouTube Channel URL copied to clipboard: 'YouTube-kanaalskakel is na knipbord gekopieer' Clipboard: - Copy failed: '' + Copy failed: 'Kopiëring na knipbord het misluk' Cannot access clipboard without a secure connection: 'Geen toegang tot knipbord sonder ’n beveiligde verbinding' From d03eebbb536878d4d6d39c9b528a3a69a50d126f Mon Sep 17 00:00:00 2001 From: Florent Date: Fri, 1 Nov 2024 15:01:13 +0000 Subject: [PATCH 16/33] Translated using Weblate (Breton) Currently translated at 80.5% (707 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/br/ --- static/locales/br.yaml | 61 ++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/static/locales/br.yaml b/static/locales/br.yaml index 87d2e21461d73..93afc73cf894c 100644 --- a/static/locales/br.yaml +++ b/static/locales/br.yaml @@ -329,15 +329,18 @@ Settings: Expand All Settings Sections: '' Sort Settings Sections (A-Z): 'Rummañ lodennoù an arventennoù (A-Z)' Return to Settings Menu: 'Distreiñ d''al lañser arventennoù' - The app needs to restart for changes to take effect. Restart and apply change?: '' + The app needs to restart for changes to take effect. Restart and apply change?: 'Ezhomm + en deus an arload da vezañ adloc''het bremañ evit arloañ ar c''hemmoù. Adloc''hañ + hag arloañ ar c''hemmoù ?' General Settings: General Settings: 'Hollek' Check for Updates: 'Klask Hizivadurioù' Check for Latest Blog Posts: 'Diskouez pennadoù diwezhañ ar Blog' - Fallback to Non-Preferred Backend on Failure: '' + Fallback to Non-Preferred Backend on Failure: 'Distreiñ d''ar Backend ha n''eo + ket hoc''h hini karetañ ma c''hoarvez ur gudenn' Enable Search Suggestions: 'Gweredekaat Kinnigoù klask' Auto Load Next Page: - Label: '' + Label: 'Kargañ ar bajenn da heul ent emgefreek' Tooltip: '' Default Landing Page: 'Pajenn degemer dre ziouer' Locale Preference: 'Yezh' @@ -347,7 +350,7 @@ Settings: Local API: 'API lec''hel' Invidious API: 'API Invidious' Video View Type: - Video View Type: '' + Video View Type: 'Doare da ziskouez ar videoioù' Grid: 'Kael' List: 'Roll' Thumbnail Preference: @@ -370,17 +373,18 @@ Settings: Region for Trending: 'Bro evit ar videoioù diouzh ar c''hiz' #! List countries External Link Handling: - External Link Handling: '' + External Link Handling: 'Merañ al liammoù diavaez' Open Link: 'Digeriñ an ere' Ask Before Opening Link: 'Goulenn a-raok digeriñ ul liamm' No Action: 'Netra' Theme Settings: Theme Settings: 'Tem' - Match Top Bar with Main Color: '' - Expand Side Bar by Default: '' - Disable Smooth Scrolling: '' + Match Top Bar with Main Color: 'Lakaat da glotañ liv ar varenn e-krec''h gant + al liv pennañ' + Expand Side Bar by Default: 'Astenn ar varenn gostez dre ziouer' + Disable Smooth Scrolling: 'Diweredekaat an dibunañ flour' UI Scale: 'Skeul an UI' - Hide Side Bar Labels: '' + Hide Side Bar Labels: 'Kuzhat tikedennoù ar varrenn gostez' Hide FreeTube Header Logo: '' Base Theme: Base Theme: 'Tem diazez' @@ -396,7 +400,7 @@ Settings: Solarized Dark: 'Du luc''hahelet' Solarized Light: 'Sklaer luc''hahelet' Main Color Theme: - Main Color Theme: '' + Main Color Theme: 'Liv pennañ an tem' Red: 'Ruz' Pink: 'Roz' Purple: 'Mouk' @@ -420,20 +424,20 @@ Settings: Dracula Purple: 'Drakula Mouk' Dracula Red: 'Drakula Ruz' Dracula Yellow: 'Drakula Melen' - Catppuccin Mocha Rosewater: '' - Catppuccin Mocha Flamingo: '' - Catppuccin Mocha Pink: '' - Catppuccin Mocha Mauve: '' - Catppuccin Mocha Red: '' - Catppuccin Mocha Maroon: '' - Catppuccin Mocha Peach: '' - Catppuccin Mocha Yellow: '' - Catppuccin Mocha Green: '' - Catppuccin Mocha Teal: '' - Catppuccin Mocha Sky: '' - Catppuccin Mocha Sapphire: '' - Catppuccin Mocha Blue: '' - Catppuccin Mocha Lavender: '' + Catppuccin Mocha Rosewater: 'Catppuccin Moka Roz sklaer' + Catppuccin Mocha Flamingo: 'Catppuccin Moka Flammeg boutin' + Catppuccin Mocha Pink: 'Catppuccin Moka Roz' + Catppuccin Mocha Mauve: 'Catppuccin Moka Mouk' + Catppuccin Mocha Red: 'Catppuccin Moka Ruz' + Catppuccin Mocha Maroon: 'Catppuccin Moka Gell' + Catppuccin Mocha Peach: 'Catppuccin Moka Pechez' + Catppuccin Mocha Yellow: 'Catppuccin Moka Melen' + Catppuccin Mocha Green: 'Catppuccin Moka Gwer' + Catppuccin Mocha Teal: 'Catppuccin Moka Glas-gwer' + Catppuccin Mocha Sky: 'Catppuccin Moka Glas oabl' + Catppuccin Mocha Sapphire: 'Catppuccin Moka Safir' + Catppuccin Mocha Blue: 'Catppuccin Moka Glas' + Catppuccin Mocha Lavender: 'Catppuccin Moka Lavand' Solarized Yellow: 'Melen luc''hahelet' Solarized Orange: 'Orañjez luc''hahelet' Solarized Red: 'Ruz luc''hahelet' @@ -751,7 +755,8 @@ Profile: No channel(s) have been selected: 'Chadenn ebet diuzet' ? 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. - : '' + : 'Ho profil pennañ eo. Ha sur oc''h e faot deoc''h dilemel ar chadennoù diuzet ? + Ar memes chadennoù a vo dilamet deus ho profiloù all.' Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: '' Close Profile Dropdown: '' Open Profile Dropdown: '' @@ -1061,6 +1066,8 @@ Tooltips: Region for Trending: 'Gant an dra-se e c''hallit dibab ar vro evit ar videoioù diouzh ar c''hiz a faot deoc''h gwelet.' External Link Handling: | + Choazit an emzalc'h dre ziouer pa vo kliket war ul liamm ha n'hall ket bezañ digoret gant FreeTube. + Dre ziouer, e vo digoret al liamm e-barzh ho merdeer web. Player Settings: Proxy Videos Through Invidious: '' Default Video Format: 'Arventennañ ar furmadoù implijet pa vez lennet ur video. @@ -1077,7 +1084,9 @@ Tooltips: External Player: '' Custom External Player Executable: '' Ignore Warnings: '' - Ignore Default Arguments: '' + Ignore Default Arguments: 'Arabat kas arguzennoù dre ziouer d''al lenner diavaez + nemet URL ar video (d.s. feur lenn, URL ar roll-videoioù, etc.). Treuzkaset + e vo an arguzennoù personelaet.' Custom External Player Arguments: '' DefaultCustomArgumentsTemplate: "(Dre ziouer : '{defaultCustomArguments}')" Distraction Free Settings: From c32409f0bc2fb71b4005c6956425b6fe2626527c Mon Sep 17 00:00:00 2001 From: Gideon Wentink Date: Fri, 1 Nov 2024 16:14:07 +0000 Subject: [PATCH 17/33] Translated using Weblate (Afrikaans) Currently translated at 16.8% (148 of 878 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/af/ --- static/locales/af.yaml | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/static/locales/af.yaml b/static/locales/af.yaml index 3dff0f77994d8..14dbe6aad3957 100644 --- a/static/locales/af.yaml +++ b/static/locales/af.yaml @@ -847,38 +847,41 @@ Video: CodecAudio: '' CodecsVideoAudio: '' CodecsVideoAudioNoItags: '' - You appear to be offline: '' - Playback will resume automatically when your connection comes back: '' - Skipped segment: '' + You appear to be offline: 'U blyk vanlyn te wees.' + Playback will resume automatically when your connection comes back: 'Afspeel sal + outomaties hervat wanneer u verbinding terug kom.' + Skipped segment: 'Segment {segmentCategory} oorgeslaan' #& Videos Videos: #& Sort By Sort By: - Newest: '' - Oldest: '' + Newest: 'Nuutste' + Oldest: 'Oudste' #& Most Popular #& Playlists Playlist: #& About - Playlist: '' - View Full Playlist: '' - Last Updated On: '' + Playlist: 'Afspeellys' + View Full Playlist: 'Bekyk volledige afspeellys' + Last Updated On: 'Laas bygewerk op' Sort By: - Sort By: '' - DateAddedNewest: '' - DateAddedOldest: '' - AuthorAscending: '' - AuthorDescending: '' - VideoTitleAscending: '' - VideoTitleDescending: '' - Custom: '' + Sort By: 'Sorteer volgens' + DateAddedNewest: 'Laaste toegevoeg boaan' + DateAddedOldest: 'Eerste toegevoeg boaan' + AuthorAscending: 'Outeur (A-Z)' + AuthorDescending: 'Outeur (Z-A)' + VideoTitleAscending: 'Titel (A-Z)' + VideoTitleDescending: 'Titel (Z-A)' + Custom: 'Pasgemaak' # On Video Watch Page #* Published #& Views + VideoDurationAscending: Duur (korste eerste) + VideoDurationDescending: Duur (langste eerste) Change Format: - Change Media Formats: '' - Use Dash Formats: '' + Change Media Formats: 'Verander mediaformate' + Use Dash Formats: 'Gebruik DASH-formate' Use Legacy Formats: 'Gebruik legaatformate' Use Audio Formats: 'Gebruik oudioformate' Dash formats are not available for this video: 'DASH-formate is nie beskikbaar vir From 595436dd0833baf8eb79fe680338a454459389d3 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Sat, 2 Nov 2024 11:18:48 +0100 Subject: [PATCH 18/33] Use decodingInfo's powerEfficient property when picking streams (#6061) --- .../ft-shaka-video-player/ft-shaka-video-player.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js index 5f3c5e5be6266..be7331449aa67 100644 --- a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js +++ b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js @@ -565,9 +565,11 @@ export default defineComponent({ }, autoShowText: shaka.config.AutoShowText.NEVER, - // Only use variants that are predicted to play smoothly + // Prioritise variants that are predicted to play: + // - `smooth`: without dropping frames + // - `powerEfficient` the spec is quite vague but in Chromium it should prioritise hardware decoding when available // https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo - preferredDecodingAttributes: format === 'dash' ? ['smooth'] : [], + preferredDecodingAttributes: format === 'dash' ? ['smooth', 'powerEfficient'] : [], // Electron doesn't like YouTube's vp9 VR video streams and throws: // "CHUNK_DEMUXER_ERROR_APPEND_FAILED: Projection element is incomplete; ProjectionPoseYaw required." From a2df91f1dcf40fb06cd85a0514df71fc07bb2fc2 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sat, 2 Nov 2024 18:34:58 +0800 Subject: [PATCH 19/33] Fix shortcut for macOS setting shortcut in video page (#6054) * ! Fix shortcut for macOS setting shortcut in video page * Update src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js --- .../ft-shaka-video-player/ft-shaka-video-player.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js index be7331449aa67..8180b98d627b1 100644 --- a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js +++ b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js @@ -2084,9 +2084,12 @@ export default defineComponent({ break } case ',': - event.preventDefault() - // Return to previous frame - frameByFrame(-1) + // `⌘+,` is for settings in MacOS + if (!event.metaKey) { + event.preventDefault() + // Return to previous frame + frameByFrame(-1) + } break case '.': event.preventDefault() From a28bb3f0f5d4092aca300f4e21347d904d14a27d Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Sat, 2 Nov 2024 06:38:07 -0400 Subject: [PATCH 20/33] Add some missing jsdoc comments, add jsdoc eslint plugin (#6048) * Add some missing jsdoc comments, add jsdoc eslint plugin * remove left over addition Co-authored-by: absidue <48293849+absidue@users.noreply.github.com> * move jsdoc eslint rule configuration * use dash for list instead * Enable some additional rules * Apply suggestions from code review Co-authored-by: PikachuEXE --------- Co-authored-by: absidue <48293849+absidue@users.noreply.github.com> Co-authored-by: PikachuEXE --- .github/dependabot.yml | 1 + _scripts/ProcessLocalesPlugin.js | 4 +- _scripts/getShakaLocales.js | 2 +- eslint.config.mjs | 11 +++ package.json | 1 + .../ChannelDetails/ChannelDetails.vue | 3 + .../FtCommunityPost/FtCommunityPost.vue | 6 ++ .../FtElementList/FtElementList.vue | 2 + .../FtListChannel/FtListChannel.vue | 7 ++ .../FtListHashtag/FtListHashtag.vue | 5 + .../FtListLazyWrapper/FtListLazyWrapper.vue | 5 + .../WatchVideoChapters/WatchVideoChapters.vue | 2 + .../WatchVideoDescription.vue | 1 + .../WatchVideoRecommendations.vue | 1 + .../ft-shaka-video-player.js | 8 +- .../player-components/AudioTrackSelection.js | 2 +- .../ft-share-button/ft-share-button.js | 2 +- src/renderer/helpers/accessibility.js | 4 + src/renderer/helpers/api/invidious.js | 5 + src/renderer/helpers/api/local.js | 10 +- src/renderer/helpers/channels.js | 20 ++-- src/renderer/helpers/player/utils.js | 12 +-- src/renderer/helpers/strings.js | 3 + src/renderer/helpers/subscriptions.js | 2 +- src/renderer/helpers/utils.js | 91 +++++++++++++++---- src/renderer/views/Channel/Channel.js | 10 +- src/renderer/views/Watch/Watch.js | 7 +- yarn.lock | 77 +++++++++++++++- 28 files changed, 248 insertions(+), 56 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 34f5ce3ee5439..248241a93065d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -20,6 +20,7 @@ updates: - "@eslint/*" - "yaml-eslint-parser" - "vue-eslint-parser" + - "neostandard" stylelint: patterns: - "stylelint" diff --git a/_scripts/ProcessLocalesPlugin.js b/_scripts/ProcessLocalesPlugin.js index d69ea4a0dbd02..d08bb3734f833 100644 --- a/_scripts/ProcessLocalesPlugin.js +++ b/_scripts/ProcessLocalesPlugin.js @@ -26,11 +26,11 @@ class ProcessLocalesPlugin { } this.outputDir = options.outputDir - /** @type {Map} */ + /** @type {Map} */ this.locales = new Map() this.localeNames = [] - /** @type {Map} */ + /** @type {Map} */ this.cache = new Map() this.filePaths = [] diff --git a/_scripts/getShakaLocales.js b/_scripts/getShakaLocales.js index 76ed42b2633c1..644a13a8ef6a1 100644 --- a/_scripts/getShakaLocales.js +++ b/_scripts/getShakaLocales.js @@ -32,7 +32,7 @@ function getMappings(shakaLocales, freeTubeLocales) { * @type {[string, string][]} * Using this structure as it gets passed to `new Map()` in the player component * The first element is the FreeTube locale, the second one is the shaka-player one - **/ + */ const mappings = [] for (const locale of freeTubeLocales) { diff --git a/eslint.config.mjs b/eslint.config.mjs index 5971c36f0f75d..29a7e2ecc4a96 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,7 @@ import eslintPluginJsonc from 'eslint-plugin-jsonc' import eslintPluginYml from 'eslint-plugin-yml' import yamlEslintParser from 'yaml-eslint-parser' import neostandard from 'neostandard' +import jsdoc from 'eslint-plugin-jsdoc' import activeLocales from './static/locales/activeLocales.json' with { type: 'json' } @@ -40,6 +41,7 @@ export default [ ], plugins: { unicorn: eslintPluginUnicorn, + jsdoc, }, languageOptions: { @@ -115,6 +117,15 @@ export default [ '@intlify/vue-i18n/no-deprecated-tc': 'off', 'vue/require-explicit-emits': 'error', 'vue/no-unused-emit-declarations': 'error', + + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-property-names': 'error', + 'jsdoc/check-param-names': 'error', + 'jsdoc/check-syntax': 'error', + 'jsdoc/check-template-names': 'error', + 'jsdoc/check-types': 'error', + 'jsdoc/no-bad-blocks': 'error', + 'jsdoc/no-multi-asterisks': 'error', }, }, diff --git a/package.json b/package.json index c24f4c088db64..bd6fe6a7dc83e 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "electron-builder": "^25.1.8", "eslint": "^9.11.1", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsdoc": "^50.4.3", "eslint-plugin-jsonc": "^2.16.0", "eslint-plugin-unicorn": "^56.0.0", "eslint-plugin-vue": "^9.30.0", diff --git a/src/renderer/components/ChannelDetails/ChannelDetails.vue b/src/renderer/components/ChannelDetails/ChannelDetails.vue index 296457569d381..8b70d92a76e70 100644 --- a/src/renderer/components/ChannelDetails/ChannelDetails.vue +++ b/src/renderer/components/ChannelDetails/ChannelDetails.vue @@ -280,14 +280,17 @@ const props = defineProps({ const emit = defineEmits(['change-tab', 'search', 'subscribed']) +/** @type {import('vue').ComputedRef} */ const hideChannelSubscriptions = computed(() => { return store.getters.getHideChannelSubscriptions }) +/** @type {import('vue').ComputedRef} */ const hideSharingActions = computed(() => { return store.getters.getHideSharingActions }) +/** @type {import('vue').ComputedRef} */ const hideUnsubscribeButton = computed(() => { return store.getters.getHideUnsubscribeButton }) diff --git a/src/renderer/components/FtCommunityPost/FtCommunityPost.vue b/src/renderer/components/FtCommunityPost/FtCommunityPost.vue index 677cba360d710..c3292e2fb91f8 100644 --- a/src/renderer/components/FtCommunityPost/FtCommunityPost.vue +++ b/src/renderer/components/FtCommunityPost/FtCommunityPost.vue @@ -198,10 +198,12 @@ const props = defineProps({ }, }) +/** @type {import('vue').ComputedRef<'grid' | 'list'>} */ const listType = computed(() => { return store.getters.getListType }) +/** @type {import('vue').ComputedRef} */ const forbiddenTitles = computed(() => { if (!props.hideForbiddenTitles) { return [] } return JSON.parse(store.getters.getForbiddenTitles) @@ -211,10 +213,12 @@ const hideVideo = computed(() => { return forbiddenTitles.value.some((text) => props.data.postContent.content.title?.toLowerCase().includes(text.toLowerCase())) }) +/** @type {import('vue').ComputedRef<'local' | 'invidious'>} */ const backendPreference = computed(() => { return store.getters.getBackendPreference }) +/** @type {import('vue').ComputedRef} */ const backendFallback = computed(() => { return store.getters.getBackendFallback }) @@ -226,11 +230,13 @@ const isInvidiousAllowed = computed(() => { let postType = '' let postText = '' let postId = '' +/** @type {string[]?} */ let authorThumbnails = null let postContent = '' let author = '' let authorId = '' let voteCount = 0 +/** @type {number?} */ let commentCount = null parseCommunityData() diff --git a/src/renderer/components/FtElementList/FtElementList.vue b/src/renderer/components/FtElementList/FtElementList.vue index e6f8f3feed11a..13204b53a51e9 100644 --- a/src/renderer/components/FtElementList/FtElementList.vue +++ b/src/renderer/components/FtElementList/FtElementList.vue @@ -104,10 +104,12 @@ const props = defineProps({ const emit = defineEmits(['move-video-down', 'move-video-up', 'remove-from-playlist']) +/** @type {import('vue').ComputedRef<'grid' | 'list'>} */ const listType = computed(() => { return store.getters.getListType }) +/** @type {import('vue').ComputedRef<'grid' | 'list'>} */ const displayValue = computed(() => { return props.display === '' ? listType.value : props.display }) diff --git a/src/renderer/components/FtListChannel/FtListChannel.vue b/src/renderer/components/FtListChannel/FtListChannel.vue index 75b7e9dc57b7d..b96c76d70b60b 100644 --- a/src/renderer/components/FtListChannel/FtListChannel.vue +++ b/src/renderer/components/FtListChannel/FtListChannel.vue @@ -91,14 +91,17 @@ const props = defineProps({ } }) +/** @type {import('vue').ComputedRef} */ const currentInvidiousInstanceUrl = computed(() => { return store.getters.getCurrentInvidiousInstanceUrl }) +/** @type {import('vue').ComputedRef<'grid' | 'list'>} */ const listType = computed(() => { return store.getters.getListType }) +/** @type {import('vue').ComputedRef} */ const hideChannelSubscriptions = computed(() => { return store.getters.getHideChannelSubscriptions }) @@ -106,8 +109,11 @@ const hideChannelSubscriptions = computed(() => { let id = '' let thumbnail = '' let name = '' +/** @type {number?} */ let subscriberCount = null +/** @type {number?} */ let videoCount = null +/** @type {string?} */ let handle = null let description = '' @@ -155,6 +161,7 @@ function parseLocalData() { function parseInvidiousData() { // Can be prefixed with `https://` or `//` (protocol relative) + /** @type {string} */ const thumbnailUrl = props.data.authorThumbnails[2].url thumbnail = youtubeImageUrlToInvidious(thumbnailUrl, currentInvidiousInstanceUrl.value) diff --git a/src/renderer/components/FtListHashtag/FtListHashtag.vue b/src/renderer/components/FtListHashtag/FtListHashtag.vue index bf39d56f2cfd6..21ad3a36573f7 100644 --- a/src/renderer/components/FtListHashtag/FtListHashtag.vue +++ b/src/renderer/components/FtListHashtag/FtListHashtag.vue @@ -67,13 +67,18 @@ const props = defineProps({ } }) +/** @type {import('vue').ComputedRef<'list'| 'grid'>} */ const listType = computed(() => { return store.getters.getListType }) +/** @type {string} */ const title = props.data.title +/** @type {number} */ const channelCount = props.data.channelCount +/** @type {number} */ const videoCount = props.data.videoCount +/** @type {string} */ const url = `/hashtag/${encodeURIComponent(title.substring(1))}` const formattedChannelCount = computed(() => { diff --git a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue index ceca6b38953cd..786054dfbea6e 100644 --- a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue +++ b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue @@ -141,18 +141,22 @@ const props = defineProps({ const emit = defineEmits(['move-video-down', 'move-video-up', 'remove-from-playlist']) +/** @type {import('vue').ComputedRef<'video' | 'shortVideo' | 'channel' | 'playlist' | 'community'>} */ const finalDataType = computed(() => { return props.data.type ?? props.dataType }) +/** @type {import('vue').ComputedRef} */ const hideLiveStreams = computed(() => { return store.getters.getHideLiveStreams }) +/** @type {import('vue').ComputedRef} */ const hideUpcomingPremieres = computed(() => { return store.getters.getHideUpcomingPremieres }) +/** @type {import('vue').ComputedRef<{name : string, preferredName: string, icon: string}[]>} */ const channelsHidden = computed(() => { // Some component users like channel view will have this disabled if (!props.useChannelsHiddenPreference) { return [] } @@ -166,6 +170,7 @@ const channelsHidden = computed(() => { }) }) +/** @type {string[]} */ const forbiddenTitles = computed(() => { if (!props.hideForbiddenTitles) { return [] } return JSON.parse(store.getters.getForbiddenTitles) diff --git a/src/renderer/components/WatchVideoChapters/WatchVideoChapters.vue b/src/renderer/components/WatchVideoChapters/WatchVideoChapters.vue index ac27a48059e7d..7e63aab8c7ac0 100644 --- a/src/renderer/components/WatchVideoChapters/WatchVideoChapters.vue +++ b/src/renderer/components/WatchVideoChapters/WatchVideoChapters.vue @@ -106,10 +106,12 @@ const currentChapter = computed(() => { return props.chapters[currentIndex.value] }) +/** @type {import('vue').ComputedRef} */ const currentTitle = computed(() => { return currentChapter.value.title }) +/** @type {import('vue').ComputedRef} */ const compact = computed(() => { return !props.chapters[0].thumbnail }) diff --git a/src/renderer/components/WatchVideoDescription/WatchVideoDescription.vue b/src/renderer/components/WatchVideoDescription/WatchVideoDescription.vue index 37a12ea6eafca..d0ab063901680 100644 --- a/src/renderer/components/WatchVideoDescription/WatchVideoDescription.vue +++ b/src/renderer/components/WatchVideoDescription/WatchVideoDescription.vue @@ -60,6 +60,7 @@ function onTimestamp(timestamp) { /** * @param {string} descriptionText + * @returns {string} */ function parseDescriptionHtml(descriptionText) { return descriptionText diff --git a/src/renderer/components/WatchVideoRecommendations/WatchVideoRecommendations.vue b/src/renderer/components/WatchVideoRecommendations/WatchVideoRecommendations.vue index 103422236a555..44e5ffe3c4e1f 100644 --- a/src/renderer/components/WatchVideoRecommendations/WatchVideoRecommendations.vue +++ b/src/renderer/components/WatchVideoRecommendations/WatchVideoRecommendations.vue @@ -46,6 +46,7 @@ defineProps({ } }) +/** @type {import('vue').ComputedRef} */ const playNextVideo = computed(() => { return store.getters.getPlayNextVideo }) diff --git a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js index 8180b98d627b1..316a4e66dcf78 100644 --- a/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js +++ b/src/renderer/components/ft-shaka-video-player/ft-shaka-video-player.js @@ -355,7 +355,7 @@ export default defineComponent({ * color: string, * skip: 'autoSkip' | 'promptToSkip' | 'showInSeekBar' | 'doNothing' * } - * }} */ + }} */ const categoryData = {} sponsorCategories.forEach(x => { @@ -537,7 +537,7 @@ export default defineComponent({ * @param {'dash'|'audio'|'legacy'} format * @param {boolean} useAutoQuality * @returns {shaka.extern.PlayerConfiguration} - **/ + */ function getPlayerConfig(format, useAutoQuality = false) { return { // YouTube uses these values and they seem to work well in FreeTube too, @@ -1872,7 +1872,7 @@ export default defineComponent({ /** * @param {WheelEvent} event - * */ + */ function mouseScrollVolume(event) { if (!event.ctrlKey && !event.metaKey) { event.preventDefault() @@ -2150,7 +2150,7 @@ export default defineComponent({ /** * @param {shaka.util.Error} error * @param {string} context - * @param {object=} details + * @param {object?} details */ function handleError(error, context, details) { logShakaError(error, context, props.videoId, details) diff --git a/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js b/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js index 66cb393db3107..6a1ea8435dc76 100644 --- a/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js +++ b/src/renderer/components/ft-shaka-video-player/player-components/AudioTrackSelection.js @@ -42,7 +42,7 @@ export class AudioTrackSelection extends shaka.ui.SettingsMenu { /** * @private - * @param {shaka.extern.TrackList=} tracks + * @param {shaka.extern.TrackList?} tracks */ updateAudioTracks_(tracks) { if (!tracks) { diff --git a/src/renderer/components/ft-share-button/ft-share-button.js b/src/renderer/components/ft-share-button/ft-share-button.js index 6d9eb6f73f149..9130a6355620e 100644 --- a/src/renderer/components/ft-share-button/ft-share-button.js +++ b/src/renderer/components/ft-share-button/ft-share-button.js @@ -19,7 +19,7 @@ export default defineComponent({ * Allows to render the dropdown conditionally * 'Channel' will exclude embed links * 'Video' (default) keeps the original behaviour - **/ + */ type: String, default: 'Video' }, diff --git a/src/renderer/helpers/accessibility.js b/src/renderer/helpers/accessibility.js index 880bf0ac45373..48f06552b7938 100644 --- a/src/renderer/helpers/accessibility.js +++ b/src/renderer/helpers/accessibility.js @@ -1,3 +1,7 @@ +/** + * @param {string} attribute + * @returns {string} + */ export function sanitizeForHtmlId(attribute) { return attribute.replaceAll(/\s+/g, '') } diff --git a/src/renderer/helpers/api/invidious.js b/src/renderer/helpers/api/invidious.js index d46d4079dd081..d6b3785efe1bc 100644 --- a/src/renderer/helpers/api/invidious.js +++ b/src/renderer/helpers/api/invidious.js @@ -142,6 +142,11 @@ export async function invidiousGetCommentReplies({ id, replyToken }) { return { commentData: parseInvidiousCommentData(response), continuation: response.continuation ?? null } } +/** + * @param {string} url + * @param {string?} currentInstance + * @returns {string} + */ export function youtubeImageUrlToInvidious(url, currentInstance = null) { if (url == null) { return null diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 6eb23dbf838ae..13a237ee5253a 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -550,15 +550,15 @@ export async function getLocalArtistTopicChannelReleasesContinuation(channel, co * @param {boolean} onlyIdNameThumbnail */ export function parseLocalChannelHeader(channel, onlyIdNameThumbnail = false) { - /** @type {string=} */ + /** @type {string?} */ let id /** @type {string} */ let name - /** @type {string=} */ + /** @type {string?} */ let thumbnailUrl - /** @type {string=} */ + /** @type {string?} */ let bannerUrl - /** @type {string=} */ + /** @type {string?} */ let subscriberText /** @type {string[]} */ const tags = [] @@ -766,7 +766,7 @@ export function parseLocalChannelShorts(shorts, channelId, channelName) { /** * @param {import('youtubei.js').YTNodes.Playlist|import('youtubei.js').YTNodes.GridPlaylist|import('youtubei.js').YTNodes.LockupView} playlist * @param {string} channelId - * @param {string} chanelName + * @param {string} channelName */ export function parseLocalListPlaylist(playlist, channelId = undefined, channelName = undefined) { if (playlist.type === 'LockupView') { diff --git a/src/renderer/helpers/channels.js b/src/renderer/helpers/channels.js index 3161e5f8dcec8..39c32089336f6 100644 --- a/src/renderer/helpers/channels.js +++ b/src/renderer/helpers/channels.js @@ -4,11 +4,11 @@ import { getLocalChannel, parseLocalChannelHeader } from './api/local' /** * @param {string} id * @param {{ -* preference: string, -* fallback: boolean, -* invalid: boolean, -* }} backendOptions -*/ + * preference: string, + * fallback: boolean, + * invalid: boolean, + * }} backendOptions + */ async function findChannelById(id, backendOptions) { try { if (!process.env.SUPPORTS_LOCAL_API || backendOptions.preference === 'invidious') { @@ -37,11 +37,11 @@ async function findChannelById(id, backendOptions) { /** * @param {string} id * @param {{ -* preference: string, -* fallback: boolean, -* }} backendOptions -* @returns {Promise<{icon: string, iconHref: string, preferredName: string} | { invalidId: boolean }>} -*/ + * preference: string, + * fallback: boolean, + * }} backendOptions + * @returns {Promise<{icon: string, iconHref: string, preferredName: string} | { invalidId: boolean }>} + */ export async function findChannelTagInfo(id, backendOptions) { if (!checkYoutubeChannelId(id)) return { invalidId: true } try { diff --git a/src/renderer/helpers/player/utils.js b/src/renderer/helpers/player/utils.js index 983a275bba2b3..0c68dcae097e0 100644 --- a/src/renderer/helpers/player/utils.js +++ b/src/renderer/helpers/player/utils.js @@ -9,7 +9,7 @@ import { sponsorBlockSkipSegments } from '../sponsorblock' * @param {shaka.util.Error} error * @param {string} context * @param {string} videoId - * @param {object=} details + * @param {object?} details */ export function logShakaError(error, context, videoId, details) { const { Severity, Category, Code } = shaka.util.Error @@ -189,13 +189,13 @@ export function sortCaptions(captions) { * This function cleans it up, so that we can use it. * * Here is a list of things this function does: - * * Removes bogus roles and labels - * * Extracts the languages from the audio URLs if available and adds it to the adapation sets - * * Adds roles and labels when possible to add support for multiple audio tracks + * - Removes bogus roles and labels + * - Extracts the languages from the audio URLs if available and adds it to the adapation sets + * - Adds roles and labels when possible to add support for multiple audio tracks * * Things this function does not do: - * * Separate DRC (Stable Volume) from their original counterparts - * * Tag HDR video streams (Invidious puts all video streams in the same adaptation set, + * - Separate DRC (Stable Volume) from their original counterparts + * - Tag HDR video streams (Invidious puts all video streams in the same adaptation set, * to tag HDR and SDR streams we would have to separate them out into multiple adaptation sets) * @param {shaka.extern.xml.Node[]} periods */ diff --git a/src/renderer/helpers/strings.js b/src/renderer/helpers/strings.js index 6c9e79465b8e0..2a95fb9491fb1 100644 --- a/src/renderer/helpers/strings.js +++ b/src/renderer/helpers/strings.js @@ -26,6 +26,9 @@ export function isKeyboardEventKeyPrintableChar(eventKey) { return false } +/** + * @param {string} title + */ export function translateWindowTitle(title) { switch (title) { case 'Subscriptions': diff --git a/src/renderer/helpers/subscriptions.js b/src/renderer/helpers/subscriptions.js index f41205244d3aa..41afe8c061ba3 100644 --- a/src/renderer/helpers/subscriptions.js +++ b/src/renderer/helpers/subscriptions.js @@ -65,7 +65,7 @@ export function updateVideoListAfterProcessing(videos) { /** * @param {string} rssString * @param {string} channelId -*/ + */ export async function parseYouTubeRSSFeed(rssString, channelId) { // doesn't need to be asynchronous, but doing it allows us to do the relatively slow DOM querying in parallel try { diff --git a/src/renderer/helpers/utils.js b/src/renderer/helpers/utils.js index 12871b1779bb6..a96dda78e2a14 100644 --- a/src/renderer/helpers/utils.js +++ b/src/renderer/helpers/utils.js @@ -12,6 +12,10 @@ export const CHANNEL_HANDLE_REGEX = /^@[\w.-]{3,30}$/ const PUBLISHED_TEXT_REGEX = /(\d+)\s?([a-z]+)/i +/** + * @param {string} sortPreference + * @returns {string[]} + */ export function getIconForSortPreference(sortPreference) { switch (sortPreference) { case 'name_descending': @@ -192,6 +196,11 @@ export function toLocalePublicationString ({ publishText, isLive = false, isUpco return i18n.t('Video.Publicationtemplate', { number: match[1], unit }) } +/** + * @param {import('youtubei.js/dist/src/parser/classes/PlayerStoryboardSpec').StoryboardData} storyboard + * @param {number} videoLengthSeconds + * @returns {string} + */ export function buildVTTFileLocally(storyboard, videoLengthSeconds) { let vttString = 'WEBVTT\n\n' // how many images are in one image @@ -249,6 +258,11 @@ export function buildVTTFileLocally(storyboard, videoLengthSeconds) { return vttString } +/** + * @param {string} message + * @param {number} time + * @param {Function} action + */ export function showToast(message, time = null, action = null) { FtToastEvents.dispatchEvent(new CustomEvent('toast-open', { detail: { @@ -260,13 +274,14 @@ export function showToast(message, time = null, action = null) { } /** - * This writes to the clipboard. If an error occurs during the copy, - * a toast with the error is shown. If the copy is successful and - * there is a success message, a toast with that message is shown. - * @param {string} content the content to be copied to the clipboard - * @param {null|string} messageOnSuccess the message to be displayed as a toast when the copy succeeds (optional) - * @param {null|string} messageOnError the message to be displayed as a toast when the copy fails (optional) - */ + * This writes to the clipboard. If an error occurs during the copy, + * a toast with the error is shown. If the copy is successful and + * there is a success message, a toast with that message is shown. + * @param {string} content the content to be copied to the clipboard + * @param {object} [options] - Optional settings for the copy operation. + * @param {null|string} options.messageOnSuccess the message to be displayed as a toast when the copy succeeds (optional) + * @param {null|string} options.messageOnError the message to be displayed as a toast when the copy fails (optional) + */ export async function copyToClipboard(content, { messageOnSuccess = null, messageOnError = null } = {}) { if (navigator.clipboard !== undefined && window.isSecureContext) { try { @@ -370,7 +385,7 @@ export async function showOpenDialog (options) { /** * @param {object} response the response from `showOpenDialog` * @param {number} index which file to read (defaults to the first in the response) - * @returns the text contents of the selected file + * @returns {string} the text contents of the selected file */ export function readFileFromDialog(response, index = 0) { return new Promise((resolve, reject) => { @@ -396,6 +411,10 @@ export function readFileFromDialog(response, index = 0) { }) } +/** + * @param {{defaultPath: string, filters: {name: string, extensions: string[]}[]}} options + * @returns { Promise | {canceled: boolean?, filePath: string } | { canceled: boolean?, handle?: Promise }} + */ export async function showSaveDialog (options) { if (process.env.IS_ELECTRON) { const { ipcRenderer } = require('electron') @@ -423,10 +442,10 @@ export async function showSaveDialog (options) { } /** -* Write to a file picked out from the `showSaveDialog` picker -* @param {object} response the response from `showSaveDialog` -* @param {string} content the content to be written to the file selected by the dialog -*/ + * Write to a file picked out from the `showSaveDialog` picker + * @param {object} response the response from `showSaveDialog` + * @param {string} content the content to be written to the file selected by the dialog + */ export async function writeFileFromDialog (response, content) { if (process.env.IS_ELECTRON) { const { filePath } = response @@ -475,7 +494,11 @@ export function createWebURL(path) { return `${origin}${windowPath}/${path}` } -// strip html tags but keep
, , , , , +/** + * strip html tags but keep
, , , , , + * @param {string} value + * @returns {string} + */ export function stripHTML(value) { return value.replaceAll(/(<(?!br|\/?[abis]|img>)([^>]+)>)/gi, '') } @@ -522,6 +545,11 @@ export function formatDurationAsTimestamp(lengthSeconds) { return timestamp } +/** + * @param {{sortBy? : string, time?: string, duration?: string, features: string[]}?} filtersA + * @param {{sortBy? : string, time?: string, duration?: string, features: string[]}?} filtersB + * @returns {boolean} + */ export function searchFiltersMatch(filtersA, filtersB) { return filtersA?.sortBy === filtersB?.sortBy && filtersA?.time === filtersB?.time && @@ -530,6 +558,10 @@ export function searchFiltersMatch(filtersA, filtersB) { filtersA?.features?.length === filtersB?.features?.length && filtersA?.features?.every((val, index) => val === filtersB?.features[index]) } +/** + * @param {string} filenameOriginal + * @returns {string} + */ export function replaceFilenameForbiddenChars(filenameOriginal) { let filenameNew = filenameOriginal let forbiddenChars = {} @@ -563,6 +595,9 @@ export function replaceFilenameForbiddenChars(filenameOriginal) { return filenameNew } +/** + * @returns {Promise} + */ export async function getSystemLocale() { let locale if (process.env.IS_ELECTRON) { @@ -715,6 +750,11 @@ export function toDistractionFreeTitle(title, minUpperCase = 3) { .replace(reg, x => capitalizedWord(x.toLowerCase())) } +/** + * @param {number} number + * @param {Intl.NumberFormatOptions?} options + * @returns {string} + */ export function formatNumber(number, options = undefined) { return Intl.NumberFormat([i18n.locale, 'en'], options).format(number) } @@ -730,6 +770,13 @@ export function getTodayDateStrLocalTimezone() { return timeNowStr.split('T')[0] } +/** + * + * @param {number} date + * @param {boolean} hideSeconds + * @param {boolean} useThirtyDayMonths + * @returns {string} + */ export function getRelativeTimeFromDate(date, hideSeconds = false, useThirtyDayMonths = true) { if (!date) { return '' @@ -800,8 +847,9 @@ export function escapeHTML(untrusted) { /** * Performs a deep copy of a javascript object - * @param {Object} obj - * @returns {Object} + * @template T + * @param {T} obj + * @returns {T} */ export function deepCopy(obj) { return JSON.parse(JSON.stringify(obj)) @@ -811,7 +859,8 @@ export function deepCopy(obj) { * Check if the `name` of the error is `TimeoutError` to know if the error was caused by a timeout or something else. * @param {number} timeoutMs * @param {RequestInfo|URL} input - * @param {RequestInit=} init + * @param {RequestInit?} init + * @returns {Promise} */ export async function fetchWithTimeout(timeoutMs, input, init) { const timeoutSignal = AbortSignal.timeout(timeoutMs) @@ -839,6 +888,10 @@ export async function fetchWithTimeout(timeoutMs, input, init) { } } +/** + * @param {KeyboardEvent} event + * @param {HTMLInputElement} inputElement + */ export function ctrlFHandler(event, inputElement) { switch (event.key) { case 'F': @@ -879,11 +932,13 @@ export function base64EncodeUtf8(text) { * @param {string} channelId * @param {'all'} type * @returns {string} -* + * * @param {string} channelId * @param {'all' | 'videos' | 'live' | 'shorts'} type - * @param {'newest' | 'popular'} sortBy + * @param {('newest' | 'popular')?} [sortBy] + * @returns {string} */ + export function getChannelPlaylistId(channelId, type, sortBy) { switch (type) { case 'videos': diff --git a/src/renderer/views/Channel/Channel.js b/src/renderer/views/Channel/Channel.js index 2230ce23bda46..33fd2307a7009 100644 --- a/src/renderer/views/Channel/Channel.js +++ b/src/renderer/views/Channel/Channel.js @@ -712,7 +712,7 @@ export default defineComponent({ try { /** * @type {import('youtubei.js').YT.Channel} - */ + */ const channel = this.channelInstance const about = await channel.getAbout() @@ -784,7 +784,7 @@ export default defineComponent({ } else { /** * @type {import('youtubei.js').YT.Channel} - */ + */ const channel = this.channelInstance let videosTab = await channel.getVideos() @@ -934,7 +934,7 @@ export default defineComponent({ try { /** * @type {import('youtubei.js').YT.Channel} - */ + */ const channel = this.channelInstance let liveTab = await channel.getLiveStreams() @@ -1426,7 +1426,7 @@ export default defineComponent({ try { /** * @type {import('youtubei.js').YT.Channel} - */ + */ const channel = this.channelInstance if (this.isArtistTopicChannel) { @@ -1561,7 +1561,7 @@ export default defineComponent({ try { /** * @type {import('youtubei.js').YT.Channel} - */ + */ const channel = this.channelInstance const podcastTab = await channel.getPodcasts() diff --git a/src/renderer/views/Watch/Watch.js b/src/renderer/views/Watch/Watch.js index 7f93657e75c86..369b03d6a53b5 100644 --- a/src/renderer/views/Watch/Watch.js +++ b/src/renderer/views/Watch/Watch.js @@ -722,7 +722,8 @@ export default defineComponent({ } if (result.storyboards?.type === 'PlayerStoryboardSpec') { - let source = result.storyboards.boards + /** @type {import('youtubei.js/dist/src/parser/classes/PlayerStoryboardSpec').StoryboardData[]} */ + let source = result.storyboardSpec.boards if (window.innerWidth < 500) { source = source.filter((board) => board.thumbnail_height <= 90) } @@ -1485,6 +1486,10 @@ export default defineComponent({ return result.adaptiveFormats }, + /** + * @param {import('youtubei.js/dist/src/parser/classes/PlayerStoryboardSpec').StoryboardData} storyboardInfo + * @returns {string} + */ createLocalStoryboardUrls: function (storyboardInfo) { const results = buildVTTFileLocally(storyboardInfo, this.videoLengthSeconds) diff --git a/yarn.lock b/yarn.lock index 7743085a3ba92..a9888ea607362 100644 --- a/yarn.lock +++ b/yarn.lock @@ -978,6 +978,15 @@ minimatch "^9.0.3" plist "^3.1.0" +"@es-joy/jsdoccomment@~0.49.0": + version "0.49.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz#e5ec1eda837c802eca67d3b29e577197f14ba1db" + integrity sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q== + dependencies: + comment-parser "1.4.1" + esquery "^1.6.0" + jsdoc-type-pratt-parser "~4.1.0" + "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2277,6 +2286,11 @@ app-builder-lib@25.1.8: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +are-docs-informative@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" + integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== + are-we-there-yet@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" @@ -2996,6 +3010,11 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +comment-parser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" @@ -3330,7 +3349,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.7: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -3988,6 +4007,11 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== +es-module-lexer@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" @@ -4138,6 +4162,23 @@ eslint-plugin-import@^2.31.0: string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" +eslint-plugin-jsdoc@^50.4.3: + version "50.4.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.3.tgz#38adf595555933775943771e906422b25cdfc780" + integrity sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA== + dependencies: + "@es-joy/jsdoccomment" "~0.49.0" + are-docs-informative "^0.0.2" + comment-parser "1.4.1" + debug "^4.3.6" + escape-string-regexp "^4.0.0" + espree "^10.1.0" + esquery "^1.6.0" + parse-imports "^2.1.1" + semver "^7.6.3" + spdx-expression-parse "^4.0.0" + synckit "^0.9.1" + eslint-plugin-jsonc@^2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.16.0.tgz#e90eca15aa2e172f5aca52a77fc8c819f52862d7" @@ -5964,6 +6005,11 @@ jsbn@1.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== +jsdoc-type-pratt-parser@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz#ff6b4a3f339c34a6c188cbf50a16087858d22113" + integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg== + jsesc@^3.0.2, jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" @@ -7036,6 +7082,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-imports@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/parse-imports/-/parse-imports-2.2.1.tgz#0a6e8b5316beb5c9905f50eb2bbb8c64a4805642" + integrity sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ== + dependencies: + es-module-lexer "^1.5.3" + slashes "^3.0.12" + parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -8341,6 +8395,11 @@ slash@^5.1.0: resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== +slashes@^3.0.12: + version "3.0.12" + resolved "https://registry.yarnpkg.com/slashes/-/slashes-3.0.12.tgz#3d664c877ad542dc1509eaf2c50f38d483a6435a" + integrity sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -8451,6 +8510,14 @@ spdx-expression-parse@^3.0.0: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-license-ids@^3.0.0: version "3.0.11" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" @@ -8853,6 +8920,14 @@ synckit@^0.9.0: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +synckit@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + table@^6.8.2: version "6.8.2" resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" From 08e5e3e40a31b8a041880674c3dc0179069f0199 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Sat, 2 Nov 2024 11:53:50 +0100 Subject: [PATCH 21/33] Migrate PasswordSettings and PasswordDialog to the composition API (#6036) --- .../PasswordDialog.css} | 0 .../PasswordDialog/PasswordDialog.vue | 45 +++++++++++++ .../PasswordSettings.css} | 0 .../PasswordSettings/PasswordSettings.vue | 67 +++++++++++++++++++ .../password-dialog/password-dialog.js | 27 -------- .../password-dialog/password-dialog.vue | 19 ------ .../password-settings/password-settings.js | 42 ------------ .../password-settings/password-settings.vue | 37 ---------- src/renderer/views/Settings/Settings.js | 4 +- 9 files changed, 114 insertions(+), 127 deletions(-) rename src/renderer/components/{password-dialog/password-dialog.css => PasswordDialog/PasswordDialog.css} (100%) create mode 100644 src/renderer/components/PasswordDialog/PasswordDialog.vue rename src/renderer/components/{password-settings/password-settings.css => PasswordSettings/PasswordSettings.css} (100%) create mode 100644 src/renderer/components/PasswordSettings/PasswordSettings.vue delete mode 100644 src/renderer/components/password-dialog/password-dialog.js delete mode 100644 src/renderer/components/password-dialog/password-dialog.vue delete mode 100644 src/renderer/components/password-settings/password-settings.js delete mode 100644 src/renderer/components/password-settings/password-settings.vue diff --git a/src/renderer/components/password-dialog/password-dialog.css b/src/renderer/components/PasswordDialog/PasswordDialog.css similarity index 100% rename from src/renderer/components/password-dialog/password-dialog.css rename to src/renderer/components/PasswordDialog/PasswordDialog.css diff --git a/src/renderer/components/PasswordDialog/PasswordDialog.vue b/src/renderer/components/PasswordDialog/PasswordDialog.vue new file mode 100644 index 0000000000000..c7e7fcbbf9093 --- /dev/null +++ b/src/renderer/components/PasswordDialog/PasswordDialog.vue @@ -0,0 +1,45 @@ + + + + +