From 227f473d948345d5d06ca54f06eff73cc099d8cf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Apr 2023 14:15:19 +0000 Subject: [PATCH 001/147] Update fedora Docker tag to v39 --- deployment/Dockerfile.fedora | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/Dockerfile.fedora b/deployment/Dockerfile.fedora index 9248c209d7..5e44024f2e 100644 --- a/deployment/Dockerfile.fedora +++ b/deployment/Dockerfile.fedora @@ -1,4 +1,4 @@ -FROM fedora:38 +FROM fedora:39 # Docker build arguments ARG SOURCE_DIR=/jellyfin From 5347f976b50ca77fec022895d690f5d925e0adcf Mon Sep 17 00:00:00 2001 From: arnolam Date: Thu, 20 Apr 2023 14:48:02 +0000 Subject: [PATCH 002/147] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 550 ++++++++++++++++++++--------------------- 1 file changed, 275 insertions(+), 275 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index b43107e64e..ec084cfd71 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -41,8 +41,8 @@ "HeaderCustomDlnaProfiles": "自訂設定檔", "HeaderDeleteItem": "刪除項目", "HeaderEasyPinCode": "簡易 PIN 碼", - "HeaderFeatureAccess": "可以使用的功能:", - "HeaderFetchImages": "擷取圖像:", + "HeaderFeatureAccess": "功能存取", + "HeaderFetchImages": "擷取圖像", "HeaderFrequentlyPlayed": "經常播放", "HeaderGuideProviders": "節目表提供者", "HeaderImageSettings": "圖像設置", @@ -63,47 +63,47 @@ "HeaderUsers": "使用者", "Help": "說明", "ItemCount": "{0}個項目", - "LabelAudioLanguagePreference": "音訊語言偏好選項:", - "LabelCachePath": "快取路徑:", - "LabelCollection": "收藏櫃:", - "LabelContentType": "內容類型:", - "LabelCountry": "國家/地區:", - "LabelCurrentPassword": "當前的密碼:", - "LabelDay": "星期:", + "LabelAudioLanguagePreference": "音訊語言偏好選項", + "LabelCachePath": "快取路徑", + "LabelCollection": "收藏櫃", + "LabelContentType": "內容類型", + "LabelCountry": "國家", + "LabelCurrentPassword": "當前的密碼", + "LabelDay": "星期", "LabelEnableDlnaClientDiscoveryInterval": "尋找用戶端時間間隔", "LabelEnableDlnaDebugLogging": "記錄 DLNA 除錯資料到日誌", "LabelEnableDlnaDebugLoggingHelp": "將會建立非常大的日誌檔案,建議在進行故障排除時啟用。", "LabelEnableDlnaPlayTo": "啟用DLNA播放功能", "LabelEnableRealtimeMonitor": "啟用即時監控", "LabelEnableRealtimeMonitorHelp": "檔案的更改將在支援的檔案系統上立即處理。", - "LabelEvent": "事件:", - "LabelEveryXMinutes": "每:", + "LabelEvent": "事件", + "LabelEveryXMinutes": "每", "LabelFinish": "完成", "LabelServerNameHelp": "名稱將作為伺服器名稱,預設是伺服器的主機名稱。", - "LabelLanguage": "語言:", - "LabelMaxBackdropsPerItem": "每個項目背景的最大數目:", - "LabelMaxParentalRating": "最大允許的家長評級:", + "LabelLanguage": "語言", + "LabelMaxBackdropsPerItem": "每個項目背景的最大數目", + "LabelMaxParentalRating": "最大允許的家長評級", "LabelMaxResumePercentage": "最大繼續播放百分比", "LabelMaxResumePercentageHelp": "媒體若於該時間後停止,會被認定為已播放。", "LabelMaxScreenshotsPerItem": "每件物品截圖的最大數量:", - "LabelMetadataPath": "媒體資訊路徑:", - "LabelMinBackdropDownloadWidth": "最小背景下載寬度:", - "LabelMinResumeDuration": "最小繼續播放時間:", + "LabelMetadataPath": "媒體資訊路徑", + "LabelMinBackdropDownloadWidth": "最小背景下載寬度", + "LabelMinResumeDuration": "最小繼續播放時間", "LabelMinResumeDurationHelp": "以秒為單位的最短影片長度,它將保存播放位置並讓您繼續播放。", - "LabelMinResumePercentage": "最低繼續播放百分比:", + "LabelMinResumePercentage": "最低繼續播放百分比", "LabelMinResumePercentageHelp": "媒體如果在這個時間之前停止,會被認定為未播放。", "LabelMinScreenshotDownloadWidth": "最小截圖下載寬度:", - "LabelName": "名字:", - "LabelNewPassword": "新密碼:", - "LabelNewPasswordConfirm": "確認新密碼:", - "LabelPassword": "密碼:", - "LabelPlaylist": "播放清單:", - "LabelRefreshMode": "更新模式:", + "LabelName": "名字", + "LabelNewPassword": "新密碼", + "LabelNewPasswordConfirm": "確認新密碼", + "LabelPassword": "密碼", + "LabelPlaylist": "播放清單", + "LabelRefreshMode": "更新模式", "LabelSaveLocalMetadata": "將媒體圖像和資訊存到媒體所在的資料夾", "LabelSaveLocalMetadataHelp": "在媒體資料夾中儲存媒體資訊和圖片會讓編輯更容易。", - "LabelTime": "時間:", - "LabelTriggerType": "觸發類型:", - "LabelUser": "使用者:", + "LabelTime": "時間", + "LabelTriggerType": "觸發類型", + "LabelUser": "使用者", "LabelYoureDone": "完成,耶!", "LibraryAccessHelp": "選擇與此使用者共享的媒體庫。管理員將可以使用媒體資訊管理器編輯所有的媒體資料夾。", "MaxParentalRatingHelp": "具有較高的家長評級內容將從這使用者被隱藏。", @@ -486,7 +486,7 @@ "HeaderPhotoAlbums": "相簿", "HeaderPinCodeReset": "重設簡易 PIN 碼", "HeaderPlayOn": "播放在", - "HeaderPlayback": "媒體播放:", + "HeaderPlayback": "媒體播放", "HeaderPlaybackError": "播放錯誤", "HeaderPluginInstallation": "附加元件安裝", "HeaderRecordingOptions": "錄影選項", @@ -538,7 +538,7 @@ "HeaderTranscodingProfile": "轉檔設定", "HeaderTranscodingProfileHelp": "新增轉檔設定檔標明哪些媒體格式需要轉檔處理。", "HeaderTuners": "調諧器", - "HeaderTypeImageFetchers": "圖片獲取程序 ({0}):", + "HeaderTypeImageFetchers": "圖片獲取程序 ({0})", "HeaderTypeText": "輸入文字", "HeaderUpcomingOnTV": "即將播放", "HeaderUploadImage": "上傳圖片", @@ -563,92 +563,92 @@ "InstantMix": "即時混音", "Items": "項目", "Kids": "兒童", - "Label3DFormat": "3D 格式:", + "Label3DFormat": "3D 格式", "LabelAbortedByServerShutdown": "(因為伺服器關閉被中止)", - "LabelAccessDay": "一週中的何時:", - "LabelAccessEnd": "結束時間:", - "LabelAccessStart": "開始時間:", - "LabelAirDays": "播出日期:", - "LabelAirTime": "播出時間:", - "LabelAirsAfterSeason": "在季度後播出:", - "LabelAirsBeforeEpisode": "在集數前播出:", - "LabelAirsBeforeSeason": "在季度前播出:", - "LabelAlbum": "專輯:", + "LabelAccessDay": "一週中的某一天", + "LabelAccessEnd": "結束時間", + "LabelAccessStart": "開始時間", + "LabelAirDays": "播出日期", + "LabelAirTime": "播出時間", + "LabelAirsAfterSeason": "在季度後播出", + "LabelAirsBeforeEpisode": "在集數前播出", + "LabelAirsBeforeSeason": "在季度前播出", + "LabelAlbum": "專輯", "LabelAlbumArtHelp": "PN 在 upnp:albumArtURI 裡的 dlna:profileID 屬性用於專輯封面。某些設備不管圖像的尺寸大小,都會要求特定的值。", - "LabelAlbumArtMaxHeight": "專輯封面最大高度:", - "LabelAlbumArtMaxWidth": "專輯封面最大寬度:", - "LabelAlbumArtPN": "專輯封面 PN :", - "LabelAlbumArtists": "專輯作家:", + "LabelAlbumArtMaxHeight": "專輯封面最大高度", + "LabelAlbumArtMaxWidth": "專輯封面最大寬度", + "LabelAlbumArtPN": "專輯封面 PN", + "LabelAlbumArtists": "專輯作家", "LabelAllowHWTranscoding": "允許硬體轉檔", - "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾:", - "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式:", + "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾", + "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式", "LabelAppName": "APP 名稱", "LabelAppNameExample": "例如:可愛蹦蹦主機、小安的 Jellyfin", - "LabelArtists": "藝人:", + "LabelArtists": "藝人", "LabelArtistsHelp": "將多位演出者以「;」分隔。", - "LabelAuthProvider": "認證提供者:", - "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動更新媒體資訊:", - "LabelBindToLocalNetworkAddress": "綁定本地網路地址:", + "LabelAuthProvider": "身份驗證提供者", + "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動更新媒體資訊", + "LabelBindToLocalNetworkAddress": "綁定本地網路地址", "LabelBindToLocalNetworkAddressHelp": "(選用)覆蓋 HTTP 伺服器綁定的本地 IP 位址。留空則將監聽所有可用的位址。更改此欄位需重啟伺服器。", - "LabelBirthDate": "出生日期:", - "LabelBirthYear": "出生年:", + "LabelBirthDate": "出生日期", + "LabelBirthYear": "出生年", "LabelBlastMessageInterval": "活動信號的時間間隔", "LabelBlastMessageIntervalHelp": "確定伺服器活動消息之間的持續時間(秒)。", - "LabelBlockContentWithTags": "通過標籤鎖定內容:", - "LabelBurnSubtitles": "燒錄字幕:", - "LabelCache": "快取:", + "LabelBlockContentWithTags": "阻止帶有標籤的項目", + "LabelBurnSubtitles": "燒錄字幕", + "LabelCache": "快取", "LabelCachePathHelp": "選擇指定所需的快取檔案(像是圖片)路徑。保留空白以使用預設設定。", "LabelCancelled": "已取消", - "LabelCertificatePassword": "證書密碼:", + "LabelCertificatePassword": "證書密碼", "LabelCertificatePasswordHelp": "如果你的證書需要密碼,請在此輸入它。", - "LabelChannels": "頻道:", + "LabelChannels": "頻道", "LabelCommunityRating": "討論區評分", - "LabelCriticRating": "影評評分:", - "LabelCustomCertificatePath": "自訂 SSL 證書路徑:", + "LabelCriticRating": "影評評分", + "LabelCustomCertificatePath": "自訂 SSL 證書路徑", "LabelCustomCertificatePathHelp": "提供包含證書和金鑰的 PKCS #12 文件的路徑以在自訂域名上啟用 TLS。", - "LabelCustomCss": "自訂 CSS:", + "LabelCustomCss": "自訂 CSS", "LabelCustomCssHelp": "於網頁介面套用您自訂的標籤或品牌樣式。", "Depressed": "凹陷", "HeaderSelectMetadataPathHelp": "瀏覽或者輸入儲存媒體資訊的資料夾,請確保資料夾可以寫入。", "HeaderSelectServerCachePathHelp": "瀏覽或者輸入路徑以用於伺服器快取檔案。請確保該資料夾可以被寫入。", "LabelCustomDeviceDisplayNameHelp": "指定自訂的顯示名稱,或者留空以使用設備自己報告的名稱。", - "LabelCustomRating": "自訂分級:", - "LabelDashboardTheme": "控制台佈景主題:", - "LabelDateAdded": "新增日期:", - "LabelDateAddedBehavior": "新內容加入的日期應使用:", - "LabelDateTimeLocale": "設定時區:", - "LabelDeathDate": "死亡時間:", - "LabelDefaultScreen": "預設分頁:", - "LabelDefaultUser": "預設使用者:", - "LabelDeviceDescription": "裝置說明:", - "LabelDidlMode": "DIDL 模式:", - "LabelDiscNumber": "光碟編號:", - "LabelDisplayLanguage": "顯示語言:", + "LabelCustomRating": "自定義評級", + "LabelDashboardTheme": "控制台佈景主題", + "LabelDateAdded": "新增日期", + "LabelDateAddedBehavior": "新增內容的添加日期行", + "LabelDateTimeLocale": "設定時區", + "LabelDeathDate": "死亡時間", + "LabelDefaultScreen": "預設分頁", + "LabelDefaultUser": "預設使用者", + "LabelDeviceDescription": "裝置說明", + "LabelDidlMode": "DIDL 模式", + "LabelDiscNumber": "光碟編號", + "LabelDisplayLanguage": "顯示語言", "LabelDisplayLanguageHelp": "翻譯 Jellyfin 是個進行中的專案。", - "LabelDisplayMode": "顯示模式:", - "LabelDisplayName": "顯示名稱:", + "LabelDisplayMode": "顯示模式", + "LabelDisplayName": "顯示名稱", "MessageNoPluginsInstalled": "您尚未安裝任何附加元件。", "Mobile": "手機", "Option3D": "3D", "OptionEveryday": "每天", "OptionMax": "最大", - "LabelAudioBitDepth": "音訊位元深度:", - "LabelBaseUrl": "根路徑:", - "LabelIconMaxHeight": "圖示最高高度:", + "LabelAudioBitDepth": "音訊位元深度", + "LabelBaseUrl": "根路徑", + "LabelIconMaxHeight": "圖示最高高度", "LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 埠。", "CopyStreamURL": "複製串流連結", "MediaInfoDefault": "預設", "LabelDateAddedBehaviorHelp": "若原本存在媒體資訊,將會優先使用現存資訊。", - "LabelScreensaver": "螢幕保護程式:", - "LabelSeasonNumber": "季:", + "LabelScreensaver": "螢幕保護程式", + "LabelSeasonNumber": "季", "LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。", - "LabelImageType": "圖片格式:", + "LabelImageType": "圖片格式", "LabelIdentificationFieldHelp": "不區分大小寫的子字串或正則表達式。", "Large": "大", - "LabelTranscodePath": "轉檔路徑:", - "LabelTranscodes": "轉檔:", + "LabelTranscodePath": "轉檔路徑", + "LabelTranscodes": "轉檔", "MinutesAfter": "分後", - "LabelVersion": "版本:", + "LabelVersion": "版本", "LabelVersionInstalled": "{0} 已安裝", "DashboardVersionNumber": "版本:{0}", "DashboardServerName": "伺服器:{0}", @@ -670,12 +670,12 @@ "ValueAudioCodec": "音訊編碼:{0}", "ValueCodec": "編碼:{0}", "ValueSongCount": "{0} 首歌", - "LabelFileOrUrl": "檔案或路徑:", + "LabelFileOrUrl": "檔案或路徑", "LabelKodiMetadataSaveImagePaths": "在 NFO 檔案中儲存圖片路徑", - "LabelLanNetworks": "區域網路:", + "LabelLanNetworks": "區域網路", "LabelMetadataPathHelp": "儲存下載的圖片與媒體資訊的資料夾。", - "LabelZipCode": "郵遞區號:", - "LabelffmpegPath": "FFmpeg 路徑:", + "LabelZipCode": "郵遞區號", + "LabelffmpegPath": "FFmpeg 路徑", "LearnHowYouCanContribute": "了解如何貢獻。", "Played": "已看過", "RefreshMetadata": "更新媒體資訊", @@ -687,40 +687,40 @@ "ShowYear": "顯示年份", "Shuffle": "隨機播放", "Smart": "智慧", - "LabelAudioBitrate": "音訊位元率:", - "LabelAudioCodec": "音訊編碼:", - "LabelBitrate": "位元率:", - "LabelAudioChannels": "音訊聲道:", - "LabelAudioSampleRate": "音訊取樣率:", - "LabelFont": "字體:", - "LabelFolder": "資料夾:", - "LabelDisplayOrder": "顯示順序:", + "LabelAudioBitrate": "音訊位元率", + "LabelAudioCodec": "音訊編碼", + "LabelBitrate": "位元率", + "LabelAudioChannels": "音訊聲道", + "LabelAudioSampleRate": "音訊取樣率", + "LabelFont": "字體", + "LabelFolder": "資料夾", + "LabelDisplayOrder": "顯示順序", "LabelEnableBlastAliveMessages": "活動訊息", "LabelEnableDlnaServer": "啟用 DLNA 伺服器", "LabelEnableDlnaServerHelp": "允許網路上的 UPnP 設備瀏覽和播放內容。", - "LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:", - "LabelEpisodeNumber": "集:", + "LabelEnableHardwareDecodingFor": "啟用硬體解碼", + "LabelEpisodeNumber": "集數", "LabelBaseUrlHelp": "您可以在此處自訂伺服器 URL 路徑的子目錄,如:http://example.com/<baseurl>", "LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片", - "LabelHttpsPort": "本地 HTTPS 埠:", + "LabelHttpsPort": "本地 HTTPS 埠", "LabelFailed": "失敗", - "LabelSupportedMediaTypes": "支援的媒體類型:", - "LabelTextBackgroundColor": "文字背景顏色:", - "LabelTextColor": "文字顏色:", - "LabelTextSize": "文字大小:", - "LabelTheme": "主題:", - "LabelTimeLimitHours": "時間限制(小時):", - "LabelTitle": "標題:", - "LabelTrackNumber": "音軌編號:", - "LabelTranscodingFramerate": "轉檔幀率:", - "LabelTranscodingProgress": "轉檔進度:", - "LabelType": "類型:", - "LabelTypeMetadataDownloaders": "媒體資訊來源 ({0}):", + "LabelSupportedMediaTypes": "支援的媒體類型", + "LabelTextBackgroundColor": "文字背景顏色", + "LabelTextColor": "文字顏色", + "LabelTextSize": "文字大小", + "LabelTheme": "主題", + "LabelTimeLimitHours": "時間限制(小時)", + "LabelTitle": "標題", + "LabelTrackNumber": "音軌編號", + "LabelTranscodingFramerate": "轉檔幀率", + "LabelTranscodingProgress": "轉檔進度", + "LabelType": "類型", + "LabelTypeMetadataDownloaders": "媒體資訊來源 ({0})", "LabelTypeText": "文本", - "LabelUsername": "使用者名稱:", + "LabelUsername": "使用者名稱", "DashboardOperatingSystem": "作業系統:{0}", - "LabelVideoCodec": "影片編碼:", - "LabelYear": "年:", + "LabelVideoCodec": "影片編碼", + "LabelYear": "年", "LatestFromLibrary": "最新的{0}", "Logo": "標誌", "ManageLibrary": "管理媒體庫", @@ -771,8 +771,8 @@ "ViewAlbum": "查看專輯", "LabelKodiMetadataDateFormatHelp": "NFO 檔案中的所有日期都將使用此格式。", "LabelServerHostHelp": "192.168.1.100:8096 或是 https://myserver.com", - "LabelServerName": "伺服器名稱:", - "LabelTag": "標記:", + "LabelServerName": "伺服器名稱", + "LabelTag": "標籤", "LabelTranscodingTempPathHelp": "指定轉檔後的儲存路徑,留空將使用預設值。", "LabelffmpegPathHelp": "FFmpeg 的路徑,或是包含其的資料夾。", "ManageRecording": "管理錄影", @@ -787,25 +787,25 @@ "TV": "電視", "Trailers": "預告", "LabelImageFetchersHelp": "啟用並按優先順序排序您的首選圖片擷取器。", - "LabelDownMixAudioScale": "縮混時的音訊增強:", + "LabelDownMixAudioScale": "縮混時音訊增強", "LabelDownMixAudioScaleHelp": "縮混時增強音訊。其中一個音軌將保持原始音量。", - "LabelDownloadLanguages": "下載語言:", + "LabelDownloadLanguages": "下載語言", "LabelDynamicExternalId": "{0} Id", - "LabelEasyPinCode": "簡易 PIN 碼:", + "LabelEasyPinCode": "簡易 PIN 碼", "LabelEnableAutomaticPortMap": "啟用自動埠映射", "LabelEnableSingleImageInDidlLimit": "限制單個嵌入式圖片", - "LabelEndDate": "結束日期:", + "LabelEndDate": "結束日期", "LabelLockItemToPreventChanges": "鎖定此項目來避免被更改", - "LabelManufacturer": "製造商:", + "LabelManufacturer": "製造商", "LabelLoginDisclaimerHelp": "顯示在登入頁面底部的訊息。", - "LabelManufacturerUrl": "製造商網址:", - "LabelMaxChromecastBitrate": "Google Cast 串流解析度:", - "LabelOriginalTitle": "原始標題:", - "LabelSelectUsers": "選擇使用者:", - "LabelSelectVersionToInstall": "選擇要安裝的版本:", - "LabelSendNotificationToUsers": "傳送通知給:", - "LabelSortBy": "排序按照:", - "LabelVideoBitrate": "影片位元率:", + "LabelManufacturerUrl": "製造商網址", + "LabelMaxChromecastBitrate": "Google Cast 串流解析度", + "LabelOriginalTitle": "原始標題", + "LabelSelectUsers": "選擇使用者", + "LabelSelectVersionToInstall": "選擇要安裝的版本", + "LabelSendNotificationToUsers": "傳送通知給", + "LabelSortBy": "排序按照", + "LabelVideoBitrate": "影片位元率", "MediaInfoSize": "大小", "MediaInfoTimestamp": "時間戳", "Menu": "選單", @@ -819,28 +819,28 @@ "Yes": "是", "ButtonAddImage": "新增圖片", "LabelForgotPasswordUsernameHelp": "假如您還記得的話,請輸入您的使用者名稱。", - "LabelFormat": "格式:", - "LabelFriendlyName": "好聽的名字:", + "LabelFormat": "格式", + "LabelFriendlyName": "好聽的名字", "LabelGroupMoviesIntoCollections": "將電影分組", - "LabelKodiMetadataDateFormat": "釋出日期格式:", - "LabelIconMaxWidth": "Icon 最寬寬度:", + "LabelKodiMetadataDateFormat": "釋出日期格式", + "LabelIconMaxWidth": "Icon 最寬寬度", "LabelGroupMoviesIntoCollectionsHelp": "選擇檢視電影清單時,集合中的電影將作為一個分組項目顯示。", - "LabelEncoderPreset": "預設編碼:", - "LabelHardwareAccelerationType": "硬體加速:", + "LabelEncoderPreset": "預設編碼", + "LabelHardwareAccelerationType": "硬體加速", "LabelImportOnlyFavoriteChannels": "僅限收藏的頻道", "LabelInNetworkSignInWithEasyPassword": "啟用 簡易 PIN code 進行區域網路登入", "LabelH264Crf": "H.264 編碼 CRF", - "LabelMaxStreamingBitrate": "最大串流畫質:", + "LabelMaxStreamingBitrate": "最大串流畫質", "LabelMaxStreamingBitrateHelp": "指定最大串流位元率。", - "LabelMessageText": "訊息文字:", - "LabelMessageTitle": "訊息標題:", - "LabelMetadataDownloadLanguage": "偏好下載語言:", - "LabelMetadata": "媒體資訊:", - "LabelMethod": "方法:", - "LabelNewName": "新名稱:", - "LabelProfileAudioCodecs": "音訊編碼:", - "LabelProfileCodecs": "編碼:", - "LabelProfileVideoCodecs": "影片編碼:", + "LabelMessageText": "訊息文字", + "LabelMessageTitle": "訊息標題", + "LabelMetadataDownloadLanguage": "偏好下載語言", + "LabelMetadata": "媒體資訊", + "LabelMethod": "方法", + "LabelNewName": "新名稱", + "LabelProfileAudioCodecs": "音訊編碼", + "LabelProfileCodecs": "編碼", + "LabelProfileVideoCodecs": "影片編碼", "Live": "直播", "NumLocationsValue": "{0} 個資料夾", "RemoveFromPlaylist": "從播放清單中移除", @@ -893,15 +893,15 @@ "People": "人物", "OptionEnableExternalContentInSuggestions": "在建議中啟用外部內容", "OptionEnableM2tsMode": "啟用 M2TS 模式", - "LabelKeepUpTo": "保持:", - "LabelKidsCategories": "兒童分類:", + "LabelKeepUpTo": "保持", + "LabelKidsCategories": "兒童分類", "LabelKodiMetadataEnablePathSubstitution": "啟用路徑取代", "LabelKodiMetadataEnableExtraThumbs": "複製 extrafanart 到 extrathumbs 欄位", - "LabelMovieCategories": "電影分類:", - "LabelMoviePrefix": "電影前綴:", + "LabelMovieCategories": "電影分類", + "LabelMoviePrefix": "電影前綴", "LabelProfileContainer": "影片容器", - "LabelDropShadow": "陰影:", - "LabelTVHomeScreen": "電視模式主畫面:", + "LabelDropShadow": "陰影", + "LabelTVHomeScreen": "電視模式主畫面", "MovieLibraryHelp": "查看 {0}Jellyfin 電影命名指南{1}。", "None": "無", "OptionAllowMediaPlaybackTranscodingHelp": "限制轉檔可能會導致播放不支援的格式時失敗。", @@ -917,14 +917,14 @@ "XmlTvMovieCategoriesHelp": "有這些類別的節目會被當作電影,以「|」來分隔多個項目。", "ValueSeriesCount": "{0} 劇集", "LabelHardwareAccelerationTypeHelp": "硬體加速需要額外的配置。", - "LabelHomeNetworkQuality": "區域網路畫質:", - "LabelHomeScreenSectionValue": "主畫面模組 {0}:", + "LabelHomeNetworkQuality": "區域網路畫質", + "LabelHomeScreenSectionValue": "主畫面模組 {0}", "LabelMetadataDownloadersHelp": "啟用和排序媒體資訊來源的優先度,優先度較低的資訊來源只會用來填補缺少的資訊。", - "LabelMetadataReaders": "媒體資訊讀取器:", + "LabelMetadataReaders": "媒體資訊讀取器", "LabelMetadataSaversHelp": "選取儲存媒體資訊的檔案格式。", - "LabelModelNumber": "型號:", - "LabelNewsCategories": "新分類:", - "LabelValue": "數值:", + "LabelModelNumber": "型號", + "LabelNewsCategories": "新分類", + "LabelValue": "數值", "OptionEnableAccessToAllChannels": "允許存取所有頻道", "OptionEnableAccessToAllLibraries": "允許存取所有媒體庫", "OptionEnableForAllTuners": "開啟所有調諧器", @@ -947,7 +947,7 @@ "SimultaneousConnectionLimitHelp": "允許的同時串流的最大數量。輸入 0 表示無限制。", "SkipEpisodesAlreadyInMyLibrary": "不錄製已存在於媒體庫中的劇集", "SmallCaps": "小型大寫字母", - "SortChannelsBy": "頻道排序方式:", + "SortChannelsBy": "頻道排序方式", "SortName": "排序名稱", "Sports": "體育", "StopRecording": "停止錄影", @@ -957,39 +957,39 @@ "LabelEnableDlnaPlayToHelp": "偵測您網路裡的設備並遠端控制它們。", "LabelExtractChaptersDuringLibraryScanHelp": "當媒體庫匯入影片並掃描時,將擷取章節圖片。否則,章節圖片將在之後的計畫任務中擷取,而媒體庫會更快完成掃描。", "LabelMoviePrefixHelp": "若前綴套用到電影標題,請在此處輸入它來方便伺服器能夠正確處理。", - "LabelMovieRecordingPath": "電影錄製路徑:", + "LabelMovieRecordingPath": "電影錄製路徑", "LabelNotificationEnabled": "啟用這個通知", "LabelProfileContainersHelp": "以逗號分隔,留空則適用於所有影片容器。", "LabelSelectFolderGroupsHelp": "未選中的資料夾將在其自己的檢視中顯示。", - "LabelSerialNumber": "序號:", - "LabelSeriesRecordingPath": "影集錄影路徑:", - "LabelServerHost": "主機:", - "LabelSimultaneousConnectionLimit": "同時串流限制:", - "LabelSize": "大小:", - "LabelSkipBackLength": "跳過長度:", + "LabelSerialNumber": "序號", + "LabelSeriesRecordingPath": "影集錄影路徑", + "LabelServerHost": "主機", + "LabelSimultaneousConnectionLimit": "同時串流限制", + "LabelSize": "大小", + "LabelSkipBackLength": "跳過長度", "LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉檔的機會。", - "LabelStopWhenPossible": "當可能時自動停止:", + "LabelStopWhenPossible": "當可能時自動停止", "LabelStopping": "停止", - "LabelTagline": "個性宣言:", - "LabelSubtitleDownloaders": "字幕下載器:", + "LabelTagline": "個性宣言", + "LabelSubtitleDownloaders": "字幕下載器", "LabelSubtitleFormatHelp": "如:SRT", - "LabelSubtitlePlaybackMode": "字幕載入:", - "LabelTranscodingThreadCount": "轉檔執行緒數:", - "LabelTunerIpAddress": "調諧器 IP 位址:", - "LabelTunerType": "調諧器類型:", - "LabelUseNotificationServices": "使用以下服務:", - "LabelUserAgent": "使用者代理:", - "LabelUserLibrary": "使用者程式庫:", + "LabelSubtitlePlaybackMode": "字幕載入", + "LabelTranscodingThreadCount": "轉檔執行緒數", + "LabelTunerIpAddress": "調諧器 IP 位址", + "LabelTunerType": "調諧器類型", + "LabelUseNotificationServices": "使用以下服務", + "LabelUserAgent": "使用者代理", + "LabelUserLibrary": "使用者程式庫", "LabelUserLibraryHelp": "選擇在裝置上顯示的使用者媒體庫,留空則使用預設設定值。", - "LabelUserLoginAttemptsBeforeLockout": "使用者被封鎖前可嘗試的次數:", + "LabelUserLoginAttemptsBeforeLockout": "使用者被封鎖前可嘗試的次數", "LabelVaapiDeviceHelp": "此渲染節點用來硬體加速。", - "LabelWeb": "網站:", + "LabelWeb": "網站", "LabelXDlnaCapHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X_DLNACAP 元素的內容。", "LabelXDlnaDocHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X-Dlna doc 元素的內容。", "LabelUserRemoteClientBitrateLimitHelp": "覆蓋伺服器設定中的預設全域值。詳請參照 控制台 > 播放 > 串流。", "LabelTranscodingThreadCountHelp": "選擇轉檔時要使用的最大執行緒數,減少執行緒數將降低 CPU 使用率,但轉換速度可能不足以提供流暢的播放體驗。", - "LabelXDlnaCap": "裝置功能 ID:", - "LabelXDlnaDoc": "裝置類別 ID:", + "LabelXDlnaCap": "裝置功能 ID", + "LabelXDlnaDoc": "裝置類別 ID", "LeaveBlankToNotSetAPassword": "您可以將此欄位留空來將密碼設定為無。", "LiveTV": "電視直播", "MapChannels": "映射頻道", @@ -1013,7 +1013,7 @@ "MessageEnablingOptionLongerScans": "啟用這個選項可能會延長媒體庫的掃描時間。", "MessageFileReadError": "讀取檔案時發生錯誤。", "MessageForgotPasswordInNetworkRequired": "請檢查您的區域網路後再開始密碼重設流程。", - "MessageForgotPasswordFileCreated": "已在伺服器上建立了以下檔案,並包含有關後續步驟說明:", + "MessageForgotPasswordFileCreated": "已在伺服器上建立了以下檔案,並包含有關後續步驟說明", "MessageNoAvailablePlugins": "沒有可用的附加元件。", "MessageNoServersAvailable": "無法自動偵測伺服器。", "MessageLeaveEmptyToInherit": "留空以使用上級設定或全域預設值。", @@ -1033,7 +1033,7 @@ "OptionAllowRemoteSharedDevices": "允許遠端控制共享裝置", "OptionAllowSyncTranscoding": "允許需要轉檔的媒體下載和同步", "OptionAllowVideoPlaybackRemuxing": "允許播放需轉換但無需重新編碼的影片", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒體位置將從您的媒體庫中刪除:", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒體位置將從您的媒體庫中刪除", "MetadataSettingChangeHelp": "更改媒體資訊設定只會影響未來新增的內容。要更新現有內容,請打開詳細訊息視頁面並點選「更新」按鈕,或使用媒體資訊管理器進行批次更新。", "MusicLibraryHelp": "查看{0}音樂命名指南{1}。", "OptionAutomaticallyGroupSeries": "自動合併分布在不同資料夾的電視劇", @@ -1077,7 +1077,7 @@ "Rate": "評等", "Recordings": "錄影", "ServerRestartNeededAfterPluginInstall": "安裝附加元件後,Jellyfin 伺服器需要重啟使其生效。", - "ShowIndicatorsFor": "顯示指標:", + "ShowIndicatorsFor": "顯示指標", "Sort": "排序", "Studios": "工作室", "TheseSettingsAffectSubtitlesOnThisDevice": "這些設定僅影響該裝置的字幕顯示", @@ -1087,13 +1087,13 @@ "Unmute": "取消靜音", "Unplayed": "尚未播放", "TvLibraryHelp": "查看 {0} 電視命名指南 {1} 。", - "LabelMonitorUsers": "監控活動:", + "LabelMonitorUsers": "監控活動", "LabelPleaseRestart": "改動將在手動重啟用戶端後生效。", "LabelProfileCodecsHelp": "以逗號分隔。留空則適用於所有編解碼器。", "OptionPlainStorageFoldersHelp": "所有資料夾在 DIDL 中顯示為「object.container.storageFolder 」,而不是一個更具體的類型,如「object.container.person.musicArtist」。", "LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的區域網路中使用你的簡易 PIN code 登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN code 留空,那麼在你的區域網路中便不需輸入密碼。", - "LabelReleaseDate": "釋出日期:", - "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps):", + "LabelReleaseDate": "釋出日期", + "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps)", "LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。", "OptionIgnoreTranscodeByteRangeRequests": "忽略轉檔位元組範圍請求", "OptionIgnoreTranscodeByteRangeRequestsHelp": "這些請求會被接受,但會忽略的位元組範圍標頭。", @@ -1107,43 +1107,43 @@ "SettingsWarning": "更改這些值可能會導致不穩定或連線故障。如果您遇到任何問題,建議將它們重新更改為預設值。", "LabelEnableSingleImageInDidlLimitHelp": "若在 DIDL 中嵌入多個圖片,某些裝置可能無法正常顯示。", "SortByValue": "排序方式:{0}", - "LabelLineup": "排隊:", - "LabelLocalHttpServerPortNumber": "本地 HTTP 埠:", + "LabelLineup": "排隊", + "LabelLocalHttpServerPortNumber": "本地 HTTP 埠", "LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 埠。", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "此設定也會影響透過此裝置投放的 Google Cast。", - "LabelLoginDisclaimer": "登入字句:", - "LabelLogs": "日誌:", + "LabelLoginDisclaimer": "登入免責聲明", + "LabelLogs": "日誌", "SubtitleDownloadersHelp": "按優先順序啟用並排列您的首選字幕下載程式。", - "LabelMatchType": "匹配的類型:", + "LabelMatchType": "匹配的類型", "SystemDlnaProfilesHelp": "系統設定檔案是唯讀的,更改系統設定檔案將被儲存到自訂的新設定檔案。", - "LabelNumber": "編號:", - "LabelNumberOfGuideDays": "下載電視指南日數:", + "LabelNumber": "編號", + "LabelNumberOfGuideDays": "下載電視指南日數", "OnlyForcedSubtitlesHelp": "僅標記為「強制」的字幕會被載入。", "PackageInstallCompleted": "{0} (版本 {1}) 安裝完成。", "OptionDisplayFolderViewHelp": "在其他媒體庫旁邊顯示資料夾,對想要一個普通的資料夾檢視很有用。", - "LabelReasonForTranscoding": "轉檔原因:", - "LabelRecord": "錄影:", - "LabelRecordingPath": "預設錄影路徑:", + "LabelReasonForTranscoding": "轉檔原因", + "LabelRecord": "錄影", + "LabelRecordingPath": "預設錄影路徑", "LabelRecordingPathHelp": "指定用於存儲轉檔的位置,留空將使用伺服器的程式根目錄。", "LabelRemoteClientBitrateLimitHelp": "所有網路裝置都能夠調整流位元率限制,這對於防止設備請求比網路連接所能處理的更高的位元率非常有用。這可能會導致伺服器上的 CPU 負載增加,以便將影片轉檔到較低的位元率。", "SmartSubtitlesHelp": "當音訊為外語時,將載入與語言偏好匹配的字幕。", "SubtitleAppearanceSettingsDisclaimer": "這些設定不會套用在圖形字幕(如 PGS、DVD 等),或者一些有著自己的內建樣式的字幕(如 ASS/SSA)。", "UserAgentHelp": "提供自訂的使用者代理 HTTP 標頭。", - "LabelRuntimeMinutes": "播放時間:", + "LabelRuntimeMinutes": "播放時間", "LabelScheduledTaskLastRan": "最後執行 {0},花費時間 {1}。", - "LabelSkipForwardLength": "快轉長度:", + "LabelSkipForwardLength": "快轉長度", "LabelSkipIfAudioTrackPresent": "如果預設音軌的語言和下載語言一樣則跳過", "LabelSkipIfAudioTrackPresentHelp": "取消此項,無論音訊語言是否一致,所有影片都會下載字幕。", "LabelSkipIfGraphicalSubsPresent": "跳過有內嵌字幕的影片", - "LabelSonyAggregationFlags": "Sony 整合標誌:", + "LabelSonyAggregationFlags": "Sony 整合標誌", "LabelSonyAggregationFlagsHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 aggregationFlags 元素的內容。", - "LabelSortOrder": "排列順序:", - "LabelSortTitle": "短標題:", - "LabelSource": "來源:", - "LabelSpecialSeasonsDisplayName": "SP 季顯示名稱:", - "LabelSportsCategories": "體育分類:", - "LabelStartWhenPossible": "當可能時自動開始:", - "LabelVaapiDevice": "VA-API 裝置:", + "LabelSortOrder": "排列順序", + "LabelSortTitle": "短標題", + "LabelSource": "來源", + "LabelSpecialSeasonsDisplayName": "SP 季顯示名稱", + "LabelSportsCategories": "體育分類", + "LabelStartWhenPossible": "當可能時自動開始", + "LabelVaapiDevice": "VA-API 裝置", "DashboardArchitecture": "架構:{0}", "MediaInfoSampleRate": "採樣率", "MessageContactAdminToResetPassword": "請聯絡您的管理員來重設密碼。", @@ -1154,47 +1154,47 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "這對一些時間跳轉緩慢的裝置是必要的。", "XmlTvNewsCategoriesHelp": "有這些類別的節目會被當作新聞節目,以「|」來分隔多個項目。", "LabelKodiMetadataEnableExtraThumbsHelp": "為了相容 Kodi 主題,下載的圖片將被同時儲存在 extrafanart 和 extrathumbs 資料夾中。", - "LabelInternetQuality": "網路畫質:", + "LabelInternetQuality": "網路畫質", "LabelKodiMetadataEnablePathSubstitutionHelp": "允許將圖片的路徑以伺服器路徑取代。", "LabelKodiMetadataSaveImagePathsHelp": "若如果您的圖片檔案名稱不符合 Kodi 規範,建議啟用。", - "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案中:", + "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案中", "LabelKodiMetadataUserHelp": "儲存觀看資料到 NFO 檔案中以便其他應用程式使用。", "LabelMetadataReadersHelp": "排序媒體資訊來源的優先度,將會讀取第一個找到的檔案。", - "LabelMetadataSavers": "媒體資訊儲存方式:", - "LabelModelDescription": "型號描述:", - "LabelModelName": "型號名稱:", - "LabelModelUrl": "型號網址:", - "LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率:", + "LabelMetadataSavers": "媒體資訊儲存方式", + "LabelModelDescription": "型號描述", + "LabelModelName": "型號名稱", + "LabelModelUrl": "型號網址", + "LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率", "LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大位元率。", "LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他應用程式直接存取媒體檔案,例如 {0} 或者 {1}。", - "LabelOriginalAspectRatio": "原始長寬比:", - "LabelOverview": "內容概述:", - "LabelParentalRating": "分級:", - "LabelPasswordConfirm": "確認密碼:", - "LabelPasswordResetProvider": "密碼重設提供者:", - "LabelPasswordRecoveryPinCode": "PIN 碼:", - "LabelPath": "路徑:", - "LabelPersonRole": "角色:", + "LabelOriginalAspectRatio": "原始長寬比", + "LabelOverview": "內容概述", + "LabelParentalRating": "分級", + "LabelPasswordConfirm": "確認密碼", + "LabelPasswordResetProvider": "密碼重設提供者", + "LabelPasswordRecoveryPinCode": "PIN 碼", + "LabelPath": "路徑", + "LabelPersonRole": "角色", "LabelPersonRoleHelp": "例如:冰淇淋車司機", - "LabelPlaceOfBirth": "出生地:", + "LabelPlaceOfBirth": "出生地", "LabelPlayDefaultAudioTrack": "無論如何都播放預設音軌", - "LabelPlayer": "播放器:", - "LabelPlayMethod": "播放方式:", - "LabelParentNumber": "父編號:", + "LabelPlayer": "播放器", + "LabelPlayMethod": "播放方式", + "LabelParentNumber": "父編號", "LabelPostProcessor": "後處理應用程式", "LabelPostProcessorArguments": "處理器後命令行參數", "LabelPostProcessorArgumentsHelp": "使用 {path} 作為錄製檔案的路徑。", - "LabelPreferredDisplayLanguage": "首選語言:", - "LabelPreferredSubtitleLanguage": "字幕語言偏好:", - "LabelProtocol": "協議:", - "LabelProtocolInfo": "協議資訊:", - "LabelPublicHttpPort": "公開 HTTP 埠:", - "LabelPublicHttpsPort": "公開 HTTPS 埠:", + "LabelPreferredDisplayLanguage": "首選語言", + "LabelPreferredSubtitleLanguage": "字幕語言偏好", + "LabelProtocol": "協議", + "LabelProtocolInfo": "協議資訊", + "LabelPublicHttpPort": "公開 HTTP 埠", + "LabelPublicHttpsPort": "公開 HTTPS 埠", "LabelProtocolInfoHelp": "當響應來自裝置的 GetProtocolInfo(獲取協議訊息)請求時,該值將被使用。", "LabelPublicHttpPortHelp": "公開連接埠應映射到本地 HTTP 連接埠。", "LabelPublicHttpsPortHelp": "公開連接埠應映射到本地 HTTPS 連接埠。", - "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組到視圖中,例如電影、音樂和電視:", - "LabelStatus": "狀態:", + "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組到視圖中,例如電影、音樂和電視", + "LabelStatus": "狀態", "LiveBroadcasts": "直播", "MessageImageTypeNotSelected": "在下拉選單中選取圖片類型。", "RemoveFromCollection": "從收藏移除", @@ -1218,7 +1218,7 @@ "TabResponses": "響應", "LabelDisplaySpecialsWithinSeasons": "顯示劇集季度中的特集", "LabelNumberOfGuideDaysHelp": "下載多日的節目指南可以幫你進一步查看節目列表並做出提前安排,但下載過程也將耗時更久。它將基於頻道數量自動選擇。", - "LabelOptionalNetworkPath": "分享的網路資料夾:", + "LabelOptionalNetworkPath": "分享的網路資料夾", "OptionResElement": "'res' 元素", "PinCodeResetComplete": "簡易 PIN code 已被重設。", "PinCodeResetConfirmation": "你確定要重設簡易 PIN code 嗎?", @@ -1233,11 +1233,11 @@ "OptionAllowRemoteSharedDevicesHelp": "DLNA裝置將被視為共享中,直至有使用者控制。", "OptionForceRemoteSourceTranscoding": "強制遠端轉檔(像電視直播一樣)", "MessageConfirmAppExit": "您要退出嗎?", - "LabelVideoResolution": "影片解析度:", - "LabelStreamType": "串流類型:", - "LabelPlayerDimensions": "播放器尺寸:", - "LabelDroppedFrames": "丟棄的幀:", - "LabelCorruptedFrames": "損壞的幀:", + "LabelVideoResolution": "影片解析度", + "LabelStreamType": "串流類型", + "LabelPlayerDimensions": "播放器尺寸", + "LabelDroppedFrames": "丟棄的幀", + "LabelCorruptedFrames": "損壞的幀", "ButtonSplit": "分割", "AskAdminToCreateLibrary": "如要建立資料庫,請聯絡管理員。", "NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}", @@ -1267,8 +1267,8 @@ "Person": "人物", "Movie": "電影", "LabelLibraryPageSizeHelp": "設置媒體庫頁面每頁要顯示的最多媒體個數。設置為 0 來停用分頁。", - "LabelLibraryPageSize": "媒體庫分頁大小:", - "LabelDeinterlaceMethod": "反交錯方法:", + "LabelLibraryPageSize": "媒體庫分頁大小", + "LabelDeinterlaceMethod": "反交錯方法", "Episode": "劇集", "DeinterlaceMethodHelp": "選擇對隔行掃描內容進行軟體轉碼時所用的反交錯方法。當硬體加速支援的硬體反交錯選項啟用時,硬體方式將取代此設定。", "BoxSet": "套裝", @@ -1293,7 +1293,7 @@ "EnableDetailsBanner": "詳情橫幅", "EnableDecodingColorDepth10Vp9": "啟用 VP9 10-bit 硬體解碼", "EnableDecodingColorDepth10Hevc": "啟用 HEVC 10-bit 硬體解碼", - "LabelSyncPlayPlaybackDiff": "播放時間差距:", + "LabelSyncPlayPlaybackDiff": "播放時間差距", "LabelSyncPlayTimeOffset": "伺服器時間延遲:", "LabelRepositoryUrlHelp": "儲存庫的位置。", "MessageSyncPlayEnabled": "已啟用同步播放。", @@ -1339,7 +1339,7 @@ "LabelSyncPlayLeaveGroup": "離開群組", "LabelSyncPlayNewGroupDescription": "建立新的群組", "LabelSyncPlayNewGroup": "建立群組", - "LabelSyncPlaySyncMethod": "同步方式:", + "LabelSyncPlaySyncMethod": "同步方式", "MillisecondsUnit": "毫秒", "HeaderSyncPlayEnabled": "已啟用同步播放", "HeaderSyncPlaySelectGroup": "加入群組", @@ -1348,7 +1348,7 @@ "MessagePluginInstallError": "安裝附加元件時發生了錯誤。", "MessageGetInstalledPluginsError": "取得已安裝的附加元件清單時發生了錯誤。", "Preview": "預覽", - "LabelSubtitleVerticalPosition": "垂直位置:", + "LabelSubtitleVerticalPosition": "垂直位置", "PreviousTrack": "上一首", "NextTrack": "下一首", "LabelUnstable": "不穩定", @@ -1371,10 +1371,10 @@ "Authorize": "授權", "QuickConnectDescription": "要使用 Quick Connect 登入,請選擇您登入的裝置上的「Quick Connect」按鈕,然後輸入下面顯示的代號。", "QuickConnectDeactivated": "在登入請求獲得批准之前無法使用 Quick Connect", - "LabelOpenclDevice": "OpenCL 裝置:", - "LabelColorTransfer": "色彩轉換:", - "LabelColorSpace": "色域:", - "LabelVideoRange": "動態範圍:", + "LabelOpenclDevice": "OpenCL 裝置", + "LabelColorTransfer": "色彩轉換", + "LabelColorSpace": "色域", + "LabelVideoRange": "動態範圍", "MediaInfoColorTransfer": "色彩轉換", "MediaInfoColorSpace": "色域", "MediaInfoVideoRange": "動態範圍", @@ -1386,7 +1386,7 @@ "QuickConnectNotAvailable": "聯繫伺服器管理員以啟用 Quick Connect", "QuickConnectInvalidCode": "Quick Connect 代號無效", "KnownProxiesHelp": "連接到 Jellyfin 的代理伺服器的 IP 位址或主機名稱之列表,以逗號分隔,以使 X-Forwarded-For 標頭能正常運作。本設定儲存後需要重新啟動。", - "LabelMaxMuxingQueueSize": "最大混合器佇列大小:", + "LabelMaxMuxingQueueSize": "最大混合器佇列大小", "VideoAudio": "影片音訊", "Video": "影片", "QuickConnectAuthorizeFail": "未知的 Quick Connect 代號", @@ -1396,9 +1396,9 @@ "QuickConnect": "快速連接", "PosterCard": "海報卡片", "PlaybackRate": "播放速度", - "LabelQuickConnectCode": "Quick Connect 代號:", - "LabelKnownProxies": "已知 Proxy:", - "LabelCurrentStatus": "目前狀態:", + "LabelQuickConnectCode": "Quick Connect 代號", + "LabelKnownProxies": "已知 Proxy", + "LabelCurrentStatus": "目前狀態", "EnableAutoCast": "設為預設", "HeaderDeleteDevices": "刪除所有裝置", "DeleteDevicesConfirmation": "確定要刪除所有裝置?其他所有工作階段都會被登出。裝置會在使用者下次登入時再次出現。", @@ -1407,25 +1407,25 @@ "OptionMaxActiveSessions": "設定最多同時工作階段數。", "OptionAllowContentDownloadHelp": "使用者可以下載多媒體,並儲存於自己的裝置。這與同步功能不同。圖書庫需要開啟這項功能才能正常運作。", "OptionAllowContentDownload": "允許下載多媒體", - "LabelUserMaxActiveSessions": "最多同時工作階段數:", - "LabelTonemappingDesat": "色調映射降低飽和度:", + "LabelUserMaxActiveSessions": "最多同時工作階段數", + "LabelTonemappingDesat": "色調映射降低飽和度", "TonemappingRangeHelp": "選擇輸出顏色範圍。選自動則與輸入範圍相同。", - "LabelTonemappingRange": "色調映射範圍:", + "LabelTonemappingRange": "色調映射範圍", "TonemappingAlgorithmHelp": "色調映射可以微調。如果你不是很熟悉這些選項,保持預設即可。建議值為 \"BT.2390\"。", - "LabelTonemappingAlgorithm": "選擇要使用的色調映射算法:", + "LabelTonemappingAlgorithm": "選擇要使用的色調映射算法", "AllowTonemappingHelp": "色調映射可以將影片的動態範圍從 HDR 變換成 SDR,同時保持圖像細節與顏色等對於表現原始場景非常重要的資訊。目前僅針對 HDR10 或 HLG 影片有效。此一選項需要對應的 OpenCL 或 CUDA runtime。", "EnableTonemapping": "啟用色調映射", "LabelOpenclDeviceHelp": "此 OpenCL 設備用來色調映射。點的左側為平台號碼,右側為此平台上的設備號碼。默認值為 0.0。需要有 OpenCL 硬體加速功能的 FFmpeg 應用程式。", - "LabelColorPrimaries": "三原色:", + "LabelColorPrimaries": "三原色", "MediaInfoColorPrimaries": "三原色", "UseDoubleRateDeinterlacingHelp": "此設定使用去交錯時的刷新頻率,通常稱為 Bob 去交錯。它將影片的幀率加倍,以提供完整的運動效果,就類似在電視上觀看隔行掃描的影片看到的那樣。", "LabelMaxMuxingQueueSizeHelp": "等待所有流初始化時可緩衝的最大封包數。如果在 FFmpeg 日誌中仍然遇到 \"Too many packets buffered for output stream\" 錯誤,請嘗試增加該值。建議值為 2048。", "LabelTonemappingParamHelp": "調整色調映射算法。建議值和預設值均為 NaN。通常將其留空。", - "LabelTonemappingParam": "色調映射參數:", + "LabelTonemappingParam": "色調映射參數", "LabelTonemappingPeakHelp": "用該值覆蓋信號/標稱/參考峰值。當顯示元數據中嵌入的峰值資訊不可靠時,或從較低範圍到較高範圍的色調映射時,此選項很有用。建議值和預設值分別為 100 和 0。", - "LabelTonemappingPeak": "色調映射峰值:", + "LabelTonemappingPeak": "色調映射峰值", "LabelTonemappingThresholdHelp": "此參數對每個場景的色調映射算法進行微調。此閾值用於檢測場景是否已更改。如果當前幀平均亮度和當前運行平均值之間的距離超過閾值,我們將重新計算場景平均和峰值亮度。建議值和預設值分別為 0.8 和 0.2。", - "LabelTonemappingThreshold": "色調映射閾值:", + "LabelTonemappingThreshold": "色調映射閾值", "LabelTonemappingDesatHelp": "降低超過此亮度級別的亮部飽和度。此值越大,將保留更多的顏色資訊。此設置可以平滑地變成白色,從而有助於防止超高亮顯示出不自然的顏色。這使圖像感覺更自然,但以減少超出範圍的顏色的相關資訊為代價。建議值和預設值分別為 0 和 0.5。", "LabelCreateHttpPortMap": "為 HTTP 與 HTTPS 流量啟用自動端口映射。", "LabelAutomaticDiscoveryHelp": "允許程式通過UDP 7359 連接埠自動偵測Jellyfin 。", @@ -1454,22 +1454,22 @@ "EnableFallbackFontHelp": "啟用自定義備用字體。這選項可以避免字幕渲染錯誤發生。", "EnableFallbackFont": "啟用備用字體", "LabelFallbackFontPathHelp": "指定一個包含備用字體的路徑,用於渲染 ASS/SSA 字幕。最大允許的總字體大小為 20MB。建議使用輕量化且適合網頁用的字體格式,如:woff2。", - "LabelFallbackFontPath": "備用字體資料夾路徑:", + "LabelFallbackFontPath": "備用字體資料夾路徑", "HeaderSelectFallbackFontPathHelp": "瀏覽或輸入用於渲染 ASS/SSA 字幕的備用字體資料夾的路徑。", "HeaderSelectFallbackFontPath": "選擇備用字體資料夾的路徑", "MessageSyncPlayIsDisabled": "使用 SyncPlay 需要授權。", "LabelUDPPortRangeHelp": "進行 UDP 連線時,限制 Jellyfin 可使用的端口範圍。(預設值為 1024 - 65535)。
注意:某些功能需要固定端口,而這些端口可能不在此範圍內。", - "LabelUDPPortRange": "UDP 通訊範圍:", - "LabelSyncPlayTimeSyncOffset": "時間偏移:", - "LabelSyncPlayTimeSyncDevice": "時間與某人同步:", + "LabelUDPPortRange": "UDP 通訊範圍", + "LabelSyncPlayTimeSyncOffset": "時間偏移", + "LabelSyncPlayTimeSyncDevice": "時間與某人同步", "LabelSyncPlayResumePlaybackDescription": "加入播放群組", "LabelSyncPlayResumePlayback": "繼續本地播放", "LabelSyncPlayHaltPlaybackDescription": "並忽略目前的播放清單更新", "LabelSyncPlayHaltPlayback": "停止本地播放", "LabelSSDPTracingFilterHelp": "自選 IP 地址,用於過濾記錄的 SSDP 流量。", - "LabelSSDPTracingFilter": "SSDP 篩選:", + "LabelSSDPTracingFilter": "SSDP 篩選", "LabelPublishedServerUriHelp": "根據接口或客戶端 IP 位址,覆蓋 Jellyfin 使用的 URI。", - "LabelPublishedServerUri": "公開伺服器 URI:", + "LabelPublishedServerUri": "公開伺服器 URI", "LabelMinAudiobookResumeHelp": "將在此時間前停止播放的媒體當作尚未播放。", "LabelMaxAudiobookResumeHelp": "將剩下的部分小於此時長後停止播放的媒體當作已播畢。", "LabelIsForced": "強制", @@ -1477,7 +1477,7 @@ "LabelHDHomerunPortRange": "HDHomeRun 端口範圍", "LabelH265Crf": "H.265 編碼 CRF", "LabelEnableSSDPTracingHelp": "將 SSDP 追蹤詳細資料記錄至日誌。
警告:這將導致效能嚴重損失。", - "LabelEnableSSDPTracing": "啟用 SSDP 追蹤:", + "LabelEnableSSDPTracing": "啟用 SSDP 追蹤", "LabelAutoDiscoveryTracing": "開啟自動追蹤。", "YoutubeNotFound": "找不到影片。", "YoutubeBadRequest": "錯誤請求。", @@ -1510,7 +1510,7 @@ "ContainerNotSupported": "不支援此封裝容器", "VideoCodecNotSupported": "不支援此影像編碼", "AudioCodecNotSupported": "不支援此音效編碼", - "EnableGamepadHelp": "監聽所有來自游戲遙控器的輸入。", + "EnableGamepadHelp": "監聽來自任何連接的控制器的輸入。 (需要:“TV”顯示模式)", "LabelEnableGamepad": "啟用遊戲手把", "Controls": "控制", "AllowVppTonemappingHelp": "完全基於Intel驅動的色調映射。目前只針對部分硬體及HDR10影片有效。此一選項比OpenCL實作有更高的優先級。", @@ -1532,8 +1532,8 @@ "MessageSent": "訊息送出。", "LabelSlowResponseTime": "反應緩慢判斷時間(毫秒)", "LabelSlowResponseEnabled": "當伺服器應答過慢時記錄警告訊息", - "LabelMinAudiobookResume": "繼續播放有聲書的最短時間:", - "LabelMaxAudiobookResume": "繼續播放有聲書的剩餘時間:", + "LabelMinAudiobookResume": "繼續播放有聲書的最短時間", + "LabelMaxAudiobookResume": "繼續播放有聲書的剩餘時間", "LabelLocalCustomCss": "自訂CSS樣式僅使用於此客戶端。你可能會想要停用伺服器自訂CSS。", "LabelDisableCustomCss": "停用由伺服器提供的自訂CSS標籤或品牌。", "LabelCreateHttpPortMapHelp": "允許自動端口映射為除了HTTPS之外的HTTP流量創建規則。", @@ -1576,8 +1576,8 @@ "PreviousChapter": "前一章節", "NextChapter": "下一章節", "AgeValue": "({0} 歲)", - "LabelSortName": "排列名稱:", - "LabelOriginalName": "原始名稱:", + "LabelSortName": "排列名稱", + "LabelOriginalName": "原始名稱", "Console": "控制台", "ButtonExitApp": "離開應用程式", "MediaInfoTitle": "標題", @@ -1596,7 +1596,7 @@ "ButtonClose": "關閉", "ButtonSpace": "空格", "TypeOptionPluralMusicVideo": "MV", - "LabelMaxDaysForNextUp": "「下一步」中的最大天數:", + "LabelMaxDaysForNextUp": "「下一步」中的最大天數", "Print": "列印", "TypeOptionPluralMusicAlbum": "音樂專輯", "TypeOptionPluralMusicArtist": "音樂藝術家", @@ -1609,7 +1609,7 @@ "EnableIntelLowPowerH264HwEncoder": "啟用』 Intel 低功耗 H.264 硬體編碼器", "IntelLowPowerEncHelp": "低功耗編碼可以保持不必要的 CPU-GPU 同步。 在 Linux 上,如果未配置 i915 HuC 驅動程式,則必須禁用它們。", "AudioIsExternal": "外部音訊串流", - "LabelVppTonemappingBrightness": "VPP 色調映射亮度增益:", + "LabelVppTonemappingBrightness": "VPP 色調映射亮度增益", "EnableSplashScreen": "啟用啟動畫面", "LabelVppTonemappingContrastHelp": "在 VPP 色調映射中使用對比度增益。 推薦值和預設值是 1.2 和 1。", "Clip": "花絮", @@ -1630,7 +1630,7 @@ "ItemDetails": "物品詳情", "EnableCardLayout": "顯示可視化 CardBox", "LabelAutomaticallyAddToCollectionHelp": "當至少有 2 部電影具有相同的收藏名稱時,它們將被自動添加到收藏中。", - "LabelTextWeight": "字體粗細:", + "LabelTextWeight": "字體粗細", "Bold": "粗體", "Localization": "本土化", "MessageNoItemsAvailable": "目前沒有可用的項目。", @@ -1652,7 +1652,7 @@ "TypeOptionPluralSeries": "電視節目", "Typewriter": "打字機", "EnableIntelLowPowerHevcHwEncoder": "啟用 Intel 低功耗 HEVC 硬體編碼器", - "LabelHardwareEncodingOptions": "硬體編碼選項:", + "LabelHardwareEncodingOptions": "硬體編碼選項", "UnknownVideoStreamInfo": "未知的影片串流資訊", "UnknownAudioStreamInfo": "未知的音訊串流資訊", "DirectPlayError": "開始直接播放時發生錯誤", @@ -1665,9 +1665,9 @@ "ThemeVideo": "主題影片", "EnableEnhancedNvdecDecoderHelp": "實驗性 NVDEC 實現,除非遇到解碼錯誤,否則不要啟用此選項。", "LabelVppTonemappingBrightnessHelp": "在 VPP 色調映射中使用亮度增益。 推薦值和預設值均為 0。", - "LabelVppTonemappingContrast": "VPP 色調映射對比度增益:", + "LabelVppTonemappingContrast": "VPP 色調映射對比度增益", "VideoRangeTypeNotSupported": "不支援影片的範圍類型", - "LabelVideoRangeType": "影片範圍類型:", + "LabelVideoRangeType": "影片範圍類型", "MediaInfoVideoRangeType": "影片範圍類型", "MediaInfoDoViTitle": "杜比視界標題", "MediaInfoDvVersionMajor": "杜比視界主要版本", From fda7794f7560c5a017bcb7b90a5a78788139abf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Apr 2023 23:04:07 +0000 Subject: [PATCH 003/147] Update dependency core-js to v3.30.1 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f27a00c8ef..c2ad0dffb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.30.0", + "core-js": "3.30.1", "date-fns": "2.29.3", "dompurify": "3.0.1", "epubjs": "0.3.93", @@ -5495,9 +5495,9 @@ } }, "node_modules/core-js": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz", - "integrity": "sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg==", + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz", + "integrity": "sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -23950,9 +23950,9 @@ } }, "core-js": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.0.tgz", - "integrity": "sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg==" + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz", + "integrity": "sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ==" }, "core-js-compat": { "version": "3.25.3", diff --git a/package.json b/package.json index f1c8104f36..823812e8be 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.30.0", + "core-js": "3.30.1", "date-fns": "2.29.3", "dompurify": "3.0.1", "epubjs": "0.3.93", From 0ae0db8ebbe8d518d7653f33762aa5633cbaa7d6 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Fri, 21 Apr 2023 11:14:39 +0000 Subject: [PATCH 004/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 433cc84822..0de9722602 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -22,9 +22,9 @@ "EditSubtitles": "編輯字幕", "Ended": "已完結", "Friday": "星期五", - "HeaderActiveDevices": "生效裝置", + "HeaderActiveDevices": "使用中的裝置", "HeaderActiveRecordings": "正在錄影的節目", - "HeaderAddToCollection": "加到收藏", + "HeaderAddToCollection": "加入至系列", "HeaderAdditionalParts": "附加部份", "HeaderBranding": "品牌", "HeaderCustomDlnaProfiles": "自定設定檔", @@ -144,8 +144,8 @@ "MessagePleaseEnsureInternetMetadata": "請確保啟用網絡資料屬性下載功能。", "Monday": "星期一", "MoreUsersCanBeAddedLater": "稍後可以在控制台添加更多用戶。", - "NewCollection": "新收藏庫", - "NewCollectionNameExample": "例如:星球大戰收藏庫", + "NewCollection": "新的系列", + "NewCollectionNameExample": "例如:星球大戰系列", "MessageNoNextUpItems": "未有發現。開始欣賞您的節目!", "OptionAdminUsers": "管理員", "OptionAllUsers": "所有用戶", @@ -200,7 +200,7 @@ "Refresh": "重新整理", "Saturday": "星期六", "Save": "儲存", - "SearchForCollectionInternetMetadata": "從互聯網搜尋相關圖片和資料屬性", + "SearchForCollectionInternetMetadata": "從互聯網搜尋相關圖片和元數據", "SearchForSubtitles": "字幕搜索", "Sunday": "星期日", "SystemDlnaProfilesHelp": "系統配置文件是唯讀的。更改系統配置文件將被保存到一個自定新配置文件。", @@ -288,7 +288,7 @@ "AirDate": "播出日期", "AdditionalNotificationServices": "瀏覽插件目錄以安裝其他通知服務。", "AddToPlayQueue": "添加至播放佇列", - "AddToCollection": "添加至系列", + "AddToCollection": "加入至系列", "AccessRestrictedTryAgainLater": "目前存取受限,請稍後再試。", "AllowFfmpegThrottling": "限制轉碼", "Disconnect": "中斷連接", @@ -613,11 +613,11 @@ "LabelHDHomerunPortRange": "HDHomeRun 端口範圍:", "LabelHardwareEncoding": "硬體加速", "LabelHardwareAccelerationTypeHelp": "硬體加速需要額外的設定。", - "LabelHardwareAccelerationType": "硬體加速:", + "LabelHardwareAccelerationType": "硬體加速", "LabelH265Crf": "H.265 編碼 CRF", "LabelH264Crf": "H.264 編碼 CRF", - "LabelGroupMoviesIntoCollectionsHelp": "顯示電影清單時,屬於相同合集的電影將合併為單一項目顯示。", - "LabelGroupMoviesIntoCollections": "將電影分組", + "LabelGroupMoviesIntoCollectionsHelp": "顯示電影清單時,屬於相同系列的電影將合併為單一項目顯示。", + "LabelGroupMoviesIntoCollections": "按系列將電影分組", "LabelFriendlyName": "好聽的名字:", "LabelFormat": "格式:", "LabelForgotPasswordUsernameHelp": "假如您還記得的話,請輸入您的使用者名稱。", @@ -688,7 +688,7 @@ "LabelColorTransfer": "色彩轉換:", "LabelColorSpace": "色域:", "LabelColorPrimaries": "三原色:", - "LabelCollection": "收藏:", + "LabelCollection": "系列", "LabelChromecastVersion": "Google Cast 版本", "LabelChannels": "頻道:", "LabelCertificatePasswordHelp": "如果你的證書需要密碼,請在此輸入它。", @@ -1014,11 +1014,11 @@ "HeaderAddUpdateImage": "新增/更新圖片", "HeaderAddToPlaylist": "加到播放清單", "HeaderActivity": "活動", - "HeaderAccessScheduleHelp": "建立一個存取時程以限制可存取的時段。", - "HeaderAccessSchedule": "存取時程", - "HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後難以播放影片,那麼你需要將此選項設回「無」。", + "HeaderAccessScheduleHelp": "建立一個使用時間表以限制用戶可以使用的時段。", + "HeaderAccessSchedule": "使用時間表", + "HardwareAccelerationWarning": "啟用硬體加速可能會導致系統變得不穩定。請確保作業系統和驅動程式已被更新至最新版本。如果啟用此功能後出現播放問題,請將硬體加速的選項設定為「無」以停用功能。", "HDPrograms": "HD 節目", - "H264CrfHelp": "恒定速率因子(CRF)是x264和x265編碼器的預設品質設定。 可以設定在0到51之間,其中值越低品質越好(檔案較大)。 推薦值為18到28之間。x264的預設值為23,x265的預設值為28。", + "H264CrfHelp": "恒定速率因子(CRF)是 x264 和 x265 的預設編碼質素設定值。 其值可設定在0至51之間,數值越低質素越好(檔案大小越大)。 推薦值為18到28之間。而 x264 的預設值為23,x265 的預設值為28。", "GuideProviderSelectListings": "選擇清單", "GuideProviderLogin": "登入", "Guide": "指南", @@ -1066,8 +1066,8 @@ "ErrorPlayerNotFound": "找不到這個媒體所需的播放器。", "Engineer": "聲音工程師", "Arranger": "編曲", - "LabelAutomaticallyAddToCollectionHelp": "當至少有 2 部電影具有相同的名稱時,它們將自動加入到合輯中。", - "LabelAutomaticallyAddToCollection": "自動加入合輯", + "LabelAutomaticallyAddToCollectionHelp": "當至少有兩部電影具有相同的系列名稱時,將自動加入到同一系列中。", + "LabelAutomaticallyAddToCollection": "自動加入至系列", "LabelAirsBeforeEpisode": "預告:", "HeaderSyncPlayTimeSyncSettings": "時間同步", "ButtonExitApp": "離開應用程式", @@ -1143,5 +1143,8 @@ "UseEpisodeImagesInNextUpHelp": "在「接下來」及「繼續觀看」區中,以相關集數的圖片取代該劇集的縮圖作顯示。", "TabScheduledTasks": "工作排程器", "LabelPlaybackInfo": "播放資訊", - "EnableCardLayout": "顯示 visual CardBox" + "EnableCardLayout": "顯示 visual CardBox", + "NewCollectionHelp": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至同一個系列中。", + "RemoveFromCollection": "從系列中移除", + "MessageNoCollectionsAvailable": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至系列/集合中。點撃「+」以新增系列。" } From b23c2b9f7c6666561c474584c2144523608ace99 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 20:06:00 +0000 Subject: [PATCH 005/147] Update github/codeql-action action to v2.3.0 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3748ee8324..76f544d9fd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Initialize CodeQL - uses: github/codeql-action/init@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12 + uses: github/codeql-action/init@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12 + uses: github/codeql-action/autobuild@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12 + uses: github/codeql-action/analyze@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 From 5721ef59d6d2d77202a9748e495bd563805f0e00 Mon Sep 17 00:00:00 2001 From: MrOscarvs Date: Sat, 22 Apr 2023 01:01:16 +0000 Subject: [PATCH 006/147] Translated using Weblate (Catalan) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/ --- src/strings/ca.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/strings/ca.json b/src/strings/ca.json index d9761bc9ae..579228632e 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -319,7 +319,7 @@ "LabelPersonRoleHelp": "Exemple: Conductor de camió de gelats", "LabelPlaceOfBirth": "Lloc de naixement", "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte independentment de l'idioma", - "LabelPlaylist": "Llista de rep.", + "LabelPlaylist": "Llista de reproducció", "LabelPreferredDisplayLanguage": "Idioma de visualització preferit", "LabelPreferredSubtitleLanguage": "Idioma preferit de subtítols", "LabelProfileAudioCodecs": "Còdecs d'àudio", @@ -657,7 +657,7 @@ "AllowOnTheFlySubtitleExtractionHelp": "Els subtítols incrustats es poden extreure de vídeos i lliurar-los als clients en text pla, per tal d’evitar la transcodificació de vídeos. En alguns sistemes, això pot trigar molt de temps i fer que la reproducció de vídeo s’aturés durant el procés d’extracció. Desactiveu aquesta opció perquè els subtítols incrustats es gravin amb la transcodificació de vídeo quan el dispositiu client no els admeti de forma nativa.", "AlbumArtist": "Artista de l'àlbum", "Album": "Àlbum", - "ButtonSyncPlay": "SyncPlay", + "ButtonSyncPlay": "Reproducció sincronitzada", "CriticRating": "Valoració dels сrítics", "CopyStreamURLSuccess": "L'URL s'ha copiat correctament.", "CopyStreamURL": "Copia l'URL de reproducció", @@ -1716,5 +1716,6 @@ "SubtitleYellow": "Groc", "StereoDownmixAlgorithmHelp": "Algoritme utilitzat per barrejar àudio multicanal a estèreo.", "DownloadAll": "Descarrega-ho tot", - "LabelEnableAudioVbr": "Activar la codificació d'àudio VBR" + "LabelEnableAudioVbr": "Activar la codificació d'àudio VBR", + "LabelEnableAudioVbrHelp": "La taxa de bits variable ofereix una millor relació entre la qualitat i velocitat de bits mitjana, però en alguns casos rars pot provocar problemes de compatibilitat i de memòria intermèdia (buffering)." } From 745913c8705fb1eb27c719332188132c1848008c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Apr 2023 18:31:43 +0000 Subject: [PATCH 007/147] Update Webpack --- package-lock.json | 28 ++++++++++++++-------------- package.json | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2ad0dffb8..56eaa40b01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "eslint-plugin-sonarjs": "0.19.0", "expose-loader": "4.1.0", "html-loader": "4.2.0", - "html-webpack-plugin": "5.5.0", + "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.21", "postcss-loader": "7.2.4", @@ -111,7 +111,7 @@ "typescript": "5.0.4", "webpack": "5.79.0", "webpack-cli": "5.0.1", - "webpack-dev-server": "4.13.2", + "webpack-dev-server": "4.13.3", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", "worker-loader": "3.0.8" @@ -9066,9 +9066,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -19308,9 +19308,9 @@ "dev": true }, "node_modules/webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -26653,9 +26653,9 @@ "dev": true }, "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", "dev": true, "requires": { "@types/html-minifier-terser": "^6.0.0", @@ -34327,9 +34327,9 @@ } }, "webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", diff --git a/package.json b/package.json index 823812e8be..edca125b2e 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "eslint-plugin-sonarjs": "0.19.0", "expose-loader": "4.1.0", "html-loader": "4.2.0", - "html-webpack-plugin": "5.5.0", + "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.21", "postcss-loader": "7.2.4", @@ -61,7 +61,7 @@ "typescript": "5.0.4", "webpack": "5.79.0", "webpack-cli": "5.0.1", - "webpack-dev-server": "4.13.2", + "webpack-dev-server": "4.13.3", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", "worker-loader": "3.0.8" From bff59b501aca30edb92c4d272d2941c9a7370c35 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Sat, 22 Apr 2023 21:47:58 +0000 Subject: [PATCH 008/147] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 9608c9bf8a..36a100d7da 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1695,5 +1695,14 @@ "LabelDummyChapterCount": "Límite", "LabelDummyChapterCountHelp": "El número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.", "LabelChapterImageResolution": "Resolución", - "LabelChapterImageResolutionHelp": "La resolución de las imágenes de los capítulos extraídos." + "LabelChapterImageResolutionHelp": "La resolución de las imágenes de los capítulos extraídos.", + "LabelParallelImageEncodingLimitHelp": "Cantidad máxima de codificaciones de imágenes que pueden ejecutarse en paralelo. Establecer esto en 0 elegirá un límite basado en las especificaciones de su sistema.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Prefiere títulos incrustados sobre nombres de archivo para extras", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Los extras a menudo tienen el mismo nombre incrustado que el padre, marque esto para usar títulos incrustados para ellos de todos modos.", + "SaveRecordingNFO": "Guardar la grabación de metadatos de EPG en NFO", + "LabelEnableAudioVbr": "Habilitar la codificación de audio VBR", + "LabelEnableAudioVbrHelp": "La tasa de bits variable ofrece una mejor relación entre calidad y tasa de bits promedio, pero en algunos casos raros puede causar problemas de almacenamiento en búfer y compatibilidad.", + "LabelParallelImageEncodingLimit": "Límite de codificación de imágenes en paralelo", + "ResolutionMatchSource": "Fuente de coincidencia", + "HeaderPerformance": "Rendimiento" } From 2d0a50223f0626f24e204b1aeb7c24de8047c7d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Apr 2023 03:57:34 +0000 Subject: [PATCH 009/147] Update dependency stylelint to v15.5.0 --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56eaa40b01..aca6167c9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,7 +102,7 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.4.0", + "stylelint": "15.5.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", @@ -9054,9 +9054,9 @@ } }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, "engines": { "node": ">=8" @@ -15450,14 +15450,14 @@ } }, "node_modules/stylelint": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.4.0.tgz", - "integrity": "sha512-TlOvpG3MbcFwHmK0q2ykhmpKo7Dq892beJit0NPdpyY9b1tFah/hGhqnAz/bRm2PDhDbJLKvjzkEYYBEz7Dxcg==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.5.0.tgz", + "integrity": "sha512-jyMO3R1QtE5mUS4v40+Gg+sIQBqe7CF1xPslxycDzNVkIBCUD4O+5F1vLPq16VmunUTv4qG9o2rUKLnU5KkVeQ==", "dev": true, "dependencies": { "@csstools/css-parser-algorithms": "^2.1.0", "@csstools/css-tokenizer": "^2.1.0", - "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.2", "@csstools/selector-specificity": "^2.2.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", @@ -15471,7 +15471,7 @@ "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", + "html-tags": "^3.3.1", "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", @@ -26647,9 +26647,9 @@ } }, "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true }, "html-webpack-plugin": { @@ -31325,14 +31325,14 @@ } }, "stylelint": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.4.0.tgz", - "integrity": "sha512-TlOvpG3MbcFwHmK0q2ykhmpKo7Dq892beJit0NPdpyY9b1tFah/hGhqnAz/bRm2PDhDbJLKvjzkEYYBEz7Dxcg==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.5.0.tgz", + "integrity": "sha512-jyMO3R1QtE5mUS4v40+Gg+sIQBqe7CF1xPslxycDzNVkIBCUD4O+5F1vLPq16VmunUTv4qG9o2rUKLnU5KkVeQ==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^2.1.0", "@csstools/css-tokenizer": "^2.1.0", - "@csstools/media-query-list-parser": "^2.0.1", + "@csstools/media-query-list-parser": "^2.0.2", "@csstools/selector-specificity": "^2.2.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", @@ -31346,7 +31346,7 @@ "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", + "html-tags": "^3.3.1", "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", diff --git a/package.json b/package.json index edca125b2e..8f6e80b49a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.4.0", + "stylelint": "15.5.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", From 3e1a76fe205f6440c91119bd0bf7369d7cb8bf03 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Apr 2023 16:04:23 +0000 Subject: [PATCH 010/147] Update dependency postcss to v8.4.22 --- package-lock.json | 40 +++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index aca6167c9a..12d58bb317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.21", + "postcss": "8.4.22", "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.1", "postcss-scss": "4.0.6", @@ -11042,10 +11042,16 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11887,9 +11893,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", + "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", "dev": true, "funding": [ { @@ -11899,10 +11905,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -28120,9 +28130,9 @@ "optional": true }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "nanomatch": { @@ -28767,12 +28777,12 @@ "dev": true }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", + "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } diff --git a/package.json b/package.json index 8f6e80b49a..c85ccea6da 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.21", + "postcss": "8.4.22", "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.1", "postcss-scss": "4.0.6", From 8008b8b6f23b456e2017d2431c2b79ce6d6b96a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:58:49 +0000 Subject: [PATCH 011/147] Update dependency postcss-preset-env to v8.3.2 --- package-lock.json | 32 +++++++++++++++++++------------- package.json | 2 +- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12d58bb317..d25c9d2dac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.22", "postcss-loader": "7.2.4", - "postcss-preset-env": "8.3.1", + "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", "sass": "1.62.0", "sass-loader": "13.2.2", @@ -13154,16 +13154,26 @@ } }, "node_modules/postcss-preset-env": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.3.1.tgz", - "integrity": "sha512-k3Y8BXbVLBAufrla3CNmQJhMS1iRuT9LFlysYvzs1rU5E78+ShX2u0EUL6KpMi0pDJO3wZcuVYSR8cgukfoRtg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.3.2.tgz", + "integrity": "sha512-VSAOsfxTXzO/gX5QljC8x8hN3ABbD9iqqLgqHqohBdNI5FhJptwpl96kpu+kYvvzK7BWwaHYou0IeYrp+NqmcQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { "@csstools/postcss-cascade-layers": "^3.0.1", "@csstools/postcss-color-function": "^2.2.1", "@csstools/postcss-color-mix-function": "^1.0.1", "@csstools/postcss-font-format-keywords": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^3.0.3", + "@csstools/postcss-gradients-interpolation-method": "^3.0.4", "@csstools/postcss-hwb-function": "^2.2.1", "@csstools/postcss-ic-unit": "^2.0.2", "@csstools/postcss-is-pseudo-class": "^3.2.0", @@ -13218,10 +13228,6 @@ "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -29575,16 +29581,16 @@ } }, "postcss-preset-env": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.3.1.tgz", - "integrity": "sha512-k3Y8BXbVLBAufrla3CNmQJhMS1iRuT9LFlysYvzs1rU5E78+ShX2u0EUL6KpMi0pDJO3wZcuVYSR8cgukfoRtg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.3.2.tgz", + "integrity": "sha512-VSAOsfxTXzO/gX5QljC8x8hN3ABbD9iqqLgqHqohBdNI5FhJptwpl96kpu+kYvvzK7BWwaHYou0IeYrp+NqmcQ==", "dev": true, "requires": { "@csstools/postcss-cascade-layers": "^3.0.1", "@csstools/postcss-color-function": "^2.2.1", "@csstools/postcss-color-mix-function": "^1.0.1", "@csstools/postcss-font-format-keywords": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^3.0.3", + "@csstools/postcss-gradients-interpolation-method": "^3.0.4", "@csstools/postcss-hwb-function": "^2.2.1", "@csstools/postcss-ic-unit": "^2.0.2", "@csstools/postcss-is-pseudo-class": "^3.2.0", diff --git a/package.json b/package.json index c85ccea6da..f5da6c8dde 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.22", "postcss-loader": "7.2.4", - "postcss-preset-env": "8.3.1", + "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", "sass": "1.62.0", "sass-loader": "13.2.2", From 257b44ba1330e456b4d69d63e66c06f79cd96678 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 11:40:16 +0000 Subject: [PATCH 012/147] Update dependency postcss to v8.4.23 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d25c9d2dac..bd05653ad1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.22", + "postcss": "8.4.23", "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", @@ -11893,9 +11893,9 @@ } }, "node_modules/postcss": { - "version": "8.4.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", - "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "funding": [ { @@ -28783,9 +28783,9 @@ "dev": true }, "postcss": { - "version": "8.4.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", - "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "requires": { "nanoid": "^3.3.6", diff --git a/package.json b/package.json index f5da6c8dde..6e1baacb00 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "html-loader": "4.2.0", "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.22", + "postcss": "8.4.23", "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", From 4fe6bb5b42827b41460815f266c1857d062d1f20 Mon Sep 17 00:00:00 2001 From: robert-hamilton36 Date: Mon, 27 Mar 2023 09:36:09 +1300 Subject: [PATCH 013/147] Add external startMultiSelect function --- src/components/multiSelect/multiSelect.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 142a31a5d7..989a421cdb 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -564,3 +564,6 @@ export default function (options) { }; } +export const startMultiSelect = (card) => { + showSelections(card); +}; From 447b6f5582521cbc2d2696f3407bbbc640f45b17 Mon Sep 17 00:00:00 2001 From: robert-hamilton36 Date: Mon, 27 Mar 2023 09:38:32 +1300 Subject: [PATCH 014/147] Add select option --- src/components/itemContextMenu.js | 17 +++++++++++++++++ src/strings/en-us.json | 1 + 2 files changed, 18 insertions(+) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index a90effb336..28dc31226c 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -1,5 +1,6 @@ import browser from '../scripts/browser'; import { copy } from '../scripts/clipboard'; +import dom from '../scripts/dom'; import globalize from '../scripts/globalize'; import actionsheet from './actionSheet/actionSheet'; import { appHost } from './apphost'; @@ -115,6 +116,16 @@ export function getCommands(options) { } } + // Multiselect is currrently only ran on long clicks of card components + // This disables Select on any context menu not originating from a card i.e songs + if (options.positionTo && (dom.parentWithClass(options.positionTo, 'card') !== null)) { + commands.push({ + name: globalize.translate('Select'), + id: 'multiSelect', + icon: 'library_add_check' + }); + } + if ((item.Type === 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ name: globalize.translate('CancelRecording'), @@ -432,6 +443,12 @@ function executeCommand(item, id, options) { itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id), getResolveFunction(resolve, id)); }); break; + case 'multiSelect': + import('./multiSelect/multiSelect').then(({ startMultiSelect: startMultiSelect }) => { + const card = dom.parentWithClass(options.positionTo, 'card'); + startMultiSelect(card); + }); + break; case 'refresh': refresh(apiClient, item); getResolveFunction(resolve, id)(); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 44e82f2e5c..e2b39af691 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1685,6 +1685,7 @@ "Interview": "Interview", "Scene": "Scene", "Sample": "Sample", + "Select": "Select", "ThemeSong": "Theme Song", "ThemeVideo": "Theme Video", "EnableEnhancedNvdecDecoderHelp": "Experimental NVDEC implementation, do not enable this option unless you encounter decoding errors.", From a83e3b121b0dec3db3c770193a584005c10c9000 Mon Sep 17 00:00:00 2001 From: robert-hamilton36 Date: Mon, 24 Apr 2023 11:44:56 +1200 Subject: [PATCH 015/147] Remove Select option from tvs --- src/components/itemContextMenu.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 28dc31226c..1e33d66af7 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -99,6 +99,16 @@ export function getCommands(options) { } if (!browser.tv) { + // Multiselect is currrently only ran on long clicks of card components + // This disables Select on any context menu not originating from a card i.e songs + if (options.positionTo && (dom.parentWithClass(options.positionTo, 'card') !== null)) { + commands.push({ + name: globalize.translate('Select'), + id: 'multiSelect', + icon: 'library_add_check' + }); + } + if (itemHelper.supportsAddingToCollection(item) && options.EnableCollectionManagement) { commands.push({ name: globalize.translate('AddToCollection'), @@ -116,16 +126,6 @@ export function getCommands(options) { } } - // Multiselect is currrently only ran on long clicks of card components - // This disables Select on any context menu not originating from a card i.e songs - if (options.positionTo && (dom.parentWithClass(options.positionTo, 'card') !== null)) { - commands.push({ - name: globalize.translate('Select'), - id: 'multiSelect', - icon: 'library_add_check' - }); - } - if ((item.Type === 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ name: globalize.translate('CancelRecording'), From 591f51fbf56bc74de95481468240f49687fd88c0 Mon Sep 17 00:00:00 2001 From: sleepycatcoding Date: Mon, 24 Apr 2023 13:42:20 +0000 Subject: [PATCH 016/147] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/et.json b/src/strings/et.json index c978ebe267..62442bdd45 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -1647,5 +1647,10 @@ "BehindTheScenes": "Kulisside taga", "DeletedScene": "Kustutatud stseen", "Interview": "Intervjuu", - "EnableSplashScreen": "Luba käivituskuva" + "EnableSplashScreen": "Luba käivituskuva", + "DownloadAll": "Lae kõik alla", + "Experimental": "Eksperimentaalne", + "HeaderRecordingMetadataSaving": "Salvestise metaandmed", + "HeaderPerformance": "Jõudlus", + "IgnoreDts": "Ignoreeri DTS-i (dekodeerimise ajatempel)" } From 9d5030d97e7f8eb09d458ca61e0a95bf7d58a25a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 15:45:32 +0000 Subject: [PATCH 017/147] Update dependency swiper to v9 --- package-lock.json | 33 +++++++-------------------------- package.json | 2 +- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd05653ad1..99b4d138b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", - "swiper": "8.4.7", + "swiper": "9.2.3", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.2", "workbox-core": "6.5.4", @@ -6309,14 +6309,6 @@ } ] }, - "node_modules/dom7": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.4.tgz", - "integrity": "sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==", - "dependencies": { - "ssr-window": "^4.0.0" - } - }, "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -18157,9 +18149,9 @@ } }, "node_modules/swiper": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", - "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.3.tgz", + "integrity": "sha512-hxqcjIsYPP1fv+KIXPqGywl6ik8RBp0y0i9+TOIh55ca6SpZ5FrgNJ4QXPhsl6mlSBMEYPmh5zOKtZpI8zpWeQ==", "funding": [ { "type": "patreon", @@ -18170,9 +18162,7 @@ "url": "http://opencollective.com/swiper" } ], - "hasInstallScript": true, "dependencies": { - "dom7": "^4.0.4", "ssr-window": "^4.0.2" }, "engines": { @@ -24557,14 +24547,6 @@ } } }, - "dom7": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.4.tgz", - "integrity": "sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==", - "requires": { - "ssr-window": "^4.0.0" - } - }, "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -33451,11 +33433,10 @@ } }, "swiper": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", - "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.3.tgz", + "integrity": "sha512-hxqcjIsYPP1fv+KIXPqGywl6ik8RBp0y0i9+TOIh55ca6SpZ5FrgNJ4QXPhsl6mlSBMEYPmh5zOKtZpI8zpWeQ==", "requires": { - "dom7": "^4.0.4", "ssr-window": "^4.0.2" } }, diff --git a/package.json b/package.json index 6e1baacb00..5ecdfd22a3 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", - "swiper": "8.4.7", + "swiper": "9.2.3", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.2", "workbox-core": "6.5.4", From c6bcee3b26daab93c87383d8115a88db16027d83 Mon Sep 17 00:00:00 2001 From: Daan Vankerkom Date: Wed, 9 Nov 2022 00:45:53 +0100 Subject: [PATCH 018/147] Reduce TV card scale size Reduced the transform scale from 10% to 7% to increase readability and reduce cognitive overload. --- src/components/cardbuilder/card.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/cardbuilder/card.scss b/src/components/cardbuilder/card.scss index e43b488dbe..28f55abe2d 100644 --- a/src/components/cardbuilder/card.scss +++ b/src/components/cardbuilder/card.scss @@ -114,7 +114,7 @@ button::-moz-focus-inner { } .card.show-animation:focus > .cardBox { - transform: scale(1.18, 1.18); + transform: scale(1.07, 1.07); } .cardBox-bottompadded { From 11b83556257694b95f31a33c3f1930d424b68b39 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 21:35:52 +0000 Subject: [PATCH 019/147] Update Linters to v5.59.0 --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd05653ad1..8513ac3a67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.58.0", - "@typescript-eslint/parser": "5.58.0", + "@typescript-eslint/eslint-plugin": "5.59.0", + "@typescript-eslint/parser": "5.59.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", @@ -3410,15 +3410,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3459,14 +3459,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" }, "engines": { @@ -3486,13 +3486,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3503,13 +3503,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3530,9 +3530,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3543,13 +3543,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3614,17 +3614,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3655,12 +3655,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -22413,15 +22413,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -22442,53 +22442,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" } }, "@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -22528,17 +22528,17 @@ } }, "@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -22555,12 +22555,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 6e1baacb00..f5a6951c9b 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.58.0", - "@typescript-eslint/parser": "5.58.0", + "@typescript-eslint/eslint-plugin": "5.59.0", + "@typescript-eslint/parser": "5.59.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", From 70d2eb0e83b50d7395f5083442009801e9d1f4fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Mon, 24 Apr 2023 18:37:09 +0000 Subject: [PATCH 020/147] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 9f68e61494..9a186bda61 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1721,5 +1721,6 @@ "LabelParallelImageEncodingLimit": "Počet paralelních kódování obrázků", "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle parametrů systému.", "LabelEnableAudioVbr": "Povolit kódování zvuku VBR", - "LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou." + "LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou.", + "Select": "Vybrat" } From 23d122698414e20e1b1193a3f742030b94b4010a Mon Sep 17 00:00:00 2001 From: NeonCube Date: Mon, 24 Apr 2023 20:05:01 +0000 Subject: [PATCH 021/147] Translated using Weblate (Persian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fa/ --- src/strings/fa.json | 49 +++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/strings/fa.json b/src/strings/fa.json index 257efea1cb..a20a849ed0 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -825,21 +825,21 @@ "LabelImageFetchersHelp": "فعالسازی و رتبه بندی دریافت کننده های تصاویر شما به ترتیب الویت.", "LabelInNetworkSignInWithEasyPassword": "فعالسازی ورود با پین کد آسان من داخل شبکه", "Off": "خاموش", - "OneChannel": "", + "OneChannel": "یک کانال", "OnlyForcedSubtitles": "", "OnlyForcedSubtitlesHelp": "", "OnlyImageFormats": "", "Option3D": "3D", "OptionAdminUsers": "مدیران سیستم", - "OptionAllUsers": "", + "OptionAllUsers": "همه کاربران", "OptionAllowAudioPlaybackTranscoding": "", "OptionForceRemoteSourceTranscoding": "", - "OptionAllowBrowsingLiveTv": "", + "OptionAllowBrowsingLiveTv": "اجازه دسترسی به تلویزیون زنده", "OptionAllowContentDownloading": "Allow media downloading and syncing", "OptionAllowLinkSharing": "", "OptionAllowLinkSharingHelp": "", "OptionAllowManageLiveTv": "", - "OptionAllowMediaPlayback": "", + "OptionAllowMediaPlayback": "اجازه پخش محتوا", "OptionAllowMediaPlaybackTranscodingHelp": "محدود کردن دسترسی به رمزگذاری ممکن است به دلیل پشتیبانی نکردن از قالب های رسانه ای ، منجر به خرابی پخش در مشتریان شود.", "OptionAllowRemoteControlOthers": "", "OptionAllowRemoteSharedDevices": "", @@ -1137,7 +1137,7 @@ "LanNetworksHelp": "ویرگول لیست آدرس \"IP\" ها یا \"IP/زیر شبکه\" های وارد شده برای شبکه هایی که شبکه محلی در نظر گرفته میشوند برای زمانی که محدودیت پهنای باند اعمال میشود را جدا کرده است. اگر تنظیم کنید، تمام آدرس IP های دیگر روی شبکه خارجی در نظر گرفته میشوند و مشمول محدودیت های پهنای باند خارجی میشود. در صورت خالی بودن، تنها زیر شبکه سرور در شبکه محلی در نظر گرفته می شود.", "LearnHowYouCanContribute": "یاد بگیرید چگونه می‌توانید مشارکت کنید.", "LeaveBlankToNotSetAPassword": "می توانید این خانه را خالی بگذارید تا کلمه عبوری تنظیم نشود.", - "List": "", + "List": "لیست", "Live": "پخش زنده", "LiveBroadcasts": "پخش زنده", "LiveTV": "پخش تلویزیون زنده", @@ -1194,7 +1194,7 @@ "MessageFileReadError": "در خواندن فایل خطایی وجود داشت. لطفا دوباره تلاش کنید.", "MessageForgotPasswordFileCreated": "", "MessageForgotPasswordInNetworkRequired": "", - "MessageImageFileTypeAllowed": "", + "MessageImageFileTypeAllowed": "فقط فایل های JPEG و PNG پشتیبانی می شوند.", "MessageImageTypeNotSelected": "", "MessageLeaveEmptyToInherit": "", "MessageNoCollectionsAvailable": "", @@ -1257,28 +1257,28 @@ "MessageYouHaveVersionInstalled": "", "MessageSyncPlayEnabled": "فعال شد SyncPlay.", "MessageSyncPlayDisabled": "SyncPlay غیرفعال شد.", - "MessageSyncPlayUserJoined": "", - "MessageSyncPlayUserLeft": "", + "MessageSyncPlayUserJoined": "{0} به گروه پیوست.", + "MessageSyncPlayUserLeft": "{0} از گروه خارج شد.", "MessageSyncPlayGroupWait": "{0} در حال بافر است …", - "MessageSyncPlayNoGroupsAvailable": "", + "MessageSyncPlayNoGroupsAvailable": "هیچ گروهی در دسترس نیست. اول پخش چیزی را شروع کنید.", "MessageSyncPlayPlaybackPermissionRequired": "", "MessageSyncPlayGroupDoesNotExist": "", "MessageSyncPlayCreateGroupDenied": "", "MessageSyncPlayJoinGroupDenied": "عضو شدن در گروه امکان پذیر نیست.", - "MessageSyncPlayLibraryAccessDenied": "", - "MessageSyncPlayErrorAccessingGroups": "", + "MessageSyncPlayLibraryAccessDenied": "دسترسی به این محتوا محدود شده است.", + "MessageSyncPlayErrorAccessingGroups": "خطایی هنگام دسترسی به لیست گروه ها رخ داد.", "MessageSyncPlayErrorNoActivePlayer": "", "MessageSyncPlayErrorMissingSession": "", "MessageSyncPlayErrorMedia": "", - "Metadata": "", - "MetadataManager": "", + "Metadata": "فراداده", + "MetadataManager": "مدیر فراداده", "MetadataSettingChangeHelp": "تغییر تنظیمات ابرداده بر محتوای جدید اضافه شده در آینده تأثیر می گذارد. برای تازه سازی محتوای موجود ، صفحه جزئیات را باز کنید و روی دکمه 'تازه سازی' کلیک کنید، یا با استفاده از 'مدیریت ابرداده' تازه سازی های عمده را انجام دهید.", - "MinutesAfter": "", + "MinutesAfter": "دقیقه بعد", "MinutesBefore": "", "Mobile": "دستگاه همراه", "Monday": "دوشنبه", - "MoreFromValue": "", - "MoreMediaInfo": "", + "MoreFromValue": "بیشتر از {0}", + "MoreMediaInfo": "اطلاعات محتوا", "MoveLeft": "", "MoveRight": "", "MovieLibraryHelp": "", @@ -1286,10 +1286,10 @@ "NewCollectionHelp": "", "NoCreatedLibraries": "", "NoNewDevicesFound": "", - "NoSubtitlesHelp": "", + "NoSubtitlesHelp": "زیرنویس ها به صورت پیش فرض بارگذاری نخواهند شد. آنها را هنوز میتوان هنگام پخش روشن کرد.", "None": "هیچ یک", "Normal": "طبیعی", - "NumLocationsValue": "", + "NumLocationsValue": "{0} پوشه", "ServerRestartNeededAfterPluginInstall": "بعد از نصب یک افزونه ، Jellyfin باید دوباره راه اندازی شود.", "ServerUpdateNeeded": "این سرور باید به روز شود. برای بارگیری آخرین نسخه ، لطفاً به {0} مراجعه کنید", "Settings": "تنظیمات", @@ -1590,5 +1590,16 @@ "IgnoreDts": "نادیده‌گرفتن DTS (decoding timestamp)", "HomeVideosPhotos": "ویدیو ها و تصاویر خانگی", "Experimental": "آزمایشی", - "DownloadAll": "دانلود همه" + "DownloadAll": "دانلود همه", + "Bold": "درشت", + "LabelDummyChapterDuration": "وقفه", + "LabelChapterImageResolution": "وضوح تصویر", + "LabelTextWeight": "وزن متن", + "MessageSent": "پیام ارسال شد.", + "MessageNoItemsAvailable": "هیچ آیتمی در حال حاضر در دسترس نیست.", + "MessageNoFavoritesAvailable": "هیچ مورد علاقه ای در حال حاضر در دسترس نیست.", + "HeaderPerformance": "کارایی", + "IgnoreDtsHelp": "غیر فعال کردن این گزینه ممکن است برخی اشکالات را رفع کند، مثل نبودن صدا بر روی کانال هایی که جریان صدا و تصویر جداگانه دارند.", + "LabelDummyChapterDurationHelp": "وقفه استخراج تصاویر فصل به ثانیه.", + "HeaderDummyChapter": "تصاویر فصل" } From 18cd64ca0b7b00cac7dc2a1d39bb28cc4146035c Mon Sep 17 00:00:00 2001 From: stanol Date: Mon, 24 Apr 2023 20:36:54 +0000 Subject: [PATCH 022/147] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 0c8a450847..2e155e2a81 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1718,5 +1718,6 @@ "LabelParallelImageEncodingLimit": "Обмеження на паралельне кодування зображень", "LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо встановити значення 0, буде обрано обмеження на основі характеристик вашої системи.", "LabelEnableAudioVbrHelp": "Змінний бітрейт забезпечує краще співвідношення якості до середнього бітрейту, але в деяких рідкісних випадках може спричинити проблеми з буферизацією та сумісністю.", - "LabelEnableAudioVbr": "Увімкнути VBR" + "LabelEnableAudioVbr": "Увімкнути VBR", + "Select": "Вибрати" } From eb15f97955fb2a9ee860d9dba46bb49e348b37de Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Tue, 14 Mar 2023 20:37:20 +0800 Subject: [PATCH 023/147] Drop progressive transcoding in web client Signed-off-by: nyanmisaka --- src/scripts/browserDeviceProfile.js | 46 ----------------------------- 1 file changed, 46 deletions(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index c603d475d4..f99e0ab343 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -686,30 +686,6 @@ export default function (options) { }); }); - if (canPlayMkv && !browser.tizen && options.enableMkvProgressive !== false) { - profile.TranscodingProfiles.push({ - Container: 'mkv', - Type: 'Video', - AudioCodec: videoAudioCodecs.join(','), - VideoCodec: mp4VideoCodecs.join(','), - Context: 'Streaming', - MaxAudioChannels: physicalAudioChannels.toString(), - CopyTimestamps: true - }); - } - - if (canPlayMkv) { - profile.TranscodingProfiles.push({ - Container: 'mkv', - Type: 'Video', - AudioCodec: videoAudioCodecs.join(','), - VideoCodec: mp4VideoCodecs.join(','), - Context: 'Static', - MaxAudioChannels: physicalAudioChannels.toString(), - CopyTimestamps: true - }); - } - if (canPlayHls() && options.enableHls !== false) { if (hlsInFmp4VideoCodecs.length && hlsInFmp4VideoAudioCodecs.length && userSettings.preferFmp4HlsContainer() && (browser.safari || browser.tizen || browser.web0s)) { profile.TranscodingProfiles.push({ @@ -740,28 +716,6 @@ export default function (options) { } } - // Progressive mp4 transcoding - if (mp4VideoCodecs.length && videoAudioCodecs.length) { - profile.TranscodingProfiles.push({ - Container: 'mp4', - Type: 'Video', - AudioCodec: videoAudioCodecs.join(','), - VideoCodec: mp4VideoCodecs.join(','), - Context: 'Streaming', - Protocol: 'http', - MaxAudioChannels: physicalAudioChannels.toString() - }); - } - - profile.TranscodingProfiles.push({ - Container: 'mp4', - Type: 'Video', - AudioCodec: videoAudioCodecs.join(','), - VideoCodec: 'h264', - Context: 'Static', - Protocol: 'http' - }); - profile.ContainerProfiles = []; profile.CodecProfiles = []; From f93bfdec4208c1fd3586ccb9b9030822197bc04e Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Fri, 14 Apr 2023 18:50:24 +0800 Subject: [PATCH 024/147] Add tonemap mode options Signed-off-by: nyanmisaka --- src/controllers/dashboard/encodingsettings.html | 12 ++++++++---- src/controllers/dashboard/encodingsettings.js | 4 ++-- src/strings/en-us.json | 4 +++- src/strings/zh-cn.json | 4 +++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/controllers/dashboard/encodingsettings.html b/src/controllers/dashboard/encodingsettings.html index 759c19d7d4..3d4ed0b99b 100644 --- a/src/controllers/dashboard/encodingsettings.html +++ b/src/controllers/dashboard/encodingsettings.html @@ -167,6 +167,14 @@ ${TonemappingAlgorithmHelp} +
+ +
${TonemappingModeHelp}
+
${LabelTonemappingDesatHelp}
-
- -
${LabelTonemappingThresholdHelp}
-
${LabelTonemappingPeakHelp}
diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 38ca954d0e..2ae00b3dec 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -32,9 +32,9 @@ function loadPage(page, config, systemInfo) { page.querySelector('#chkTonemapping').checked = config.EnableTonemapping; page.querySelector('#chkVppTonemapping').checked = config.EnableVppTonemapping; page.querySelector('#selectTonemappingAlgorithm').value = config.TonemappingAlgorithm; + page.querySelector('#selectTonemappingMode').value = config.TonemappingMode; page.querySelector('#selectTonemappingRange').value = config.TonemappingRange; page.querySelector('#txtTonemappingDesat').value = config.TonemappingDesat; - page.querySelector('#txtTonemappingThreshold').value = config.TonemappingThreshold; page.querySelector('#txtTonemappingPeak').value = config.TonemappingPeak; page.querySelector('#txtTonemappingParam').value = config.TonemappingParam || ''; page.querySelector('#txtVppTonemappingBrightness').value = config.VppTonemappingBrightness; @@ -90,9 +90,9 @@ function onSubmit() { config.EnableTonemapping = form.querySelector('#chkTonemapping').checked; config.EnableVppTonemapping = form.querySelector('#chkVppTonemapping').checked; config.TonemappingAlgorithm = form.querySelector('#selectTonemappingAlgorithm').value; + config.TonemappingMode = form.querySelector('#selectTonemappingMode').value; config.TonemappingRange = form.querySelector('#selectTonemappingRange').value; config.TonemappingDesat = form.querySelector('#txtTonemappingDesat').value; - config.TonemappingThreshold = form.querySelector('#txtTonemappingThreshold').value; config.TonemappingPeak = form.querySelector('#txtTonemappingPeak').value; config.TonemappingParam = form.querySelector('#txtTonemappingParam').value || '0'; config.VppTonemappingBrightness = form.querySelector('#txtVppTonemappingBrightness').value; diff --git a/src/strings/en-us.json b/src/strings/en-us.json index e2b39af691..7a8ce9d8ee 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1706,5 +1706,7 @@ "MediaInfoElPresentFlag": "DV el preset flag", "MediaInfoBlPresentFlag": "DV bl preset flag", "MediaInfoDvBlSignalCompatibilityId": "DV bl signal compatibility id", - "Unreleased": "Not yet released" + "Unreleased": "Not yet released", + "LabelTonemappingMode": "Tone mapping mode:", + "TonemappingModeHelp": "Select the tone mapping mode. If you experience blown out highlights try switching to the RGB mode." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index d0ce56c4f8..9a047ed0be 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1721,5 +1721,7 @@ "HeaderPerformance": "性能", "LabelParallelImageEncodingLimit": "并行图像编码限制", "LabelEnableAudioVbr": "启用 VBR 音频编码", - "LabelEnableAudioVbrHelp": "可变比特率(VBR)相比平均比特率(ABR)可以提供更好的质量,但在少见情况中可能造成缓冲和兼容性问题。" + "LabelEnableAudioVbrHelp": "可变比特率(VBR)相比平均比特率(ABR)可以提供更好的质量,但在少见情况中可能造成缓冲和兼容性问题。", + "LabelTonemappingMode": "色调映射模式:", + "TonemappingModeHelp": "如果您遇到高光过曝问题,请尝试切换到 RGB 模式。" } From 89158b66531a9f71a9f4fe25a1808bec6ed69ee3 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Fri, 14 Apr 2023 18:55:08 +0800 Subject: [PATCH 025/147] Update translations for tonemapping Signed-off-by: nyanmisaka --- src/strings/en-us.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 7a8ce9d8ee..be9ee91bab 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -32,7 +32,7 @@ "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", "AllowRemoteAccess": "Allow remote connections to this server", "AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.", - "AllowTonemappingHelp": "Tone-mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colors, which are very important information for representing the original scene. Currently works only with HDR10 or HLG videos. This requires the corresponding OpenCL or CUDA runtime.", + "AllowTonemappingHelp": "Tone-mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colors, which are very important information for representing the original scene. Currently works only with 10bit HDR10,HLG and DoVi videos. This requires the corresponding OpenCL or CUDA runtime.", "AlwaysPlaySubtitles": "Always Play", "AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.", "AnyLanguage": "Any Language", @@ -1691,9 +1691,9 @@ "EnableEnhancedNvdecDecoderHelp": "Experimental NVDEC implementation, do not enable this option unless you encounter decoding errors.", "EnableSplashScreen": "Enable the splash screen", "LabelVppTonemappingBrightness": "VPP Tone mapping brightness gain", - "LabelVppTonemappingBrightnessHelp": "Apply brightness gain in VPP tone mapping. Both recommended and default values are 0.", + "LabelVppTonemappingBrightnessHelp": "Apply brightness gain in VPP tone mapping. The recommended and default values are 16 and 0.", "LabelVppTonemappingContrast": "VPP Tone mapping contrast gain", - "LabelVppTonemappingContrastHelp": "Apply contrast gain in VPP tone mapping. The recommended and default values are 1.2 and 1.", + "LabelVppTonemappingContrastHelp": "Apply contrast gain in VPP tone mapping. Both recommended and default values are 1.", "VideoRangeTypeNotSupported": "The video's range type is not supported", "LabelVideoRangeType": "Video range type", "MediaInfoVideoRangeType": "Video range type", From 24126b15740ee6b340dfd9807d8ce321e7d3bade Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 25 Apr 2023 01:54:03 -0400 Subject: [PATCH 026/147] Remove colons from label translations --- src/strings/en-us.json | 2 +- src/strings/zh-cn.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index be9ee91bab..9c4d2c8764 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1707,6 +1707,6 @@ "MediaInfoBlPresentFlag": "DV bl preset flag", "MediaInfoDvBlSignalCompatibilityId": "DV bl signal compatibility id", "Unreleased": "Not yet released", - "LabelTonemappingMode": "Tone mapping mode:", + "LabelTonemappingMode": "Tone mapping mode", "TonemappingModeHelp": "Select the tone mapping mode. If you experience blown out highlights try switching to the RGB mode." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 9a047ed0be..8818053189 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1722,6 +1722,6 @@ "LabelParallelImageEncodingLimit": "并行图像编码限制", "LabelEnableAudioVbr": "启用 VBR 音频编码", "LabelEnableAudioVbrHelp": "可变比特率(VBR)相比平均比特率(ABR)可以提供更好的质量,但在少见情况中可能造成缓冲和兼容性问题。", - "LabelTonemappingMode": "色调映射模式:", + "LabelTonemappingMode": "色调映射模式", "TonemappingModeHelp": "如果您遇到高光过曝问题,请尝试切换到 RGB 模式。" } From 99262d6edd0d2f5db616424111f6c09d1d4f6dba Mon Sep 17 00:00:00 2001 From: Oskari Lavinto Date: Tue, 25 Apr 2023 06:47:43 +0000 Subject: [PATCH 027/147] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index 76b86d8016..f67a1dcaef 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1719,5 +1719,6 @@ "HeaderPerformance": "Suorituskyky", "LabelParallelImageEncodingLimit": "Rinnakkaisten kuvaenkoodauksien rajoitus", "LabelEnableAudioVbr": "Käytä äänen VBR-enkoodausta", - "LabelEnableAudioVbrHelp": "Muuttuva bittinopeus (variable bitrate, VBR) tuottaa keskitasoista paremman laadun, mutta saattaa joissakin harvoissa tapauksissa aiheuttaa puskurointi ja yhteensopivuusongelmia." + "LabelEnableAudioVbrHelp": "Muuttuva bittinopeus (variable bitrate, VBR) tuottaa keskitasoista paremman laadun, mutta saattaa joissakin harvoissa tapauksissa aiheuttaa puskurointi ja yhteensopivuusongelmia.", + "Select": "Valitse" } From eeddd5dc2fcbb33cb05f25b3bae2f433323b0c5a Mon Sep 17 00:00:00 2001 From: Bas Date: Tue, 25 Apr 2023 14:59:45 +0000 Subject: [PATCH 028/147] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 3c73edc564..0ef61eb21b 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1720,5 +1720,6 @@ "LabelParallelImageEncodingLimitHelp": "Maximum aantal afbeeldingscoderingen dat tegelijkertijd mag lopen. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op je systeemspecificaties.", "LabelParallelImageEncodingLimit": "Limiet gelijktijdige afbeeldingscoderingen", "LabelEnableAudioVbr": "VBR-audiocodering inschakelen", - "LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt betere kwaliteit bij een vergelijkbare gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden." + "LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt betere kwaliteit bij een vergelijkbare gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden.", + "Select": "Selecteren" } From 66937e696ff28c73c8f738cb5c8c17d712bcb49f Mon Sep 17 00:00:00 2001 From: blob03 Date: Tue, 25 Apr 2023 22:09:49 +0000 Subject: [PATCH 029/147] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 259f435d12..a2df89fe28 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1384,7 +1384,7 @@ "LabelTonemappingRange": "Gamme de mappage tonal", "TonemappingAlgorithmHelp": "Le mappage tonal peut être affiné. Si vous n'êtes pas familier avec ces réglages, il est conseillé de choisir les valeurs recommandées. L'algorithme de mappage recommandé est 'BT.2390'.", "LabelTonemappingAlgorithm": "Sélectionner l'algorithme de mappage tonal à utiliser", - "AllowTonemappingHelp": "Le mappage tonal est capable de convertir une gamme dynamique HDR en SDR tout en maintenant les détails et les couleurs d'image si importants au rendu de la scène originale. Pour le moment, ne fonctionne qu'avec les vidéos HDR10 ou HLG et requiert les environnements d'exécution OpenCL et CUDA correspondant.", + "AllowTonemappingHelp": "Le mappage tonal est capable de convertir une gamme dynamique HDR en SDR tout en maintenant les détails et les couleurs d'image si importants au rendu de la scène originale. Pour le moment, ne fonctionne qu'avec les vidéos 10bits HDR10, HLG, DoVi et requiert les environnements d'exécution OpenCL et CUDA correspondant.", "EnableTonemapping": "Activer le mappage tonal", "LabelOpenclDeviceHelp": "Ce dispositif OpenCL est utilisé pour le mappage tonal. La partie à gauche du point est le numéro de plate-forme et la partie à droite est le numéro du dispositif sur la plate-forme. La valeur par défaut est 0,0. Le fichier de l'application FFmpeg contenant l'accélération matérielle OpenCL est nécessaire.", "LabelOpenclDevice": "Dispositif OpenCL", @@ -1667,9 +1667,9 @@ "MediaInfoVideoRangeType": "Type de plage vidéo", "LabelVideoRangeType": "Type de plage vidéo", "VideoRangeTypeNotSupported": "Le type de plage de la vidéo n'est pas pris en charge", - "LabelVppTonemappingContrastHelp": "Appliquer le gain de contraste dans le mappage de tonalité VPP. La valeur recommandée est 1,2 ; la valeur par défaut est 1.", + "LabelVppTonemappingContrastHelp": "Appliquer le gain de contraste dans le mappage tonal VPP. La valeur recommandée et par défaut est 1.", "LabelVppTonemappingContrast": "Gain de contraste du mappage VPP", - "LabelVppTonemappingBrightnessHelp": "Appliquer le gain de luminosité dans le mappage de tonalité VPP. La valeur recommandée et par défaut est 0.", + "LabelVppTonemappingBrightnessHelp": "Appliquer le gain de luminosité dans le mappage tonal VPP. La valeur recommandée et celle par défaut sont respectivement 16 et 0.", "LabelVppTonemappingBrightness": "Gain de luminosité du mappage VPP", "ScreenResolution": "Résolution d'écran", "RememberSubtitleSelectionsHelp": "Choisir la piste de sous-titres la plus proche de la dernière vidéo.", @@ -1721,5 +1721,8 @@ "LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image", "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, vous choisirez une limite en fonction des spécifications de votre système.", "LabelEnableAudioVbr": "Activer l’encodage audio VBR", - "LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité." + "LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité.", + "LabelTonemappingMode": "Mode de mappage tonal", + "TonemappingModeHelp": "Sélectionnez le mode de mappage tonal. Si vous rencontrez des reflets soufflés, essayez le mode RVB.", + "Select": "Sélectionner" } From dbf4e8e3cfe16bcaa8c456241a794db282cc66d2 Mon Sep 17 00:00:00 2001 From: stanol Date: Tue, 25 Apr 2023 22:39:43 +0000 Subject: [PATCH 030/147] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 2e155e2a81..5183ac4fc0 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -302,7 +302,7 @@ "DirectStreamHelp1": "Відеопотік сумісний із пристроєм, але має несумісний аудіоформат (DTS, Dolby True HD тощо) або кількість аудіоканалів. Перед відправленням на пристрій, відеопотік буде перепаковуватись без втрат \"на льоту\". Буде перекодовано лише аудіопотік.", "DefaultSubtitlesHelp": "Завантаження субтитрів визначається опціями \"За замовчуванням\" і \"Форсовані\" у вбудованих метаданих. Мовні уподобання враховуються за наявності кількох опцій.", "DefaultMetadataLangaugeDescription": "Це значення за замовчуванням. Вони можуть бути налаштовані індивідуально для кожної медіатеки.", - "AllowTonemappingHelp": "Відображення тонів може перетворити динамічний діапазон відео з HDR до SDR, зберігаючи деталі зображення та кольори, які є дуже важливою інформацією для представлення оригінальної сцени. Наразі працює лише з відео HDR10 або HLG. Для цього потрібне відповідне середовище виконання OpenCL або CUDA.", + "AllowTonemappingHelp": "Відображення тонів може перетворити динамічний діапазон відео з HDR до SDR, зберігаючи деталі зображення та кольори, які є дуже важливою інформацією для представлення оригінальної сцени. Наразі працює лише з відео 10bit HDR10, HLG або DoVi. Для цього потрібне відповідне середовище виконання OpenCL або CUDA.", "HeaderCastAndCrew": "Актори і знімальна команда", "HeaderCancelSeries": "Скасувати серіал", "HeaderCancelRecording": "Скасувати запис", @@ -1669,9 +1669,9 @@ "MediaInfoVideoRangeType": "Тип діапазону відео", "LabelVideoRangeType": "Тип діапазону відео", "VideoRangeTypeNotSupported": "Тип диапазону відео не підтримується", - "LabelVppTonemappingContrastHelp": "Застосувати чутливість яскравості для VPP tone mapping. Значення за замовчуванням (1.2 та 1) є рекомендованими.", + "LabelVppTonemappingContrastHelp": "Застосувати чутливість яскравості для VPP tone mapping. Значення за замовчуванням (1) є рекомендованими.", "LabelVppTonemappingContrast": "Чутливість контрасту для VPP Tone mapping", - "LabelVppTonemappingBrightnessHelp": "Застосувати чутливість яскравості для VPP tone mapping. Значення за замовчуванням (0) є рекомендованим.", + "LabelVppTonemappingBrightnessHelp": "Застосувати чутливість яскравості для VPP tone mapping. Рекомендоване значення 16, значення за замовчуванням 0.", "LabelVppTonemappingBrightness": "Чутливість яскравості для VPP Tone mapping", "IgnoreDts": "Ігнорувати DTS (мітка часу декодування)", "IgnoreDtsHelp": "Вимкнення цієї опції може вирішити деякі проблеми, напр. відсутність аудіо на каналах з окремими аудіо- та відеопотоками.", From 60d3859a2f11b5f18f183ad5ae715c5cb41bd759 Mon Sep 17 00:00:00 2001 From: Ian Walton Date: Sat, 22 Apr 2023 10:12:58 -0400 Subject: [PATCH 031/147] Escape device id in raw HTML. --- src/controllers/dashboard/devices/devices.js | 7 ++++--- src/scripts/imagehelper.js | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 8413c42dee..f28064e09a 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -90,11 +90,12 @@ function load(page, devices) { let html = ''; html += devices.map(function (device) { let deviceHtml = ''; - deviceHtml += "
"; + deviceHtml += "
"; deviceHtml += '
'; deviceHtml += '
'; deviceHtml += '
'; - deviceHtml += ``; + deviceHtml += ``; + // audit note: getDeviceIcon returns static text const iconUrl = imageHelper.getDeviceIcon(device); if (iconUrl) { @@ -113,7 +114,7 @@ function load(page, devices) { deviceHtml += '
'; else deviceHtml += '
'; - deviceHtml += ''; + deviceHtml += ''; deviceHtml += '
'; } diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index 49fe204b33..052c68111e 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -1,5 +1,6 @@ const BASE_DEVICE_IMAGE_URL = 'assets/img/devices/'; +// audit note: this module is expected to return safe text for use in HTML function getWebDeviceIcon(browser) { switch (browser) { case 'Opera': From 097471863e35c4fc2967efdfc0856f0dfad2e255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Wed, 26 Apr 2023 07:22:30 +0000 Subject: [PATCH 032/147] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 9a186bda61..ae924414cb 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1386,7 +1386,7 @@ "LabelTonemappingRange": "Rozsah mapování tónů", "TonemappingAlgorithmHelp": "Mapování tonů je možné dále ladit. Pokud možnostem zde nerozumíte, je možné ponechat vše ve výchozím nastavení. Doporučená hodnota je 'BT.2390'.", "LabelTonemappingAlgorithm": "Algoritmus mapování tónů", - "AllowTonemappingHelp": "Mapování tónů umožňuje změnit dynamický rozsah videa z HDR na SDR bez ztráty detailů a barev, tj. důležitých informací původního obrazu. Tato funkce momentálně funguje pouze u videí, které obsahují HDR10 nebo HLG, a vyžaduje buď OpenCL nebo CUDA.", + "AllowTonemappingHelp": "Mapování tónů umožňuje změnit dynamický rozsah videa z HDR na SDR bez ztráty detailů a barev, tj. důležitých informací původního obrazu. Tato funkce momentálně funguje pouze u videí, které obsahují 10bitové HDR10, HLG nebo Dolby Vision. Funkce rovněž vyžaduje OpenCL nebo CUDA.", "EnableTonemapping": "Zapnout mapování tónů", "LabelOpenclDeviceHelp": "Zařízení OpenCL použité pro mapování tónů. Nalevo od tečky je číslo platformy, napravo pak číslo zařízení na této platformě. Výchozí hodnota je 0.0. Soubor aplikace FFmpeg, který obsahuje metodu pro hardwarovou akceleraci OpenCL, je povinný.", "LabelOpenclDevice": "Zařízení OpenCL", @@ -1666,9 +1666,9 @@ "MediaInfoVideoRangeType": "Typ rozsahu videa", "LabelVideoRangeType": "Typ rozsahu videa", "VideoRangeTypeNotSupported": "Typ rozsahu videa není podporován", - "LabelVppTonemappingContrastHelp": "Zvýší kontrast při mapování tonů VPP. Doporučená hodnota je 1.2, výchozí hodnota je 1.", + "LabelVppTonemappingContrastHelp": "Zvýší kontrast při mapování tonů VPP. Doporučená i výchozí hodnota je 1.", "LabelVppTonemappingContrast": "Zvýšení kontrastu mapování tónů VPP", - "LabelVppTonemappingBrightnessHelp": "Zvýší jas při mapování tonů VPP. Doporučená i výchozí hodnota je 0.", + "LabelVppTonemappingBrightnessHelp": "Zvýší jas při mapování tonů VPP. Doporučená hodnota je 16, výchozí hodnota je 0.", "LabelVppTonemappingBrightness": "Zvýšení jasu mapování tónů VPP", "ScreenResolution": "Rozlišení obrazovky", "RememberSubtitleSelectionsHelp": "Pokusí se nastavit titulkovou stopu co nejpodobněji předchozímu videu.", @@ -1722,5 +1722,7 @@ "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle parametrů systému.", "LabelEnableAudioVbr": "Povolit kódování zvuku VBR", "LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou.", - "Select": "Vybrat" + "Select": "Vybrat", + "LabelTonemappingMode": "Režim mapování tónů", + "TonemappingModeHelp": "Určute režim mapování tónů. Pokud narazíte na přeexponovaná světlá místa, zkuste přepnout do režimu RGB." } From 829f476ce3ac9a431f36d1d28560b74f4d10cb84 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 09:50:48 -0400 Subject: [PATCH 033/147] Refactor backdrop and header to separate components --- src/App.tsx | 23 +++++------------------ src/components/AppHeader.tsx | 20 ++++++++++++++++++++ src/components/Backdrop.tsx | 17 +++++++++++++++++ 3 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 src/components/AppHeader.tsx create mode 100644 src/components/Backdrop.tsx diff --git a/src/App.tsx b/src/App.tsx index 1a544723a1..d72fd3831e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,8 @@ import { History } from '@remix-run/router'; -import React, { useEffect } from 'react'; +import React from 'react'; +import AppHeader from './components/AppHeader'; +import Backdrop from './components/Backdrop'; import { HistoryRouter } from './components/HistoryRouter'; import { ApiProvider } from './hooks/useApi'; import { AppRoutes, ExperimentalAppRoutes } from './routes'; @@ -8,31 +10,16 @@ import { AppRoutes, ExperimentalAppRoutes } from './routes'; const App = ({ history }: { history: History }) => { const layoutMode = localStorage.getItem('layout'); - useEffect(() => { - Promise.all([ - // Initialize the UI components after first render - import('./scripts/libraryMenu'), - import('./scripts/autoBackdrops') - ]); - }, []); - return ( -
-
- -
-
-
-
+ +
{layoutMode === 'experimental' ? : }
- -
); diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx new file mode 100644 index 0000000000..941d36a940 --- /dev/null +++ b/src/components/AppHeader.tsx @@ -0,0 +1,20 @@ +import React, { useEffect } from 'react'; + +const AppHeader = () => { + useEffect(() => { + // Initialize the UI components after first render + import('../scripts/libraryMenu'); + }, []); + + return ( + <> +
+
+
+
+
+ + ); +}; + +export default AppHeader; diff --git a/src/components/Backdrop.tsx b/src/components/Backdrop.tsx new file mode 100644 index 0000000000..1283be0aa9 --- /dev/null +++ b/src/components/Backdrop.tsx @@ -0,0 +1,17 @@ +import React, { useEffect } from 'react'; + +const Backdrop = () => { + useEffect(() => { + // Initialize the UI components after first render + import('../scripts/autoBackdrops'); + }, []); + + return ( + <> +
+
+ + ); +}; + +export default Backdrop; From 8f730b82706253ffa63f4b4e8e7d1d65e16c3be4 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 11:30:57 -0400 Subject: [PATCH 034/147] Fix eslint warnings in ts files --- src/components/ServerContentPage.tsx | 3 ++- src/components/viewManager/ViewManagerPage.tsx | 3 ++- src/elements/emby-scroller/Scroller.tsx | 2 +- src/types/viewManager.ts | 3 +++ src/utils/jellyfin-apiclient/getItems.ts | 11 ++++++----- 5 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 src/types/viewManager.ts diff --git a/src/components/ServerContentPage.tsx b/src/components/ServerContentPage.tsx index 7473c856e8..e5428269bc 100644 --- a/src/components/ServerContentPage.tsx +++ b/src/components/ServerContentPage.tsx @@ -4,6 +4,7 @@ import { useLocation } from 'react-router-dom'; import ServerConnections from './ServerConnections'; import viewManager from './viewManager/viewManager'; import globalize from '../scripts/globalize'; +import type { RestoreViewFailResponse } from '../types/viewManager'; interface ServerContentPageProps { view: string @@ -29,7 +30,7 @@ const ServerContentPage: FunctionComponent = ({ view }) }; viewManager.tryRestoreView(viewOptions) - .catch(async (result?: any) => { + .catch(async (result?: RestoreViewFailResponse) => { if (!result || !result.cancelled) { const apiClient = ServerConnections.currentApiClient(); diff --git a/src/components/viewManager/ViewManagerPage.tsx b/src/components/viewManager/ViewManagerPage.tsx index 563603e531..511338d1e2 100644 --- a/src/components/viewManager/ViewManagerPage.tsx +++ b/src/components/viewManager/ViewManagerPage.tsx @@ -2,6 +2,7 @@ import React, { FunctionComponent, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import globalize from '../../scripts/globalize'; +import type { RestoreViewFailResponse } from '../../types/viewManager'; import viewManager from './viewManager'; export interface ViewManagerPageProps { @@ -45,7 +46,7 @@ const ViewManagerPage: FunctionComponent = ({ }; viewManager.tryRestoreView(viewOptions) - .catch(async (result?: any) => { + .catch(async (result?: RestoreViewFailResponse) => { if (!result || !result.cancelled) { const [ controllerFactory, viewHtml ] = await Promise.all([ import(/* webpackChunkName: "[request]" */ `../../controllers/${controller}`), diff --git a/src/elements/emby-scroller/Scroller.tsx b/src/elements/emby-scroller/Scroller.tsx index 36b38cc1fb..773d184c59 100644 --- a/src/elements/emby-scroller/Scroller.tsx +++ b/src/elements/emby-scroller/Scroller.tsx @@ -126,7 +126,7 @@ const Scroller: FC = ({ }, [getScrollPosition, getScrollSize, getScrollWidth]); const initCenterFocus = useCallback((elem: EventTarget, scrollerInstance: scrollerFactory) => { - dom.addEventListener(elem, 'focus', function (e: { target: any; }) { + dom.addEventListener(elem, 'focus', function (e: FocusEvent) { const focused = focusManager.focusableParent(e.target); if (focused) { scrollerInstance.toCenter(focused, false); diff --git a/src/types/viewManager.ts b/src/types/viewManager.ts new file mode 100644 index 0000000000..541bbdbc75 --- /dev/null +++ b/src/types/viewManager.ts @@ -0,0 +1,3 @@ +export interface RestoreViewFailResponse { + cancelled?: boolean +} diff --git a/src/utils/jellyfin-apiclient/getItems.ts b/src/utils/jellyfin-apiclient/getItems.ts index dee681a5d5..4bbe711f81 100644 --- a/src/utils/jellyfin-apiclient/getItems.ts +++ b/src/utils/jellyfin-apiclient/getItems.ts @@ -31,25 +31,26 @@ function getItemsSplit(apiClient: ApiClient, userId: string, options: GetItemsRe function mergeResults(results: BaseItemDtoQueryResult[]) { const merged: BaseItemDtoQueryResult = { Items: [], - TotalRecordCount: 0, StartIndex: 0 }; + // set TotalRecordCount separately so TS knows it is defined + merged.TotalRecordCount = 0; for (const result of results) { - if (result.Items == null) { + if (!result.Items) { console.log('[getItems] Retrieved Items array is invalid', result.Items); continue; } - if (result.TotalRecordCount == null) { + if (!result.TotalRecordCount) { console.log('[getItems] Retrieved TotalRecordCount is invalid', result.TotalRecordCount); continue; } - if (result.StartIndex == null) { + if (typeof result.StartIndex === 'undefined') { console.log('[getItems] Retrieved StartIndex is invalid', result.StartIndex); continue; } merged.Items = merged.Items?.concat(result.Items); - merged.TotalRecordCount! += result.TotalRecordCount; + merged.TotalRecordCount += result.TotalRecordCount; merged.StartIndex = Math.min(merged.StartIndex || 0, result.StartIndex); } return merged; From 9c128b8c106abdb76d23e0d31986f5c33ddb6422 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 12:32:15 -0400 Subject: [PATCH 035/147] Fix complexity warnings in user routes --- src/routes/user/useredit.tsx | 58 +++++++++++-------------- src/routes/user/usernew.tsx | 8 +--- src/routes/user/userparentalcontrol.tsx | 8 +--- src/routes/user/userprofile.tsx | 8 +--- 4 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/routes/user/useredit.tsx b/src/routes/user/useredit.tsx index 67fe055632..64e70f32f6 100644 --- a/src/routes/user/useredit.tsx +++ b/src/routes/user/useredit.tsx @@ -25,6 +25,17 @@ type AuthProvider = { Id?: string; } +const getCheckedElementDataIds = (elements: NodeListOf) => ( + Array.prototype.filter.call(elements, e => e.checked) + .map(e => e.getAttribute('data-id')) +); + +function onSaveComplete() { + Dashboard.navigate('userprofiles.html'); + loading.hide(); + toast(globalize.translate('SettingsSaved')); +} + const UserEdit: FunctionComponent = () => { const [ userName, setUserName ] = useState(''); const [ deleteFoldersAccess, setDeleteFoldersAccess ] = useState([]); @@ -56,7 +67,7 @@ const UserEdit: FunctionComponent = () => { } const fldSelectLoginProvider = page.querySelector('.fldSelectLoginProvider') as HTMLDivElement; - providers.length > 1 ? fldSelectLoginProvider.classList.remove('hide') : fldSelectLoginProvider.classList.add('hide'); + fldSelectLoginProvider.classList.toggle('hide', providers.length <= 1); setAuthProviders(providers); @@ -73,7 +84,7 @@ const UserEdit: FunctionComponent = () => { } const fldSelectPasswordResetProvider = page.querySelector('.fldSelectPasswordResetProvider') as HTMLDivElement; - providers.length > 1 ? fldSelectPasswordResetProvider.classList.remove('hide') : fldSelectPasswordResetProvider.classList.add('hide'); + fldSelectPasswordResetProvider.classList.toggle('hide', providers.length <= 1); setPasswordResetProviders(providers); @@ -145,7 +156,7 @@ const UserEdit: FunctionComponent = () => { }); const disabledUserBanner = page.querySelector('.disabledUserBanner') as HTMLDivElement; - user.Policy.IsDisabled ? disabledUserBanner.classList.remove('hide') : disabledUserBanner.classList.add('hide'); + disabledUserBanner.classList.toggle('hide', !user.Policy.IsDisabled); const txtUserName = page.querySelector('#txtUserName') as HTMLInputElement; txtUserName.disabled = false; @@ -198,19 +209,9 @@ const UserEdit: FunctionComponent = () => { loadData(); - function onSaveComplete() { - Dashboard.navigate('userprofiles.html'); - loading.hide(); - toast(globalize.translate('SettingsSaved')); - } - const saveUser = (user: UserDto) => { - if (!user.Id) { - throw new Error('Unexpected null user.Id'); - } - - if (!user.Policy) { - throw new Error('Unexpected null user.Policy'); + if (!user.Id || !user.Policy) { + throw new Error('Unexpected null user id or policy'); } user.Name = (page.querySelector('#txtUserName') as HTMLInputElement).value; @@ -235,19 +236,15 @@ const UserEdit: FunctionComponent = () => { user.Policy.AuthenticationProviderId = (page.querySelector('#selectLoginProvider') as HTMLSelectElement).value; user.Policy.PasswordResetProviderId = (page.querySelector('#selectPasswordResetProvider') as HTMLSelectElement).value; user.Policy.EnableContentDeletion = (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).checked; - user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : Array.prototype.filter.call(page.querySelectorAll('.chkFolder'), function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - if (window.ApiClient.isMinServerVersion('10.6.0')) { - user.Policy.SyncPlayAccess = (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value as SyncPlayUserAccessType; - } - window.ApiClient.updateUser(user).then(function () { - window.ApiClient.updateUserPolicy(user.Id || '', user.Policy || {}).then(function () { + user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : getCheckedElementDataIds(page.querySelectorAll('.chkFolder')); + user.Policy.SyncPlayAccess = (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value as SyncPlayUserAccessType; + + window.ApiClient.updateUser(user) + .then(() => ( + window.ApiClient.updateUserPolicy(user.Id || '', user.Policy || {}) + )).then(() => { onSaveComplete(); }); - }); }; const onSubmit = (e: Event) => { @@ -261,16 +258,11 @@ const UserEdit: FunctionComponent = () => { }; (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).addEventListener('change', function (this: HTMLInputElement) { - if (this.checked) { - (page.querySelector('.deleteAccess') as HTMLDivElement).classList.add('hide'); - } else { - (page.querySelector('.deleteAccess') as HTMLDivElement).classList.remove('hide'); - } + (page.querySelector('.deleteAccess') as HTMLDivElement).classList.toggle('hide', this.checked); }); window.ApiClient.getNamedConfiguration('network').then(function (config) { - const fldRemoteAccess = page.querySelector('.fldRemoteAccess') as HTMLDivElement; - config.EnableRemoteAccess ? fldRemoteAccess.classList.remove('hide') : fldRemoteAccess.classList.add('hide'); + (page.querySelector('.fldRemoteAccess') as HTMLDivElement).classList.toggle('hide', !config.EnableRemoteAccess); }); (page.querySelector('.editUserProfileForm') as HTMLFormElement).addEventListener('submit', onSubmit); diff --git a/src/routes/user/usernew.tsx b/src/routes/user/usernew.tsx index e3610b07f5..25d1a13140 100644 --- a/src/routes/user/usernew.tsx +++ b/src/routes/user/usernew.tsx @@ -111,12 +111,8 @@ const UserNew: FunctionComponent = () => { userInput.Name = (page.querySelector('#txtUsername') as HTMLInputElement).value; userInput.Password = (page.querySelector('#txtPassword') as HTMLInputElement).value; window.ApiClient.createUser(userInput).then(function (user) { - if (!user.Id) { - throw new Error('Unexpected null user.Id'); - } - - if (!user.Policy) { - throw new Error('Unexpected null user.Policy'); + if (!user.Id || !user.Policy) { + throw new Error('Unexpected null user id or policy'); } user.Policy.EnableAllFolders = (page.querySelector('.chkEnableAllFolders') as HTMLInputElement).checked; diff --git a/src/routes/user/userparentalcontrol.tsx b/src/routes/user/userparentalcontrol.tsx index dcf465a773..be28cf5089 100644 --- a/src/routes/user/userparentalcontrol.tsx +++ b/src/routes/user/userparentalcontrol.tsx @@ -215,12 +215,8 @@ const UserParentalControl: FunctionComponent = () => { }; const saveUser = (user: UserDto) => { - if (!user.Id) { - throw new Error('Unexpected null user.Id'); - } - - if (!user.Policy) { - throw new Error('Unexpected null user.Policy'); + if (!user.Id || !user.Policy) { + throw new Error('Unexpected null user id or policy'); } const parentalRating = parseInt((page.querySelector('#selectMaxParentalRating') as HTMLSelectElement).value, 10); diff --git a/src/routes/user/userprofile.tsx b/src/routes/user/userprofile.tsx index fb1b5d08f3..0b35d50943 100644 --- a/src/routes/user/userprofile.tsx +++ b/src/routes/user/userprofile.tsx @@ -30,12 +30,8 @@ const UserProfile: FunctionComponent = () => { loading.show(); window.ApiClient.getUser(userId).then(function (user) { - if (!user.Name) { - throw new Error('Unexpected null user.Name'); - } - - if (!user.Id) { - throw new Error('Unexpected null user.Id'); + if (!user.Name || !user.Id) { + throw new Error('Unexpected null user name or id'); } setUserName(user.Name); From 0e0a30a0679b12a766fc698542b5276b207ff71c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 13:13:37 -0400 Subject: [PATCH 036/147] Fix complexity warnings in search results --- src/components/search/SearchResults.tsx | 219 +++++++++++++----------- 1 file changed, 116 insertions(+), 103 deletions(-) diff --git a/src/components/search/SearchResults.tsx b/src/components/search/SearchResults.tsx index bc3528261d..720cee0e3c 100644 --- a/src/components/search/SearchResults.tsx +++ b/src/components/search/SearchResults.tsx @@ -1,7 +1,7 @@ -import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client'; +import type { BaseItemDto, BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; import type { ApiClient } from 'jellyfin-apiclient'; import classNames from 'classnames'; -import React, { FunctionComponent, useEffect, useState } from 'react'; +import React, { FunctionComponent, useCallback, useEffect, useState } from 'react'; import globalize from '../../scripts/globalize'; import ServerConnections from '../ServerConnections'; @@ -14,6 +14,17 @@ type SearchResultsProps = { query?: string; } +const ensureNonNullItems = (result: BaseItemDtoQueryResult) => ({ + ...result, + Items: result.Items || [] +}); + +const isMovies = (collectionType: string) => collectionType === 'movies'; + +const isMusic = (collectionType: string) => collectionType === 'music'; + +const isTVShows = (collectionType: string) => collectionType === 'tvshows' || collectionType === 'tv'; + /* * React component to display search result rows for global search and non-live tv library search */ @@ -35,55 +46,55 @@ const SearchResults: FunctionComponent = ({ serverId = windo const [ people, setPeople ] = useState([]); const [ collections, setCollections ] = useState([]); - useEffect(() => { - const getDefaultParameters = () => ({ - ParentId: parentId, - searchTerm: query, - Limit: 24, - Fields: 'PrimaryImageAspectRatio,CanDelete,BasicSyncInfo,MediaSourceCount', - Recursive: true, - EnableTotalRecordCount: false, - ImageTypeLimit: 1, - IncludePeople: false, - IncludeMedia: false, - IncludeGenres: false, - IncludeStudios: false, - IncludeArtists: false - }); + const getDefaultParameters = useCallback(() => ({ + ParentId: parentId, + searchTerm: query, + Limit: 24, + Fields: 'PrimaryImageAspectRatio,CanDelete,BasicSyncInfo,MediaSourceCount', + Recursive: true, + EnableTotalRecordCount: false, + ImageTypeLimit: 1, + IncludePeople: false, + IncludeMedia: false, + IncludeGenres: false, + IncludeStudios: false, + IncludeArtists: false + }), [parentId, query]); - const fetchArtists = (apiClient: ApiClient, params = {}) => apiClient?.getArtists( - apiClient?.getCurrentUserId(), + const fetchArtists = useCallback((apiClient: ApiClient, params = {}) => ( + apiClient?.getArtists( + apiClient.getCurrentUserId(), { ...getDefaultParameters(), IncludeArtists: true, ...params } - ); + ).then(ensureNonNullItems) + ), [getDefaultParameters]); - const fetchItems = (apiClient: ApiClient, params = {}) => apiClient?.getItems( - apiClient?.getCurrentUserId(), + const fetchItems = useCallback((apiClient: ApiClient, params = {}) => ( + apiClient?.getItems( + apiClient.getCurrentUserId(), { ...getDefaultParameters(), IncludeMedia: true, ...params } - ); + ).then(ensureNonNullItems) + ), [getDefaultParameters]); - const fetchPeople = (apiClient: ApiClient, params = {}) => apiClient?.getPeople( - apiClient?.getCurrentUserId(), + const fetchPeople = useCallback((apiClient: ApiClient, params = {}) => ( + apiClient?.getPeople( + apiClient.getCurrentUserId(), { ...getDefaultParameters(), IncludePeople: true, ...params } - ); - - const isMovies = () => collectionType === 'movies'; - - const isMusic = () => collectionType === 'music'; - - const isTVShows = () => collectionType === 'tvshows' || collectionType === 'tv'; + ).then(ensureNonNullItems) + ), [getDefaultParameters]); + useEffect(() => { // Reset state setMovies([]); setShows([]); @@ -102,78 +113,80 @@ const SearchResults: FunctionComponent = ({ serverId = windo setPeople([]); setCollections([]); - if (query) { - const apiClient = ServerConnections.getApiClient(serverId); - - // Movie libraries - if (!collectionType || isMovies()) { - // Movies row - fetchItems(apiClient, { IncludeItemTypes: 'Movie' }) - .then(result => setMovies(result.Items || [])); - } - - // TV Show libraries - if (!collectionType || isTVShows()) { - // Shows row - fetchItems(apiClient, { IncludeItemTypes: 'Series' }) - .then(result => setShows(result.Items || [])); - // Episodes row - fetchItems(apiClient, { IncludeItemTypes: 'Episode' }) - .then(result => setEpisodes(result.Items || [])); - } - - // People are included for Movies and TV Shows - if (!collectionType || isMovies() || isTVShows()) { - // People row - fetchPeople(apiClient).then(result => setPeople(result.Items || [])); - } - - // Music libraries - if (!collectionType || isMusic()) { - // Playlists row - fetchItems(apiClient, { IncludeItemTypes: 'Playlist' }) - .then(results => setPlaylists(results.Items || [])); - // Artists row - fetchArtists(apiClient).then(result => setArtists(result.Items || [])); - // Albums row - fetchItems(apiClient, { IncludeItemTypes: 'MusicAlbum' }) - .then(result => setAlbums(result.Items || [])); - // Songs row - fetchItems(apiClient, { IncludeItemTypes: 'Audio' }) - .then(result => setSongs(result.Items || [])); - } - - // Other libraries do not support in-library search currently - if (!collectionType) { - // Videos row - fetchItems(apiClient, { - MediaTypes: 'Video', - ExcludeItemTypes: 'Movie,Episode,TvChannel' - }).then(result => setVideos(result.Items || [])); - // Programs row - fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram' }) - .then(result => setPrograms(result.Items || [])); - // Channels row - fetchItems(apiClient, { IncludeItemTypes: 'TvChannel' }) - .then(result => setChannels(result.Items || [])); - // Photo Albums row - fetchItems(apiClient, { IncludeItemTypes: 'PhotoAlbum' }) - .then(results => setPhotoAlbums(results.Items || [])); - // Photos row - fetchItems(apiClient, { IncludeItemTypes: 'Photo' }) - .then(results => setPhotos(results.Items || [])); - // Audio Books row - fetchItems(apiClient, { IncludeItemTypes: 'AudioBook' }) - .then(results => setAudioBooks(results.Items || [])); - // Books row - fetchItems(apiClient, { IncludeItemTypes: 'Book' }) - .then(results => setBooks(results.Items || [])); - // Collections row - fetchItems(apiClient, { IncludeItemTypes: 'BoxSet' }) - .then(result => setCollections(result.Items || [])); - } + if (!query) { + return; } - }, [collectionType, parentId, query, serverId]); + + const apiClient = ServerConnections.getApiClient(serverId); + + // Movie libraries + if (!collectionType || isMovies(collectionType)) { + // Movies row + fetchItems(apiClient, { IncludeItemTypes: 'Movie' }) + .then(result => setMovies(result.Items)); + } + + // TV Show libraries + if (!collectionType || isTVShows(collectionType)) { + // Shows row + fetchItems(apiClient, { IncludeItemTypes: 'Series' }) + .then(result => setShows(result.Items)); + // Episodes row + fetchItems(apiClient, { IncludeItemTypes: 'Episode' }) + .then(result => setEpisodes(result.Items)); + } + + // People are included for Movies and TV Shows + if (!collectionType || isMovies(collectionType) || isTVShows(collectionType)) { + // People row + fetchPeople(apiClient).then(result => setPeople(result.Items)); + } + + // Music libraries + if (!collectionType || isMusic(collectionType)) { + // Playlists row + fetchItems(apiClient, { IncludeItemTypes: 'Playlist' }) + .then(results => setPlaylists(results.Items)); + // Artists row + fetchArtists(apiClient).then(result => setArtists(result.Items)); + // Albums row + fetchItems(apiClient, { IncludeItemTypes: 'MusicAlbum' }) + .then(result => setAlbums(result.Items)); + // Songs row + fetchItems(apiClient, { IncludeItemTypes: 'Audio' }) + .then(result => setSongs(result.Items)); + } + + // Other libraries do not support in-library search currently + if (!collectionType) { + // Videos row + fetchItems(apiClient, { + MediaTypes: 'Video', + ExcludeItemTypes: 'Movie,Episode,TvChannel' + }).then(result => setVideos(result.Items)); + // Programs row + fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram' }) + .then(result => setPrograms(result.Items)); + // Channels row + fetchItems(apiClient, { IncludeItemTypes: 'TvChannel' }) + .then(result => setChannels(result.Items)); + // Photo Albums row + fetchItems(apiClient, { IncludeItemTypes: 'PhotoAlbum' }) + .then(result => setPhotoAlbums(result.Items)); + // Photos row + fetchItems(apiClient, { IncludeItemTypes: 'Photo' }) + .then(result => setPhotos(result.Items)); + // Audio Books row + fetchItems(apiClient, { IncludeItemTypes: 'AudioBook' }) + .then(result => setAudioBooks(result.Items)); + // Books row + fetchItems(apiClient, { IncludeItemTypes: 'Book' }) + .then(result => setBooks(result.Items)); + // Collections row + fetchItems(apiClient, { IncludeItemTypes: 'BoxSet' }) + .then(result => setCollections(result.Items)); + } + }, [collectionType, fetchArtists, fetchItems, fetchPeople, query, serverId]); return (
Date: Wed, 26 Apr 2023 15:13:51 -0400 Subject: [PATCH 037/147] Fix complexity warnings in ViewItemsContainer --- src/components/common/ViewItemsContainer.tsx | 90 +++++++++----------- 1 file changed, 39 insertions(+), 51 deletions(-) diff --git a/src/components/common/ViewItemsContainer.tsx b/src/components/common/ViewItemsContainer.tsx index 086d160137..d4f2937513 100644 --- a/src/components/common/ViewItemsContainer.tsx +++ b/src/components/common/ViewItemsContainer.tsx @@ -1,4 +1,4 @@ -import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; +import { type BaseItemDtoQueryResult, ItemFields, ItemFilter } from '@jellyfin/sdk/lib/generated-client'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import loading from '../loading/loading'; @@ -33,6 +33,41 @@ const getDefaultSortBy = () => { return 'SortName'; }; +const getFields = (viewQuerySettings: ViewQuerySettings) => { + const fields: ItemFields[] = [ + ItemFields.BasicSyncInfo, + ItemFields.MediaSourceCount + ]; + + if (viewQuerySettings.imageType === 'primary') { + fields.push(ItemFields.PrimaryImageAspectRatio); + } + + return fields.join(','); +}; + +const getFilters = (viewQuerySettings: ViewQuerySettings) => { + const filters: ItemFilter[] = []; + + if (viewQuerySettings.IsPlayed) { + filters.push(ItemFilter.IsPlayed); + } + + if (viewQuerySettings.IsUnplayed) { + filters.push(ItemFilter.IsUnplayed); + } + + if (viewQuerySettings.IsFavorite) { + filters.push(ItemFilter.IsFavorite); + } + + if (viewQuerySettings.IsResumable) { + filters.push(ItemFilter.IsResumable); + } + + return filters; +}; + const getVisibleViewSettings = () => { return [ 'showTitle', @@ -228,33 +263,7 @@ const ViewItemsContainer: FC = ({ }, [getCardOptions, getContext, itemsResult.Items, getNoItemsMessage, viewQuerySettings.imageType]); const getQuery = useCallback(() => { - let fields = 'BasicSyncInfo,MediaSourceCount'; - - if (viewQuerySettings.imageType === 'primary') { - fields += ',PrimaryImageAspectRatio'; - } - - if (viewQuerySettings.showYear) { - fields += ',ProductionYear'; - } - - const queryFilters: string[] = []; - - if (viewQuerySettings.IsPlayed) { - queryFilters.push('IsPlayed'); - } - - if (viewQuerySettings.IsUnplayed) { - queryFilters.push('IsUnplayed'); - } - - if (viewQuerySettings.IsFavorite) { - queryFilters.push('IsFavorite'); - } - - if (viewQuerySettings.IsResumable) { - queryFilters.push('IsResumable'); - } + const queryFilters = getFilters(viewQuerySettings); let queryIsHD; @@ -271,7 +280,7 @@ const ViewItemsContainer: FC = ({ SortOrder: viewQuerySettings.SortOrder, IncludeItemTypes: getItemTypes().join(','), Recursive: true, - Fields: fields, + Fields: getFields(viewQuerySettings), ImageTypeLimit: 1, EnableImageTypes: 'Primary,Backdrop,Banner,Thumb,Disc,Logo', Limit: userSettings.libraryPageSize(undefined) || undefined, @@ -293,28 +302,7 @@ const ViewItemsContainer: FC = ({ ParentId: topParentId }; }, [ - viewQuerySettings.imageType, - viewQuerySettings.showYear, - viewQuerySettings.IsPlayed, - viewQuerySettings.IsUnplayed, - viewQuerySettings.IsFavorite, - viewQuerySettings.IsResumable, - viewQuerySettings.IsHD, - viewQuerySettings.IsSD, - viewQuerySettings.SortBy, - viewQuerySettings.SortOrder, - viewQuerySettings.VideoTypes, - viewQuerySettings.GenreIds, - viewQuerySettings.Is4K, - viewQuerySettings.Is3D, - viewQuerySettings.HasSubtitles, - viewQuerySettings.HasTrailer, - viewQuerySettings.HasSpecialFeature, - viewQuerySettings.HasThemeSong, - viewQuerySettings.HasThemeVideo, - viewQuerySettings.StartIndex, - viewQuerySettings.NameLessThan, - viewQuerySettings.NameStartsWith, + viewQuerySettings, getItemTypes, getBasekey, topParentId From a6c8c63d2ed51be03858a280a3838cc5767e3142 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 15:47:21 -0400 Subject: [PATCH 038/147] Fix complexity warnings in UserPasswordForm --- .../dashboard/users/UserPasswordForm.tsx | 80 ++++++++----------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/src/components/dashboard/users/UserPasswordForm.tsx b/src/components/dashboard/users/UserPasswordForm.tsx index 3d3daa2993..8cfb47b5b1 100644 --- a/src/components/dashboard/users/UserPasswordForm.tsx +++ b/src/components/dashboard/users/UserPasswordForm.tsx @@ -1,4 +1,3 @@ -import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FunctionComponent, useCallback, useEffect, useRef } from 'react'; import Dashboard from '../../../utils/dashboard'; import globalize from '../../../scripts/globalize'; @@ -17,7 +16,7 @@ type IProps = { const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { const element = useRef(null); - const loadUser = useCallback(() => { + const loadUser = useCallback(async () => { const page = element.current; if (!page) { @@ -25,61 +24,48 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { return; } - window.ApiClient.getUser(userId).then(function (user) { - Dashboard.getCurrentUser().then(function (loggedInUser: UserDto) { - if (!user.Policy) { - throw new Error('Unexpected null user.Policy'); - } + const user = await window.ApiClient.getUser(userId); + const loggedInUser = await Dashboard.getCurrentUser(); - if (!user.Configuration) { - throw new Error('Unexpected null user.Configuration'); - } + if (!user.Policy || !user.Configuration) { + throw new Error('Unexpected null user policy or configuration'); + } - LibraryMenu.setTitle(user.Name); + LibraryMenu.setTitle(user.Name); - let showLocalAccessSection = false; + let showLocalAccessSection = false; - if (user.HasConfiguredPassword) { - (page.querySelector('#btnResetPassword') as HTMLDivElement).classList.remove('hide'); - (page.querySelector('#fldCurrentPassword') as HTMLDivElement).classList.remove('hide'); - showLocalAccessSection = true; - } else { - (page.querySelector('#btnResetPassword') as HTMLDivElement).classList.add('hide'); - (page.querySelector('#fldCurrentPassword') as HTMLDivElement).classList.add('hide'); - } + if (user.HasConfiguredPassword) { + (page.querySelector('#btnResetPassword') as HTMLDivElement).classList.remove('hide'); + (page.querySelector('#fldCurrentPassword') as HTMLDivElement).classList.remove('hide'); + showLocalAccessSection = true; + } else { + (page.querySelector('#btnResetPassword') as HTMLDivElement).classList.add('hide'); + (page.querySelector('#fldCurrentPassword') as HTMLDivElement).classList.add('hide'); + } - if (loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess) { - (page.querySelector('.passwordSection') as HTMLDivElement).classList.remove('hide'); - } else { - (page.querySelector('.passwordSection') as HTMLDivElement).classList.add('hide'); - } + const canChangePassword = loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess; + (page.querySelector('.passwordSection') as HTMLDivElement).classList.toggle('hide', !canChangePassword); + (page.querySelector('.localAccessSection') as HTMLDivElement).classList.toggle('hide', !(showLocalAccessSection && canChangePassword)); - if (showLocalAccessSection && (loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - (page.querySelector('.localAccessSection') as HTMLDivElement).classList.remove('hide'); - } else { - (page.querySelector('.localAccessSection') as HTMLDivElement).classList.add('hide'); - } + const txtEasyPassword = page.querySelector('#txtEasyPassword') as HTMLInputElement; + txtEasyPassword.value = ''; - const txtEasyPassword = page.querySelector('#txtEasyPassword') as HTMLInputElement; - txtEasyPassword.value = ''; + if (user.HasConfiguredEasyPassword) { + txtEasyPassword.placeholder = '******'; + (page.querySelector('#btnResetEasyPassword') as HTMLDivElement).classList.remove('hide'); + } else { + txtEasyPassword.removeAttribute('placeholder'); + txtEasyPassword.placeholder = ''; + (page.querySelector('#btnResetEasyPassword') as HTMLDivElement).classList.add('hide'); + } - if (user.HasConfiguredEasyPassword) { - txtEasyPassword.placeholder = '******'; - (page.querySelector('#btnResetEasyPassword') as HTMLDivElement).classList.remove('hide'); - } else { - txtEasyPassword.removeAttribute('placeholder'); - txtEasyPassword.placeholder = ''; - (page.querySelector('#btnResetEasyPassword') as HTMLDivElement).classList.add('hide'); - } + const chkEnableLocalEasyPassword = page.querySelector('.chkEnableLocalEasyPassword') as HTMLInputElement; - const chkEnableLocalEasyPassword = page.querySelector('.chkEnableLocalEasyPassword') as HTMLInputElement; + chkEnableLocalEasyPassword.checked = user.Configuration.EnableLocalPassword || false; - chkEnableLocalEasyPassword.checked = user.Configuration.EnableLocalPassword || false; - - import('../../autoFocuser').then(({ default: autoFocuser }) => { - autoFocuser.autoFocus(page); - }); - }); + import('../../autoFocuser').then(({ default: autoFocuser }) => { + autoFocuser.autoFocus(page); }); (page.querySelector('#txtCurrentPassword') as HTMLInputElement).value = ''; From 6fc90c174050f9d3d593623e3908246b0bac01db Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 16:44:46 -0400 Subject: [PATCH 039/147] Fix complexity warnings in ConnectionRequired --- src/components/ConnectionRequired.tsx | 199 +++++++++++++------------- 1 file changed, 101 insertions(+), 98 deletions(-) diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index 9c5f402b0a..59e680e219 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useEffect, useState } from 'react'; +import React, { FunctionComponent, useCallback, useEffect, useState } from 'react'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import type { ConnectResponse } from 'jellyfin-apiclient'; @@ -35,116 +35,119 @@ const ConnectionRequired: FunctionComponent = ({ const [ isLoading, setIsLoading ] = useState(true); - useEffect(() => { - const bounce = async (connectionResponse: ConnectResponse) => { - switch (connectionResponse.State) { - case ConnectionState.SignedIn: - // Already logged in, bounce to the home page - console.debug('[ConnectionRequired] already logged in, redirecting to home'); - navigate(BounceRoutes.Home); - return; - case ConnectionState.ServerSignIn: - // Bounce to the login page - if (location.pathname === BounceRoutes.Login) { - setIsLoading(false); - } else { - console.debug('[ConnectionRequired] not logged in, redirecting to login page'); - navigate(`${BounceRoutes.Login}?serverid=${connectionResponse.ApiClient.serverId()}`); - } - return; - case ConnectionState.ServerSelection: - // Bounce to select server page - console.debug('[ConnectionRequired] redirecting to select server page'); - navigate(BounceRoutes.SelectServer); - return; - case ConnectionState.ServerUpdateNeeded: - // Show update needed message and bounce to select server page - try { - await alert({ - text: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), - html: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') - }); - } catch (ex) { - console.warn('[ConnectionRequired] failed to show alert', ex); - } - console.debug('[ConnectionRequired] server update required, redirecting to select server page'); - navigate(BounceRoutes.SelectServer); - return; - } - - console.warn('[ConnectionRequired] unhandled connection state', connectionResponse.State); - }; - - const validateConnection = async () => { - // Check connection status on initial page load - const firstConnection = appRouter.firstConnectionResult; - appRouter.firstConnectionResult = null; - - if (firstConnection && firstConnection.State !== ConnectionState.SignedIn) { - if (firstConnection.State === ConnectionState.ServerSignIn) { - // Verify the wizard is complete - try { - const infoResponse = await fetch(`${firstConnection.ApiClient.serverAddress()}/System/Info/Public`); - if (!infoResponse.ok) { - throw new Error('Public system info request failed'); - } - const systemInfo = await infoResponse.json(); - if (!systemInfo?.StartupWizardCompleted) { - // Update the current ApiClient - // TODO: Is there a better place to handle this? - ServerConnections.setLocalApiClient(firstConnection.ApiClient); - // Bounce to the wizard - console.info('[ConnectionRequired] startup wizard is not complete, redirecting there'); - navigate(BounceRoutes.StartWizard); - return; - } - } catch (ex) { - console.error('[ConnectionRequired] checking wizard status failed', ex); - return; - } + const bounce = useCallback(async (connectionResponse: ConnectResponse) => { + switch (connectionResponse.State) { + case ConnectionState.SignedIn: + // Already logged in, bounce to the home page + console.debug('[ConnectionRequired] already logged in, redirecting to home'); + navigate(BounceRoutes.Home); + return; + case ConnectionState.ServerSignIn: + // Bounce to the login page + if (location.pathname === BounceRoutes.Login) { + setIsLoading(false); + } else { + console.debug('[ConnectionRequired] not logged in, redirecting to login page'); + navigate(`${BounceRoutes.Login}?serverid=${connectionResponse.ApiClient.serverId()}`); } + return; + case ConnectionState.ServerSelection: + // Bounce to select server page + console.debug('[ConnectionRequired] redirecting to select server page'); + navigate(BounceRoutes.SelectServer); + return; + case ConnectionState.ServerUpdateNeeded: + // Show update needed message and bounce to select server page + try { + await alert({ + text: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), + html: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') + }); + } catch (ex) { + console.warn('[ConnectionRequired] failed to show alert', ex); + } + console.debug('[ConnectionRequired] server update required, redirecting to select server page'); + navigate(BounceRoutes.SelectServer); + return; + } - // Bounce to the correct page in the login flow - bounce(firstConnection); + console.warn('[ConnectionRequired] unhandled connection state', connectionResponse.State); + }, [location.pathname, navigate]); + + const handleIncompleteWizard = useCallback(async (firstConnection: ConnectResponse) => { + if (firstConnection.State === ConnectionState.ServerSignIn) { + // Verify the wizard is complete + try { + const infoResponse = await fetch(`${firstConnection.ApiClient.serverAddress()}/System/Info/Public`); + if (!infoResponse.ok) { + throw new Error('Public system info request failed'); + } + const systemInfo = await infoResponse.json(); + if (!systemInfo?.StartupWizardCompleted) { + // Update the current ApiClient + // TODO: Is there a better place to handle this? + ServerConnections.setLocalApiClient(firstConnection.ApiClient); + // Bounce to the wizard + console.info('[ConnectionRequired] startup wizard is not complete, redirecting there'); + navigate(BounceRoutes.StartWizard); + return; + } + } catch (ex) { + console.error('[ConnectionRequired] checking wizard status failed', ex); return; } + } - // TODO: appRouter will call appHost.exit() if navigating back when you are already at the default route. - // This case will need to be handled elsewhere before appRouter can be killed. + // Bounce to the correct page in the login flow + bounce(firstConnection); + }, [bounce, navigate]); - const client = ServerConnections.currentApiClient(); + const validateUserAccess = useCallback(async () => { + const client = ServerConnections.currentApiClient(); - // If this is a user route, ensure a user is logged in - if ((isAdminRequired || isUserRequired) && !client?.isLoggedIn()) { - try { - console.warn('[ConnectionRequired] unauthenticated user attempted to access user route'); + // If this is a user route, ensure a user is logged in + if ((isAdminRequired || isUserRequired) && !client?.isLoggedIn()) { + try { + console.warn('[ConnectionRequired] unauthenticated user attempted to access user route'); + bounce(await ServerConnections.connect()); + } catch (ex) { + console.warn('[ConnectionRequired] error bouncing from user route', ex); + } + return; + } + + // If this is an admin route, ensure the user has access + if (isAdminRequired) { + try { + const user = await client?.getCurrentUser(); + if (!user?.Policy?.IsAdministrator) { + console.warn('[ConnectionRequired] normal user attempted to access admin route'); bounce(await ServerConnections.connect()); - } catch (ex) { - console.warn('[ConnectionRequired] error bouncing from user route', ex); - } - return; - } - - // If this is an admin route, ensure the user has access - if (isAdminRequired) { - try { - const user = await client?.getCurrentUser(); - if (!user?.Policy?.IsAdministrator) { - console.warn('[ConnectionRequired] normal user attempted to access admin route'); - bounce(await ServerConnections.connect()); - return; - } - } catch (ex) { - console.warn('[ConnectionRequired] error bouncing from admin route', ex); return; } + } catch (ex) { + console.warn('[ConnectionRequired] error bouncing from admin route', ex); + return; } + } - setIsLoading(false); - }; + setIsLoading(false); + }, [bounce, isAdminRequired, isUserRequired]); - validateConnection(); - }, [ isAdminRequired, isUserRequired, location.pathname, navigate ]); + useEffect(() => { + // TODO: appRouter will call appHost.exit() if navigating back when you are already at the default route. + // This case will need to be handled elsewhere before appRouter can be killed. + + // Check connection status on initial page load + const firstConnection = appRouter.firstConnectionResult; + appRouter.firstConnectionResult = null; + + if (firstConnection && firstConnection.State !== ConnectionState.SignedIn) { + handleIncompleteWizard(firstConnection); + } else { + validateUserAccess(); + } + }, [handleIncompleteWizard, validateUserAccess]); if (isLoading) { return ; From 6c6b841f41451fe80382fc5ed206e579da79e567 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 26 Apr 2023 16:53:31 -0400 Subject: [PATCH 040/147] Disable exhaustive dependency warnings where required --- src/components/ServerContentPage.tsx | 7 ++++--- src/components/viewManager/ViewManagerPage.tsx | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/ServerContentPage.tsx b/src/components/ServerContentPage.tsx index e5428269bc..5b86d66072 100644 --- a/src/components/ServerContentPage.tsx +++ b/src/components/ServerContentPage.tsx @@ -47,12 +47,13 @@ const ServerContentPage: FunctionComponent = ({ view }) }; loadPage(); - }, [ + }, + // location.state is NOT included as a dependency here since dialogs will update state while the current view stays the same + // eslint-disable-next-line react-hooks/exhaustive-deps + [ view, location.pathname, location.search - // location.state is NOT included as a dependency here since dialogs will update state while the current view - // stays the same ]); return <>; diff --git a/src/components/viewManager/ViewManagerPage.tsx b/src/components/viewManager/ViewManagerPage.tsx index 511338d1e2..98cf0dcb01 100644 --- a/src/components/viewManager/ViewManagerPage.tsx +++ b/src/components/viewManager/ViewManagerPage.tsx @@ -64,7 +64,10 @@ const ViewManagerPage: FunctionComponent = ({ }; loadPage(); - }, [ + }, + // location.state is NOT included as a dependency here since dialogs will update state while the current view stays the same + // eslint-disable-next-line react-hooks/exhaustive-deps + [ controller, view, type, @@ -74,8 +77,6 @@ const ViewManagerPage: FunctionComponent = ({ transition, location.pathname, location.search - // location.state is NOT included as a dependency here since dialogs will update state while the current view - // stays the same ]); return <>; From 675135d3a3848a432c3f20b1662b80dbb9a3db48 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 00:01:39 +0000 Subject: [PATCH 041/147] Update github/codeql-action action to v2.3.1 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 76f544d9fd..dd5d5fb523 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Initialize CodeQL - uses: github/codeql-action/init@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 + uses: github/codeql-action/init@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 + uses: github/codeql-action/autobuild@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 + uses: github/codeql-action/analyze@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 From 372e57027322a63882fa30bcfe590719f543c201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9A=87=E7=94=AB=E6=9C=9D=E4=BA=91?= Date: Thu, 27 Apr 2023 02:19:19 +0000 Subject: [PATCH 042/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 8818053189..ed2ca9457d 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1353,7 +1353,7 @@ "LabelOpenclDevice": "OpenCL 设备", "LabelOpenclDeviceHelp": "这是用于色调映射的 OpenCL 设备。 点左边是平台号,右边是平台上的设备号。 默认值为 0.0。 需要支持OpenCL 硬件加速的 FFmpeg 应用程序。", "EnableTonemapping": "启用色调映射", - "AllowTonemappingHelp": "色调映射可以将视频的动态范围从 HDR 变换成 SDR,同时保持图像细节与颜色等对于表现原始场景非常重要的信息。目前仅对 HDR10 或 HLG 视频生效。此项需要对应的 OpenCL 或 CUDA 运行库。", + "AllowTonemappingHelp": "色调映射可以将视频的动态范围从 HDR 变换成 SDR,同时保持图像细节与颜色等对于表现原始场景非常重要的信息。目前仅对 HDR10 、HLG10bit HDR10、HLG和DoVi视频生效。此项需要对应的 OpenCL 或 CUDA 运行库。", "LabelTonemappingAlgorithm": "选择要使用的色调映射算法", "TonemappingAlgorithmHelp": "色调映射可以微调。如果你不是很熟悉这些选项,保持默认即可。建议值为 'BT.2390'。", "LabelTonemappingRange": "色调映射范围", @@ -1666,10 +1666,10 @@ "MediaInfoVideoRangeType": "动态范围类型", "LabelVideoRangeType": "动态范围类型", "VideoRangeTypeNotSupported": "视频动态范围不支持", - "LabelVppTonemappingContrastHelp": "在 VPP 色调映射中应用对比度增益。推荐值和默认值分别为 1.2 和 1。", + "LabelVppTonemappingContrastHelp": "在 VPP 色调映射中应用对比度增益。推荐值和默认值均为 1。", "LabelVppTonemappingBrightness": "VPP 色调映射亮度增益", "LabelVppTonemappingContrast": "VPP 色调映射对比度增益", - "LabelVppTonemappingBrightnessHelp": "在 VPP 色调映射中应用亮度增益。推荐值和默认值均为 0。", + "LabelVppTonemappingBrightnessHelp": "在 VPP 色调映射中应用亮度增益。推荐值和默认值为16和 0。", "ScreenResolution": "屏幕分辨率", "LabelMaxVideoResolution": "允许的最大视频转码分辨率", "RememberSubtitleSelectionsHelp": "尝试将字幕轨道设置为与最后一个视频最接近的匹配。", @@ -1723,5 +1723,6 @@ "LabelEnableAudioVbr": "启用 VBR 音频编码", "LabelEnableAudioVbrHelp": "可变比特率(VBR)相比平均比特率(ABR)可以提供更好的质量,但在少见情况中可能造成缓冲和兼容性问题。", "LabelTonemappingMode": "色调映射模式", - "TonemappingModeHelp": "如果您遇到高光过曝问题,请尝试切换到 RGB 模式。" + "TonemappingModeHelp": "如果您遇到高光过曝问题,请尝试切换到 RGB 模式。", + "Select": "选择" } From d8fe05fb4a9a615102788a35fb5334176357b07f Mon Sep 17 00:00:00 2001 From: stanol Date: Thu, 27 Apr 2023 09:08:02 +0000 Subject: [PATCH 043/147] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 5183ac4fc0..dec608a738 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1719,5 +1719,7 @@ "LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо встановити значення 0, буде обрано обмеження на основі характеристик вашої системи.", "LabelEnableAudioVbrHelp": "Змінний бітрейт забезпечує краще співвідношення якості до середнього бітрейту, але в деяких рідкісних випадках може спричинити проблеми з буферизацією та сумісністю.", "LabelEnableAudioVbr": "Увімкнути VBR", - "Select": "Вибрати" + "Select": "Вибрати", + "LabelTonemappingMode": "Режим тонального відображення", + "TonemappingModeHelp": "Виберіть режим тонального відображення. Якщо ви спостерігаєте вигоряння яскравих ділянок, спробуйте переключитися в режим RGB." } From cfe016ad7ac1963b75988d5a1d6b664b07ef50cc Mon Sep 17 00:00:00 2001 From: stanol Date: Thu, 27 Apr 2023 19:28:45 +0000 Subject: [PATCH 044/147] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index dec608a738..52c426fde7 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -370,7 +370,7 @@ "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматично оновлювати метадані з інтернету", "LabelAuthProvider": "Провайдер аутентіфікаціі", "LabelAudioLanguagePreference": "Бажана мова аудіо", - "LabelAudioCodec": "Кодек аудіо", + "LabelAudioCodec": "Аудіокодек", "LabelAudioChannels": "Аудіоканали", "LabelAudioBitrate": "Бітрейт аудіо", "LabelArtists": "Виконавці", From c17c23fd8eb42981fddcf7e88c55166a9417b75a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 21:29:57 +0000 Subject: [PATCH 045/147] Update github/codeql-action action to v2.3.2 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index dd5d5fb523..240f558cfb 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Initialize CodeQL - uses: github/codeql-action/init@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 + uses: github/codeql-action/init@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 + uses: github/codeql-action/autobuild@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8662eabe0e9f338a07350b7fd050732745f93848 # v2.3.1 + uses: github/codeql-action/analyze@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 From d748372a286ca736e603f3ec92546dc9f6b9f253 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 27 Apr 2023 17:04:33 -0400 Subject: [PATCH 046/147] Refactor app structure --- README.md | 33 ++++++++++--------- src/{App.tsx => RootApp.tsx} | 15 ++++++--- src/apps/experimental/App.tsx | 19 +++++++++++ .../experimental/routes/AppRoutes.tsx} | 8 ++--- .../experimental/routes}/asyncRoutes/admin.ts | 2 +- .../experimental/routes}/asyncRoutes/index.ts | 0 .../experimental/routes}/asyncRoutes/user.ts | 2 +- .../routes}/legacyRoutes/admin.ts | 2 +- .../routes}/legacyRoutes/index.ts | 0 .../routes}/legacyRoutes/public.ts | 2 +- .../experimental/routes}/legacyRoutes/user.ts | 2 +- src/apps/stable/App.tsx | 19 +++++++++++ .../stable/routes/AppRoutes.tsx} | 8 ++--- .../stable/routes}/asyncRoutes/index.ts | 0 .../stable/routes}/asyncRoutes/user.ts | 2 +- .../stable/routes}/legacyRoutes/admin.ts | 2 +- .../stable/routes}/legacyRoutes/index.ts | 0 .../stable/routes}/legacyRoutes/public.ts | 2 +- .../stable/routes}/legacyRoutes/user.ts | 2 +- .../router}/AsyncRoute.tsx | 2 +- .../router}/LegacyRoute.tsx | 2 +- src/index.jsx | 4 +-- src/routes/index.tsx | 2 -- 23 files changed, 88 insertions(+), 42 deletions(-) rename src/{App.tsx => RootApp.tsx} (60%) create mode 100644 src/apps/experimental/App.tsx rename src/{routes/experimentalAppRoutes/index.tsx => apps/experimental/routes/AppRoutes.tsx} (82%) rename src/{routes/experimentalAppRoutes => apps/experimental/routes}/asyncRoutes/admin.ts (85%) rename src/{routes/experimentalAppRoutes => apps/experimental/routes}/asyncRoutes/index.ts (100%) rename src/{routes/experimentalAppRoutes => apps/experimental/routes}/asyncRoutes/user.ts (77%) rename src/{routes/experimentalAppRoutes => apps/experimental/routes}/legacyRoutes/admin.ts (98%) rename src/{routes/appRoutes => apps/experimental/routes}/legacyRoutes/index.ts (100%) rename src/{routes/appRoutes => apps/experimental/routes}/legacyRoutes/public.ts (96%) rename src/{routes/experimentalAppRoutes => apps/experimental/routes}/legacyRoutes/user.ts (97%) create mode 100644 src/apps/stable/App.tsx rename src/{routes/appRoutes/index.tsx => apps/stable/routes/AppRoutes.tsx} (81%) rename src/{routes/appRoutes => apps/stable/routes}/asyncRoutes/index.ts (100%) rename src/{routes/appRoutes => apps/stable/routes}/asyncRoutes/user.ts (57%) rename src/{routes/appRoutes => apps/stable/routes}/legacyRoutes/admin.ts (98%) rename src/{routes/experimentalAppRoutes => apps/stable/routes}/legacyRoutes/index.ts (100%) rename src/{routes/experimentalAppRoutes => apps/stable/routes}/legacyRoutes/public.ts (96%) rename src/{routes/appRoutes => apps/stable/routes}/legacyRoutes/user.ts (97%) rename src/{routes => components/router}/AsyncRoute.tsx (89%) rename src/{routes => components/router}/LegacyRoute.tsx (80%) delete mode 100644 src/routes/index.tsx diff --git a/README.md b/README.md index 99637125ae..bcb0c53311 100644 --- a/README.md +++ b/README.md @@ -76,21 +76,24 @@ Jellyfin Web is the frontend used for most of the clients available for end user ``` . └── src - ├── assets # Static assets - ├── components # Higher order visual components and React components - ├── controllers # Legacy page views and controllers 🧹 - ├── elements # Basic webcomponents and React wrappers 🧹 - ├── hooks # Custom React hooks - ├── legacy # Polyfills for legacy browsers - ├── libraries # Third party libraries 🧹 - ├── plugins # Client plugins - ├── routes # React routes/pages - ├── scripts # Random assortment of visual components and utilities 🐉 - ├── strings # Translation files - ├── styles # Common app Sass stylesheets - ├── themes # CSS themes - ├── types # Common TypeScript interfaces/types - └── utils # Utility functions + ├── apps + │   ├── experimental # New experimental app layout + │   └── stable # Classic (stable) app layout + ├── assets # Static assets + ├── components # Higher order visual components and React components + ├── controllers # Legacy page views and controllers 🧹 + ├── elements # Basic webcomponents and React wrappers 🧹 + ├── hooks # Custom React hooks + ├── legacy # Polyfills for legacy browsers + ├── libraries # Third party libraries 🧹 + ├── plugins # Client plugins + ├── routes # React routes/pages + ├── scripts # Random assortment of visual components and utilities 🐉 + ├── strings # Translation files + ├── styles # Common app Sass stylesheets + ├── themes # CSS themes + ├── types # Common TypeScript interfaces/types + └── utils # Utility functions ``` - 🧹 — Needs cleanup diff --git a/src/App.tsx b/src/RootApp.tsx similarity index 60% rename from src/App.tsx rename to src/RootApp.tsx index d72fd3831e..dddf31b5b1 100644 --- a/src/App.tsx +++ b/src/RootApp.tsx @@ -1,13 +1,16 @@ +import loadable from '@loadable/component'; import { History } from '@remix-run/router'; import React from 'react'; +import StableApp from './apps/stable/App'; import AppHeader from './components/AppHeader'; import Backdrop from './components/Backdrop'; import { HistoryRouter } from './components/HistoryRouter'; import { ApiProvider } from './hooks/useApi'; -import { AppRoutes, ExperimentalAppRoutes } from './routes'; -const App = ({ history }: { history: History }) => { +const ExperimentalApp = loadable(() => import('./apps/experimental/App')); + +const RootApp = ({ history }: { history: History }) => { const layoutMode = localStorage.getItem('layout'); return ( @@ -18,11 +21,15 @@ const App = ({ history }: { history: History }) => {
- {layoutMode === 'experimental' ? : } + { + layoutMode === 'experimental' ? + : + + }
); }; -export default App; +export default RootApp; diff --git a/src/apps/experimental/App.tsx b/src/apps/experimental/App.tsx new file mode 100644 index 0000000000..842cdaf38a --- /dev/null +++ b/src/apps/experimental/App.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import AppHeader from '../../components/AppHeader'; +import Backdrop from '../../components/Backdrop'; +import { ExperimentalAppRoutes } from './routes/AppRoutes'; + +const ExperimentalApp = () => ( + <> + + + +
+
+ +
+ +); + +export default ExperimentalApp; diff --git a/src/routes/experimentalAppRoutes/index.tsx b/src/apps/experimental/routes/AppRoutes.tsx similarity index 82% rename from src/routes/experimentalAppRoutes/index.tsx rename to src/apps/experimental/routes/AppRoutes.tsx index bd4cf8a19f..e87476c554 100644 --- a/src/routes/experimentalAppRoutes/index.tsx +++ b/src/apps/experimental/routes/AppRoutes.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; -import ConnectionRequired from '../../components/ConnectionRequired'; -import ServerContentPage from '../../components/ServerContentPage'; -import { toAsyncPageRoute } from '../AsyncRoute'; -import { toViewManagerPageRoute } from '../LegacyRoute'; +import ConnectionRequired from '../../../components/ConnectionRequired'; +import ServerContentPage from '../../../components/ServerContentPage'; +import { toAsyncPageRoute } from '../../../components/router/AsyncRoute'; +import { toViewManagerPageRoute } from '../../../components/router/LegacyRoute'; import { ASYNC_ADMIN_ROUTES, ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_ADMIN_ROUTES, LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; diff --git a/src/routes/experimentalAppRoutes/asyncRoutes/admin.ts b/src/apps/experimental/routes/asyncRoutes/admin.ts similarity index 85% rename from src/routes/experimentalAppRoutes/asyncRoutes/admin.ts rename to src/apps/experimental/routes/asyncRoutes/admin.ts index 3c75058288..0f2ec6b9cf 100644 --- a/src/routes/experimentalAppRoutes/asyncRoutes/admin.ts +++ b/src/apps/experimental/routes/asyncRoutes/admin.ts @@ -1,4 +1,4 @@ -import { AsyncRoute } from '../../AsyncRoute'; +import { AsyncRoute } from '../../../../components/router/AsyncRoute'; export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ { path: 'usernew.html', page: 'user/usernew' }, diff --git a/src/routes/experimentalAppRoutes/asyncRoutes/index.ts b/src/apps/experimental/routes/asyncRoutes/index.ts similarity index 100% rename from src/routes/experimentalAppRoutes/asyncRoutes/index.ts rename to src/apps/experimental/routes/asyncRoutes/index.ts diff --git a/src/routes/experimentalAppRoutes/asyncRoutes/user.ts b/src/apps/experimental/routes/asyncRoutes/user.ts similarity index 77% rename from src/routes/experimentalAppRoutes/asyncRoutes/user.ts rename to src/apps/experimental/routes/asyncRoutes/user.ts index 7126b0f2ad..44674e888c 100644 --- a/src/routes/experimentalAppRoutes/asyncRoutes/user.ts +++ b/src/apps/experimental/routes/asyncRoutes/user.ts @@ -1,4 +1,4 @@ -import { AsyncRoute } from '../../AsyncRoute'; +import { AsyncRoute } from '../../../../components/router/AsyncRoute'; export const ASYNC_USER_ROUTES: AsyncRoute[] = [ { path: 'search.html', page: 'search' }, diff --git a/src/routes/experimentalAppRoutes/legacyRoutes/admin.ts b/src/apps/experimental/routes/legacyRoutes/admin.ts similarity index 98% rename from src/routes/experimentalAppRoutes/legacyRoutes/admin.ts rename to src/apps/experimental/routes/legacyRoutes/admin.ts index 16365e4fc8..dd1f95f6e5 100644 --- a/src/routes/experimentalAppRoutes/legacyRoutes/admin.ts +++ b/src/apps/experimental/routes/legacyRoutes/admin.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ { diff --git a/src/routes/appRoutes/legacyRoutes/index.ts b/src/apps/experimental/routes/legacyRoutes/index.ts similarity index 100% rename from src/routes/appRoutes/legacyRoutes/index.ts rename to src/apps/experimental/routes/legacyRoutes/index.ts diff --git a/src/routes/appRoutes/legacyRoutes/public.ts b/src/apps/experimental/routes/legacyRoutes/public.ts similarity index 96% rename from src/routes/appRoutes/legacyRoutes/public.ts rename to src/apps/experimental/routes/legacyRoutes/public.ts index 15f8f0e8a9..4fdb6a9395 100644 --- a/src/routes/appRoutes/legacyRoutes/public.ts +++ b/src/apps/experimental/routes/legacyRoutes/public.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_PUBLIC_ROUTES: LegacyRoute[] = [ { diff --git a/src/routes/experimentalAppRoutes/legacyRoutes/user.ts b/src/apps/experimental/routes/legacyRoutes/user.ts similarity index 97% rename from src/routes/experimentalAppRoutes/legacyRoutes/user.ts rename to src/apps/experimental/routes/legacyRoutes/user.ts index cc41c99957..49afc715f1 100644 --- a/src/routes/experimentalAppRoutes/legacyRoutes/user.ts +++ b/src/apps/experimental/routes/legacyRoutes/user.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_USER_ROUTES: LegacyRoute[] = [ { diff --git a/src/apps/stable/App.tsx b/src/apps/stable/App.tsx new file mode 100644 index 0000000000..7d619f6230 --- /dev/null +++ b/src/apps/stable/App.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import AppHeader from '../../components/AppHeader'; +import Backdrop from '../../components/Backdrop'; +import { AppRoutes } from './routes/AppRoutes'; + +const StableApp = () => ( + <> + + + +
+
+ +
+ +); + +export default StableApp; diff --git a/src/routes/appRoutes/index.tsx b/src/apps/stable/routes/AppRoutes.tsx similarity index 81% rename from src/routes/appRoutes/index.tsx rename to src/apps/stable/routes/AppRoutes.tsx index 0136dc5531..cdeaedfe54 100644 --- a/src/routes/appRoutes/index.tsx +++ b/src/apps/stable/routes/AppRoutes.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; -import ConnectionRequired from '../../components/ConnectionRequired'; -import ServerContentPage from '../../components/ServerContentPage'; -import { toAsyncPageRoute } from '../AsyncRoute'; -import { toViewManagerPageRoute } from '../LegacyRoute'; +import ConnectionRequired from '../../../components/ConnectionRequired'; +import ServerContentPage from '../../../components/ServerContentPage'; +import { toAsyncPageRoute } from '../../../components/router/AsyncRoute'; +import { toViewManagerPageRoute } from '../../../components/router/LegacyRoute'; import { ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_ADMIN_ROUTES, LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; diff --git a/src/routes/appRoutes/asyncRoutes/index.ts b/src/apps/stable/routes/asyncRoutes/index.ts similarity index 100% rename from src/routes/appRoutes/asyncRoutes/index.ts rename to src/apps/stable/routes/asyncRoutes/index.ts diff --git a/src/routes/appRoutes/asyncRoutes/user.ts b/src/apps/stable/routes/asyncRoutes/user.ts similarity index 57% rename from src/routes/appRoutes/asyncRoutes/user.ts rename to src/apps/stable/routes/asyncRoutes/user.ts index 23621101be..7b86c9c7c0 100644 --- a/src/routes/appRoutes/asyncRoutes/user.ts +++ b/src/apps/stable/routes/asyncRoutes/user.ts @@ -1,4 +1,4 @@ -import { AsyncRoute } from '../../AsyncRoute'; +import { AsyncRoute } from '../../../../components/router/AsyncRoute'; export const ASYNC_USER_ROUTES: AsyncRoute[] = [ { path: 'search.html', page: 'search' } diff --git a/src/routes/appRoutes/legacyRoutes/admin.ts b/src/apps/stable/routes/legacyRoutes/admin.ts similarity index 98% rename from src/routes/appRoutes/legacyRoutes/admin.ts rename to src/apps/stable/routes/legacyRoutes/admin.ts index 055f97c57f..0f358a5d65 100644 --- a/src/routes/appRoutes/legacyRoutes/admin.ts +++ b/src/apps/stable/routes/legacyRoutes/admin.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ { diff --git a/src/routes/experimentalAppRoutes/legacyRoutes/index.ts b/src/apps/stable/routes/legacyRoutes/index.ts similarity index 100% rename from src/routes/experimentalAppRoutes/legacyRoutes/index.ts rename to src/apps/stable/routes/legacyRoutes/index.ts diff --git a/src/routes/experimentalAppRoutes/legacyRoutes/public.ts b/src/apps/stable/routes/legacyRoutes/public.ts similarity index 96% rename from src/routes/experimentalAppRoutes/legacyRoutes/public.ts rename to src/apps/stable/routes/legacyRoutes/public.ts index 15f8f0e8a9..4fdb6a9395 100644 --- a/src/routes/experimentalAppRoutes/legacyRoutes/public.ts +++ b/src/apps/stable/routes/legacyRoutes/public.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_PUBLIC_ROUTES: LegacyRoute[] = [ { diff --git a/src/routes/appRoutes/legacyRoutes/user.ts b/src/apps/stable/routes/legacyRoutes/user.ts similarity index 97% rename from src/routes/appRoutes/legacyRoutes/user.ts rename to src/apps/stable/routes/legacyRoutes/user.ts index 4179907cb4..8f460dcbc2 100644 --- a/src/routes/appRoutes/legacyRoutes/user.ts +++ b/src/apps/stable/routes/legacyRoutes/user.ts @@ -1,4 +1,4 @@ -import { LegacyRoute } from '../../LegacyRoute'; +import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_USER_ROUTES: LegacyRoute[] = [ { diff --git a/src/routes/AsyncRoute.tsx b/src/components/router/AsyncRoute.tsx similarity index 89% rename from src/routes/AsyncRoute.tsx rename to src/components/router/AsyncRoute.tsx index ba5bc90c42..6fb189e8bf 100644 --- a/src/routes/AsyncRoute.tsx +++ b/src/components/router/AsyncRoute.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Route } from 'react-router-dom'; -import AsyncPage from '../components/AsyncPage'; +import AsyncPage from '../AsyncPage'; export interface AsyncRoute { /** The URL path for this route. */ diff --git a/src/routes/LegacyRoute.tsx b/src/components/router/LegacyRoute.tsx similarity index 80% rename from src/routes/LegacyRoute.tsx rename to src/components/router/LegacyRoute.tsx index f548a122cc..bba780a513 100644 --- a/src/routes/LegacyRoute.tsx +++ b/src/components/router/LegacyRoute.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Route } from 'react-router-dom'; -import ViewManagerPage, { ViewManagerPageProps } from '../components/viewManager/ViewManagerPage'; +import ViewManagerPage, { ViewManagerPageProps } from '../viewManager/ViewManagerPage'; export interface LegacyRoute { path: string, diff --git a/src/index.jsx b/src/index.jsx index 87e4fde803..2b9aafbd5d 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -34,7 +34,7 @@ import './legacy/htmlMediaElement'; import './legacy/vendorStyles'; import { currentSettings } from './scripts/settings/userSettings'; import taskButton from './scripts/taskbutton'; -import App from './App.tsx'; +import RootApp from './RootApp.tsx'; import './styles/livetv.scss'; import './styles/dashboard.scss'; @@ -151,7 +151,7 @@ async function onAppReady() { ReactDOM.render( - + , root ); diff --git a/src/routes/index.tsx b/src/routes/index.tsx deleted file mode 100644 index d06d48a747..0000000000 --- a/src/routes/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export * from './appRoutes'; -export * from './experimentalAppRoutes'; From ffed8c6a6509e5aa6df70131b8ad32e7a0c3dce6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 16:14:54 +0000 Subject: [PATCH 047/147] Update dependency swiper to v9.2.4 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ee9c9b56e..b53fed83c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", - "swiper": "9.2.3", + "swiper": "9.2.4", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.2", "workbox-core": "6.5.4", @@ -18149,9 +18149,9 @@ } }, "node_modules/swiper": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.3.tgz", - "integrity": "sha512-hxqcjIsYPP1fv+KIXPqGywl6ik8RBp0y0i9+TOIh55ca6SpZ5FrgNJ4QXPhsl6mlSBMEYPmh5zOKtZpI8zpWeQ==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.4.tgz", + "integrity": "sha512-L7y3K/iiMXNYQ94FbfcJn7jex4QPnS4+voXGupTdC+UHW4XrR40QDdm4c9hXJ+Br0Il7PP0vP1W3goM9/Ly6Sg==", "funding": [ { "type": "patreon", @@ -33433,9 +33433,9 @@ } }, "swiper": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.3.tgz", - "integrity": "sha512-hxqcjIsYPP1fv+KIXPqGywl6ik8RBp0y0i9+TOIh55ca6SpZ5FrgNJ4QXPhsl6mlSBMEYPmh5zOKtZpI8zpWeQ==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.2.4.tgz", + "integrity": "sha512-L7y3K/iiMXNYQ94FbfcJn7jex4QPnS4+voXGupTdC+UHW4XrR40QDdm4c9hXJ+Br0Il7PP0vP1W3goM9/Ly6Sg==", "requires": { "ssr-window": "^4.0.2" } diff --git a/package.json b/package.json index f6d1d59d3b..cbcf24fa10 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", - "swiper": "9.2.3", + "swiper": "9.2.4", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.2", "workbox-core": "6.5.4", From 4967c0efcf0447719fffc0601cc54f417695a8f9 Mon Sep 17 00:00:00 2001 From: Kotsasmin Date: Fri, 28 Apr 2023 14:50:24 +0000 Subject: [PATCH 048/147] Translated using Weblate (Greek) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/ --- src/strings/el.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/el.json b/src/strings/el.json index 49d512e462..5584a0fca2 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -1087,7 +1087,7 @@ "MusicVideos": "Μουσικά Βίντεο", "Bwdif": "BWDIF", "Arranger": "Ταξιθέτηση", - "AllowTonemappingHelp": "Η αντιστοίχηση απόχρωσης μπορεί να αλλάξει το δυναμικό εύρος ενός βίντεο από HDR σε SDR διατηρώντας την ευκρίνεια και τα χρώματα της εικόνας, τα οποία είναι σημαντικές πληροφορίες για την απόδοση της αρχικής σκηνής. Προς το παρόν δουλεύει μόνο όταν μετακωδικοποιούνται βίντεο με ενσωματωμένα μεταδεδομένα HDR10 ή HLG. Αυτή η επιλογή απαιτεί OpenCL ή CUDA.", + "AllowTonemappingHelp": "Η αντιστοίχηση απόχρωσης μπορεί να αλλάξει το δυναμικό εύρος ενός βίντεο από HDR σε SDR διατηρώντας την ευκρίνεια και τα χρώματα της εικόνας, τα οποία είναι σημαντικές πληροφορίες για την απόδοση της αρχικής σκηνής. Προς το παρόν δουλεύει μόνο όταν μετακωδικοποιούνται βίντεο με ενσωματωμένα μεταδεδομένα 10bit HDR10, HLG και DoVi. Αυτή η επιλογή απαιτεί OpenCL ή CUDA.", "AgeValue": "({0} έτη)", "OptionBluray": "BD", "MediaInfoTimestamp": "Xρονική σφραγίδα", From d7500ba6c908308359b7be354986e51882ff32c6 Mon Sep 17 00:00:00 2001 From: sleepycatcoding Date: Fri, 28 Apr 2023 15:58:51 +0000 Subject: [PATCH 049/147] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings/et.json b/src/strings/et.json index 62442bdd45..e4e4f61bff 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -285,7 +285,7 @@ "CustomDlnaProfilesHelp": "Loo kohandatud profiil uue seadme jaoks või tühista süsteemi profiil.", "ConfigureDateAdded": "Seadista, kuidas lisamise kuupäev kuvatakse juhtpaneeli meediakogu seadetes", "Banner": "Bänner", - "AllowTonemappingHelp": "Värvikaardistus võib muuta video dünaamilise ulatuse HDR -st SDR -ks, säilitades samal ajal pildi üksikasjad ja värvid, mis on algse stseeni kujutamisel väga oluline teave. Praegu töötab ainult HDR10 või HLG videotega. See vajab vastavat OpenGL või CUDA käitusaega.", + "AllowTonemappingHelp": "Värvikaardistus võib muuta video dünaamilise ulatuse HDR -st SDR -ks, säilitades samal ajal pildi üksikasjad ja värvid, mis on algse stseeni kujutamisel väga oluline teave. Praegu töötab ainult 10-bitise HDR10, HLG või DoVi videotega. See vajab vastavat OpenGL või CUDA käitusaega.", "HeaderDirectPlayProfile": "Otse-esituse profiil", "HeaderContainerProfileHelp": "Konteineri profiilid näitavad seadme piiranguid teatud vormingute esitamisel. Kui kehtib piirang, meedium transkooditakse, isegi kui vorming on seadistatud otse-esituseks.", "HeaderCodecProfileHelp": "Koodeki profiilid näitavad seadme piiranguid konkreetsete koodekite esitamisel. Kui kehtivad piirangud, transkooditakse meedia, isegi kui koodek on seadistatud otse-esituseks.", @@ -1652,5 +1652,8 @@ "Experimental": "Eksperimentaalne", "HeaderRecordingMetadataSaving": "Salvestise metaandmed", "HeaderPerformance": "Jõudlus", - "IgnoreDts": "Ignoreeri DTS-i (dekodeerimise ajatempel)" + "IgnoreDts": "Ignoreeri DTS-i (dekodeerimise ajatempel)", + "Select": "Vali", + "EnableIntelLowPowerH264HwEncoder": "Luba Intel Low-Power H.264 riistvara kodeerija", + "HeaderDummyChapter": "Peatükipildid" } From 5360df52c08e7bb83d57a371c2ca3f0b0ae41409 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Sat, 29 Apr 2023 19:17:19 +0000 Subject: [PATCH 050/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index ed2ca9457d..0b94f633dd 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1353,7 +1353,7 @@ "LabelOpenclDevice": "OpenCL 设备", "LabelOpenclDeviceHelp": "这是用于色调映射的 OpenCL 设备。 点左边是平台号,右边是平台上的设备号。 默认值为 0.0。 需要支持OpenCL 硬件加速的 FFmpeg 应用程序。", "EnableTonemapping": "启用色调映射", - "AllowTonemappingHelp": "色调映射可以将视频的动态范围从 HDR 变换成 SDR,同时保持图像细节与颜色等对于表现原始场景非常重要的信息。目前仅对 HDR10 、HLG10bit HDR10、HLG和DoVi视频生效。此项需要对应的 OpenCL 或 CUDA 运行库。", + "AllowTonemappingHelp": "色调映射可以将视频的动态范围从 HDR 变换成 SDR,同时保持图像细节与颜色等对于表现原始场景非常重要的信息。目前仅对 10bit HDR10,HLG 和 DoVi 视频生效。此项需要对应的 OpenCL 或 CUDA 运行库。", "LabelTonemappingAlgorithm": "选择要使用的色调映射算法", "TonemappingAlgorithmHelp": "色调映射可以微调。如果你不是很熟悉这些选项,保持默认即可。建议值为 'BT.2390'。", "LabelTonemappingRange": "色调映射范围", @@ -1669,7 +1669,7 @@ "LabelVppTonemappingContrastHelp": "在 VPP 色调映射中应用对比度增益。推荐值和默认值均为 1。", "LabelVppTonemappingBrightness": "VPP 色调映射亮度增益", "LabelVppTonemappingContrast": "VPP 色调映射对比度增益", - "LabelVppTonemappingBrightnessHelp": "在 VPP 色调映射中应用亮度增益。推荐值和默认值为16和 0。", + "LabelVppTonemappingBrightnessHelp": "在 VPP 色调映射中应用亮度增益。推荐值和默认值为 16 和 0。", "ScreenResolution": "屏幕分辨率", "LabelMaxVideoResolution": "允许的最大视频转码分辨率", "RememberSubtitleSelectionsHelp": "尝试将字幕轨道设置为与最后一个视频最接近的匹配。", From 5161fe0f501f9ea53237600b69ec67abf92f0ad8 Mon Sep 17 00:00:00 2001 From: kyaroslav83 Date: Sat, 29 Apr 2023 21:50:49 +0000 Subject: [PATCH 051/147] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index eb37854aae..610becf14c 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -760,7 +760,7 @@ "MediaInfoAnamorphic": "Анаморфность", "MediaInfoAspectRatio": "Соотношение сторон", "MediaInfoBitDepth": "Разрядность", - "MediaInfoBitrate": "Потоковая скорость", + "MediaInfoBitrate": "Битрейт", "MediaInfoChannels": "Каналы", "MediaInfoCodec": "Кодек", "MediaInfoCodecTag": "Тег кодека", From 134764f38b2db1d10f940ae60fb558343cb0d6f4 Mon Sep 17 00:00:00 2001 From: NenoRMa1eN Date: Sun, 30 Apr 2023 08:22:39 +0000 Subject: [PATCH 052/147] Translated using Weblate (Bulgarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bg/ --- src/strings/bg-bg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 12999583fa..e200e520d9 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -1453,7 +1453,7 @@ "KnownProxiesHelp": "Списък от IP ареси или хост имена на известни прокси сървъри, разделени със запетая, използвани при свързване с Jellyfin сървър. Това е задължително за да се използва правилнен \"X-Forwarded-For\" хедър. Изисква рестартиране след прилагане.", "HomeVideosPhotos": "Домашни видеа и снимки", "DirectPlayHelp": "Основният файл е напълно съвместим с този клиент, което значи че го получавате без модификации.", - "AllowTonemappingHelp": "Тоналното-картографиране може да помогне при преработка от HDR към SDR, запазвайки детайлите и цветовете на картината възможно най-близо до оригиналната сцена. В момента се поддържа само HDR10 или HGL видео потоци. Нужно е да имате поддръжка от OpenCL или CUDA от процесора и/или графичната ви карта.", + "AllowTonemappingHelp": "Тоналното картографиране може да трансформира динамичния обхват на видеото от HDR към SDR, като същевременно запазва детайлите и цветовете на изображението, които са много важна информация за представяне на оригиналната сцена. В момента работи само с 10-битови HDR10,HLG и DoVi видеоклипове. Това изисква съответното време за изпълнение от OpenCL или CUDA.", "LabelMaxAudiobookResumeHelp": "Приема се ,че файловете се възпроизведени до края , ако се спре след като оставащото време е по-малко от тази стойност.", "Experimental": "Експериментални", "IgnoreDtsHelp": "Изключването на опцията може да теши някои проблеми, напр. липсващ звук на канали с отделни звукови и видео потоци.", From b11445ffe06fbed7f5a5ba739d66ec44681977a3 Mon Sep 17 00:00:00 2001 From: Oskari Lavinto Date: Sun, 30 Apr 2023 08:50:17 +0000 Subject: [PATCH 053/147] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index f67a1dcaef..0bb1eebfc5 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -120,7 +120,7 @@ "ButtonResetEasyPassword": "Poista Helppo PIN -koodi", "ButtonResume": "Jatka", "ButtonRevoke": "Peruuta", - "ButtonScanAllLibraries": "Skannaa kaikki kirjastot", + "ButtonScanAllLibraries": "Päivitä kaikki kirjastot", "ButtonSelectDirectory": "Valitse hakemisto", "ButtonSelectView": "Valitse näkymä", "ButtonSend": "Lähetä", @@ -596,7 +596,7 @@ "Screenshots": "Kuvakaappaukset", "Screenshot": "Kuvakaappaus", "Schedule": "Ajoita", - "ScanLibrary": "Skannaa kirjasto", + "ScanLibrary": "Päivitä kirjasto", "SaveSubtitlesIntoMediaFolders": "Tallenna tekstitykset mediakansioihin", "Saturday": "Lauantai", "ResumeAt": "Jatka kohdasta {0}", @@ -824,7 +824,7 @@ "LabelDeviceDescription": "Laitteen kuvaus", "LabelDefaultScreen": "Oletusnäyttö", "LabelDefaultUser": "Oletuskäyttäjä", - "LabelDashboardTheme": "Palvelimen hallintapaneelin teema", + "LabelDashboardTheme": "Palvelimen Hallintapaneelin teema", "LabelCustomCertificatePathHelp": "Varmenteen ja yksityisen avaimen sisältävän PKCS #12 -tiedoston sijainti oman verkkotunnuksen TLS-tuen käyttöönottamiseksi.", "LabelCustomCertificatePath": "Oman SSL-varmenteen sijainti", "LabelContentType": "Sisältötyyppi", @@ -841,7 +841,7 @@ "ButtonTogglePlaylist": "Soittolista", "Artist": "Esittäjä", "RefreshQueued": "Päivitys odottamassa.", - "SeriesCancelled": "Sarja peruttu.", + "SeriesCancelled": "Sarja on peruttu.", "MediaInfoRefFrames": "Viitekehykset", "LabelXDlnaDoc": "Laitteen luokitustunnus", "LabelXDlnaCap": "Laitteen ominaisuustunnus", @@ -887,7 +887,7 @@ "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Seuraavat mediasijainnit tullaan poistamaan kirjastostasi", "MessageItemsAdded": "Kohteet lisätty.", "MessageItemSaved": "Kohde tallennettu.", - "MessageEnablingOptionLongerScans": "Asetuksen käyttö saattaa pidentää kirjaston skannausaikaa merkittävästi.", + "MessageEnablingOptionLongerScans": "Asetuksen käyttö saattaa pidentää kirjastopäivityksiä merkittävästi.", "MessageDownloadQueued": "Lataus asetettu jonoon.", "MessageConfirmRevokeApiKey": "Haluatko varmasti poistaa API-avaimen? Sovelluksen yhteys palvelimeen katkeaa välittömästi.", "MessageConfirmRemoveMediaLocation": "Haluatko varmasti poistaa tämän sijainnin?", @@ -1053,7 +1053,7 @@ "LabelFriendlyName": "Käyttäjäystävällinen nimi", "LabelFileOrUrl": "Tiedosto tai URL", "LabelFailed": "Epäonnistui", - "LabelExtractChaptersDuringLibraryScan": "Pura kappalekuvat kirjastojen skannauksen yhteydessä", + "LabelExtractChaptersDuringLibraryScan": "Pura kappalekuvat kirjastopäivityksen yhteydessä", "LabelBaseUrl": "Perus-URL", "LabelEvent": "Tapahtuma", "LabelEnableSingleImageInDidlLimit": "Rajoita yhteen upotettuun kuvaan", @@ -1069,7 +1069,7 @@ "LabelAirDays": "Lähetyspäivät", "LabelAccessStart": "Aloitusaika", "LabelAccessEnd": "Lopetusaika", - "InstantMix": "Välitön miksaus", + "InstantMix": "Pikasekoitus", "Image": "Kuva", "HttpsRequiresCert": "Ottaaksesi suojatut yhteydet käyttöösi tulee sinun toimittaa luotettu SSL-varmenne (esim. Let's Encrypt). Ole hyvä ja toimita varmenne tai ota suojattu yhteys pois käytöstä.", "HeaderSyncPlayEnabled": "Ryhmäkatselu päällä", @@ -1080,7 +1080,7 @@ "HeaderLibraryAccess": "Kirjastojen käyttöoikeudet", "HeaderKeepSeries": "Pidä sarja", "HeaderKeepRecording": "Jatka tallennusta", - "HeaderInstantMix": "Välitön miksaus", + "HeaderInstantMix": "Pikasekoitus", "HeaderImageSettings": "Kuva-asetukset", "HeaderImageOptions": "Kuva-asetukset", "HeaderIdentificationHeader": "Tunnistusotsake", @@ -1232,7 +1232,7 @@ "EnableTonemapping": "Käytä sävykartoitusta", "EnableBlurHashHelp": "Kuvat, joita ladataan vielä, näytetään yksilöllisellä paikkamerkillä.", "EnableBlurHash": "Ota sumennetut paikkamerkit käyttöön kuville", - "AllowTonemappingHelp": "Sävykartoitus voi muuttaa videon dynaamisen alueen HDR:stä SDR:ksi säilyttäen samalla kuvan yksityiskohdat ja värit, jotka ovat kohtauksen alkuperäisen ilmeen kannalta erittäin tärkeitä. Toimii tällä hetkellä vain HDR10- ja HLG-videoiden kanssa ja edellyttää soveltuvaa OpenCL- tai CUDA-suoritusalustaa.", + "AllowTonemappingHelp": "Sävykartoitus voi muuttaa videon dynaamisen alueen HDR:stä SDR:ksi säilyttäen samalla kuvan yksityiskohdat ja värit, jotka ovat kohtauksen alkuperäisen ilmeen kannalta erittäin tärkeitä. Toimii tällä hetkellä vain 10bit HDR10, HLG ja Dovi -videoiden kanssa ja edellyttää soveltuvaa OpenCL- tai CUDA-suoritusalustaa.", "LabelffmpegPathHelp": "FFmpeg-sovellustiedoston tai -kansion tiedostosijainti.", "LabelKodiMetadataEnablePathSubstitutionHelp": "Mahdollistaa kuvien tiedostosijaintien korvauksen palvelimen korvausasetuksien perusteella.", "ThumbCard": "Pienoiskortti", @@ -1244,7 +1244,7 @@ "LabelTVHomeScreen": "Televisiotilan aloitusnäyttö", "LabelHomeScreenSectionValue": "Aloitusnäyttö-osio {0}", "LabelHDHomerunPortRangeHelp": "Rajoittaa HD Homerun -laitteiden UDP-porttialueen tähän arvoon (oletus on 1024 - 65535).", - "LabelExtractChaptersDuringLibraryScanHelp": "Pura kappalekuvat, kun videoita tuodaan kirjastojen skannauksen aikana. Muutoin ne puretaan kappalekuvien ajoitetun tehtävän aikana, jolloin kirjaston säännöllinen skannaus voidaan suorittaa nopeammin.", + "LabelExtractChaptersDuringLibraryScanHelp": "Pura kirjastopäivityksen yhteydessä tuotavien videoiden kappalekuvat. Muutoin tämä tapahtuu kappalekuvien purun ajoitetun tehtävän aikana, jolloin kirjaston perustarkastus nopeutuu.", "LabelHDHomerunPortRange": "HDHomeRun -portin alue", "LabelH265Crf": "H.265-koodauksen CRF", "LabelGroupMoviesIntoCollectionsHelp": "Kokoelmiin kuuluvat elokuvat näytetään elokuvalistauksissa kokoelmiin ryhmiteltyinä.", @@ -1267,7 +1267,7 @@ "LatestFromLibrary": "Viimeksi lisätty: {0}", "LabelVideoRange": "Videon alue", "LabelVaapiDeviceHelp": "Tämä on renderöintinoodi, jota käytetään laitteistokiihdytykseen.", - "LabelUserRemoteClientBitrateLimitHelp": "Korvaa globaali arvo asetusten kohdasta Ohjauspaneeli > Toisto > Suoratoisto.", + "LabelUserRemoteClientBitrateLimitHelp": "Korvaa globaali arvo asetusten kohdasta Hallintapaneeli > Toisto > Suoratoisto.", "LabelUserMaxActiveSessions": "Yhtäaikaisten käyttäjäistuntojen enimmäismäärä", "LabelUserLibraryHelp": "Valitse käyttäjäkirjasto joka näytetään laitteella. Jätä tyhjäksi käyttääksesi oletusasetusta.", "LabelUserAgent": "Käyttäjäagentti", @@ -1422,7 +1422,7 @@ "Casual": "Rento", "ErrorPlayerNotFound": "Pyydetylle medialle sopivaa soitinta ei löytynyt.", "Cursive": "Kursivointi", - "WizardCompleted": "Siinä kaikki tällä erää tarvittava. Jellyfin on aloittanut kirjastosi tietojen keräyksen. Tutustu sovelluksiimme ja paina lopuksi Valmis avataksesi hallintapaneelin.", + "WizardCompleted": "Siinä kaikki tällä erää tarvittava. Jellyfin on aloittanut kirjastosi tietojen keräyksen. Tutustu sovelluksiimme ja paina lopuksi Valmis avataksesi Hallintapaneelin.", "HeaderSyncPlayTimeSyncSettings": "Ajan synkronointi", "LabelMaxDaysForNextUpHelp": "Määritä enimmäisaika päivinä, jonka katsomaton sarja pysyy 'Seuraavaksi'-osiossa.", "LabelMaxDaysForNextUp": "'Seuraavaksi'-osion päivien enimmäismäärä", @@ -1585,7 +1585,7 @@ "SettingsWarning": "Näiden arvojen muutos voi aiheuttaa epävakautta tai yhteysongelmia. Jos havaitset ongelmia, kannattaa palauttaa ne takaisin oletusarvoihin.", "SeriesRecordingScheduled": "Sarjan tallennus on ajoitettu.", "SeriesDisplayOrderHelp": "Järjestä jaksot esitysajan, DVD-levyn tai absoluuttisen numeroinnin mukaan.", - "ScanForNewAndUpdatedFiles": "Etsi uusia ja päivitettyjä tiedostoja", + "ScanForNewAndUpdatedFiles": "Etsi uusia ja muuttuneita tiedostoja", "ReleaseGroup": "Julkaisuryhmä", "RecommendationStarring": "Pääosissa {0}", "RecommendationDirectedBy": "Ohjannut {0}", @@ -1664,8 +1664,8 @@ "MediaInfoVideoRangeType": "Videon aluetyyppi", "LabelVideoRangeType": "Videon aluetyyppi", "VideoRangeTypeNotSupported": "Videon aluetyyppiä ei tueta", - "LabelVppTonemappingContrastHelp": "Käytä kontrastin vahvistusta VPP-sävykartoituksen kanssa. Molemmat ovat suositeltavia ja oletusarvot ovat 0.", - "LabelVppTonemappingBrightnessHelp": "Käytä kirkkauden vahvistusta VPP-sävykartoituksen kanssa. Molemmat ovat suositeltavia ja oletusarvot ovat 0.", + "LabelVppTonemappingContrastHelp": "Käytä kontrastin vahvistusta VPP-sävykartoituksen kanssa. Suositus- ja oletusarvo on 1.", + "LabelVppTonemappingBrightnessHelp": "Käytä kirkkauden vahvistusta VPP-sävykartoituksen kanssa. Suositus- ja oletusarvot ovat 10 ja 0.", "LabelVppTonemappingContrast": "VPP-sävykartoituksen kontrastin vahvistus", "LabelVppTonemappingBrightness": "VPP-sävykartoituksen kirkkauden vahvistus", "IgnoreDtsHelp": "Valinnan käytöstä poisto voi korjata joitakin onhelmia, kuten puuttuvan äänen kanavilla, joilla on erilliset ääni- ja videokanavat.", @@ -1720,5 +1720,7 @@ "LabelParallelImageEncodingLimit": "Rinnakkaisten kuvaenkoodauksien rajoitus", "LabelEnableAudioVbr": "Käytä äänen VBR-enkoodausta", "LabelEnableAudioVbrHelp": "Muuttuva bittinopeus (variable bitrate, VBR) tuottaa keskitasoista paremman laadun, mutta saattaa joissakin harvoissa tapauksissa aiheuttaa puskurointi ja yhteensopivuusongelmia.", - "Select": "Valitse" + "Select": "Valitse", + "LabelTonemappingMode": "Sävykartoituksen tila", + "TonemappingModeHelp": "Valitse sävykartoituksen tila. Jos esiintyy ylikorostuneita värejä, kokeile RGB>-tilaa." } From 5977a336869431fef523c8bebf1c9c429c4c1810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20PONTON?= Date: Sun, 30 Apr 2023 07:52:12 +0000 Subject: [PATCH 054/147] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index a2df89fe28..bd5f8ed005 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1715,7 +1715,7 @@ "SubtitleRed": "Rouge", "SubtitleWhite": "Blanc", "SubtitleYellow": "Jaune", - "Featurette": "Featurette", + "Featurette": "Moyen-Métrage", "Short": "Court-métrage", "HeaderPerformance": "Performance", "LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image", From 2b9141f4cde9a5dc5be109b5de65dc9df3b2eb57 Mon Sep 17 00:00:00 2001 From: Rares Tamasanu Date: Sun, 30 Apr 2023 19:15:14 +0100 Subject: [PATCH 055/147] fix code smell: 'for loop should be for-of' --- src/components/cardbuilder/cardBuilder.js | 13 +++++-------- src/components/homesections/homesections.js | 12 ++++++------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index d4f3aafa49..0367648d3a 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -679,9 +679,8 @@ function getCardTextLines(lines, cssClass, forceLines, isOuterFooter, cardLayout let valid = 0; - for (let i = 0; i < lines.length; i++) { + for (const text of lines) { let currentCssClass = cssClass; - const text = lines[i]; if (valid > 0 && isOuterFooter) { currentCssClass += ' cardText-secondary'; @@ -862,8 +861,8 @@ function getCardFooterText(item, apiClient, options, footerClass, progressHtml, if (options.textLines) { const additionalLines = options.textLines(item); - for (let i = 0; i < additionalLines.length; i++) { - lines.push(additionalLines[i]); + for (const additionalLine of additionalLines) { + lines.push(additionalLine); } } @@ -1724,8 +1723,7 @@ export function onTimerCreated(programId, newTimerId, itemsContainer) { export function onTimerCancelled(timerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-timerid="' + timerId + '"]'); - for (let i = 0; i < cells.length; i++) { - const cell = cells[i]; + for (const cell of cells) { const icon = cell.querySelector('.timerIndicator'); if (icon) { icon.parentNode.removeChild(icon); @@ -1742,8 +1740,7 @@ export function onTimerCancelled(timerId, itemsContainer) { export function onSeriesTimerCancelled(cancelledTimerId, itemsContainer) { const cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + cancelledTimerId + '"]'); - for (let i = 0; i < cells.length; i++) { - const cell = cells[i]; + for (const cell of cells) { const icon = cell.querySelector('.timerIndicator'); if (icon) { icon.parentNode.removeChild(icon); diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 5cf83ced94..32ad3bed6d 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -100,10 +100,10 @@ export function loadSections(elem, apiClient, user, userSettings) { export function destroySections(elem) { const elems = elem.querySelectorAll('.itemsContainer'); - for (let i = 0; i < elems.length; i++) { - elems[i].fetchData = null; - elems[i].parentContainer = null; - elems[i].getItemsHtml = null; + for (const e of elems) { + e.fetchData = null; + e.parentContainer = null; + e.getItemsHtml = null; } elem.innerHTML = ''; @@ -111,8 +111,8 @@ export function destroySections(elem) { export function pause(elem) { const elems = elem.querySelectorAll('.itemsContainer'); - for (let i = 0; i < elems.length; i++) { - elems[i].pause(); + for (const e of elems) { + e.pause(); } } From 35bdbdf8a4633eed5f3efacceae150a39e917337 Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Sun, 30 Apr 2023 22:35:06 +0000 Subject: [PATCH 056/147] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index fb83bb6717..066375ae27 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1392,7 +1392,7 @@ "LabelTonemappingRange": "Tone mapping range", "TonemappingAlgorithmHelp": "Tone mapping can be fine-tuned. If you are not familiar with these options, just keep the default. The recommended value is 'BT.2390'.", "LabelTonemappingAlgorithm": "Select the Tone mapping algorithm to use", - "AllowTonemappingHelp": "Tone-mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colors, which are very important information for representing the original scene. Currently works only with HDR10 or HLG videos. This requires the corresponding OpenCL or CUDA runtime.", + "AllowTonemappingHelp": "Tone mapping can transform the dynamic range of a video from HDR to SDR while maintaining image details and colours, which are very important information for representing the original scene. Currently works only with 10bit HDR10,HLG and DoVi videos. This requires the corresponding OpenCL or CUDA runtime.", "EnableTonemapping": "Enable Tone mapping", "LabelOpenclDeviceHelp": "This is the OpenCL device that is used for tone mapping. The left side of the dot is the platform number, and the right side is the device number on the platform. The default value is 0.0. The FFmpeg application file containing the OpenCL hardware acceleration method is required.", "LabelOpenclDevice": "OpenCL Device", @@ -1666,9 +1666,9 @@ "MediaInfoVideoRangeType": "Video range type", "LabelVideoRangeType": "Video range type", "VideoRangeTypeNotSupported": "The video's range type is not supported", - "LabelVppTonemappingContrastHelp": "Apply contrast gain in VPP tone mapping. The recommended and default values are 1.2 and 1.", + "LabelVppTonemappingContrastHelp": "Apply contrast gain in VPP tone mapping. Both recommended and default values are 1.", "LabelVppTonemappingContrast": "VPP Tone mapping contrast gain", - "LabelVppTonemappingBrightnessHelp": "Apply brightness gain in VPP tone mapping. Both recommended and default values are 0.", + "LabelVppTonemappingBrightnessHelp": "Apply brightness gain in VPP tone mapping. The recommended and default values are 16 and 0.", "LabelVppTonemappingBrightness": "VPP Tone mapping brightness gain", "ScreenResolution": "Screen Resolution", "RememberSubtitleSelectionsHelp": "Try to set the subtitle track to the closest match to the last video.", @@ -1721,5 +1721,8 @@ "LabelParallelImageEncodingLimit": "Parallel image encoding limit", "LabelParallelImageEncodingLimitHelp": "Maximum amount of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your system specs.", "LabelEnableAudioVbr": "Enable VBR audio encoding", - "LabelEnableAudioVbrHelp": "Variable bitrate offers better quality to average bitrate ratio, but in some rare cases may cause buffering and compatibility issues." + "LabelEnableAudioVbrHelp": "Variable bitrate offers better quality to average bitrate ratio, but in some rare cases may cause buffering and compatibility issues.", + "LabelTonemappingMode": "Tone mapping mode", + "Select": "Select", + "TonemappingModeHelp": "Select the tone mapping mode. If you experience blown out highlights try switching to the RGB mode." } From 8439fd343bfbaf0a756c0293e1ad02cfb24a8c72 Mon Sep 17 00:00:00 2001 From: sleepycatcoding Date: Mon, 1 May 2023 00:08:55 +0000 Subject: [PATCH 057/147] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/et.json b/src/strings/et.json index e4e4f61bff..c3e153e2f3 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -285,7 +285,7 @@ "CustomDlnaProfilesHelp": "Loo kohandatud profiil uue seadme jaoks või tühista süsteemi profiil.", "ConfigureDateAdded": "Seadista, kuidas lisamise kuupäev kuvatakse juhtpaneeli meediakogu seadetes", "Banner": "Bänner", - "AllowTonemappingHelp": "Värvikaardistus võib muuta video dünaamilise ulatuse HDR -st SDR -ks, säilitades samal ajal pildi üksikasjad ja värvid, mis on algse stseeni kujutamisel väga oluline teave. Praegu töötab ainult 10-bitise HDR10, HLG või DoVi videotega. See vajab vastavat OpenGL või CUDA käitusaega.", + "AllowTonemappingHelp": "Värvikaardistus võib muuta video dünaamilise ulatuse HDR -st SDR -ks, säilitades samal ajal pildi üksikasjad ja värvid, mis on algse stseeni kujutamisel väga oluline teave. Praegu töötab ainult 10-bitise HDR10, HLG ja DoVi videotega. See vajab vastavat OpenGL või CUDA käitusaega.", "HeaderDirectPlayProfile": "Otse-esituse profiil", "HeaderContainerProfileHelp": "Konteineri profiilid näitavad seadme piiranguid teatud vormingute esitamisel. Kui kehtib piirang, meedium transkooditakse, isegi kui vorming on seadistatud otse-esituseks.", "HeaderCodecProfileHelp": "Koodeki profiilid näitavad seadme piiranguid konkreetsete koodekite esitamisel. Kui kehtivad piirangud, transkooditakse meedia, isegi kui koodek on seadistatud otse-esituseks.", From 575afa2e98aa70c6e3bda2821872e3198f6b4471 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 1 May 2023 13:08:16 +0000 Subject: [PATCH 058/147] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 0ce6b1bd0e..49cfa0fa21 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -879,7 +879,7 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dies wird für manche Abspielgeräte benötigt, auf denen die Zeitsuche nicht gut funktioniert.", "OptionRequirePerfectSubtitleMatch": "Nur Untertitel mit einem perfekten Ergebnis zu meinen Videos herunterladen", "OptionRequirePerfectSubtitleMatchHelp": "Perfektes Ergebnis wählt beim Filtern nur Untertitel, welche getestet und für deine exakte Videodatei verifiziert wurden. Die Abwahl dieser Option erhöht die Chance, dass Untertitel heruntergeladen werden, die Möglichkeit falscher Untertitel oder dass Text an falschen Positionen angezeigt wird ist aber ebenfalls größer.", - "OptionResElement": "'res' element", + "OptionResElement": "'res'-Element", "OptionResumable": "Fortsetzbar", "OptionSaveMetadataAsHidden": "Speichere Metadaten und Bilder als versteckte Dateien", "OptionSaveMetadataAsHiddenHelp": "Diese Änderung betrifft nur neu gespeicherte Metadaten. Schon gespeicherte Metadaten werden erst aktualisiert, wenn der Server diese erneut speichert.", @@ -1377,7 +1377,7 @@ "LabelColorSpace": "Farbraum", "MediaInfoColorSpace": "Farbraum", "VideoAudio": "Videoton", - "AllowTonemappingHelp": "Tone-Mapping kann die Dynamic Range eines Videos von HDR zu SDR umwandeln und dabei Bilddetails und Farben beibehalten. Dies funktioniert zurzeit nur bei HDR10- oder HLG-Videos. Entsprechend der gewählten Hardwarebeschleunigung wird die passende OpenCL- oder CUDA-Laufzeitumgebung benötigt.", + "AllowTonemappingHelp": "Dynamikkompression kann den Dynamikumfang eines Videos von HDR nach SDR wandeln und dabei die für die Darstellung der Originalszene sehr wichtigen Bilddetails und Farben beibehalten. Dies funktioniert zurzeit nur bei 10-Bit-HDR10, HLG und DoVi-V und benötigt die entsprechende OpenCL- oder CUDA-Laufzeitumgebung.", "TonemappingRangeHelp": "Wähle den Ausgabefarbraum aus. Auto ist derselbe wie der Eingabefarbraum.", "TonemappingAlgorithmHelp": "Das Tone-Mapping kann fein abgestimmt werden. Wenn du mit diesen Optionen nicht vertraut bist, behalte einfach den Standardwert bei. Der empfohlene Wert ist \"BT.2390\".", "LabelTonemappingAlgorithm": "Wähle den zu verwendenden Tone-Mapping-Algorithmus aus", @@ -1411,7 +1411,7 @@ "QuickConnectAuthorizeCode": "Login Code {0} eingeben", "QuickConnectActivationSuccessful": "Erfolgreich aktiviert", "EnableQuickConnect": "Quick Connect auf diesem Server aktivieren", - "QuickConnect": "Quick Connect", + "QuickConnect": "Schnellverbindung", "PosterCard": "Posterkarte", "LabelQuickConnectCode": "Quick Connect-Code", "LabelCurrentStatus": "Aktueller Status", @@ -1462,7 +1462,7 @@ "HeaderAddUser": "Benutzer hinzufügen", "HeaderAddUpdateSubtitle": "Untertitel hinzufügen/aktualisieren", "LabelSSDPTracingFilterHelp": "Optionale IP-Adresse zum Filtern des protokollierten SSDP-Verkehrs.", - "LabelSSDPTracingFilter": "SSDP Filter", + "LabelSSDPTracingFilter": "SSDP-Filter", "LabelPublishedServerUriHelp": "Überschreibt die von Jellyfin genutzte URI auf Basis des Interfaces oder der IP-Adresse des Clients.", "LabelPublishedServerUri": "Veröffentlichte Server-URIs", "LabelEnableSSDPTracingHelp": "Aktiviere detailreiche SSDP Netzwerkverfolgung-Logs.
WARNUNG: Dies wird erhebliche Einbüßungen in der Leistung hervorrufen.", @@ -1660,9 +1660,9 @@ "MediaInfoDvVersionMinor": "DV Nebenversion", "MediaInfoDvVersionMajor": "DV Hauptversion", "MediaInfoDoViTitle": "DV Titel", - "LabelVppTonemappingContrastHelp": "VPP Tonemapping Kontrast anwenden. Empfohlene und Standartwerte sind 1,2 und 1.", + "LabelVppTonemappingContrastHelp": "Kontrast der VPP-Dynamikkompression erhöhen. Der empfohlene und voreingestellte Wert sind beide 1.", "LabelVppTonemappingContrast": "VPP Tonemapping Kontrast", - "LabelVppTonemappingBrightnessHelp": "VPP Tonemapping Helligkeit anwenden. Empfohlener und Standartwert sind 0.", + "LabelVppTonemappingBrightnessHelp": "Helligkeit der VPP-Dynamikkompression erhöhen. Der empfohlene Wert ist 16, der voreingestellte 0.", "LabelVppTonemappingBrightness": "VPP Tonemapping Helligkeit", "ScreenResolution": "Bildschirmauflösung", "RememberSubtitleSelectionsHelp": "Versuche den zum letzten Video ähnlichsten Untertitel zu setzen.", @@ -1721,5 +1721,8 @@ "LabelParallelImageEncodingLimitHelp": "Maximale Anzahl von Bildkodierungen, die parallel ausgeführt werden können. Wenn Sie diesen Wert auf 0 setzen, wird eine Grenze auf der Grundlage Ihrer Systemspezifikationen gewählt.", "HeaderPerformance": "Leistung", "LabelEnableAudioVbr": "Aktiviere Audio-Konvertierung mit variabler Bitrate (VBR)", - "LabelEnableAudioVbrHelp": "Eine variable Bitrate bietet bessere Qualität im Vergleich zu einer konstanten, kann jedoch in manchen Fällen zu Problemen beim Buffering und der Kompatibilität führen." + "LabelEnableAudioVbrHelp": "Eine variable Bitrate bietet bessere Qualität im Vergleich zu einer konstanten, kann jedoch in manchen Fällen zu Problemen beim Buffering und der Kompatibilität führen.", + "Select": "Auswählen", + "LabelTonemappingMode": "Dynamikkompressionsmodus", + "TonemappingModeHelp": "Dynamikkompressionsmodus auswählen. Falls etwas überbelichtet ist, versuche in den RGB-Modus zu wechseln." } From 1676b0c990a26a63cc9fbd886a17e398217eea7f Mon Sep 17 00:00:00 2001 From: "Chen-Tai,Peng" Date: Mon, 1 May 2023 16:22:09 +0000 Subject: [PATCH 059/147] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index ec084cfd71..169a7d7974 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1611,7 +1611,7 @@ "AudioIsExternal": "外部音訊串流", "LabelVppTonemappingBrightness": "VPP 色調映射亮度增益", "EnableSplashScreen": "啟用啟動畫面", - "LabelVppTonemappingContrastHelp": "在 VPP 色調映射中使用對比度增益。 推薦值和預設值是 1.2 和 1。", + "LabelVppTonemappingContrastHelp": "在 VPP 色調映射中使用對比度增益。 推薦值和預設值是 1。", "Clip": "花絮", "Larger": "較大的", "Sample": "樣本", @@ -1664,7 +1664,7 @@ "ThemeSong": "主題曲", "ThemeVideo": "主題影片", "EnableEnhancedNvdecDecoderHelp": "實驗性 NVDEC 實現,除非遇到解碼錯誤,否則不要啟用此選項。", - "LabelVppTonemappingBrightnessHelp": "在 VPP 色調映射中使用亮度增益。 推薦值和預設值均為 0。", + "LabelVppTonemappingBrightnessHelp": "在 VPP 色調映射中使用亮度增益。 推薦值和預設值均為 16 和 0。", "LabelVppTonemappingContrast": "VPP 色調映射對比度增益", "VideoRangeTypeNotSupported": "不支援影片的範圍類型", "LabelVideoRangeType": "影片範圍類型", @@ -1688,5 +1688,16 @@ "StereoDownmixAlgorithmHelp": "會將多聲道的音訊混縮為雙聲道的演算法。", "DownloadAll": "下載全部", "Experimental": "實驗性", - "HeaderDummyChapter": "章節影像" + "HeaderDummyChapter": "章節影像", + "LabelEnableAudioVbr": "啟用 VBR 音訊編碼", + "LabelParallelImageEncodingLimit": "並行圖片編碼限制", + "LabelParallelImageEncodingLimitHelp": "允許並行運行的圖像編碼最大數量。將其設置為 0 將根據您的系統規格限制。", + "HeaderPerformance": "效能", + "LabelDummyChapterDuration": "頻率", + "LabelDummyChapterDurationHelp": "章節圖片擷取頻率為幾秒。", + "LabelDummyChapterCount": "限制", + "LabelDummyChapterCountHelp": "每個媒體檔案的最大的章節擷取圖片數量。", + "LabelChapterImageResolution": "解析度", + "LabelChapterImageResolutionHelp": "章節擷取圖片解析度。", + "HeaderRecordingMetadataSaving": "錄製中繼資料" } From d7c72080e97edafd811c4dcc896c20beedf648be Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 1 May 2023 14:19:50 -0400 Subject: [PATCH 060/147] Remove duplicated app elements --- src/RootApp.tsx | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/RootApp.tsx b/src/RootApp.tsx index dddf31b5b1..018ac7c10a 100644 --- a/src/RootApp.tsx +++ b/src/RootApp.tsx @@ -3,8 +3,6 @@ import { History } from '@remix-run/router'; import React from 'react'; import StableApp from './apps/stable/App'; -import AppHeader from './components/AppHeader'; -import Backdrop from './components/Backdrop'; import { HistoryRouter } from './components/HistoryRouter'; import { ApiProvider } from './hooks/useApi'; @@ -16,17 +14,11 @@ const RootApp = ({ history }: { history: History }) => { return ( - - - -
-
- { - layoutMode === 'experimental' ? - : - - } -
+ { + layoutMode === 'experimental' ? + : + + } ); From 621355b53b1adc8fa1cca9f4dc08dc4fc9a9c151 Mon Sep 17 00:00:00 2001 From: Brian Bentancour Date: Mon, 1 May 2023 18:47:18 +0000 Subject: [PATCH 061/147] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 36a100d7da..775a45a41a 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1400,7 +1400,7 @@ "LabelTonemappingDesat": "Desaturación del mapa de tonos", "TonemappingRangeHelp": "Seleccione la gama de colores de salida. Auto es el mismo que el rango de entrada.", "TonemappingAlgorithmHelp": "El mapeo de tonos se puede ajustar con precisión. Si no está familiarizado con estas opciones, mantenga las predeterminadas. El valor recomendado es Hable.", - "AllowTonemappingHelp": "El mapeo de tonos puede transformar el rango dinámico de un video de HDR a SDR mientras mantiene los detalles y colores de la imagen, que son información muy importante para representar la escena original. Actualmente solo funciona con videos HDR10 o HLG. Esto requiere el OpenCL o CUDA runtime correspondiente.", + "AllowTonemappingHelp": "El mapeo de tonos puede transformar el rango dinámico de un video de HDR a SDR mientras mantiene los detalles y colores de la imagen, que son información muy importante para representar la escena original. Actualmente solo funciona con videos HDR10 de 10 bits, HLG y DoVi. Esto requiere el runtime correspondiente, CUDA u OpenCL.", "QuickConnectNotActive": "La conexión rápida no está activa en este servidor", "QuickConnectNotAvailable": "Pida al administrador del servidor que habilite la conexión rápida", "QuickConnectInvalidCode": "Código de conexión rápida no válido", @@ -1704,5 +1704,22 @@ "LabelEnableAudioVbrHelp": "La tasa de bits variable ofrece una mejor relación entre calidad y tasa de bits promedio, pero en algunos casos raros puede causar problemas de almacenamiento en búfer y compatibilidad.", "LabelParallelImageEncodingLimit": "Límite de codificación de imágenes en paralelo", "ResolutionMatchSource": "Fuente de coincidencia", - "HeaderPerformance": "Rendimiento" + "HeaderPerformance": "Rendimiento", + "Featurette": "Mediometraje", + "SubtitleBlack": "Negro", + "SaveRecordingNFOHelp": "Guardar los metadatos del proveedor de listados EPG junto a los archivos multimedia.", + "SaveRecordingImages": "Guardar grabación de imágenes EPG", + "SecondarySubtitles": "Subtítulos secundarios", + "SubtitleBlue": "Azul", + "SubtitleCyan": "Cian", + "SubtitleGray": "Gris", + "SubtitleGreen": "Verde", + "SubtitleMagenta": "Magenta", + "SubtitleWhite": "Blanco", + "Select": "Seleccionar", + "SaveRecordingImagesHelp": "Guardar las imágenes del proveedor de listados EPG junto a los archivos multimedia.", + "SubtitleLightGray": "Gris claro", + "SubtitleRed": "Rojo", + "SubtitleYellow": "Amarillo", + "Short": "Cortometraje" } From 15fc04ea4a2461db47aaf4af65be63844d32aa4f Mon Sep 17 00:00:00 2001 From: Brian Bentancour Date: Mon, 1 May 2023 18:54:02 +0000 Subject: [PATCH 062/147] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 775a45a41a..67fbbe8597 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -1671,7 +1671,7 @@ "ShowParentImages": "Mostrar imágenes de la serie", "StoryArc": "Arco narrativo", "Clip": "Ficha técnica", - "LabelVppTonemappingBrightnessHelp": "Aplicar ganancia de brillo en el mapeo de tonos VPP. Tanto los valores recomendados como los predeterminados son 0.", + "LabelVppTonemappingBrightnessHelp": "Aplicar ganancia de brillo en el mapeo de tonos VPP. El valor predeterminado es 0 y el recomendado es 16.", "LabelVppTonemappingContrastHelp": "Aplicar ganancia de contraste en el mapeo de tonos VPP. Los valores recomendados y predeterminados son 1.2 y 1.", "VideoRangeTypeNotSupported": "El tipo de rango del video no es compatible", "MediaInfoRpuPresentFlag": "Bandera preestablecida de DV rpu", From 31293e4cd89c44ee47ed6d6038a26eeaf3e3a53e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 21:04:37 +0000 Subject: [PATCH 063/147] Update Linters --- package-lock.json | 228 +++++++++++++++++++++++----------------------- package.json | 8 +- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ee9c9b56e..c313ac3389 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.59.0", - "@typescript-eslint/parser": "5.59.0", + "@typescript-eslint/eslint-plugin": "5.59.1", + "@typescript-eslint/parser": "5.59.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", @@ -81,7 +81,7 @@ "css-loader": "6.7.3", "cssnano": "6.0.0", "es-check": "7.1.1", - "eslint": "8.38.0", + "eslint": "8.39.0", "eslint-plugin-compat": "4.1.4", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", @@ -102,7 +102,7 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.5.0", + "stylelint": "15.6.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", @@ -2667,9 +2667,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3410,15 +3410,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3459,14 +3459,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" }, "engines": { @@ -3486,13 +3486,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3503,13 +3503,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3530,9 +3530,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3543,13 +3543,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3614,17 +3614,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3655,12 +3655,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6790,15 +6790,15 @@ } }, "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6808,7 +6808,7 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", + "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.0", "espree": "^9.5.1", "esquery": "^1.4.2", @@ -15458,14 +15458,14 @@ } }, "node_modules/stylelint": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.5.0.tgz", - "integrity": "sha512-jyMO3R1QtE5mUS4v40+Gg+sIQBqe7CF1xPslxycDzNVkIBCUD4O+5F1vLPq16VmunUTv4qG9o2rUKLnU5KkVeQ==", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", + "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", "dev": true, "dependencies": { - "@csstools/css-parser-algorithms": "^2.1.0", - "@csstools/css-tokenizer": "^2.1.0", - "@csstools/media-query-list-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.1.1", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/media-query-list-parser": "^2.0.4", "@csstools/selector-specificity": "^2.2.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", @@ -15490,7 +15490,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.22", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -21754,9 +21754,9 @@ } }, "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true }, "@fontsource/noto-sans": { @@ -22403,15 +22403,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -22432,53 +22432,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" } }, "@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -22518,17 +22518,17 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -22545,12 +22545,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -24931,15 +24931,15 @@ "dev": true }, "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -24949,7 +24949,7 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", + "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.0", "espree": "^9.5.1", "esquery": "^1.4.2", @@ -31323,14 +31323,14 @@ } }, "stylelint": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.5.0.tgz", - "integrity": "sha512-jyMO3R1QtE5mUS4v40+Gg+sIQBqe7CF1xPslxycDzNVkIBCUD4O+5F1vLPq16VmunUTv4qG9o2rUKLnU5KkVeQ==", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", + "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^2.1.0", - "@csstools/css-tokenizer": "^2.1.0", - "@csstools/media-query-list-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.1.1", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/media-query-list-parser": "^2.0.4", "@csstools/selector-specificity": "^2.2.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", @@ -31355,7 +31355,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.22", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", diff --git a/package.json b/package.json index f6d1d59d3b..3c0010923f 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.59.0", - "@typescript-eslint/parser": "5.59.0", + "@typescript-eslint/eslint-plugin": "5.59.1", + "@typescript-eslint/parser": "5.59.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", @@ -31,7 +31,7 @@ "css-loader": "6.7.3", "cssnano": "6.0.0", "es-check": "7.1.1", - "eslint": "8.38.0", + "eslint": "8.39.0", "eslint-plugin-compat": "4.1.4", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", @@ -52,7 +52,7 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.5.0", + "stylelint": "15.6.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", From 747f647b5dadfffd621c639db1fbafd0f97cb4b9 Mon Sep 17 00:00:00 2001 From: Brian Bentancour Date: Mon, 1 May 2023 18:55:36 +0000 Subject: [PATCH 064/147] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 67fbbe8597..b8eae118bb 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -182,7 +182,7 @@ "DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla principal, como \"Últimos Medios\" y \"Continuar viendo\"", "DisplayMissingEpisodesWithinSeasons": "Mostrar capítulos faltantes entre temporadas", "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.", - "DisplayModeHelp": "Seleccione el estilo de diseño que desea en la Interfaz.", + "DisplayModeHelp": "Seleccionar el estilo de diseño que desea en la Interfaz.", "DoNotRecord": "No grabar", "Down": "Abajo", "Download": "Descargar", @@ -278,7 +278,7 @@ "HeaderActiveDevices": "Dispositivos activos", "HeaderAccessScheduleHelp": "Cree un horario de acceso para limitar el acceso a ciertas horas.", "HeaderAccessSchedule": "Horario de acceso", - "HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de vídeo estén completamente actualizados. Si tiene dificultades para reproducir el vídeo después de habilitarlo, deberá volver a cambiar la configuración a \"Nada\".", + "HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de video estén completamente actualizados. Si tiene dificultades para reproducir el video después de habilitarlo, deberá volver a cambiar la configuración a Ninguno.", "HDPrograms": "Programas en HD", "EncoderPresetHelp": "Elegí un valor más rápido para mejorar el rendimiento, o un valor más lento para mejorar la calidad.", "FetchingData": "Obteniendo información adicional", @@ -1015,7 +1015,7 @@ "OptionCustomUsers": "Personalizado", "OptionCriticRating": "Valoración crítica", "OptionCommunityRating": "Calificación de la comunidad", - "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionCaptionInfoExSamsung": "Información sobre subtítulos Ex (Samsung)", "OptionBluray": "Blu-ray", "MusicLibraryHelp": "Revise la {0}guía de nomenclatura musical{1}.", "MovieLibraryHelp": "Revise la {0}guía de nombres de películas{1}.", @@ -1120,13 +1120,13 @@ "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes se actualizarán la próxima vez que el servidor los guarde.", "OptionSaveMetadataAsHidden": "Guardar metadatos e imágenes como archivos ocultos", "OptionResumable": "Reanudable", - "OptionResElement": "'res' element", + "OptionResElement": "Elemento 'res'", "OptionRequirePerfectSubtitleMatchHelp": "Requerir una combinación perfecta filtrará los subtítulos para incluir solo aquellos que han sido probados y verificados con su archivo de video exacto. Desmarcar esto aumentará la probabilidad de que se descarguen los subtítulos, pero aumentará las posibilidades de texto de subtítulos incorrecto o incorrecto.", "OptionRequirePerfectSubtitleMatch": "Descargar solo subtítulos que coincidan perfectamente con mis archivos de video", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para algunos dispositivos que no buscan el tiempo muy bien.", "OptionReportByteRangeSeekingWhenTranscoding": "Informe que el servidor admite la búsqueda de bytes al transcodificar", "OptionReleaseDate": "Fecha de lanzamiento", - "OptionRegex": "Regex", + "OptionRegex": "RegEx (Expresión regular)", "OptionRandom": "Aleatorio", "OptionProtocolHttp": "HTTP", "OptionProtocolHls": "Transmisión en vivo HTTP (HLS)", @@ -1170,7 +1170,7 @@ "RemoveFromCollection": "Eliminar de la colección", "RememberMe": "Recuérdame", "ButtonCast": "Transmitir a Dispositivo", - "ButtonSyncPlay": "SyncPlay", + "ButtonSyncPlay": "SyncPlay (Reproducción sincronizada)", "EnableBlurHashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición único.", "EnableBlurHash": "Habilitar marcadores de posición borrosos para imágenes", "OnApplicationStartup": "En el inicio de la aplicación", @@ -1255,7 +1255,7 @@ "TabParentalControl": "Control parental", "TabOther": "Otro", "TabNotifications": "Notificaciones", - "TabNfoSettings": "Configuraciones de NFO", + "TabNfoSettings": "Configuración de NFO", "TabNetworking": "Redes", "TabNetworks": "TV Redes", "TabMyPlugins": "Mis complementos", @@ -1510,7 +1510,7 @@ "Framerate": "Tasa de Cuadros", "DirectPlayHelp": "El Archivo fuente es enteramente compatible con este cliente y la sesión esta recibiendo el archivo sin modificaciones.", "HeaderContinueReading": "Continuar leyendo", - "EnableGamepadHelp": "Esperando por entradas desde cualquier controlador conectado.", + "EnableGamepadHelp": "Esperando por entradas desde cualquier controlador conectado. (Requiere: modo de visualización 'TV')", "LabelEnableGamepad": "Habilitar Gamepad", "Controls": "Controles", "TextSent": "Texto enviado.", @@ -1672,7 +1672,7 @@ "StoryArc": "Arco narrativo", "Clip": "Ficha técnica", "LabelVppTonemappingBrightnessHelp": "Aplicar ganancia de brillo en el mapeo de tonos VPP. El valor predeterminado es 0 y el recomendado es 16.", - "LabelVppTonemappingContrastHelp": "Aplicar ganancia de contraste en el mapeo de tonos VPP. Los valores recomendados y predeterminados son 1.2 y 1.", + "LabelVppTonemappingContrastHelp": "Aplicar ganancia de contraste en el mapeo de tonos VPP. Ambos valores, tanto recomendados como predeterminados, son 1.", "VideoRangeTypeNotSupported": "El tipo de rango del video no es compatible", "MediaInfoRpuPresentFlag": "Bandera preestablecida de DV rpu", "MediaInfoElPresentFlag": "Indicador preestablecido DV el", @@ -1721,5 +1721,7 @@ "SubtitleLightGray": "Gris claro", "SubtitleRed": "Rojo", "SubtitleYellow": "Amarillo", - "Short": "Cortometraje" + "Short": "Cortometraje", + "LabelTonemappingMode": "Modo de mapeo de tono", + "TonemappingModeHelp": "Seleccionar el modo de mapeo de tono. Si experimenta sobreexposición intente cambiar al modo RGB." } From c93d362b3605d22a7a134eb61aae3e1370be9258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20V=C3=A9lez=20Schrod?= Date: Mon, 1 May 2023 21:21:52 +0000 Subject: [PATCH 065/147] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index f42116c959..f1267a4a34 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1414,7 +1414,7 @@ "PosterCard": "Tarjeta de presentación", "EnableAutoCast": "Marcar como predeterminado", "LabelTonemappingDesatHelp": "Aplicar desaturación a realces que excedan este nivel de brillo. Mientras más alto el parámetro, se preservará más información de color. Este ajuste ayuda a prevenir la aparición de colores innecesariamente apagados en realces altos, cambiándolos gradualmente a blanco. Esto hace que las imágenes se vean más naturales, a cambio de reducir información relativa a los colores que estén fuera del rango. Se recomiendan los valores predeterminados 0 y 0.5.", - "AllowTonemappingHelp": "El mapeo de tonos puede transformar el rango dinámico de un video HDR a SDR mientras se mantienen los detalles y colores en la imagen, por lo tanto es importante para representar la escena original. Actualmente solo funciona con vídeos HDR10 o HLG. Esto requiere la librería OpenCL o Cuda, según corresponda.", + "AllowTonemappingHelp": "El mapeo de tonos puede transformar el rango dinámico de un video HDR a SDR mientras se mantienen los detalles y colores en la imagen, por lo tanto es importante para representar la escena original. Actualmente solo funciona con vídeos 10bit HDR10, HLG o DoVi. Esto requiere la librería OpenCL o Cuda, según corresponda.", "LabelOpenclDeviceHelp": "Este es el dispositivo OpenCL que se usará para el mapeo de tonos. La parte izquierda del punto es el número de plataforma, la derecha es el número de dispositivo en la plataforma. El valor predeterminado es 0.0. Se requiere especificar el archivo ejecutable FFmpeg con el método de aceleración por Hardware para OpenCL.", "LabelMaxMuxingQueueSizeHelp": "El número máximo de paquetes que se pueden almacenar en buffer mientras se espera a que se inicialicen todos los flujos. Intenta aumentar este valor si aún encuentras el mensaje de error \"Demasiados paquetes en buffer para transmitir\" en los registros de FFmpeg. El valor recomendado es 2048.", "LabelTonemappingPeakHelp": "Se omitirán los picos de referencia con este valor. Util cuando la información de pico incrustada en los metadatos de imagen no es confiable o cuando se hace un mapeo de tonos de un rango bajo a uno más alto. Se recomiendan los valores predeterminados 100 y 0.", @@ -1677,9 +1677,9 @@ "LabelStereoDownmixAlgorithm": "Algoritmo de mezcla estéreo", "StereoDownmixAlgorithmHelp": "Algoritmo utilizado para mezclar audio multicanal a estéreo.", "LabelVppTonemappingBrightness": "Ganancia de brillo de mapeo de tonos VPP", - "LabelVppTonemappingBrightnessHelp": "Aplicar gananca de brillo en mapeo de tonos VPP. El valor recomendado y por defecto es 0.", + "LabelVppTonemappingBrightnessHelp": "Aplicar ganancia de brillo en mapeo de tonos VPP. Los valores recomendados y por defecto son 16 y 0.", "Unreleased": "No publicado todavía", - "LabelVppTonemappingContrastHelp": "Aplicar ganancia de contraste en el mapeado de tonos VPP. Los valores recomendados y por defecto son 1.2 y 1 respectivamente.", + "LabelVppTonemappingContrastHelp": "Aplicar ganancia de contraste en el mapeado de tonos VPP. Los valores recomendados y seleccionados por defecto son 1.", "VideoRangeTypeNotSupported": "El tipo de rango del video no es compatible", "MediaInfoDvLevel": "Nivel de DV", "MediaInfoRpuPresentFlag": "Bandera preestablecida de DV rpu", @@ -1721,5 +1721,8 @@ "SubtitleRed": "Rojo", "SubtitleYellow": "Amarillo", "Short": "Cortometraje", - "HeaderPerformance": "Rendimiento" + "HeaderPerformance": "Rendimiento", + "LabelTonemappingMode": "Modo de mapeo de tono", + "TonemappingModeHelp": "Seleccione el modo de mapeado de tono. Si experimenta sobreiluminación intente cambiar al modo RGB.", + "Select": "Seleccionar" } From 848e9a738cdeb905314cd19aec72680d47d2f460 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 01:31:32 +0000 Subject: [PATCH 066/147] Update peter-evans/create-or-update-comment action to v3.0.1 --- .github/workflows/commands.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index 20ec075c5b..27bf335e19 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Notify as seen - uses: peter-evans/create-or-update-comment@3383acd359705b10cb1eeef05c0e88c056ea4666 # v3.0.0 + uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1 with: token: ${{ secrets.JF_BOT_TOKEN }} comment-id: ${{ github.event.comment.id }} @@ -28,7 +28,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }} - name: Comment on failure if: failure() - uses: peter-evans/create-or-update-comment@3383acd359705b10cb1eeef05c0e88c056ea4666 # v3.0.0 + uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1 with: token: ${{ secrets.JF_BOT_TOKEN }} issue-number: ${{ github.event.issue.number }} From 5cfdb1647f9f96e92fb7b177d9dc15788dfe8423 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 12:53:20 -0400 Subject: [PATCH 067/147] Fix getter return value bugs --- src/components/scrollManager.js | 2 +- src/legacy/focusPreventScroll.js | 2 +- src/scripts/dom.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 7417c7643e..52c46bcaf7 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -39,9 +39,9 @@ try { const elem = document.createElement('div'); const opts = Object.defineProperty({}, 'behavior', { - // eslint-disable-next-line getter-return get: function () { supportsScrollToOptions = true; + return null; } }); diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js index 8f912207b5..6ed7d6d017 100644 --- a/src/legacy/focusPreventScroll.js +++ b/src/legacy/focusPreventScroll.js @@ -12,9 +12,9 @@ if (HTMLElement.prototype.nativeFocus === undefined) { }, true); const opts = Object.defineProperty({}, 'preventScroll', { - // eslint-disable-next-line getter-return get: function () { supportsPreventScrollOption = true; + return null; } }); diff --git a/src/scripts/dom.js b/src/scripts/dom.js index 75bf68cc1f..35ff2078a6 100644 --- a/src/scripts/dom.js +++ b/src/scripts/dom.js @@ -87,9 +87,9 @@ export function parentWithClass(elem, classNames) { let supportsCaptureOption = false; try { const opts = Object.defineProperty({}, 'capture', { - // eslint-disable-next-line getter-return get: function () { supportsCaptureOption = true; + return null; } }); window.addEventListener('test', null, opts); From 45450324a895b92b141625f6ff73112f78d55edc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 18:36:54 +0000 Subject: [PATCH 068/147] Update dependency jassub to v1.5.13 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6026fe142e..dd5ffbb5b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "history": "5.3.0", "hls.js": "1.4.0", "intersection-observer": "0.12.2", - "jassub": "1.5.12", + "jassub": "1.5.13", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.4", "jstree": "3.3.15", @@ -10093,9 +10093,9 @@ } }, "node_modules/jassub": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/jassub/-/jassub-1.5.12.tgz", - "integrity": "sha512-CJiuNCXMMGqfmVVlaDyxqaKfOy3RIHW4HBwVWvbq8pl/d1/y1fgTarfR31whUUupHZCe7Tfq8XB7WDgdu6IHaA==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/jassub/-/jassub-1.5.13.tgz", + "integrity": "sha512-mQM88BcYgppvpPG6VE+DPQm7r6QS65EBedbm13RE4lRIhdrnQ+ihWhBOZXYZe3SlGhg+ROIDRK8uY4dm9ER2XQ==", "dependencies": { "rvfc-polyfill": "^1.0.4" } @@ -27375,9 +27375,9 @@ "dev": true }, "jassub": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/jassub/-/jassub-1.5.12.tgz", - "integrity": "sha512-CJiuNCXMMGqfmVVlaDyxqaKfOy3RIHW4HBwVWvbq8pl/d1/y1fgTarfR31whUUupHZCe7Tfq8XB7WDgdu6IHaA==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/jassub/-/jassub-1.5.13.tgz", + "integrity": "sha512-mQM88BcYgppvpPG6VE+DPQm7r6QS65EBedbm13RE4lRIhdrnQ+ihWhBOZXYZe3SlGhg+ROIDRK8uY4dm9ER2XQ==", "requires": { "rvfc-polyfill": "^1.0.4" } diff --git a/package.json b/package.json index 4e7e73d04c..7d831bc995 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "history": "5.3.0", "hls.js": "1.4.0", "intersection-observer": "0.12.2", - "jassub": "1.5.12", + "jassub": "1.5.13", "jellyfin-apiclient": "1.10.0", "jquery": "3.6.4", "jstree": "3.3.15", From 2badabb661e030a5be4d2ae9213938831aa98691 Mon Sep 17 00:00:00 2001 From: Bas Date: Tue, 2 May 2023 17:38:32 +0000 Subject: [PATCH 069/147] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 0ef61eb21b..474c87ab18 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1404,7 +1404,7 @@ "LabelTonemappingRange": "Tonemapping-bereik", "TonemappingAlgorithmHelp": "Tonemapping kan worden verfijnd. Als je niet bekend bent met deze opties, behoud je gewoon de standaardwaarde. De aanbevolen waarde is 'BT.2390'.", "LabelTonemappingAlgorithm": "Selecteer het te gebruiken tonemapping-algoritme", - "AllowTonemappingHelp": "Tone-mapping kan het dynamische bereik van een video transformeren van HDR naar SDR met behoud van beelddetails en kleuren, wat zeer belangrijke informatie is voor het weergeven van de originele scène. Werkt momenteel alleen met HDR10 of HLG videos. Dit vereist de bijbehorende OpenCL- of CUDA-runtime.", + "AllowTonemappingHelp": "Tone-mapping kan het dynamische bereik van een video transformeren van HDR naar SDR met behoud van beelddetails en kleuren, wat zeer belangrijke informatie is voor het weergeven van de originele scène. Werkt momenteel alleen met 10bit HDR10-, HLG- en DoVi-videos. Dit vereist de bijbehorende OpenCL- of CUDA-runtime.", "EnableTonemapping": "Tonemapping inschakelen", "LabelOpenclDeviceHelp": "Dit is het OpenCL-apparaat dat wordt gebruikt voor tonemapping. De linkerkant van het punt is het platformnummer en de rechterkant is het apparaatnummer op het platform. De standaardwaarde is 0,0. Het FFmpeg-toepassingsbestand met de OpenCL-hardwareversnellingsmethode is vereist.", "LabelOpenclDevice": "OpenCL-apparaat", @@ -1662,7 +1662,7 @@ "VideoRangeTypeNotSupported": "Het bereiktype van de video wordt niet ondersteund", "LabelVppTonemappingContrastHelp": "Pas contrastversterking toe in VPP-tonemapping. De aanbevolen en standaardwaarden zijn 1.2 en 1.", "LabelVppTonemappingContrast": "Contrastversterking VPP-tonemapping", - "LabelVppTonemappingBrightnessHelp": "Pas helderheidsversterking toe bij VPP-tonemapping. Zowel de aanbevolen als de standaardwaarden zijn 0.", + "LabelVppTonemappingBrightnessHelp": "Pas helderheidsversterking toe bij VPP-tonemapping. De aanbevolen en standaardwaarden zijn 0.", "LabelVppTonemappingBrightness": "Helderheidsversterking VPP-tonemapping", "EnableSplashScreen": "Opstartscherm inschakelen", "EnableEnhancedNvdecDecoderHelp": "Experimentele NVDEC-implementatie; deze instelling niet inschakelen tenzij u decoderingsfouten tegenkomt.", @@ -1721,5 +1721,7 @@ "LabelParallelImageEncodingLimit": "Limiet gelijktijdige afbeeldingscoderingen", "LabelEnableAudioVbr": "VBR-audiocodering inschakelen", "LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt betere kwaliteit bij een vergelijkbare gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden.", - "Select": "Selecteren" + "Select": "Selecteren", + "LabelTonemappingMode": "Tonemapping-modus", + "TonemappingModeHelp": "Selecteer de tonemapping-modus. Indien je overbelichtingsfouten ervaart, probeer dan de RGB-modus." } From 80411674737fc838810164e18f9626fffbf73c96 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 15:51:46 -0400 Subject: [PATCH 070/147] Use typescript eslint parser for all files --- .eslintrc.js | 38 +++----- package-lock.json | 104 ---------------------- package.json | 2 - src/components/cardbuilder/cardBuilder.js | 3 - src/scripts/editorsidebar.js | 1 - src/scripts/keyboardNavigation.js | 1 - 6 files changed, 13 insertions(+), 136 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 01714c04c4..03e06eb499 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,8 +2,9 @@ const restrictedGlobals = require('confusing-browser-globals'); module.exports = { root: true, + parser: '@typescript-eslint/parser', plugins: [ - '@babel', + '@typescript-eslint', 'react', 'promise', 'import', @@ -16,14 +17,6 @@ module.exports = { es2017: true, es2020: true }, - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module', - ecmaFeatures: { - impliedStrict: true, - jsx: true - } - }, extends: [ 'eslint:recommended', 'plugin:react/recommended', @@ -53,14 +46,19 @@ module.exports = { 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-nested-ternary': ['error'], + 'no-redeclare': ['off'], + '@typescript-eslint/no-redeclare': ['error', { builtinGlobals: false }], 'no-restricted-globals': ['error'].concat(restrictedGlobals), 'no-return-assign': ['error'], 'no-return-await': ['error'], 'no-sequences': ['error', { 'allowInParentheses': false }], - 'no-shadow': ['error'], + 'no-shadow': ['off'], + '@typescript-eslint/no-shadow': ['error'], 'no-trailing-spaces': ['error'], - '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], - 'no-useless-constructor': ['error'], + 'no-unused-expressions': ['off'], + '@typescript-eslint/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + 'no-useless-constructor': ['off'], + '@typescript-eslint/no-useless-constructor': ['error'], 'no-var': ['error'], 'no-void': ['error', { 'allowAsStatement': true }], 'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }], @@ -71,7 +69,7 @@ module.exports = { 'prefer-const': ['error', { 'destructuring': 'all' }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'radix': ['error'], - '@babel/semi': ['error'], + '@typescript-eslint/semi': ['error'], 'space-before-blocks': ['error'], 'space-infix-ops': 'error', 'yoda': 'error', @@ -201,9 +199,9 @@ module.exports = { files: [ './src/**/*.js', './src/**/*.jsx', - './src/**/*.ts' + './src/**/*.ts', + './src/**/*.tsx' ], - parser: '@babel/eslint-parser', env: { node: false, amd: true, @@ -241,8 +239,6 @@ module.exports = { 'TaskButton': 'writable', 'UserParentalControlPage': 'writable', 'Windows': 'readonly' - }, - rules: { } }, // TypeScript source files @@ -251,8 +247,6 @@ module.exports = { './src/**/*.ts', './src/**/*.tsx' ], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], extends: [ 'eslint:recommended', 'plugin:import/typescript', @@ -263,12 +257,6 @@ module.exports = { 'plugin:jsx-a11y/recommended' ], rules: { - // Use TypeScript equivalent rules when required - 'no-shadow': ['off'], - '@typescript-eslint/no-shadow': ['error'], - 'no-useless-constructor': ['off'], - '@typescript-eslint/no-useless-constructor': ['error'], - 'sonarjs/cognitive-complexity': ['warn'] } } diff --git a/package-lock.json b/package-lock.json index 6026fe142e..20807c8044 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,8 +56,6 @@ }, "devDependencies": { "@babel/core": "7.21.4", - "@babel/eslint-parser": "7.21.3", - "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", @@ -225,40 +223,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", - "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-plugin": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", - "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", - "dev": true, - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/eslint-parser": ">=7.11.0", - "eslint": ">=7.5.0" - } - }, "node_modules/@babel/generator": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", @@ -2902,15 +2866,6 @@ "node": ">=4" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7232,15 +7187,6 @@ "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -7254,15 +7200,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -20171,26 +20108,6 @@ "semver": "^6.3.0" } }, - "@babel/eslint-parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", - "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", - "dev": true, - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - } - }, - "@babel/eslint-plugin": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", - "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, "@babel/generator": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", @@ -21938,15 +21855,6 @@ "glob-to-regexp": "^0.3.0" } }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "requires": { - "eslint-scope": "5.1.1" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -25452,12 +25360,6 @@ "dev": true, "requires": {} }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -25468,12 +25370,6 @@ "estraverse": "^4.1.1" } }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, "espree": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", diff --git a/package.json b/package.json index 4e7e73d04c..5aca9baac6 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,6 @@ "license": "GPL-2.0-or-later", "devDependencies": { "@babel/core": "7.21.4", - "@babel/eslint-parser": "7.21.3", - "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index d4f3aafa49..0271a5084b 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1118,7 +1118,6 @@ let refreshIndicatorLoaded; function importRefreshIndicator() { if (!refreshIndicatorLoaded) { refreshIndicatorLoaded = true; - /* eslint-disable-next-line @babel/no-unused-expressions */ import('../../elements/emby-itemrefreshindicator/emby-itemrefreshindicator'); } } @@ -1469,7 +1468,6 @@ function getHoverMenuHtml(item, action) { const userData = item.UserData || {}; if (itemHelper.canMarkPlayed(item)) { - /* eslint-disable-next-line @babel/no-unused-expressions */ import('../../elements/emby-playstatebutton/emby-playstatebutton'); html += ''; } @@ -1477,7 +1475,6 @@ function getHoverMenuHtml(item, action) { if (itemHelper.canRate(item)) { const likes = userData.Likes == null ? '' : userData.Likes; - /* eslint-disable-next-line @babel/no-unused-expressions */ import('../../elements/emby-ratingbutton/emby-ratingbutton'); html += ''; } diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index e3a1f58ab8..8f6cd24c98 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -300,7 +300,6 @@ let selectedNodeId; $(document).on('itemsaved', '.metadataEditorPage', function (e, item) { updateEditorNode(this, item); }).on('pagebeforeshow', '.metadataEditorPage', function () { - /* eslint-disable-next-line @babel/no-unused-expressions */ import('../styles/metadataeditor.scss'); }).on('pagebeforeshow', '.metadataEditorPage', function () { const page = this; diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index 39c187479d..6e8e477d7a 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -202,7 +202,6 @@ export function enable() { function attachGamepadScript() { console.log('Gamepad connected! Attaching gamepadtokey.js script'); window.removeEventListener('gamepadconnected', attachGamepadScript); - /* eslint-disable-next-line @babel/no-unused-expressions */ import('./gamepadtokey'); } From 45623fe586859550cce6441bfabcab46b571b96f Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 15:54:53 -0400 Subject: [PATCH 071/147] Fix missing semicolons in ts files --- src/apiclient.d.ts | 2 +- src/components/dashboard/users/AccessContainer.tsx | 2 +- src/components/dashboard/users/AccessScheduleList.tsx | 2 +- src/components/dashboard/users/BlockedTagList.tsx | 2 +- src/components/dashboard/users/LinkEditUserPreferences.tsx | 2 +- src/components/dashboard/users/SectionTabs.tsx | 2 +- src/components/dashboard/users/UserCardBox.tsx | 2 +- src/components/dashboard/users/UserPasswordForm.tsx | 2 +- src/components/search/LiveTVSearchResults.tsx | 2 +- src/components/search/SearchResults.tsx | 2 +- src/components/search/SearchResultsRow.tsx | 4 ++-- src/components/search/SearchSuggestions.tsx | 2 +- src/elements/ButtonElement.tsx | 2 +- src/elements/CheckBoxElement.tsx | 2 +- src/elements/IconButtonElement.tsx | 2 +- src/elements/InputElement.tsx | 2 +- src/elements/SectionTitleContainer.tsx | 2 +- src/elements/SectionTitleLinkElement.tsx | 2 +- src/elements/SelectElement.tsx | 2 +- src/routes/home.tsx | 4 ++-- src/routes/user/useredit.tsx | 4 ++-- src/routes/user/userlibraryaccess.tsx | 2 +- src/routes/user/usernew.tsx | 4 ++-- src/routes/user/userparentalcontrol.tsx | 2 +- src/routes/user/userprofiles.tsx | 2 +- 25 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/apiclient.d.ts b/src/apiclient.d.ts index 33f3752ca7..a9f7f61ccd 100644 --- a/src/apiclient.d.ts +++ b/src/apiclient.d.ts @@ -268,7 +268,7 @@ declare module 'jellyfin-apiclient' { sendWebSocketMessage(name: string, data: any): void; serverAddress(val?: string): string; serverId(): string; - serverVersion(): string + serverVersion(): string; setAuthenticationInfo(accessKey?: string, userId?: string): void; setRequestHeaders(headers: any): void; setSystemInfo(info: SystemInfo): void; diff --git a/src/components/dashboard/users/AccessContainer.tsx b/src/components/dashboard/users/AccessContainer.tsx index 32fe9c213d..88727f396a 100644 --- a/src/components/dashboard/users/AccessContainer.tsx +++ b/src/components/dashboard/users/AccessContainer.tsx @@ -12,7 +12,7 @@ type IProps = { listTitle?: string; description?: string; children?: React.ReactNode -} +}; const AccessContainer: FunctionComponent = ({ containerClassName, headerTitle, checkBoxClassName, checkBoxTitle, listContainerClassName, accessClassName, listTitle, description, children }: IProps) => { return ( diff --git a/src/components/dashboard/users/AccessScheduleList.tsx b/src/components/dashboard/users/AccessScheduleList.tsx index 41c55c3621..f1e5affb8c 100644 --- a/src/components/dashboard/users/AccessScheduleList.tsx +++ b/src/components/dashboard/users/AccessScheduleList.tsx @@ -9,7 +9,7 @@ type AccessScheduleListProps = { DayOfWeek?: string; StartHour?: number ; EndHour?: number; -} +}; function getDisplayTime(hours = 0) { let minutes = 0; diff --git a/src/components/dashboard/users/BlockedTagList.tsx b/src/components/dashboard/users/BlockedTagList.tsx index 20e7f88ef2..5158a63e97 100644 --- a/src/components/dashboard/users/BlockedTagList.tsx +++ b/src/components/dashboard/users/BlockedTagList.tsx @@ -3,7 +3,7 @@ import IconButtonElement from '../../../elements/IconButtonElement'; type IProps = { tag?: string; -} +}; const BlockedTagList: FunctionComponent = ({ tag }: IProps) => { return ( diff --git a/src/components/dashboard/users/LinkEditUserPreferences.tsx b/src/components/dashboard/users/LinkEditUserPreferences.tsx index fde63ba514..fd272fd770 100644 --- a/src/components/dashboard/users/LinkEditUserPreferences.tsx +++ b/src/components/dashboard/users/LinkEditUserPreferences.tsx @@ -4,7 +4,7 @@ import globalize from '../../../scripts/globalize'; type IProps = { title?: string; className?: string; -} +}; const createLinkElement = ({ className, title }: IProps) => ({ __html: ` ({ __html: ` { if (lastActivityDate) { diff --git a/src/components/dashboard/users/UserPasswordForm.tsx b/src/components/dashboard/users/UserPasswordForm.tsx index 8cfb47b5b1..0337c06510 100644 --- a/src/components/dashboard/users/UserPasswordForm.tsx +++ b/src/components/dashboard/users/UserPasswordForm.tsx @@ -11,7 +11,7 @@ import InputElement from '../../../elements/InputElement'; type IProps = { userId: string; -} +}; const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { const element = useRef(null); diff --git a/src/components/search/LiveTVSearchResults.tsx b/src/components/search/LiveTVSearchResults.tsx index 5b4c097c5c..a087dc23cc 100644 --- a/src/components/search/LiveTVSearchResults.tsx +++ b/src/components/search/LiveTVSearchResults.tsx @@ -24,7 +24,7 @@ type LiveTVSearchResultsProps = { parentId?: string | null; collectionType?: string | null; query?: string; -} +}; /* * React component to display search result rows for live tv library search diff --git a/src/components/search/SearchResults.tsx b/src/components/search/SearchResults.tsx index 720cee0e3c..731cc6ec35 100644 --- a/src/components/search/SearchResults.tsx +++ b/src/components/search/SearchResults.tsx @@ -12,7 +12,7 @@ type SearchResultsProps = { parentId?: string | null; collectionType?: string | null; query?: string; -} +}; const ensureNonNullItems = (result: BaseItemDtoQueryResult) => ({ ...result, diff --git a/src/components/search/SearchResultsRow.tsx b/src/components/search/SearchResultsRow.tsx index 9dbb330578..0e5c1a50a4 100644 --- a/src/components/search/SearchResultsRow.tsx +++ b/src/components/search/SearchResultsRow.tsx @@ -35,13 +35,13 @@ type CardOptions = { showChannelName?: boolean, showTitle?: boolean, showYear?: boolean -} +}; type SearchResultsRowProps = { title?: string; items?: BaseItemDto[]; cardOptions?: CardOptions; -} +}; const SearchResultsRow: FunctionComponent = ({ title, items = [], cardOptions = {} }: SearchResultsRowProps) => { const element = useRef(null); diff --git a/src/components/search/SearchSuggestions.tsx b/src/components/search/SearchSuggestions.tsx index d16cdca8e6..7e70d19ee5 100644 --- a/src/components/search/SearchSuggestions.tsx +++ b/src/components/search/SearchSuggestions.tsx @@ -25,7 +25,7 @@ const createSuggestionLink = ({ name, href }: { name: string, href: string }) => type SearchSuggestionsProps = { parentId?: string | null; -} +}; const SearchSuggestions: FunctionComponent = ({ parentId }: SearchSuggestionsProps) => { const [ suggestions, setSuggestions ] = useState([]); diff --git a/src/elements/ButtonElement.tsx b/src/elements/ButtonElement.tsx index 3de90f0c11..f9ed58954b 100644 --- a/src/elements/ButtonElement.tsx +++ b/src/elements/ButtonElement.tsx @@ -21,7 +21,7 @@ type IProps = { title?: string; leftIcon?: string; rightIcon?: string; -} +}; const ButtonElement: FunctionComponent = ({ type, id, className, title, leftIcon, rightIcon }: IProps) => { return ( diff --git a/src/elements/CheckBoxElement.tsx b/src/elements/CheckBoxElement.tsx index fade823891..c8d861a0bb 100644 --- a/src/elements/CheckBoxElement.tsx +++ b/src/elements/CheckBoxElement.tsx @@ -29,7 +29,7 @@ type IProps = { itemCheckedAttribute?: string; itemName?: string title?: string -} +}; const CheckBoxElement: FunctionComponent = ({ labelClassName, className, elementId, dataFilter, itemType, itemId, itemAppName, itemCheckedAttribute, itemName, title }: IProps) => { const appName = itemAppName ? `- ${itemAppName}` : ''; diff --git a/src/elements/IconButtonElement.tsx b/src/elements/IconButtonElement.tsx index b39847403b..50b4d76f6e 100644 --- a/src/elements/IconButtonElement.tsx +++ b/src/elements/IconButtonElement.tsx @@ -10,7 +10,7 @@ type IProps = { dataIndex?: string | number; dataTag?: string | number; dataProfileid?: string | number; -} +}; const createIconButtonElement = ({ is, id, className, title, icon, dataIndex, dataTag, dataProfileid }: IProps) => ({ __html: ` - - -
- -
-
-
diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js deleted file mode 100644 index 98aa0dd40e..0000000000 --- a/src/controllers/dashboard/users/useredit.js +++ /dev/null @@ -1,196 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function loadDeleteFolders(page, user, mediaFolders) { - ApiClient.getJSON(ApiClient.getUrl('Channels', { - SupportsMediaDeletion: true - })).then(function (channelsResult) { - let isChecked; - let checkedAttribute; - let html = ''; - - for (const folder of mediaFolders) { - isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; - checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - for (const folder of channelsResult.Items) { - isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; - checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - $('.deleteAccess', page).html(html).trigger('create'); - $('#chkEnableDeleteAllFolders', page).prop('checked', user.Policy.EnableContentDeletion); - }); -} - -function loadAuthProviders(page, user, providers) { - if (providers.length > 1) { - page.querySelector('.fldSelectLoginProvider').classList.remove('hide'); - } else { - page.querySelector('.fldSelectLoginProvider').classList.add('hide'); - } - - const currentProviderId = user.Policy.AuthenticationProviderId; - page.querySelector('.selectLoginProvider').innerHTML = providers.map(function (provider) { - const selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; - return ''; - }); -} - -function loadPasswordResetProviders(page, user, providers) { - if (providers.length > 1) { - page.querySelector('.fldSelectPasswordResetProvider').classList.remove('hide'); - } else { - page.querySelector('.fldSelectPasswordResetProvider').classList.add('hide'); - } - - const currentProviderId = user.Policy.PasswordResetProviderId; - page.querySelector('.selectPasswordResetProvider').innerHTML = providers.map(function (provider) { - const selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; - return ''; - }); -} - -function loadUser(page, user) { - ApiClient.getJSON(ApiClient.getUrl('Auth/Providers')).then(function (providers) { - loadAuthProviders(page, user, providers); - }); - ApiClient.getJSON(ApiClient.getUrl('Auth/PasswordResetProviders')).then(function (providers) { - loadPasswordResetProviders(page, user, providers); - }); - ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })).then(function (folders) { - loadDeleteFolders(page, user, folders.Items); - }); - - if (user.Policy.IsDisabled) { - $('.disabledUserBanner', page).show(); - } else { - $('.disabledUserBanner', page).hide(); - } - - $('#txtUserName', page).prop('disabled', '').removeAttr('disabled'); - $('#fldConnectInfo', page).show(); - $('.lnkEditUserPreferences', page).attr('href', 'mypreferencesmenu.html?userId=' + user.Id); - libraryMenu.setTitle(user.Name); - page.querySelector('.username').innerHTML = user.Name; - $('#txtUserName', page).val(user.Name); - $('#chkIsAdmin', page).prop('checked', user.Policy.IsAdministrator); - $('#chkDisabled', page).prop('checked', user.Policy.IsDisabled); - $('#chkIsHidden', page).prop('checked', user.Policy.IsHidden); - $('#chkEnableCollectionManagement', page).prop('checked', user.Policy.chkEnableCollectionManagement); - $('#chkRemoteControlSharedDevices', page).prop('checked', user.Policy.EnableSharedDeviceControl); - $('#chkEnableRemoteControlOtherUsers', page).prop('checked', user.Policy.EnableRemoteControlOfOtherUsers); - $('#chkEnableDownloading', page).prop('checked', user.Policy.EnableContentDownloading); - $('#chkManageLiveTv', page).prop('checked', user.Policy.EnableLiveTvManagement); - $('#chkEnableLiveTvAccess', page).prop('checked', user.Policy.EnableLiveTvAccess); - $('#chkEnableMediaPlayback', page).prop('checked', user.Policy.EnableMediaPlayback); - $('#chkEnableAudioPlaybackTranscoding', page).prop('checked', user.Policy.EnableAudioPlaybackTranscoding); - $('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding); - $('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing); - $('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding); - $('#chkRemoteAccess', page).prop('checked', user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess); - $('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ''); - $('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0'); - $('#txtMaxActiveSessions', page).val(user.Policy.MaxActiveSessions || '0'); - if (ApiClient.isMinServerVersion('10.6.0')) { - $('#selectSyncPlayAccess').val(user.Policy.SyncPlayAccess); - } - loading.hide(); -} - -function onSaveComplete() { - Dashboard.navigate('userprofiles.html'); - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Name = $('#txtUserName', page).val(); - user.Policy.IsAdministrator = $('#chkIsAdmin', page).is(':checked'); - user.Policy.IsHidden = $('#chkIsHidden', page).is(':checked'); - user.Policy.IsDisabled = $('#chkDisabled', page).is(':checked'); - user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).is(':checked'); - user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).is(':checked'); - user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).is(':checked'); - user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).is(':checked'); - user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).is(':checked'); - user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).is(':checked'); - user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).is(':checked'); - user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).is(':checked'); - user.Policy.EnableCollectionManagement = $('#chkEnableCollectionManagement', page).is(':checked'); - user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).is(':checked'); - user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).is(':checked'); - user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).is(':checked'); - user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0'), 10); - user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0', 10); - user.Policy.MaxActiveSessions = parseInt($('#txtMaxActiveSessions', page).val() || '0', 10); - user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; - user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; - user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).is(':checked'); - user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - if (ApiClient.isMinServerVersion('10.6.0')) { - user.Policy.SyncPlayAccess = page.querySelector('#selectSyncPlayAccess').value; - } - ApiClient.updateUser(user).then(function () { - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); - }); -} - -function onSubmit() { - const page = $(this).parents('.page')[0]; - loading.show(); - getUser().then(function (result) { - saveUser(result, page); - }); - return false; -} - -function getUser() { - const userId = getParameterByName('userId'); - return ApiClient.getUser(userId); -} - -function loadData(page) { - loading.show(); - getUser().then(function (user) { - loadUser(page, user); - }); -} - -$(document).on('pageinit', '#editUserPage', function () { - $('.editUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); - const page = this; - $('#chkEnableDeleteAllFolders', this).on('change', function () { - if (this.checked) { - $('.deleteAccess', page).hide(); - } else { - $('.deleteAccess', page).show(); - } - }); - ApiClient.getServerConfiguration().then(function (config) { - if (config.EnableRemoteAccess) { - page.querySelector('.fldRemoteAccess').classList.remove('hide'); - } else { - page.querySelector('.fldRemoteAccess').classList.add('hide'); - } - }); -}).on('pagebeforeshow', '#editUserPage', function () { - loadData(this); -}); - diff --git a/src/controllers/dashboard/users/userlibraryaccess.html b/src/controllers/dashboard/users/userlibraryaccess.html deleted file mode 100644 index bf6ba93408..0000000000 --- a/src/controllers/dashboard/users/userlibraryaccess.html +++ /dev/null @@ -1,68 +0,0 @@ -
- -
-
- -
-
-

- ${Help} -
-
- - -
- -
-

${HeaderLibraryAccess}

- -
-
-
-
${LibraryAccessHelp}
-
-
- -
-
-

${HeaderDeviceAccess}

- -
-
-
-
${DeviceAccessHelp}
-
-
-
-
-
- -
-
-
-
-
diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js deleted file mode 100644 index e84638e8e0..0000000000 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ /dev/null @@ -1,184 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function triggerChange(select) { - const evt = document.createEvent('HTMLEvents'); - evt.initEvent('change', false, true); - select.dispatchEvent(evt); -} - -function loadMediaFolders(page, user, mediaFolders) { - let html = ''; - html += '

' + globalize.translate('HeaderLibraries') + '

'; - html += '
'; - - for (let i = 0, length = mediaFolders.length; i < length; i++) { - const folder = mediaFolders[i]; - const isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1; - const checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - page.querySelector('.folderAccess').innerHTML = html; - const chkEnableAllFolders = page.querySelector('#chkEnableAllFolders'); - chkEnableAllFolders.checked = user.Policy.EnableAllFolders; - triggerChange(chkEnableAllFolders); -} - -function loadChannels(page, user, channels) { - let html = ''; - html += '

' + globalize.translate('Channels') + '

'; - html += '
'; - - for (let i = 0, length = channels.length; i < length; i++) { - const folder = channels[i]; - const isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1; - const checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.channelAccess', page).show().html(html); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - const chkEnableAllChannels = page.querySelector('#chkEnableAllChannels'); - chkEnableAllChannels.checked = user.Policy.EnableAllChannels; - triggerChange(chkEnableAllChannels); -} - -function loadDevices(page, user, devices) { - let html = ''; - html += '

' + globalize.translate('HeaderDevices') + '

'; - html += '
'; - - for (let i = 0, length = devices.length; i < length; i++) { - const device = devices[i]; - const checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.deviceAccess', page).show().html(html); - const chkEnableAllDevices = page.querySelector('#chkEnableAllDevices'); - chkEnableAllDevices.checked = user.Policy.EnableAllDevices; - triggerChange(chkEnableAllDevices); - - if (user.Policy.IsAdministrator) { - page.querySelector('.deviceAccessContainer').classList.add('hide'); - } else { - page.querySelector('.deviceAccessContainer').classList.remove('hide'); - } -} - -function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) { - page.querySelector('.username').innerHTML = user.Name; - libraryMenu.setTitle(user.Name); - loadChannels(page, user, channels); - loadMediaFolders(page, user, mediaFolders); - loadDevices(page, user, devices); - loading.hide(); -} - -function onSaveComplete() { - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); - user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); - user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).is(':checked'); - user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.BlockedChannels = null; - user.Policy.BlockedMediaFolders = null; - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); -} - -function onSubmit() { - const page = $(this).parents('.page'); - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - return false; -} - -$(document).on('pageinit', '#userLibraryAccessPage', function () { - const page = this; - $('#chkEnableAllDevices', page).on('change', function () { - if (this.checked) { - $('.deviceAccessListContainer', page).hide(); - } else { - $('.deviceAccessListContainer', page).show(); - } - }); - $('#chkEnableAllChannels', page).on('change', function () { - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - }); - page.querySelector('#chkEnableAllFolders').addEventListener('change', function () { - if (this.checked) { - page.querySelector('.folderAccessListContainer').classList.add('hide'); - } else { - page.querySelector('.folderAccessListContainer').classList.remove('hide'); - } - }); - $('.userLibraryAccessForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#userLibraryAccessPage', function () { - const page = this; - loading.show(); - let promise1; - const userId = getParameterByName('userId'); - - if (userId) { - promise1 = ApiClient.getUser(userId); - } else { - const deferred = $.Deferred(); - deferred.resolveWith(null, [{ - Configuration: {} - }]); - promise1 = deferred.promise(); - } - - const promise2 = Dashboard.getCurrentUser(); - const promise4 = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })); - const promise5 = ApiClient.getJSON(ApiClient.getUrl('Channels')); - const promise6 = ApiClient.getJSON(ApiClient.getUrl('Devices')); - Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) { - loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items); - }); -}); - diff --git a/src/controllers/dashboard/users/usernew.html b/src/controllers/dashboard/users/usernew.html deleted file mode 100644 index 5d50ede80a..0000000000 --- a/src/controllers/dashboard/users/usernew.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-
-
-
-

${ButtonAddUser}

- ${Help} -
- -
- -
- -
- -
-
- -
-

${HeaderLibraryAccess}

-
- -
${LibraryAccessHelp}
-
-
-
-
-
-
- - - -
- - - -
-
-
-
-
diff --git a/src/controllers/dashboard/users/usernew.js b/src/controllers/dashboard/users/usernew.js deleted file mode 100644 index 9477506aca..0000000000 --- a/src/controllers/dashboard/users/usernew.js +++ /dev/null @@ -1,128 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-checkbox/emby-checkbox'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; - -function loadMediaFolders(page, mediaFolders) { - let html = ''; - html += '

' + globalize.translate('HeaderLibraries') + '

'; - html += '
'; - - for (let i = 0; i < mediaFolders.length; i++) { - const folder = mediaFolders[i]; - html += ''; - } - - html += '
'; - $('.folderAccess', page).html(html).trigger('create'); - $('#chkEnableAllFolders', page).prop('checked', false); -} - -function loadChannels(page, channels) { - let html = ''; - html += '

' + globalize.translate('Channels') + '

'; - html += '
'; - - for (let i = 0; i < channels.length; i++) { - const folder = channels[i]; - html += ''; - } - - html += '
'; - $('.channelAccess', page).show().html(html).trigger('create'); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - $('#chkEnableAllChannels', page).prop('checked', false); -} - -function loadUser(page) { - $('#txtUsername', page).val(''); - $('#txtPassword', page).val(''); - loading.show(); - const promiseFolders = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })); - const promiseChannels = ApiClient.getJSON(ApiClient.getUrl('Channels')); - Promise.all([promiseFolders, promiseChannels]).then(function (responses) { - loadMediaFolders(page, responses[0].Items); - loadChannels(page, responses[1].Items); - loading.hide(); - }); -} - -function saveUser(page) { - const _user = { - Name: $('#txtUsername', page).val(), - Password: $('#txtPassword', page).val() - }; - ApiClient.createUser(_user).then(function (user) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); - user.Policy.EnabledFolders = []; - - if (!user.Policy.EnableAllFolders) { - user.Policy.EnabledFolders = $('.chkFolder', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - } - - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); - user.Policy.EnabledChannels = []; - - if (!user.Policy.EnableAllChannels) { - user.Policy.EnabledChannels = $('.chkChannel', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - } - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - Dashboard.navigate('useredit.html?userId=' + user.Id); - }); - }, function () { - toast(globalize.translate('ErrorDefault')); - loading.hide(); - }); -} - -function onSubmit() { - const page = $(this).parents('.page')[0]; - loading.show(); - saveUser(page); - return false; -} - -function loadData(page) { - loadUser(page); -} - -$(document).on('pageinit', '#newUserPage', function () { - const page = this; - $('#chkEnableAllChannels', page).on('change', function () { - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - }); - $('#chkEnableAllFolders', page).on('change', function () { - if (this.checked) { - $('.folderAccessListContainer', page).hide(); - } else { - $('.folderAccessListContainer', page).show(); - } - }); - $('.newUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#newUserPage', function () { - loadData(this); -}); - diff --git a/src/controllers/dashboard/users/userparentalcontrol.html b/src/controllers/dashboard/users/userparentalcontrol.html deleted file mode 100644 index 5b58047c60..0000000000 --- a/src/controllers/dashboard/users/userparentalcontrol.html +++ /dev/null @@ -1,60 +0,0 @@ -
-
-
-
-
-

- ${Help} -
-
- - - -
-
- -
${MaxParentalRatingHelp}
-
- -
-
-
- -
- -
-
-

${LabelBlockContentWithTags}

- -
-
-
- -
-
-

${HeaderAccessSchedule}

- -
- -

${HeaderAccessScheduleHelp}

-
-
- -
- -
-
-
-
-
diff --git a/src/controllers/dashboard/users/userparentalcontrol.js b/src/controllers/dashboard/users/userparentalcontrol.js deleted file mode 100644 index 0b527e09ef..0000000000 --- a/src/controllers/dashboard/users/userparentalcontrol.js +++ /dev/null @@ -1,278 +0,0 @@ -import 'jquery'; -import datetime from '../../../scripts/datetime'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import '../../../components/listview/listview.scss'; -import '../../../elements/emby-button/paper-icon-button-light'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function populateRatings(allParentalRatings, page) { - let html = ''; - html += ""; - let rating; - const ratings = []; - - for (let i = 0, length = allParentalRatings.length; i < length; i++) { - rating = allParentalRatings[i]; - if (ratings.length) { - const lastRating = ratings[ratings.length - 1]; - - if (lastRating.Value === rating.Value) { - lastRating.Name += '/' + rating.Name; - continue; - } - } - - ratings.push({ - Name: rating.Name, - Value: rating.Value - }); - } - - for (let i = 0, length = ratings.length; i < length; i++) { - rating = ratings[i]; - html += "'; - } - - $('#selectMaxParentalRating', page).html(html); -} - -function loadUnratedItems(page, user) { - const items = [{ - name: globalize.translate('Books'), - value: 'Book' - }, { - name: globalize.translate('Channels'), - value: 'ChannelContent' - }, { - name: globalize.translate('LiveTV'), - value: 'LiveTvChannel' - }, { - name: globalize.translate('Movies'), - value: 'Movie' - }, { - name: globalize.translate('Music'), - value: 'Music' - }, { - name: globalize.translate('Trailers'), - value: 'Trailer' - }, { - name: globalize.translate('Shows'), - value: 'Series' - }]; - let html = ''; - html += '

' + globalize.translate('HeaderBlockItemsWithNoRating') + '

'; - html += '
'; - - for (let i = 0, length = items.length; i < length; i++) { - const item = items[i]; - const checkedAttribute = user.Policy.BlockUnratedItems.indexOf(item.value) != -1 ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.blockUnratedItems', page).html(html).trigger('create'); -} - -function loadUser(page, user, allParentalRatings) { - page.querySelector('.username').innerHTML = user.Name; - libraryMenu.setTitle(user.Name); - loadUnratedItems(page, user); - loadBlockedTags(page, user.Policy.BlockedTags); - populateRatings(allParentalRatings, page); - let ratingValue = ''; - - if (user.Policy.MaxParentalRating) { - for (let i = 0, length = allParentalRatings.length; i < length; i++) { - const rating = allParentalRatings[i]; - - if (user.Policy.MaxParentalRating >= rating.Value) { - ratingValue = rating.Value; - } - } - } - - $('#selectMaxParentalRating', page).val(ratingValue); - - if (user.Policy.IsAdministrator) { - $('.accessScheduleSection', page).hide(); - } else { - $('.accessScheduleSection', page).show(); - } - - renderAccessSchedule(page, user.Policy.AccessSchedules || []); - loading.hide(); -} - -function loadBlockedTags(page, tags) { - let html = tags.map(function (h) { - let li = '
'; - li += '
'; - li += '

'; - li += h; - li += '

'; - li += '
'; - li += ''; - li += '
'; - return li; - }).join(''); - - if (html) { - html = '
' + html + '
'; - } - - const blockedTags = page.querySelector('.blockedTags'); - blockedTags.innerHTML = html; - - for (const btnDeleteTag of blockedTags.querySelectorAll('.btnDeleteTag')) { - btnDeleteTag.addEventListener('click', function () { - const tag = this.getAttribute('data-tag'); - const newTags = tags.filter(function (t) { - return t != tag; - }); - loadBlockedTags(page, newTags); - }); - } -} - -function deleteAccessSchedule(page, schedules, index) { - schedules.splice(index, 1); - renderAccessSchedule(page, schedules); -} - -function renderAccessSchedule(page, schedules) { - let html = ''; - let index = 0; - html += schedules.map(function (a) { - let itemHtml = ''; - itemHtml += '
'; - itemHtml += '
'; - itemHtml += '

'; - itemHtml += globalize.translate('Option' + a.DayOfWeek); - itemHtml += '

'; - itemHtml += '
' + getDisplayTime(a.StartHour) + ' - ' + getDisplayTime(a.EndHour) + '
'; - itemHtml += '
'; - itemHtml += ''; - itemHtml += '
'; - index++; - return itemHtml; - }).join(''); - const accessScheduleList = page.querySelector('.accessScheduleList'); - accessScheduleList.innerHTML = html; - $('.btnDelete', accessScheduleList).on('click', function () { - deleteAccessSchedule(page, schedules, parseInt(this.getAttribute('data-index'), 10)); - }); -} - -function onSaveComplete() { - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Policy.MaxParentalRating = $('#selectMaxParentalRating', page).val() || null; - user.Policy.BlockUnratedItems = $('.chkUnratedItem', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-itemtype'); - }); - user.Policy.AccessSchedules = getSchedulesFromPage(page); - user.Policy.BlockedTags = getBlockedTagsFromPage(page); - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); -} - -function getDisplayTime(hours) { - let minutes = 0; - const pct = hours % 1; - - if (pct) { - minutes = parseInt(60 * pct, 10); - } - - return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); -} - -function showSchedulePopup(page, schedule, index) { - schedule = schedule || {}; - import('../../../components/accessSchedule/accessSchedule').then(({ default: accessschedule }) => { - accessschedule.show({ - schedule: schedule - }).then(function (updatedSchedule) { - const schedules = getSchedulesFromPage(page); - - if (index == -1) { - index = schedules.length; - } - - schedules[index] = updatedSchedule; - renderAccessSchedule(page, schedules); - }); - }); -} - -function getSchedulesFromPage(page) { - return $('.liSchedule', page).map(function () { - return { - DayOfWeek: this.getAttribute('data-day'), - StartHour: this.getAttribute('data-start'), - EndHour: this.getAttribute('data-end') - }; - }).get(); -} - -function getBlockedTagsFromPage(page) { - return $('.blockedTag', page).map(function () { - return this.getAttribute('data-tag'); - }).get(); -} - -function showBlockedTagPopup(page) { - import('../../../components/prompt/prompt').then(({ default: prompt }) => { - prompt({ - label: globalize.translate('LabelTag') - }).then(function (value) { - const tags = getBlockedTagsFromPage(page); - - if (tags.indexOf(value) == -1) { - tags.push(value); - loadBlockedTags(page, tags); - } - }); - }); -} - -window.UserParentalControlPage = { - onSubmit: function () { - const page = $(this).parents('.page'); - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - return false; - } -}; -$(document).on('pageinit', '#userParentalControlPage', function () { - const page = this; - $('.btnAddSchedule', page).on('click', function () { - showSchedulePopup(page, {}, -1); - }); - $('.btnAddBlockedTag', page).on('click', function () { - showBlockedTagPopup(page); - }); - $('.userParentalControlForm').off('submit', UserParentalControlPage.onSubmit).on('submit', UserParentalControlPage.onSubmit); -}).on('pageshow', '#userParentalControlPage', function () { - const page = this; - loading.show(); - const userId = getParameterByName('userId'); - const promise1 = ApiClient.getUser(userId); - const promise2 = ApiClient.getParentalRatings(); - Promise.all([promise1, promise2]).then(function (responses) { - loadUser(page, responses[0], responses[1]); - }); -}); - diff --git a/src/controllers/dashboard/users/userpassword.html b/src/controllers/dashboard/users/userpassword.html deleted file mode 100644 index 897f0e7bd5..0000000000 --- a/src/controllers/dashboard/users/userpassword.html +++ /dev/null @@ -1,72 +0,0 @@ -
-
-
-
-
-

- ${Help} -
-
- - - -
-
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
-
- ${HeaderEasyPinCode} -
-
-
${EasyPasswordHelp}
-
-
- -
-
-
- -
${LabelInNetworkSignInWithEasyPasswordHelp}
-
-
- - -
-
-
-
-
-
-
diff --git a/src/controllers/dashboard/users/userpasswordpage.js b/src/controllers/dashboard/users/userpasswordpage.js deleted file mode 100644 index 4171c55d6e..0000000000 --- a/src/controllers/dashboard/users/userpasswordpage.js +++ /dev/null @@ -1,179 +0,0 @@ -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-button/emby-button'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import confirm from '../../../components/confirm/confirm'; - -function loadUser(page, params) { - const userid = params.userId; - ApiClient.getUser(userid).then(function (user) { - Dashboard.getCurrentUser().then(function (loggedInUser) { - libraryMenu.setTitle(user.Name); - page.querySelector('.username').innerText = user.Name; - let showPasswordSection = true; - let showLocalAccessSection = false; - - if (user.ConnectLinkType == 'Guest') { - page.querySelector('.localAccessSection').classList.add('hide'); - showPasswordSection = false; - } else if (user.HasConfiguredPassword) { - page.querySelector('#btnResetPassword').classList.remove('hide'); - page.querySelector('#fldCurrentPassword').classList.remove('hide'); - showLocalAccessSection = true; - } else { - page.querySelector('#btnResetPassword').classList.add('hide'); - page.querySelector('#fldCurrentPassword').classList.add('hide'); - } - - if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.passwordSection').classList.remove('hide'); - } else { - page.querySelector('.passwordSection').classList.add('hide'); - } - - if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.localAccessSection').classList.remove('hide'); - } else { - page.querySelector('.localAccessSection').classList.add('hide'); - } - - const txtEasyPassword = page.querySelector('#txtEasyPassword'); - txtEasyPassword.value = ''; - - if (user.HasConfiguredEasyPassword) { - txtEasyPassword.placeholder = '******'; - page.querySelector('#btnResetEasyPassword').classList.remove('hide'); - } else { - txtEasyPassword.removeAttribute('placeholder'); - txtEasyPassword.placeholder = ''; - page.querySelector('#btnResetEasyPassword').classList.add('hide'); - } - - page.querySelector('.chkEnableLocalEasyPassword').checked = user.Configuration.EnableLocalPassword; - - import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { - autoFocuser.autoFocus(page); - }); - }); - }); - page.querySelector('#txtCurrentPassword').value = ''; - page.querySelector('#txtNewPassword').value = ''; - page.querySelector('#txtNewPasswordConfirm').value = ''; -} - -export default function (view, params) { - function saveEasyPassword() { - const userId = params.userId; - const easyPassword = view.querySelector('#txtEasyPassword').value; - - if (easyPassword) { - ApiClient.updateEasyPassword(userId, easyPassword).then(function () { - onEasyPasswordSaved(userId); - }); - } else { - onEasyPasswordSaved(userId); - } - } - - function onEasyPasswordSaved(userId) { - ApiClient.getUser(userId).then(function (user) { - user.Configuration.EnableLocalPassword = view.querySelector('.chkEnableLocalEasyPassword').checked; - ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () { - loading.hide(); - toast(globalize.translate('SettingsSaved')); - - loadUser(view, params); - }); - }); - } - - function savePassword() { - const userId = params.userId; - let currentPassword = view.querySelector('#txtCurrentPassword').value; - const newPassword = view.querySelector('#txtNewPassword').value; - - if (view.querySelector('#fldCurrentPassword').classList.contains('hide')) { - // Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank) - // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on - currentPassword = ''; - } - - ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () { - loading.hide(); - toast(globalize.translate('PasswordSaved')); - - loadUser(view, params); - }, function () { - loading.hide(); - Dashboard.alert({ - title: globalize.translate('HeaderLoginFailure'), - message: globalize.translate('MessageInvalidUser') - }); - }); - } - - function onSubmit(e) { - const form = this; - - if (form.querySelector('#txtNewPassword').value != form.querySelector('#txtNewPasswordConfirm').value) { - toast(globalize.translate('PasswordMatchError')); - } else { - loading.show(); - savePassword(); - } - - e.preventDefault(); - return false; - } - - function onLocalAccessSubmit(e) { - loading.show(); - saveEasyPassword(); - e.preventDefault(); - return false; - } - - function resetPassword() { - const msg = globalize.translate('PasswordResetConfirmation'); - confirm(msg, globalize.translate('ResetPassword')).then(function () { - const userId = params.userId; - loading.show(); - ApiClient.resetUserPassword(userId).then(function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('PasswordResetComplete'), - title: globalize.translate('ResetPassword') - }); - loadUser(view, params); - }); - }); - } - - function resetEasyPassword() { - const msg = globalize.translate('PinCodeResetConfirmation'); - - confirm(msg, globalize.translate('HeaderPinCodeReset')).then(function () { - const userId = params.userId; - loading.show(); - ApiClient.resetEasyPassword(userId).then(function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('PinCodeResetComplete'), - title: globalize.translate('HeaderPinCodeReset') - }); - loadUser(view, params); - }); - }); - } - - view.querySelector('.updatePasswordForm').addEventListener('submit', onSubmit); - view.querySelector('.localAccessForm').addEventListener('submit', onLocalAccessSubmit); - view.querySelector('#btnResetEasyPassword').addEventListener('click', resetEasyPassword); - view.querySelector('#btnResetPassword').addEventListener('click', resetPassword); - view.addEventListener('viewshow', function () { - loadUser(view, params); - }); -} - diff --git a/src/controllers/dashboard/users/userprofiles.html b/src/controllers/dashboard/users/userprofiles.html deleted file mode 100644 index 9e2908266b..0000000000 --- a/src/controllers/dashboard/users/userprofiles.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-
-
-
-

${HeaderUsers}

- - ${Help} -
-
-
-
-
-
diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js deleted file mode 100644 index 59d61a443f..0000000000 --- a/src/controllers/dashboard/users/userprofilespage.js +++ /dev/null @@ -1,184 +0,0 @@ -import loading from '../../../components/loading/loading'; -import dom from '../../../scripts/dom'; -import globalize from '../../../scripts/globalize'; -import { formatDistanceToNow } from 'date-fns'; -import { getLocaleWithSuffix } from '../../../utils/dateFnsLocale.ts'; -import '../../../elements/emby-button/paper-icon-button-light'; -import '../../../components/cardbuilder/card.scss'; -import '../../../elements/emby-button/emby-button'; -import '../../../components/indicators/indicators.scss'; -import '../../../styles/flexstyles.scss'; -import Dashboard, { pageIdOn } from '../../../utils/dashboard'; -import confirm from '../../../components/confirm/confirm'; -import cardBuilder from '../../../components/cardbuilder/cardBuilder'; - -function deleteUser(page, id) { - const msg = globalize.translate('DeleteUserConfirmation'); - - confirm({ - title: globalize.translate('DeleteUser'), - text: msg, - confirmText: globalize.translate('Delete'), - primary: 'delete' - }).then(function () { - loading.show(); - ApiClient.deleteUser(id).then(function () { - loadData(page); - }); - }); -} - -function showUserMenu(elem) { - const card = dom.parentWithClass(elem, 'card'); - const page = dom.parentWithClass(card, 'page'); - const userId = card.getAttribute('data-userid'); - const menuItems = []; - menuItems.push({ - name: globalize.translate('ButtonOpen'), - id: 'open', - icon: 'mode_edit' - }); - menuItems.push({ - name: globalize.translate('ButtonLibraryAccess'), - id: 'access', - icon: 'lock' - }); - menuItems.push({ - name: globalize.translate('ButtonParentalControl'), - id: 'parentalcontrol', - icon: 'person' - }); - menuItems.push({ - name: globalize.translate('Delete'), - id: 'delete', - icon: 'delete' - }); - - import('../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { - actionsheet.show({ - items: menuItems, - positionTo: card, - callback: function (id) { - switch (id) { - case 'open': - Dashboard.navigate('useredit.html?userId=' + userId); - break; - - case 'access': - Dashboard.navigate('userlibraryaccess.html?userId=' + userId); - break; - - case 'parentalcontrol': - Dashboard.navigate('userparentalcontrol.html?userId=' + userId); - break; - - case 'delete': - deleteUser(page, userId); - } - } - }); - }); -} - -function getUserHtml(user) { - let html = ''; - let cssClass = 'card squareCard scalableCard squareCard-scalable'; - - if (user.Policy.IsDisabled) { - cssClass += ' grayscale'; - } - - html += "
"; - html += '
'; - html += '
'; - html += '
'; - html += ``; - let imgUrl; - - if (user.PrimaryImageTag) { - imgUrl = ApiClient.getUserImageUrl(user.Id, { - width: 300, - tag: user.PrimaryImageTag, - type: 'Primary' - }); - } - - let imageClass = 'cardImage'; - - if (user.Policy.IsDisabled) { - imageClass += ' disabledUser'; - } - - if (imgUrl) { - html += ''; - html += '
'; - html += '
'; - html += '
'; - html += user.Name; - html += '
'; - html += ''; - html += '
'; - html += '
'; - const lastSeen = getLastSeenText(user.LastActivityDate); - html += lastSeen != '' ? lastSeen : ' '; - html += '
'; - html += '
'; - html += '
'; - return html + '
'; -} -// FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix -// how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences -function getLastSeenText(lastActivityDate) { - const localeWithSuffix = getLocaleWithSuffix(); - - if (lastActivityDate) { - return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), localeWithSuffix)); - } - - return ''; -} - -function getUserSectionHtml(users) { - return users.map(function (u__q) { - return getUserHtml(u__q); - }).join(''); -} - -function renderUsers(page, users) { - page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users); -} - -function loadData(page) { - loading.show(); - ApiClient.getUsers().then(function (users) { - renderUsers(page, users); - loading.hide(); - }); -} - -pageIdOn('pageinit', 'userProfilesPage', function () { - const page = this; - page.querySelector('.btnAddUser').addEventListener('click', function() { - Dashboard.navigate('usernew.html'); - }); - page.querySelector('.localUsers').addEventListener('click', function (e__e) { - const btnUserMenu = dom.parentWithClass(e__e.target, 'btnUserMenu'); - - if (btnUserMenu) { - showUserMenu(btnUserMenu); - } - }); -}); - -pageIdOn('pagebeforeshow', 'userProfilesPage', function () { - loadData(this); -}); - diff --git a/src/controllers/user/profile/index.html b/src/controllers/user/profile/index.html deleted file mode 100644 index 3eaa2f7299..0000000000 --- a/src/controllers/user/profile/index.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-
-
- -
-
-
-

-
- - -
-
-
-
-

- ${HeaderPassword} -

-
- -
-
- -
-
- -
-
- - -
-
-
-
-
-

${HeaderEasyPinCode}

-
${EasyPasswordHelp}
-
-
- -
-
- -
${LabelInNetworkSignInWithEasyPasswordHelp}
-
-
- - -
-
-
-
-
diff --git a/src/controllers/user/profile/index.js b/src/controllers/user/profile/index.js deleted file mode 100644 index 07bab611c3..0000000000 --- a/src/controllers/user/profile/index.js +++ /dev/null @@ -1,105 +0,0 @@ -import UserPasswordPage from '../../dashboard/users/userpasswordpage'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import { appHost } from '../../../components/apphost'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-button/emby-button'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import confirm from '../../../components/confirm/confirm'; -import { getParameterByName } from '../../../utils/url.ts'; - -function reloadUser(page) { - const userId = getParameterByName('userId'); - loading.show(); - ApiClient.getUser(userId).then(function (user) { - page.querySelector('.username').innerText = user.Name; - libraryMenu.setTitle(user.Name); - - let imageUrl = 'assets/img/avatar.png'; - if (user.PrimaryImageTag) { - imageUrl = ApiClient.getUserImageUrl(user.Id, { - tag: user.PrimaryImageTag, - type: 'Primary' - }); - } - - const userImage = page.querySelector('#image'); - userImage.style.backgroundImage = 'url(' + imageUrl + ')'; - - Dashboard.getCurrentUser().then(function (loggedInUser) { - if (user.PrimaryImageTag) { - page.querySelector('#btnAddImage').classList.add('hide'); - page.querySelector('#btnDeleteImage').classList.remove('hide'); - } else if (appHost.supports('fileinput') && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('#btnDeleteImage').classList.add('hide'); - page.querySelector('#btnAddImage').classList.remove('hide'); - } - }); - loading.hide(); - }); -} - -function onFileReaderError(evt) { - loading.hide(); - switch (evt.target.error.code) { - case evt.target.error.NOT_FOUND_ERR: - toast(globalize.translate('FileNotFound')); - break; - case evt.target.error.ABORT_ERR: - onFileReaderAbort(); - break; - case evt.target.error.NOT_READABLE_ERR: - default: - toast(globalize.translate('FileReadError')); - } -} - -function onFileReaderAbort() { - loading.hide(); - toast(globalize.translate('FileReadCancelled')); -} - -function setFiles(page, files) { - const userImage = page.querySelector('#image'); - const file = files[0]; - - if (!file || !file.type.match('image.*')) { - return false; - } - - const reader = new FileReader(); - reader.onerror = onFileReaderError; - reader.onabort = onFileReaderAbort; - reader.onload = function (evt) { - userImage.style.backgroundImage = 'url(' + evt.target.result + ')'; - const userId = getParameterByName('userId'); - ApiClient.uploadUserImage(userId, 'Primary', file).then(function () { - loading.hide(); - reloadUser(page); - }); - }; - - reader.readAsDataURL(file); -} - -export default function (view, params) { - reloadUser(view); - new UserPasswordPage(view, params); - view.querySelector('#btnDeleteImage').addEventListener('click', function () { - confirm(globalize.translate('DeleteImageConfirmation'), globalize.translate('DeleteImage')).then(function () { - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.deleteUserImage(userId, 'primary').then(function () { - loading.hide(); - reloadUser(view); - }); - }); - }); - view.querySelector('#btnAddImage').addEventListener('click', function () { - view.querySelector('#uploadImage').click(); - }); - view.querySelector('#uploadImage').addEventListener('change', function (evt) { - setFiles(view, evt.target.files); - }); -} From c4f5f188128bb912d441370c278d6204a2d436c5 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 09:52:08 -0400 Subject: [PATCH 076/147] Add support for absolute imports --- .eslintrc.js | 20 ++++++++++++++------ tsconfig.json | 1 + webpack.common.js | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 03e06eb499..86ec12b0d0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -88,15 +88,23 @@ module.exports = { react: { version: 'detect' }, - 'import/extensions': [ - '.js', - '.ts', - '.jsx', - '.tsx' - ], 'import/parsers': { '@typescript-eslint/parser': [ '.ts', '.tsx' ] }, + 'import/resolver': { + node: { + extensions: [ + '.js', + '.ts', + '.jsx', + '.tsx' + ], + moduleDirectory: [ + 'node_modules', + 'src' + ] + } + }, polyfills: [ // Native Promises Only 'Promise', diff --git a/tsconfig.json b/tsconfig.json index a67dd148ed..d3541c6df1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl": "src", "target": "ES5", "lib": ["DOM", "DOM.Iterable", "ES2015"], "allowJs": true, diff --git a/webpack.common.js b/webpack.common.js index 57d3cc6fdc..7d08ca06c3 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -31,6 +31,7 @@ const config = { resolve: { extensions: ['.tsx', '.ts', '.js'], modules: [ + path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules') ] }, From 81a2d878ca9f156f221747b1ad1904c628e6fbc4 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 2 May 2023 18:43:53 +0300 Subject: [PATCH 077/147] Fix query selector target Cherry-picked from: https://github.com/jellyfin/jellyfin-web/commit/1fb5c4d95d4607ed33b00be2d8cee1ae35d5631b --- src/controllers/playback/video/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 745170f5fc..93da237ec0 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -539,11 +539,11 @@ export default function (view) { } function onBeginFetch() { - document.querySelector('.osdMediaStatus').classList.remove('hide'); + view.querySelector('.osdMediaStatus').classList.remove('hide'); } function onEndFetch() { - document.querySelector('.osdMediaStatus').classList.add('hide'); + view.querySelector('.osdMediaStatus').classList.add('hide'); } function bindToPlayer(player) { @@ -1437,7 +1437,7 @@ export default function (view) { const btnFastForward = view.querySelector('.btnFastForward'); const transitionEndEventName = dom.whichTransitionEvent(); const headerElement = document.querySelector('.skinHeader'); - const osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols'); + const osdBottomElement = view.querySelector('.videoOsdBottom-maincontrols'); nowPlayingPositionSlider.enableKeyboardDragging(); nowPlayingVolumeSlider.enableKeyboardDragging(); From df5798700231e9c13047f94ad2e4014ece411649 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 22:33:34 +0000 Subject: [PATCH 078/147] Update dependency @types/react-dom to v17.0.20 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20807c8044..c17e7bdba8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", - "@types/react-dom": "17.0.19", + "@types/react-dom": "17.0.20", "@typescript-eslint/eslint-plugin": "5.59.1", "@typescript-eslint/parser": "5.59.1", "@uupaa/dynamic-import-polyfill": "1.0.2", @@ -3259,9 +3259,9 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", + "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", "dev": true, "dependencies": { "@types/react": "^17" @@ -22206,9 +22206,9 @@ } }, "@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", + "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", "dev": true, "requires": { "@types/react": "^17" diff --git a/package.json b/package.json index 5aca9baac6..8ed1ac292b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", - "@types/react-dom": "17.0.19", + "@types/react-dom": "17.0.20", "@typescript-eslint/eslint-plugin": "5.59.1", "@typescript-eslint/parser": "5.59.1", "@uupaa/dynamic-import-polyfill": "1.0.2", From f6f6c3fb9604be36b549322467a56e649bc6cea6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 01:56:57 +0000 Subject: [PATCH 079/147] Update dependency sass to v1.62.1 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20807c8044..ab04200018 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", - "sass": "1.62.0", + "sass": "1.62.1", "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", @@ -14270,9 +14270,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", - "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -30331,9 +30331,9 @@ "dev": true }, "sass": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", - "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 5aca9baac6..6c3e6e18ad 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "postcss-loader": "7.2.4", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", - "sass": "1.62.0", + "sass": "1.62.1", "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", From daddde7acd08860692871d0f46127d2adc77a8f1 Mon Sep 17 00:00:00 2001 From: shape93 Date: Wed, 3 May 2023 08:14:04 +0000 Subject: [PATCH 080/147] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/strings/it.json b/src/strings/it.json index 6ee3510585..d3aec5a30d 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1407,7 +1407,7 @@ "TonemappingRangeHelp": "Seleziona l'intervallo di colore in uscita. Auto imposta lo stesso del valore di entrata.", "LabelTonemappingRange": "Intervallo mappatura dei toni", "TonemappingAlgorithmHelp": "La mappatura dei toni può essere messa a punto. Se non sei abbastanza familiare con queste opzioni, lascia quelle predefinite. Il valore raccomandato è 'BT.2390'.", - "AllowTonemappingHelp": "La mappatura dei toni può trasformare l'intervallo dinamico di un video da HDR a SDR mantenendo il dettaglio e i colori dell'immagine, che sono informazioni molto importanti per rappresentare la scena originale. Attualmente funziona solo con video HDR10 o HLG. Richiede le corrispondenti librerie OpenCL o CUDA.", + "AllowTonemappingHelp": "La mappatura dei toni può trasformare l'intervallo dinamico di un video da HDR a SDR mantenendo il dettaglio e i colori dell'immagine, che sono informazioni molto importanti per rappresentare la scena originale. Attualmente funziona solo con video HDR10, HLG e DoVi. Richiede le corrispondenti librerie OpenCL o CUDA.", "LabelOpenclDeviceHelp": "Questo è il dispositivo OpenCL utilizzato per la mappatura dei toni. Il lato sinistro del punto è il numero di piattaforma, mentre la parte destra è il numero del dispositivo sulla piattaforma. Il valore base è 0.0. Il file di applicazione FFmpeg contenente il metodo di accelerazione hardware OpenCL è richiesto.", "LabelColorPrimaries": "Primari colore", "LabelColorTransfer": "Trasferimento colore", @@ -1666,8 +1666,8 @@ "MediaInfoVideoRangeType": "Tipo range del video", "LabelVideoRangeType": "Tipo range del video", "VideoRangeTypeNotSupported": "Tipo range del video non supportato", - "LabelVppTonemappingBrightnessHelp": "Applica un guadagno luminosità nella mappatura toni VPP. Il valore consigliato e predefinito è 0.", - "LabelVppTonemappingContrastHelp": "Applica un guadagno al contrasto nella mappatura toni VPP. Il valore consigliato è 1.2 e quello predefinito è 1.", + "LabelVppTonemappingBrightnessHelp": "Applica un guadagno luminosità nella mappatura toni VPP. I valori consigliati e predefiniti sono 16 e 0.", + "LabelVppTonemappingContrastHelp": "Applica un guadagno al contrasto nella mappatura toni VPP. Il valore consigliato e predefinito è 1.", "LabelVppTonemappingContrast": "Guadagno contrasto della mappatura toni VPP", "LabelVppTonemappingBrightness": "Guadagno luminosità della mappatura toni VPP", "ScreenResolution": "Risoluzione schermo", @@ -1706,5 +1706,23 @@ "LabelDummyChapterDurationHelp": "Intervallo in secondi tra le estrazioni delle immagini in capitoli.", "LabelDummyChapterCountHelp": "Numero massimo di capitoli da estrarre per ciascun file.", "LabelChapterImageResolutionHelp": "Risoluzione delle immagini per l'estrazione", - "HeaderDummyChapter": "Immagini Capitolo" + "HeaderDummyChapter": "Immagini Capitolo", + "SaveRecordingNFO": "Salva i metadati EPG in NFO", + "HeaderRecordingMetadataSaving": "Registrazione Metadati", + "SaveRecordingNFOHelp": "Salva i metadati dal fornitore di elenchi EPG insieme ai media.", + "SaveRecordingImages": "Salva le immagini EPG delle registrazioni", + "SecondarySubtitles": "Sottotitoli Secondari", + "Featurette": "Featurette", + "Select": "Seleziona", + "Short": "Corto", + "TonemappingModeHelp": "Seleziona la modalità di mappatura dei toni. Se riscontri colori poco fedeli, prova a passare alla modalità RGB.", + "LabelTonemappingMode": "Modalità di mappatura dei toni", + "ResolutionMatchSource": "Abbina alla sorgente", + "LabelEnableAudioVbr": "Abilita codifica audio VBR", + "LabelEnableAudioVbrHelp": "Il bitrate variabile offre una migliore qualità rispetto al rapporto bitrate medio, ma in alcuni rari casi può causare problemi di buffering e compatibilità.", + "LabelParallelImageEncodingLimit": "Limite codifica parallela delle immagini", + "LabelParallelImageEncodingLimitHelp": "Numero massimo di codifiche di immagini che possono essere eseguite in parallelo. Impostandolo su 0 sceglierai un limite basato sulle specifiche del tuo sistema.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Preferisci i titoli incorporati ai nomi dei file per gli extra", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Gli extra hanno spesso lo stesso nome incorporato del parent, controlla questo per usare comunque titoli incorporati per loro.", + "SaveRecordingImagesHelp": "Salva le immagini dal fornitore di elenchi EPG insieme ai media." } From 7dff81ef68e7153d518f290b4d8d04d00ad1ac3f Mon Sep 17 00:00:00 2001 From: Marcinbar Date: Thu, 4 May 2023 08:11:15 +0000 Subject: [PATCH 081/147] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index 83f2375699..f02ab5eefd 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1396,7 +1396,7 @@ "HeaderAddUser": "Dodaj użytkownika", "HeaderAddUpdateSubtitle": "Dodaj/Zaktualizuj napisy", "EnableTonemapping": "Włącz Tone mapping", - "AllowTonemappingHelp": "Mapowanie tonalne może przekształcić zakres dynamiczny wideo z HDR na SDR, zachowując jednocześnie szczegóły obrazu i kolory, które są bardzo ważnymi informacjami dla odwzorowania oryginalnej sceny. Obecnie działa tylko z filmami HDR10 lub HLG. Wymaga to odpowiedniego środowiska uruchomieniowego OpenCL lub CUDA.", + "AllowTonemappingHelp": "Mapowanie tonalne może przekształcić zakres dynamiczny wideo z HDR na SDR, zachowując jednocześnie szczegóły obrazu i kolory, które są bardzo ważnymi informacjami dla odwzorowania oryginalnej sceny. Obecnie działa tylko z filmami 10bit HDR10, HLG i DoVi. Wymaga to odpowiedniego środowiska uruchomieniowego OpenCL lub CUDA.", "TonemappingAlgorithmHelp": "Mapowanie tonów może zostać dostrojone. Jeśli nie znasz tych opcji, pozostaw domyślne wartości. Domyślna wartość to 'BT.2390'.", "PreferFmp4HlsContainerHelp": "Preferuj fMP4 jako domyślny format dla HLS, pozwalając na bezpośrednie odtwarzanie zawartości HEVC na wspieranych urządzeniach.", "PreferFmp4HlsContainer": "Preferuj format fMP4-HLS", From 2584de5efae6e6db28182293ef02b91978d7efbe Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 10:58:11 -0400 Subject: [PATCH 082/147] Make cognitive complexity an error for ts files --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 03e06eb499..6ccaca73f0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -257,7 +257,7 @@ module.exports = { 'plugin:jsx-a11y/recommended' ], rules: { - 'sonarjs/cognitive-complexity': ['warn'] + 'sonarjs/cognitive-complexity': ['error'] } } ] From ef719c45f44220b42031b6f5f2606dbc3ce0e0af Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 11:00:48 -0400 Subject: [PATCH 083/147] Add prefer for-of eslint rule --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index 6ccaca73f0..36e895e510 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -67,6 +67,7 @@ module.exports = { 'operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }], 'padded-blocks': ['error', 'never'], 'prefer-const': ['error', { 'destructuring': 'all' }], + '@typescript-eslint/prefer-for-of': ['error'], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'radix': ['error'], '@typescript-eslint/semi': ['error'], From 1b03cd79eb78507f790646028601255af619bbdc Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 11:27:15 -0400 Subject: [PATCH 084/147] Fix prefer for-of errors --- .../libraryoptionseditor.js | 30 +++++++------------ .../metadataEditor/metadataEditor.js | 3 +- src/components/playback/playbackmanager.js | 8 ++--- .../dashboard/plugins/add/index.js | 3 +- .../dashboard/plugins/available/index.js | 3 +- .../scheduledtasks/scheduledtasks.js | 3 +- src/controllers/session/login/index.js | 4 +-- src/elements/emby-textarea/emby-textarea.js | 4 +-- src/scripts/autocast.js | 6 ++-- src/scripts/browser.js | 4 +-- src/scripts/libraryMenu.js | 5 +--- 11 files changed, 26 insertions(+), 47 deletions(-) diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 0b0f66b61e..6785dafe1f 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -23,8 +23,7 @@ function populateLanguages(parent) { function populateLanguagesIntoSelect(select, languages) { let html = ''; html += ""; - for (let i = 0; i < languages.length; i++) { - const culture = languages[i]; + for (const culture of languages) { html += ``; } select.innerHTML = html; @@ -32,8 +31,7 @@ function populateLanguagesIntoSelect(select, languages) { function populateLanguagesIntoList(element, languages) { let html = ''; - for (let i = 0; i < languages.length; i++) { - const culture = languages[i]; + for (const culture of languages) { html += ``; } element.innerHTML = html; @@ -43,8 +41,7 @@ function populateCountries(select) { return ApiClient.getCountries().then(allCountries => { let html = ''; html += ""; - for (let i = 0; i < allCountries.length; i++) { - const culture = allCountries[i]; + for (const culture of allCountries) { html += ``; } select.innerHTML = html; @@ -109,8 +106,7 @@ function renderMetadataSavers(page, metadataSavers) { } html += `

${globalize.translate('LabelMetadataSavers')}

`; html += '
'; - for (let i = 0; i < metadataSavers.length; i++) { - const plugin = metadataSavers[i]; + for (const plugin of metadataSavers) { html += ``; } html += '
'; @@ -157,8 +153,7 @@ function getMetadataFetchersForTypeHtml(availableTypeOptions, libraryOptionsForT function getTypeOptions(allOptions, type) { const allTypeOptions = allOptions.TypeOptions || []; - for (let i = 0; i < allTypeOptions.length; i++) { - const typeOptions = allTypeOptions[i]; + for (const typeOptions of allTypeOptions) { if (typeOptions.Type === type) return typeOptions; } return null; @@ -167,8 +162,7 @@ function getTypeOptions(allOptions, type) { function renderMetadataFetchers(page, availableOptions, libraryOptions) { let html = ''; const elem = page.querySelector('.metadataFetchers'); - for (let i = 0; i < availableOptions.TypeOptions.length; i++) { - const availableTypeOptions = availableOptions.TypeOptions[i]; + for (const availableTypeOptions of availableOptions.TypeOptions) { html += getMetadataFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } elem.innerHTML = html; @@ -262,8 +256,7 @@ function getImageFetchersForTypeHtml(availableTypeOptions, libraryOptionsForType function renderImageFetchers(page, availableOptions, libraryOptions) { let html = ''; const elem = page.querySelector('.imageFetchers'); - for (let i = 0; i < availableOptions.TypeOptions.length; i++) { - const availableTypeOptions = availableOptions.TypeOptions[i]; + for (const availableTypeOptions of availableOptions.TypeOptions) { html += getImageFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } elem.innerHTML = html; @@ -454,8 +447,7 @@ function setSubtitleFetchersIntoOptions(parent, options) { function setMetadataFetchersIntoOptions(parent, options) { const sections = parent.querySelectorAll('.metadataFetcher'); - for (let i = 0; i < sections.length; i++) { - const section = sections[i]; + for (const section of sections) { const type = section.getAttribute('data-type'); let typeOptions = getTypeOptions(options, type); if (!typeOptions) { @@ -478,8 +470,7 @@ function setMetadataFetchersIntoOptions(parent, options) { function setImageFetchersIntoOptions(parent, options) { const sections = parent.querySelectorAll('.imageFetcher'); - for (let i = 0; i < sections.length; i++) { - const section = sections[i]; + for (const section of sections) { const type = section.getAttribute('data-type'); let typeOptions = getTypeOptions(options, type); if (!typeOptions) { @@ -503,8 +494,7 @@ function setImageFetchersIntoOptions(parent, options) { function setImageOptionsIntoOptions(options) { const originalTypeOptions = (currentLibraryOptions || {}).TypeOptions || []; - for (let i = 0; i < originalTypeOptions.length; i++) { - const originalTypeOption = originalTypeOptions[i]; + for (const originalTypeOption of originalTypeOptions) { let typeOptions = getTypeOptions(options, originalTypeOption.Type); if (!typeOptions) { diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 422f3c964d..dfe7a99237 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -955,8 +955,7 @@ function populatePeople(context, people) { function getLockedFieldsHtml(fields, currentFields) { let html = ''; - for (let i = 0; i < fields.length; i++) { - const field = fields[i]; + for (const field of fields) { const name = field.name; const value = field.value || field.name; const checkedHtml = currentFields.indexOf(value) === -1 ? ' checked' : ''; diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 392c6ceafb..879b5fe36f 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -853,11 +853,9 @@ class PlaybackManager { user: user }); - for (let i = 0; i < responses.length; i++) { - const subTargets = responses[i]; - - for (let j = 0; j < subTargets.length; j++) { - targets.push(subTargets[j]); + for (const subTargets of responses) { + for (const subTarget of subTargets) { + targets.push(subTarget); } } diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js index 150fe3e1fd..62ae70ab4f 100644 --- a/src/controllers/dashboard/plugins/add/index.js +++ b/src/controllers/dashboard/plugins/add/index.js @@ -28,8 +28,7 @@ function populateVersions(packageInfo, page, installedPlugin) { return b.timestamp < a.timestamp ? -1 : 1; }); - for (let i = 0; i < packageInfo.versions.length; i++) { - const version = packageInfo.versions[i]; + for (const version of packageInfo.versions) { html += ''; } diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js index 4dc172450f..78368b2c14 100644 --- a/src/controllers/dashboard/plugins/available/index.js +++ b/src/controllers/dashboard/plugins/available/index.js @@ -66,8 +66,7 @@ function populateList(options) { let currentCategory = null; let html = ''; - for (let i = 0; i < availablePlugins.length; i++) { - const plugin = availablePlugins[i]; + for (const plugin of availablePlugins) { const category = plugin.categoryDisplayName; if (category != currentCategory) { if (currentCategory) { diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index c074331aa1..8ae447aabc 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -133,8 +133,7 @@ function updateTaskButton(elem, state) { export default function(view) { function updateTasks(tasks) { - for (let i = 0; i < tasks.length; i++) { - const task = tasks[i]; + for (const task of tasks) { view.querySelector('#taskProgress' + task.Id).innerHTML = getTaskProgressHtml(task); updateTaskButton(view.querySelector('#btnTask' + task.Id), task.State); } diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 0f2d18580c..6e75af6f08 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -135,9 +135,7 @@ function showManualForm(context, showCancel, focusPassword) { function loadUserList(context, apiClient, users) { let html = ''; - for (let i = 0; i < users.length; i++) { - const user = users[i]; - + for (const user of users) { // TODO move card creation code to Card component let cssClass = 'card squareCard scalableCard squareCard-scalable'; diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index 4acf38b594..04ce1a42d9 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -13,8 +13,8 @@ function calculateOffset(textarea) { const props = ['paddingTop', 'paddingBottom']; let offset = 0; - for (let i = 0; i < props.length; i++) { - offset += parseInt(style[props[i]], 10); + for (const prop of props) { + offset += parseInt(style[prop], 10); } return offset; } diff --git a/src/scripts/autocast.js b/src/scripts/autocast.js index a118022513..854403b4da 100644 --- a/src/scripts/autocast.js +++ b/src/scripts/autocast.js @@ -33,9 +33,9 @@ function onOpen() { const playerId = localStorage.getItem('autocastPlayerId'); playbackManager.getTargets().then(function (targets) { - for (let i = 0; i < targets.length; i++) { - if (targets[i].id == playerId) { - playbackManager.trySetActivePlayer(targets[i].playerName, targets[i]); + for (const target of targets) { + if (target.id == playerId) { + playbackManager.trySetActivePlayer(target.playerName, target); break; } } diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 7540d0c684..47b0635d52 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -167,8 +167,8 @@ function supportsCssAnimation(allowPrefix) { } if (animation === false && allowPrefix) { - for (let i = 0; i < domPrefixes.length; i++) { - if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) { + for (const domPrefix of domPrefixes) { + if (elm.style[domPrefix + 'AnimationName'] !== undefined) { animation = true; break; } diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 0a8ba07831..ec7f26a0b2 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -591,13 +591,10 @@ function getToolsLinkHtml(item) { function getToolsMenuHtml(apiClient) { return getToolsMenuLinks(apiClient).then(function (items) { - let item; let menuHtml = ''; menuHtml += '
'; - for (let i = 0; i < items.length; i++) { - item = items[i]; - + for (const item of items) { if (item.href) { menuHtml += getToolsLinkHtml(item); } else if (item.name) { From c981b47468709a923da96c5a946d989a6c903bb6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 May 2023 18:56:04 +0000 Subject: [PATCH 085/147] Update github/codeql-action action to v2.3.3 --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 240f558cfb..696c591aa5 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,11 +21,11 @@ jobs: - name: Checkout repository uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Initialize CodeQL - uses: github/codeql-action/init@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 + uses: github/codeql-action/init@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2.3.3 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 + uses: github/codeql-action/autobuild@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2.3.3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f3feb00acb00f31a6f60280e6ace9ca31d91c76a # v2.3.2 + uses: github/codeql-action/analyze@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2.3.3 From aaac4883e38b2f200c78ba0aedbfa63a6b13f523 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 11:24:36 -0400 Subject: [PATCH 086/147] Add floating promises eslint rule --- .eslintrc.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.eslintrc.js b/.eslintrc.js index 36e895e510..aad915afde 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -203,6 +203,9 @@ module.exports = { './src/**/*.ts', './src/**/*.tsx' ], + parserOptions: { + project: ['./tsconfig.json'] + }, env: { node: false, amd: true, @@ -240,6 +243,9 @@ module.exports = { 'TaskButton': 'writable', 'UserParentalControlPage': 'writable', 'Windows': 'readonly' + }, + rules: { + '@typescript-eslint/no-floating-promises': ['error'] } }, // TypeScript source files From eedd40159c754782eb50b5ce5d4d2a0e390af62e Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 11:24:53 -0400 Subject: [PATCH 087/147] Fix floating promises in ts files --- src/apps/experimental/routes/home.tsx | 2 + .../experimental/routes/movies/GenresView.tsx | 2 + .../routes/movies/SuggestionsView.tsx | 8 +++ src/apps/experimental/routes/movies/index.tsx | 2 + src/apps/stable/routes/user/useredit.tsx | 32 +++++++++--- .../stable/routes/user/userlibraryaccess.tsx | 6 +++ src/apps/stable/routes/user/usernew.tsx | 9 +++- .../routes/user/userparentalcontrol.tsx | 14 +++++ src/apps/stable/routes/user/userpassword.tsx | 2 + src/apps/stable/routes/user/userprofile.tsx | 10 ++++ src/apps/stable/routes/user/userprofiles.tsx | 30 +++++++++-- src/components/ConnectionRequired.tsx | 25 +++++++-- src/components/common/Filter.tsx | 4 ++ .../common/GenresItemsContainer.tsx | 2 + src/components/common/NewCollection.tsx | 4 ++ src/components/common/SelectView.tsx | 4 ++ src/components/common/Shuffle.tsx | 2 + src/components/common/Sort.tsx | 4 ++ src/components/common/ViewItemsContainer.tsx | 4 ++ .../dashboard/users/UserPasswordForm.tsx | 36 +++++++++++-- src/components/search/LiveTVSearchResults.tsx | 27 +++++++--- src/components/search/SearchResults.tsx | 51 +++++++++++++------ src/components/search/SearchSuggestions.tsx | 6 ++- src/elements/emby-button/LinkButton.tsx | 5 +- src/utils/dashboard.js | 6 +++ 25 files changed, 250 insertions(+), 47 deletions(-) diff --git a/src/apps/experimental/routes/home.tsx b/src/apps/experimental/routes/home.tsx index 0b0e38f3b2..af14e252e1 100644 --- a/src/apps/experimental/routes/home.tsx +++ b/src/apps/experimental/routes/home.tsx @@ -101,6 +101,8 @@ const Home: FunctionComponent = () => { controller.refreshed = true; tabController.current = controller; + }).catch(err => { + console.error('[Home] failed to get tab controller', err); }); }, [ getTabController ]); diff --git a/src/apps/experimental/routes/movies/GenresView.tsx b/src/apps/experimental/routes/movies/GenresView.tsx index a2c1d7a476..dd1af9efc9 100644 --- a/src/apps/experimental/routes/movies/GenresView.tsx +++ b/src/apps/experimental/routes/movies/GenresView.tsx @@ -23,6 +23,8 @@ const GenresView: FC = ({ topParentId }) => { ).then((result) => { setItemsResult(result); loading.hide(); + }).catch(err => { + console.error('[GenresView] failed to fetch genres', err); }); }, [topParentId]); diff --git a/src/apps/experimental/routes/movies/SuggestionsView.tsx b/src/apps/experimental/routes/movies/SuggestionsView.tsx index 48b402efbc..1d468d009b 100644 --- a/src/apps/experimental/routes/movies/SuggestionsView.tsx +++ b/src/apps/experimental/routes/movies/SuggestionsView.tsx @@ -30,6 +30,8 @@ const SuggestionsView: FC = ({ topParentId }) => { const autoFocus = useCallback((page) => { import('../../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); + }).catch(err => { + console.error('[SuggestionsView] failed to load data', err); }); }, []); @@ -55,6 +57,8 @@ const SuggestionsView: FC = ({ topParentId }) => { loading.hide(); autoFocus(page); + }).catch(err => { + console.error('[SuggestionsView] failed to fetch items', err); }); }, [autoFocus]); @@ -72,6 +76,8 @@ const SuggestionsView: FC = ({ topParentId }) => { setLatestItems(items); autoFocus(page); + }).catch(err => { + console.error('[SuggestionsView] failed to fetch latest items', err); }); }, [autoFocus]); @@ -95,6 +101,8 @@ const SuggestionsView: FC = ({ topParentId }) => { setRecommendations(result); autoFocus(page); + }).catch(err => { + console.error('[SuggestionsView] failed to fetch recommendations', err); }); }, [autoFocus]); diff --git a/src/apps/experimental/routes/movies/index.tsx b/src/apps/experimental/routes/movies/index.tsx index e2e7bfa4de..64f66368c8 100644 --- a/src/apps/experimental/routes/movies/index.tsx +++ b/src/apps/experimental/routes/movies/index.tsx @@ -114,6 +114,8 @@ const Movies: FC = () => { window.ApiClient.getItem(window.ApiClient.getCurrentUserId(), parentId).then((item) => { page.setAttribute('data-title', item.Name as string); libraryMenu.setTitle(item.Name); + }).catch(err => { + console.error('[movies] failed to fetch library', err); }); } else { page.setAttribute('data-title', globalize.translate('Movies')); diff --git a/src/apps/stable/routes/user/useredit.tsx b/src/apps/stable/routes/user/useredit.tsx index f099ee6407..c4acdfaaee 100644 --- a/src/apps/stable/routes/user/useredit.tsx +++ b/src/apps/stable/routes/user/useredit.tsx @@ -32,7 +32,10 @@ const getCheckedElementDataIds = (elements: NodeListOf) => ( ); function onSaveComplete() { - Dashboard.navigate('userprofiles.html'); + Dashboard.navigate('userprofiles.html') + .catch(err => { + console.error('[useredit] failed to navigate to user profile', err); + }); loading.hide(); toast(globalize.translate('SettingsSaved')); } @@ -133,6 +136,8 @@ const UserEdit: FunctionComponent = () => { const chkEnableDeleteAllFolders = page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement; chkEnableDeleteAllFolders.checked = user.Policy.EnableContentDeletion; triggerChange(chkEnableDeleteAllFolders); + }).catch(err => { + console.error('[useredit] failed to fetch channels', err); }); }, []); @@ -146,14 +151,20 @@ const UserEdit: FunctionComponent = () => { window.ApiClient.getJSON(window.ApiClient.getUrl('Auth/Providers')).then(function (providers) { loadAuthProviders(user, providers); + }).catch(err => { + console.error('[useredit] failed to fetch auth providers', err); }); window.ApiClient.getJSON(window.ApiClient.getUrl('Auth/PasswordResetProviders')).then(function (providers) { loadPasswordResetProviders(user, providers); + }).catch(err => { + console.error('[useredit] failed to fetch password reset providers', err); }); window.ApiClient.getJSON(window.ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })).then(function (folders) { loadDeleteFolders(user, folders.Items); + }).catch(err => { + console.error('[useredit] failed to fetch media folders', err); }); const disabledUserBanner = page.querySelector('.disabledUserBanner') as HTMLDivElement; @@ -197,6 +208,8 @@ const UserEdit: FunctionComponent = () => { loading.show(); getUser().then(function (user) { loadUser(user); + }).catch(err => { + console.error('[useredit] failed to load data', err); }); }, [loadUser]); @@ -240,18 +253,21 @@ const UserEdit: FunctionComponent = () => { user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : getCheckedElementDataIds(page.querySelectorAll('.chkFolder')); user.Policy.SyncPlayAccess = (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value as SyncPlayUserAccessType; - window.ApiClient.updateUser(user) - .then(() => ( - window.ApiClient.updateUserPolicy(user.Id || '', user.Policy || {}) - )).then(() => { - onSaveComplete(); - }); + window.ApiClient.updateUser(user).then(() => ( + window.ApiClient.updateUserPolicy(user.Id || '', user.Policy || {}) + )).then(() => { + onSaveComplete(); + }).catch(err => { + console.error('[useredit] failed to update user', err); + }); }; const onSubmit = (e: Event) => { loading.show(); getUser().then(function (result) { saveUser(result); + }).catch(err => { + console.error('[useredit] failed to fetch user', err); }); e.preventDefault(); e.stopPropagation(); @@ -264,6 +280,8 @@ const UserEdit: FunctionComponent = () => { window.ApiClient.getNamedConfiguration('network').then(function (config) { (page.querySelector('.fldRemoteAccess') as HTMLDivElement).classList.toggle('hide', !config.EnableRemoteAccess); + }).catch(err => { + console.error('[useredit] failed to load network config', err); }); (page.querySelector('.editUserProfileForm') as HTMLFormElement).addEventListener('submit', onSubmit); diff --git a/src/apps/stable/routes/user/userlibraryaccess.tsx b/src/apps/stable/routes/user/userlibraryaccess.tsx index e255376104..e9af88cb1f 100644 --- a/src/apps/stable/routes/user/userlibraryaccess.tsx +++ b/src/apps/stable/routes/user/userlibraryaccess.tsx @@ -148,6 +148,8 @@ const UserLibraryAccess: FunctionComponent = () => { const promise4 = window.ApiClient.getJSON(window.ApiClient.getUrl('Devices')); Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { loadUser(responses[0], responses[1].Items, responses[2].Items, responses[3].Items); + }).catch(err => { + console.error('[userlibraryaccess] failed to load data', err); }); }, [loadUser]); @@ -166,6 +168,8 @@ const UserLibraryAccess: FunctionComponent = () => { const userId = getParameterByName('userId'); window.ApiClient.getUser(userId).then(function (result) { saveUser(result); + }).catch(err => { + console.error('[userlibraryaccess] failed to fetch user', err); }); e.preventDefault(); e.stopPropagation(); @@ -203,6 +207,8 @@ const UserLibraryAccess: FunctionComponent = () => { user.Policy.BlockedMediaFolders = null; window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { onSaveComplete(); + }).catch(err => { + console.error('[userlibraryaccess] failed to update user policy', err); }); }; diff --git a/src/apps/stable/routes/user/usernew.tsx b/src/apps/stable/routes/user/usernew.tsx index 051bbce9b7..22758500ea 100644 --- a/src/apps/stable/routes/user/usernew.tsx +++ b/src/apps/stable/routes/user/usernew.tsx @@ -93,6 +93,8 @@ const UserNew: FunctionComponent = () => { loadMediaFolders(responses[0].Items); loadChannels(responses[1].Items); loading.hide(); + }).catch(err => { + console.error('[usernew] failed to load data', err); }); }, [loadChannels, loadMediaFolders]); @@ -138,7 +140,12 @@ const UserNew: FunctionComponent = () => { } window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - Dashboard.navigate('useredit.html?userId=' + user.Id); + Dashboard.navigate('useredit.html?userId=' + user.Id) + .catch(err => { + console.error('[usernew] failed to navigate to edit user page', err); + }); + }).catch(err => { + console.error('[usernew] failed to update user policy', err); }); }, function () { toast(globalize.translate('ErrorDefault')); diff --git a/src/apps/stable/routes/user/userparentalcontrol.tsx b/src/apps/stable/routes/user/userparentalcontrol.tsx index ce02ba0f33..bee0fde1c7 100644 --- a/src/apps/stable/routes/user/userparentalcontrol.tsx +++ b/src/apps/stable/routes/user/userparentalcontrol.tsx @@ -197,6 +197,8 @@ const UserParentalControl: FunctionComponent = () => { const promise2 = window.ApiClient.getParentalRatings(); Promise.all([promise1, promise2]).then(function (responses) { loadUser(responses[0], responses[1]); + }).catch(err => { + console.error('[userparentalcontrol] failed to load data', err); }); }, [loadUser]); @@ -231,6 +233,8 @@ const UserParentalControl: FunctionComponent = () => { user.Policy.BlockedTags = getBlockedTagsFromPage(); window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { onSaveComplete(); + }).catch(err => { + console.error('[userparentalcontrol] failed to update user policy', err); }); }; @@ -248,7 +252,11 @@ const UserParentalControl: FunctionComponent = () => { schedules[index] = updatedSchedule; renderAccessSchedule(schedules); + }).catch(() => { + // access schedule closed }); + }).catch(err => { + console.error('[userparentalcontrol] failed to load access schedule', err); }); }; @@ -279,7 +287,11 @@ const UserParentalControl: FunctionComponent = () => { tags.push(value); loadBlockedTags(tags); } + }).catch(() => { + // prompt closed }); + }).catch(err => { + console.error('[userparentalcontrol] failed to load prompt', err); }); }; @@ -288,6 +300,8 @@ const UserParentalControl: FunctionComponent = () => { const userId = getParameterByName('userId'); window.ApiClient.getUser(userId).then(function (result) { saveUser(result); + }).catch(err => { + console.error('[userparentalcontrol] failed to fetch user', err); }); e.preventDefault(); e.stopPropagation(); diff --git a/src/apps/stable/routes/user/userpassword.tsx b/src/apps/stable/routes/user/userpassword.tsx index 3a518d6379..544e8c6dec 100644 --- a/src/apps/stable/routes/user/userpassword.tsx +++ b/src/apps/stable/routes/user/userpassword.tsx @@ -19,6 +19,8 @@ const UserPassword: FunctionComponent = () => { } setUserName(user.Name); loading.hide(); + }).catch(err => { + console.error('[userpassword] failed to fetch user', err); }); }, [userId]); useEffect(() => { diff --git a/src/apps/stable/routes/user/userprofile.tsx b/src/apps/stable/routes/user/userprofile.tsx index 7b1575d2c1..0c038bc84a 100644 --- a/src/apps/stable/routes/user/userprofile.tsx +++ b/src/apps/stable/routes/user/userprofile.tsx @@ -59,8 +59,12 @@ const UserProfile: FunctionComponent = () => { (page.querySelector('#btnDeleteImage') as HTMLButtonElement).classList.add('hide'); (page.querySelector('#btnAddImage') as HTMLButtonElement).classList.remove('hide'); } + }).catch(err => { + console.error('[userprofile] failed to get current user', err); }); loading.hide(); + }).catch(err => { + console.error('[userprofile] failed to load data', err); }); }, [userId]); @@ -110,6 +114,8 @@ const UserProfile: FunctionComponent = () => { window.ApiClient.uploadUserImage(userId, ImageType.Primary, file).then(function () { loading.hide(); reloadUser(); + }).catch(err => { + console.error('[userprofile] failed to upload image', err); }); }; @@ -125,7 +131,11 @@ const UserProfile: FunctionComponent = () => { window.ApiClient.deleteUserImage(userId, ImageType.Primary).then(function () { loading.hide(); reloadUser(); + }).catch(err => { + console.error('[userprofile] failed to delete image', err); }); + }).catch(() => { + // confirm dialog closed }); }); diff --git a/src/apps/stable/routes/user/userprofiles.tsx b/src/apps/stable/routes/user/userprofiles.tsx index 1eb2c9ee2e..b386533f4b 100644 --- a/src/apps/stable/routes/user/userprofiles.tsx +++ b/src/apps/stable/routes/user/userprofiles.tsx @@ -31,6 +31,8 @@ const UserProfiles: FunctionComponent = () => { window.ApiClient.getUsers().then(function (result) { setUsers(result); loading.hide(); + }).catch(err => { + console.error('[userprofiles] failed to fetch users', err); }); }; @@ -83,22 +85,35 @@ const UserProfiles: FunctionComponent = () => { callback: function (id: string) { switch (id) { case 'open': - Dashboard.navigate('useredit.html?userId=' + userId); + Dashboard.navigate('useredit.html?userId=' + userId) + .catch(err => { + console.error('[userprofiles] failed to navigate to user edit page', err); + }); break; case 'access': - Dashboard.navigate('userlibraryaccess.html?userId=' + userId); + Dashboard.navigate('userlibraryaccess.html?userId=' + userId) + .catch(err => { + console.error('[userprofiles] failed to navigate to user library page', err); + }); break; case 'parentalcontrol': - Dashboard.navigate('userparentalcontrol.html?userId=' + userId); + Dashboard.navigate('userparentalcontrol.html?userId=' + userId) + .catch(err => { + console.error('[userprofiles] failed to navigate to parental control page', err); + }); break; case 'delete': deleteUser(userId); } } + }).catch(() => { + // action sheet closed }); + }).catch(err => { + console.error('[userprofiles] failed to load action sheet', err); }); }; @@ -114,7 +129,11 @@ const UserProfiles: FunctionComponent = () => { loading.show(); window.ApiClient.deleteUser(id).then(function () { loadData(); + }).catch(err => { + console.error('[userprofiles] failed to delete user', err); }); + }).catch(() => { + // confirm dialog closed }); }; @@ -127,7 +146,10 @@ const UserProfiles: FunctionComponent = () => { }); (page.querySelector('#btnAddUser') as HTMLButtonElement).addEventListener('click', function() { - Dashboard.navigate('usernew.html'); + Dashboard.navigate('usernew.html') + .catch(err => { + console.error('[userprofiles] failed to navigate to new user page', err); + }); }); }, []); diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index c61e7c52ba..ca6c26b091 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -99,7 +99,10 @@ const ConnectionRequired: FunctionComponent = ({ } // Bounce to the correct page in the login flow - bounce(firstConnection); + bounce(firstConnection) + .catch(err => { + console.error('[ConnectionRequired] failed to bounce', err); + }); }, [bounce, navigate]); const validateUserAccess = useCallback(async () => { @@ -109,7 +112,10 @@ const ConnectionRequired: FunctionComponent = ({ if ((isAdminRequired || isUserRequired) && !client?.isLoggedIn()) { try { console.warn('[ConnectionRequired] unauthenticated user attempted to access user route'); - bounce(await ServerConnections.connect()); + bounce(await ServerConnections.connect()) + .catch(err => { + console.error('[ConnectionRequired] failed to bounce', err); + }); } catch (ex) { console.warn('[ConnectionRequired] error bouncing from user route', ex); } @@ -122,7 +128,10 @@ const ConnectionRequired: FunctionComponent = ({ const user = await client?.getCurrentUser(); if (!user?.Policy?.IsAdministrator) { console.warn('[ConnectionRequired] normal user attempted to access admin route'); - bounce(await ServerConnections.connect()); + bounce(await ServerConnections.connect()) + .catch(err => { + console.error('[ConnectionRequired] failed to bounce', err); + }); return; } } catch (ex) { @@ -143,9 +152,15 @@ const ConnectionRequired: FunctionComponent = ({ appRouter.firstConnectionResult = null; if (firstConnection && firstConnection.State !== ConnectionState.SignedIn) { - handleIncompleteWizard(firstConnection); + handleIncompleteWizard(firstConnection) + .catch(err => { + console.error('[ConnectionRequired] failed to start wizard', err); + }); } else { - validateUserAccess(); + validateUserAccess() + .catch(err => { + console.error('[ConnectionRequired] failed to validate user access', err); + }); } }, [handleIncompleteWizard, validateUserAccess]); diff --git a/src/components/common/Filter.tsx b/src/components/common/Filter.tsx index c3316df1a2..c3ccdd62f3 100644 --- a/src/components/common/Filter.tsx +++ b/src/components/common/Filter.tsx @@ -32,7 +32,11 @@ const Filter: FC = ({ serverId: window.ApiClient.serverId(), filterMenuOptions: getFilterMenuOptions(), setfilters: setViewQuerySettings + }).catch(() => { + // filter menu closed }); + }).catch(err => { + console.error('[Filter] failed to load filter menu', err); }); }, [viewQuerySettings, getVisibleFilters, topParentId, getItemTypes, getFilterMenuOptions, setViewQuerySettings]); diff --git a/src/components/common/GenresItemsContainer.tsx b/src/components/common/GenresItemsContainer.tsx index 796b6fa119..09623e7e57 100644 --- a/src/components/common/GenresItemsContainer.tsx +++ b/src/components/common/GenresItemsContainer.tsx @@ -73,6 +73,8 @@ const GenresItemsContainer: FC = ({ centerText: true, showYear: true }); + }).catch(err => { + console.error('[GenresItemsContainer] failed to fetch items', err); }); }, [getPortraitShape, topParentId]); diff --git a/src/components/common/NewCollection.tsx b/src/components/common/NewCollection.tsx index 4eadda8e36..837fe85fd3 100644 --- a/src/components/common/NewCollection.tsx +++ b/src/components/common/NewCollection.tsx @@ -12,7 +12,11 @@ const NewCollection: FC = () => { collectionEditor.show({ items: [], serverId: serverId + }).catch(() => { + // closed collection editor }); + }).catch(err => { + console.error('[NewCollection] failed to load collection editor', err); }); }, []); diff --git a/src/components/common/SelectView.tsx b/src/components/common/SelectView.tsx index f718529857..bfb34555b8 100644 --- a/src/components/common/SelectView.tsx +++ b/src/components/common/SelectView.tsx @@ -22,7 +22,11 @@ const SelectView: FC = ({ settings: viewQuerySettings, visibleSettings: getVisibleViewSettings(), setviewsettings: setViewQuerySettings + }).catch(() => { + // view settings closed }); + }).catch(err => { + console.error('[SelectView] failed to load view settings', err); }); }, [getVisibleViewSettings, viewQuerySettings, setViewQuerySettings]); diff --git a/src/components/common/Shuffle.tsx b/src/components/common/Shuffle.tsx index 7d5b06be4b..093dc74874 100644 --- a/src/components/common/Shuffle.tsx +++ b/src/components/common/Shuffle.tsx @@ -18,6 +18,8 @@ const Shuffle: FC = ({ itemsResult = {}, topParentId }) => { topParentId as string ).then((item) => { playbackManager.shuffle(item); + }).catch(err => { + console.error('[Shuffle] failed to fetch items', err); }); }, [topParentId]); diff --git a/src/components/common/Sort.tsx b/src/components/common/Sort.tsx index 5c5d1b6193..db5cb89956 100644 --- a/src/components/common/Sort.tsx +++ b/src/components/common/Sort.tsx @@ -25,7 +25,11 @@ const Sort: FC = ({ settings: viewQuerySettings, sortOptions: getSortMenuOptions(), setSortValues: setViewQuerySettings + }).catch(() => { + // sort menu closed }); + }).catch(err => { + console.error('[Sort] failed to load sort menu', err); }); }, [getSortMenuOptions, viewQuerySettings, setViewQuerySettings]); diff --git a/src/components/common/ViewItemsContainer.tsx b/src/components/common/ViewItemsContainer.tsx index d4f2937513..5cbc7aace6 100644 --- a/src/components/common/ViewItemsContainer.tsx +++ b/src/components/common/ViewItemsContainer.tsx @@ -335,9 +335,13 @@ const ViewItemsContainer: FC = ({ import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); + }).catch(err => { + console.error('[ViewItemsContainer] failed to load autofocuser', err); }); loading.hide(); setisLoading(true); + }).catch(err => { + console.error('[ViewItemsContainer] failed to fetch data', err); }); }, [fetchData]); diff --git a/src/components/dashboard/users/UserPasswordForm.tsx b/src/components/dashboard/users/UserPasswordForm.tsx index 0337c06510..d7801fdb42 100644 --- a/src/components/dashboard/users/UserPasswordForm.tsx +++ b/src/components/dashboard/users/UserPasswordForm.tsx @@ -66,6 +66,8 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { import('../../autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); + }).catch(err => { + console.error('[UserPasswordForm] failed to load autofocuser', err); }); (page.querySelector('#txtCurrentPassword') as HTMLInputElement).value = ''; @@ -81,7 +83,9 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { return; } - loadUser(); + loadUser().catch(err => { + console.error('[UserPasswordForm] failed to load user', err); + }); const onSubmit = (e: Event) => { if ((page.querySelector('#txtNewPassword') as HTMLInputElement).value != (page.querySelector('#txtNewPasswordConfirm') as HTMLInputElement).value) { @@ -109,7 +113,9 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { loading.hide(); toast(globalize.translate('PasswordSaved')); - loadUser(); + loadUser().catch(err => { + console.error('[UserPasswordForm] failed to load user', err); + }); }, function () { loading.hide(); Dashboard.alert({ @@ -132,6 +138,8 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { if (easyPassword) { window.ApiClient.updateEasyPassword(userId, easyPassword).then(function () { onEasyPasswordSaved(); + }).catch(err => { + console.error('[UserPasswordForm] failed to update easy password', err); }); } else { onEasyPasswordSaved(); @@ -153,8 +161,14 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { loading.hide(); toast(globalize.translate('SettingsSaved')); - loadUser(); + loadUser().catch(err => { + console.error('[UserPasswordForm] failed to load user', err); + }); + }).catch(err => { + console.error('[UserPasswordForm] failed to update user configuration', err); }); + }).catch(err => { + console.error('[UserPasswordForm] failed to fetch user', err); }); }; @@ -169,8 +183,14 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { message: globalize.translate('PinCodeResetComplete'), title: globalize.translate('HeaderPinCodeReset') }); - loadUser(); + loadUser().catch(err => { + console.error('[UserPasswordForm] failed to load user', err); + }); + }).catch(err => { + console.error('[UserPasswordForm] failed to reset easy password', err); }); + }).catch(() => { + // confirm dialog was closed }); }; @@ -184,8 +204,14 @@ const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { message: globalize.translate('PasswordResetComplete'), title: globalize.translate('ResetPassword') }); - loadUser(); + loadUser().catch(err => { + console.error('[UserPasswordForm] failed to load user', err); + }); + }).catch(err => { + console.error('[UserPasswordForm] failed to reset user password', err); }); + }).catch(() => { + // confirm dialog was closed }); }; diff --git a/src/components/search/LiveTVSearchResults.tsx b/src/components/search/LiveTVSearchResults.tsx index a087dc23cc..12d862804d 100644 --- a/src/components/search/LiveTVSearchResults.tsx +++ b/src/components/search/LiveTVSearchResults.tsx @@ -79,7 +79,9 @@ const LiveTVSearchResults: FunctionComponent = ({ serv fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', IsMovie: true - }).then(result => setMovies(result.Items || [])); + }) + .then(result => setMovies(result.Items || [])) + .catch(() => setMovies([])); // Episodes row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', @@ -88,22 +90,30 @@ const LiveTVSearchResults: FunctionComponent = ({ serv IsSports: false, IsKids: false, IsNews: false - }).then(result => setEpisodes(result.Items || [])); + }) + .then(result => setEpisodes(result.Items || [])) + .catch(() => setEpisodes([])); // Sports row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', IsSports: true - }).then(result => setSports(result.Items || [])); + }) + .then(result => setSports(result.Items || [])) + .catch(() => setSports([])); // Kids row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', IsKids: true - }).then(result => setKids(result.Items || [])); + }) + .then(result => setKids(result.Items || [])) + .catch(() => setKids([])); // News row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', IsNews: true - }).then(result => setNews(result.Items || [])); + }) + .then(result => setNews(result.Items || [])) + .catch(() => setNews([])); // Programs row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram', @@ -112,10 +122,13 @@ const LiveTVSearchResults: FunctionComponent = ({ serv IsSports: false, IsKids: false, IsNews: false - }).then(result => setPrograms(result.Items || [])); + }) + .then(result => setPrograms(result.Items || [])) + .catch(() => setPrograms([])); // Channels row fetchItems(apiClient, { IncludeItemTypes: 'TvChannel' }) - .then(result => setChannels(result.Items || [])); + .then(result => setChannels(result.Items || [])) + .catch(() => setChannels([])); } }, [collectionType, parentId, query, serverId]); diff --git a/src/components/search/SearchResults.tsx b/src/components/search/SearchResults.tsx index 731cc6ec35..f8e5a12fbd 100644 --- a/src/components/search/SearchResults.tsx +++ b/src/components/search/SearchResults.tsx @@ -123,38 +123,48 @@ const SearchResults: FunctionComponent = ({ serverId = windo if (!collectionType || isMovies(collectionType)) { // Movies row fetchItems(apiClient, { IncludeItemTypes: 'Movie' }) - .then(result => setMovies(result.Items)); + .then(result => setMovies(result.Items)) + .catch(() => setMovies([])); } // TV Show libraries if (!collectionType || isTVShows(collectionType)) { // Shows row fetchItems(apiClient, { IncludeItemTypes: 'Series' }) - .then(result => setShows(result.Items)); + .then(result => setShows(result.Items)) + .catch(() => setShows([])); // Episodes row fetchItems(apiClient, { IncludeItemTypes: 'Episode' }) - .then(result => setEpisodes(result.Items)); + .then(result => setEpisodes(result.Items)) + .catch(() => setEpisodes([])); } // People are included for Movies and TV Shows if (!collectionType || isMovies(collectionType) || isTVShows(collectionType)) { // People row - fetchPeople(apiClient).then(result => setPeople(result.Items)); + fetchPeople(apiClient) + .then(result => setPeople(result.Items)) + .catch(() => setPeople([])); } // Music libraries if (!collectionType || isMusic(collectionType)) { // Playlists row fetchItems(apiClient, { IncludeItemTypes: 'Playlist' }) - .then(results => setPlaylists(results.Items)); + .then(results => setPlaylists(results.Items)) + .catch(() => setPlaylists([])); // Artists row - fetchArtists(apiClient).then(result => setArtists(result.Items)); + fetchArtists(apiClient) + .then(result => setArtists(result.Items)) + .catch(() => setArtists([])); // Albums row fetchItems(apiClient, { IncludeItemTypes: 'MusicAlbum' }) - .then(result => setAlbums(result.Items)); + .then(result => setAlbums(result.Items)) + .catch(() => setAlbums([])); // Songs row fetchItems(apiClient, { IncludeItemTypes: 'Audio' }) - .then(result => setSongs(result.Items)); + .then(result => setSongs(result.Items)) + .catch(() => setSongs([])); } // Other libraries do not support in-library search currently @@ -163,28 +173,37 @@ const SearchResults: FunctionComponent = ({ serverId = windo fetchItems(apiClient, { MediaTypes: 'Video', ExcludeItemTypes: 'Movie,Episode,TvChannel' - }).then(result => setVideos(result.Items)); + }) + .then(result => setVideos(result.Items)) + .catch(() => setVideos([])); // Programs row fetchItems(apiClient, { IncludeItemTypes: 'LiveTvProgram' }) - .then(result => setPrograms(result.Items)); + .then(result => setPrograms(result.Items)) + .catch(() => setPrograms([])); // Channels row fetchItems(apiClient, { IncludeItemTypes: 'TvChannel' }) - .then(result => setChannels(result.Items)); + .then(result => setChannels(result.Items)) + .catch(() => setChannels([])); // Photo Albums row fetchItems(apiClient, { IncludeItemTypes: 'PhotoAlbum' }) - .then(result => setPhotoAlbums(result.Items)); + .then(result => setPhotoAlbums(result.Items)) + .catch(() => setPhotoAlbums([])); // Photos row fetchItems(apiClient, { IncludeItemTypes: 'Photo' }) - .then(result => setPhotos(result.Items)); + .then(result => setPhotos(result.Items)) + .catch(() => setPhotos([])); // Audio Books row fetchItems(apiClient, { IncludeItemTypes: 'AudioBook' }) - .then(result => setAudioBooks(result.Items)); + .then(result => setAudioBooks(result.Items)) + .catch(() => setAudioBooks([])); // Books row fetchItems(apiClient, { IncludeItemTypes: 'Book' }) - .then(result => setBooks(result.Items)); + .then(result => setBooks(result.Items)) + .catch(() => setBooks([])); // Collections row fetchItems(apiClient, { IncludeItemTypes: 'BoxSet' }) - .then(result => setCollections(result.Items)); + .then(result => setCollections(result.Items)) + .catch(() => setCollections([])); } }, [collectionType, fetchArtists, fetchItems, fetchPeople, query, serverId]); diff --git a/src/components/search/SearchSuggestions.tsx b/src/components/search/SearchSuggestions.tsx index 8d07d95da8..aefb831fe0 100644 --- a/src/components/search/SearchSuggestions.tsx +++ b/src/components/search/SearchSuggestions.tsx @@ -45,7 +45,11 @@ const SearchSuggestions: FunctionComponent = ({ parentId parentId: parentId || undefined, enableTotalRecordCount: false }) - .then(result => setSuggestions(result.data.Items || [])); + .then(result => setSuggestions(result.data.Items || [])) + .catch(err => { + console.error('[SearchSuggestions] failed to fetch search suggestions', err); + setSuggestions([]); + }); } }, [ api, parentId, user ]); diff --git a/src/elements/emby-button/LinkButton.tsx b/src/elements/emby-button/LinkButton.tsx index dceeac7b99..af2e5aa1d3 100644 --- a/src/elements/emby-button/LinkButton.tsx +++ b/src/elements/emby-button/LinkButton.tsx @@ -33,7 +33,10 @@ const LinkButton: React.FC = ({ } } else { e.preventDefault(); - appRouter.show(url); + appRouter.show(url) + .catch(err => { + console.error('[LinkButton] failed to show url', url, err); + }); } } else { e.preventDefault(); diff --git a/src/utils/dashboard.js b/src/utils/dashboard.js index a126aa1a58..8ceb81229f 100644 --- a/src/utils/dashboard.js +++ b/src/utils/dashboard.js @@ -107,6 +107,12 @@ export function getConfigurationResourceUrl(name) { }); } +/** + * Navigate to a url. + * @param {string} url - The url to navigate to. + * @param {boolean} [preserveQueryString] - A flag to indicate the current query string should be appended to the new url. + * @returns {Promise} + */ export function navigate(url, preserveQueryString) { if (!url) { throw new Error('url cannot be null or empty'); From 4a72d84a46cc0398b033ba1399241b9cf00b14b4 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 16:04:09 -0400 Subject: [PATCH 088/147] Change promise lint rules to error in ts and warn in js --- .eslintrc.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index aad915afde..c089d3ac0e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -245,7 +245,7 @@ module.exports = { 'Windows': 'readonly' }, rules: { - '@typescript-eslint/no-floating-promises': ['error'] + '@typescript-eslint/no-floating-promises': ['warn'] } }, // TypeScript source files @@ -264,6 +264,8 @@ module.exports = { 'plugin:jsx-a11y/recommended' ], rules: { + '@typescript-eslint/no-floating-promises': ['error'], + 'sonarjs/cognitive-complexity': ['error'] } } From bdf28b89fc9b1642cdbd30c7e7ecc1de65b76422 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 16:05:02 -0400 Subject: [PATCH 089/147] Disable the ignored return error in support check --- src/scripts/datetime.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index a6c677e2f6..3903b58638 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -114,6 +114,7 @@ export function getDisplayRunningTime(ticks) { const toLocaleTimeStringSupportsLocales = function () { try { + // eslint-disable-next-line sonarjs/no-ignored-return new Date().toLocaleTimeString('i'); } catch (e) { return e.name === 'RangeError'; From 30797d60ea702b6992696b961a54fd2e90860ced Mon Sep 17 00:00:00 2001 From: kimpig Date: Fri, 5 May 2023 02:39:34 +0000 Subject: [PATCH 090/147] Translated using Weblate (Korean) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/ --- src/strings/ko.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ko.json b/src/strings/ko.json index 9d4bef151d..0062f4f5aa 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1371,7 +1371,7 @@ "EveryXMinutes": "매 {0} 분마다", "OnWakeFromSleep": "잠에서 깨어날 때", "DailyAt": "매일 {0}", - "LastSeen": "마지막으로 본 {0}", + "LastSeen": "마지막 접속 {0}", "ListPaging": "{0}-{1} 의 {2}", "WriteAccessRequired": "Jellyfin에 이 폴더에 대한 쓰기 권한이 필요합니다. 쓰기 권한을 확인하고 다시 시도하십시오.", "PathNotFound": "경로를 찾을 수 없습니다. 경로가 유효한지 확인하고 다시 시도하십시오.", From f8f2477e762398cb1b4bb86959fd296381c1e253 Mon Sep 17 00:00:00 2001 From: diahyc Date: Fri, 5 May 2023 03:41:21 +0000 Subject: [PATCH 091/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 0de9722602..b9dc1f5348 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -1146,5 +1146,6 @@ "EnableCardLayout": "顯示 visual CardBox", "NewCollectionHelp": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至同一個系列中。", "RemoveFromCollection": "從系列中移除", - "MessageNoCollectionsAvailable": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至系列/集合中。點撃「+」以新增系列。" + "MessageNoCollectionsAvailable": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至系列/集合中。點撃「+」以新增系列。", + "HeaderPerformance": "效能" } From bb40b80a0f0be881ff5185f87db04d319f781a13 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:10 +0000 Subject: [PATCH 092/147] Translated using Weblate (Greek) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/ --- src/strings/el.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/el.json b/src/strings/el.json index 5584a0fca2..5c767fb938 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -378,7 +378,7 @@ "LabelBlockContentWithTags": "Αποκλεισμός στοιχείων με ετικέτες", "LabelBurnSubtitles": "Εγγραφή υπότιτλων", "LabelCache": "Προσωρινά αρχεία", - "LabelCachePath": "Διαδρομή προσωρ. αποθ.", + "LabelCachePath": "Διαδρομή προσωρ. αποθ", "LabelCachePathHelp": "Καθορίστε μια προσαρμοσμένη τοποθεσία για τα αρχεία προσωρινής μνήμης του σέρβερ, όπως πχ. εικόνες. Αφήστε το κενό για να χρησιμοποιήσετε την προεπιλογή του διακομιστή.", "LabelCertificatePassword": "Κωδικός πρόσβασης πιστοποιητικού", "LabelCertificatePasswordHelp": "Εάν το πιστοποιητικό σας απαιτεί κωδικό πρόσβασης, πληκτρολογήστε τον εδώ.", @@ -1479,7 +1479,7 @@ "YoutubeBadRequest": "Κακό αίτημα.", "EnableVppTonemapping": "Ενεργοποίηση αντιστοίχισης VPP Tone", "LabelEnableGamepad": "Ενεργοποίηση Gamepad", - "EnableGamepadHelp": "Ακούστε πληροφορίες από τυχόν συνδεδεμένους ελεγκτές.", + "EnableGamepadHelp": "Ακούστε πληροφορίες από τυχόν συνδεδεμένους ελεγκτές", "AudioCodecNotSupported": "Ο κωδικοποιητής ήχου δεν υποστηρίζεται", "AudioChannelsNotSupported": "Ο αριθμός των καναλιών ήχου δεν υποστηρίζεται", "AudioSampleRateNotSupported": "Ο ρυθμός δειγματοληψίας του ήχου δεν υποστηρίζεται", @@ -1687,7 +1687,7 @@ "MediaInfoDoViTitle": "Τίτλος DV", "LabelEnableAudioVbrHelp": "Το μεταβλητό bitrate προσφέρει καλύτερη ποιότητα από τη μέση αναλογία bitrate, αλλά σε μερικές περιστάσεις μπορεί να προκαλέσει προβλήματα φόρτωσης και συμβατότητας.", "LabelDummyChapterDuration": "Διάστημα", - "LabelEnableAudioVbr": "Ενεργοποίηση της VBR κωδικοποίησης ήχων.", + "LabelEnableAudioVbr": "Ενεργοποίηση της VBR κωδικοποίησης ήχων", "LabelParallelImageEncodingLimit": "Όριο παράλληλης κωδικοποίησης εικόνας", "HeaderRecordingMetadataSaving": "Καταγραφή Μεταδεδομένων", "HeaderPerformance": "Επίδοση", From 2518b1aaf413ac819d4c63553b6db30c58777dff Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:22 +0000 Subject: [PATCH 093/147] Translated using Weblate (Spanish (Mexico)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/ --- src/strings/es-mx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index de4d4f9476..2854d6ec4e 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -1525,7 +1525,7 @@ "SubtitleCodecNotSupported": "El formato de subtitulo no está soportado", "ContainerNotSupported": "El contenedor no está soportado", "AudioCodecNotSupported": "El formato de audio no está soportado", - "EnableGamepadHelp": "Recibir entrada de cualquier control conectado.", + "EnableGamepadHelp": "Recibir entrada de cualquier control conectado", "LabelEnableGamepad": "Habilitar Gamepad", "Controls": "Controles", "UseEpisodeImagesInNextUpHelp": "Las secciones 'Siguiente' y 'Continuar viendo' usarán imágenes de episodios como miniaturas en lugar de la miniatura principal del programa.", From 06c6bc660f20de31acda0fc9cf25283d94abfd01 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:30 +0000 Subject: [PATCH 094/147] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index 0bb1eebfc5..6f21ff3ff6 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1306,7 +1306,7 @@ "LabelSlowResponseEnabled": "Kirjaa lokimerkintä, jos palvelin vastasi liian hitaasti", "LabelSkipIfGraphicalSubsPresentHelp": "Tekstitysten säilytys tekstimuodossa mahdollistaa sujuvamman mediatoiston ja vähentää transkoodauksen todennäköisyyttä.", "SimultaneousConnectionLimitHelp": "Samanaikaisten suoratoistojen enimmäismäärä. Arvo 0 poistaa rajoituksen käytöstä.", - "EnableGamepadHelp": "Seuraa kytkettyjen ohjainten syötteitä (edellytys: TV-näyttötila).", + "EnableGamepadHelp": "Seuraa kytkettyjen ohjainten syötteitä (edellytys: TV-näyttötila)", "LabelEnableGamepad": "Ota käyttöön peliohjain", "Controls": "Ohjaimet", "AllowVppTonemappingHelp": "Täysi Intel-ajuriin pohjautuva sävykartoitus. Toimii toistaiseksi vain teittyjen laitteiden ja HDR10-videoiden kanssa. Tämä on muihin OpenCL-toteutuksiin verrattuna ensisijainen.", From fd3397f3a79628a211306a748a23a1a961f2c838 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:30:39 +0000 Subject: [PATCH 095/147] Translated using Weblate (French (Canada)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/ --- src/strings/fr-ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index ee1eeb0147..a62cb9c76f 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -1002,7 +1002,7 @@ "LabelMatchType": "Type recherché", "LabelMaxDaysForNextUp": "Nombre de jours maximal dans « À suivre »", "LabelIsForced": "Forcé", - "LabelInNetworkSignInWithEasyPassword": "Activer l'authentification locale avec un code Easy PIN", + "LabelInNetworkSignInWithEasyPassword": "Activer l'authentification locale avec un code Easy PIN", "LabelInternetQuality": "Qualité d'Internet", "LabelKeepUpTo": "Garder jusqu'à", "LabelKidsCategories": "Catégories enfant", From 7777e9a540827e0e78b858b8925c15af6eee3190 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:37 +0000 Subject: [PATCH 096/147] Translated using Weblate (Croatian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/ --- src/strings/hr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/hr.json b/src/strings/hr.json index c65fc1e60b..b2c7cf2e61 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -1319,7 +1319,7 @@ "AspectRatioFill": "Ispunite", "Controls": "Kontrole", "LabelEnableGamepad": "Omogući Gamepad", - "EnableGamepadHelp": "Osluškujte unos bilo kojeg povezanog kontrolera.", + "EnableGamepadHelp": "Osluškujte unos bilo kojeg povezanog kontrolera", "AudioCodecNotSupported": "Audio kodek nije podržan", "SecondaryAudioNotSupported": "Sekundarni zvučni zapisi nisu podržani", "RefFramesNotSupported": "Referentni okviri nisu podržani", From 132fb073f09267bc253b9962ced61ec31bb36cf3 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:40 +0000 Subject: [PATCH 097/147] Translated using Weblate (Indonesian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/id/ --- src/strings/id.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/id.json b/src/strings/id.json index fd715406ce..c86d8042bd 100644 --- a/src/strings/id.json +++ b/src/strings/id.json @@ -1157,7 +1157,7 @@ "SubtitleCodecNotSupported": "Kodek subjudul tidak didukung", "ContainerNotSupported": "Kontainer tidak didukung", "AudioCodecNotSupported": "Kodek audio tidak didukung", - "EnableGamepadHelp": "Dengarkan masukan dari pengontrol yang terhubung.", + "EnableGamepadHelp": "Dengarkan masukan dari pengontrol yang terhubung", "LabelEnableGamepad": "Aktifkan Gamepad", "Controls": "Kontrol", "AllowVppTonemappingHelp": "Pemetaan nada berbasis driver Intel penuh. Saat ini hanya berfungsi pada perangkat keras tertentu dengan video HDR10. Ini memiliki prioritas lebih tinggi dibandingkan dengan implementasi OpenCL lainnya.", From ac450ef4ec1842c09e50b1cb2ffe3257ac418ff3 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:44 +0000 Subject: [PATCH 098/147] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index d3aec5a30d..274a751ad6 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1705,7 +1705,7 @@ "LabelDummyChapterDuration": "Intervallo", "LabelDummyChapterDurationHelp": "Intervallo in secondi tra le estrazioni delle immagini in capitoli.", "LabelDummyChapterCountHelp": "Numero massimo di capitoli da estrarre per ciascun file.", - "LabelChapterImageResolutionHelp": "Risoluzione delle immagini per l'estrazione", + "LabelChapterImageResolutionHelp": "Risoluzione delle immagini per l'estrazione.", "HeaderDummyChapter": "Immagini Capitolo", "SaveRecordingNFO": "Salva i metadati EPG in NFO", "HeaderRecordingMetadataSaving": "Registrazione Metadati", From 42704035e20e189c61c7d70b68a0394a58ef3c4b Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:52 +0000 Subject: [PATCH 099/147] Translated using Weblate (Kazakh) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kk/ --- src/strings/kk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/kk.json b/src/strings/kk.json index 41df607614..d29bf080a8 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -1511,7 +1511,7 @@ "Framerate": "Kadr jyld-ğy", "DirectPlayHelp": "Qainar fail osy tūtynğyşpen tolyğymen üilesımdı, al seans osy faildy özgertusız qabyldaidy.", "HeaderContinueReading": "Oqudy jalğastyru", - "EnableGamepadHelp": "Kezkelgen qosylğan kontrolerlerden kırıstı tyñdau.", + "EnableGamepadHelp": "Kezkelgen qosylğan kontrolerlerden kırıstı tyñdau", "LabelEnableGamepad": "Gamepad qosu", "Controls": "Basqaru qūraldar", "TextSent": "Mätın jıberıldı.", From 5913944651dc3cf0fd0605097cc4a9a1e1e4c3e2 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:29:30 +0000 Subject: [PATCH 100/147] Translated using Weblate (Romanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/ --- src/strings/ro.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/ro.json b/src/strings/ro.json index 4546cd5786..f8e70f175a 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -868,7 +868,7 @@ "MessageYouHaveVersionInstalled": "În prezent, aveți versiunea {0} instalată.", "MessageUnsetContentHelp": "Conținutul va fi afișat ca foldere simple. Pentru cele mai bune rezultate, utilizați managerul de metadate pentru a seta tipurile de conținut ale sub-foldererelor.", "MessageUnableToConnectToServer": "Nu putem să ne conectăm la serverul selectat în acest moment. Vă rugăm să vă asigurați că funcționează și încercați din nou.", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Următoarele locații media vor fi eliminate din biblioteca dvs.", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Următoarele locații media vor fi eliminate din biblioteca dvs", "MessageReenableUser": "Consultați mai jos pentru a reactiva", "MessagePluginInstallDisclaimer": "Pluginurile create de membrii comunității sunt o modalitate excelentă de a vă îmbunătăți experiența cu funcții și beneficii suplimentare. Înainte de instalare, vă rugăm să fiți conștienți de efectele pe care le pot avea asupra serverului dvs., cum ar fi scanările de bibliotecă mai îndelungate, procesare suplimentară în fundal și scăderea stabilității sistemului.", "MessagePluginConfigurationRequiresLocalAccess": "Pentru a configura acest plugin, vă rugăm să vă conectați direct la serverul dvs. local.", @@ -1645,7 +1645,7 @@ "SubtitleCodecNotSupported": "Codecul subtitrarii nu este suportat", "ContainerNotSupported": "Containerul nu este suportat", "AudioCodecNotSupported": "Codec audio nu este suportat", - "EnableGamepadHelp": "Ascultați intrarea de la orice controler conectat.", + "EnableGamepadHelp": "Ascultați intrarea de la orice controler conectat", "LabelEnableGamepad": "Activați Gamepad", "Controls": "Controale", "UseEpisodeImagesInNextUpHelp": "Secțiunile „Următorul” și „Continuați vizionarea” vor folosi imagini ale episoadelor ca miniaturi în loc de miniatura principală a emisiunii.", @@ -1682,7 +1682,7 @@ "HeaderDummyChapter": "Imaginile Capitolelor", "HeaderRecordingMetadataSaving": "Înregistrarea Metadatelor", "EnableSplashScreen": "Activează ecranul splash", - "StereoDownmixAlgorithmHelp": "Algoritm utilizat pentru downmix multi-canale audio la stereo", + "StereoDownmixAlgorithmHelp": "Algoritm utilizat pentru downmix multi-canale audio la stereo.", "Short": "Scurt", "MediaInfoDoViTitle": "Titlu DV", "ResolutionMatchSource": "Potrivire Sursa", From 845253ccaf29c9412e62ae5ea17d1b83a0f623a7 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:29:34 +0000 Subject: [PATCH 101/147] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index df5cbf3013..9f423efd23 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1580,7 +1580,7 @@ "SubtitleCodecNotSupported": "Kodek podnapisa ni podprt", "ContainerNotSupported": "Kontejner ni podprt", "AudioCodecNotSupported": "Zvočni kodek ni podprt", - "EnableGamepadHelp": "Poslušaj vnose iz katerega koli priključenega igralnega ploščka.", + "EnableGamepadHelp": "Poslušaj vnose iz katerega koli priključenega igralnega ploščka", "LabelEnableGamepad": "Omogoči igralni plošček", "Controls": "Nadzor", "HeaderSelectFallbackFontPath": "Izberite pot mape nadomestnih pisav", @@ -1691,7 +1691,7 @@ "SaveRecordingNFO": "Shrani posnete EPG metapodatke v NFO", "SaveRecordingImagesHelp": "Shrani prenešene slike v mapo datoteke.", "PreferEmbeddedExtrasTitlesOverFileNames": "Raje uporabi vdelane naslove kot imena datotek", - "SaveRecordingNFOHelp": "Shrani metapodatke v isto mapo", + "SaveRecordingNFOHelp": "Shrani metapodatke v isto mapo.", "LabelDummyChapterDuration": "interval", "LabelDummyChapterDurationHelp": "Interval ekstrakcije slike poglavja v sekundah.", "LabelDummyChapterCount": "Limit", From f9e22b0d0610fdbe1e1afeb9c7790523ea9c2178 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:29:46 +0000 Subject: [PATCH 102/147] Translated using Weblate (Turkish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/ --- src/strings/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/tr.json b/src/strings/tr.json index b390e48824..cf91a1e594 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -1510,7 +1510,7 @@ "MessageSyncPlayPlaybackPermissionRequired": "Oynatma izni gerekiyor.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Aşağıdaki medya konumları kitaplığınızdan kaldırılacak", "MessageSyncPlayCreateGroupDenied": "Grup oluşturmak için izin gerekiyor.", - "EnableGamepadHelp": "Bağlı herhangi bir kontrolcüden gelen girişi dinleyin.", + "EnableGamepadHelp": "Bağlı herhangi bir kontrolcüden gelen girişi dinleyin", "MessagePluginInstalled": "Eklenti başarıyla kuruldu. Değişikliklerin etkili olması için sunucunun yeniden başlatılması gerekecek.", "MessagePluginConfigurationRequiresLocalAccess": "Bu eklentiyi kurmak için lütfen doğrudan yerel sunucunuzda oturum açın.", "MessageNoPluginsInstalled": "Yüklü hiçbir eklentiniz yok.", From 2935297ba6ddd13301b08a5f2dbb76d50a5f38f7 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:33:49 +0000 Subject: [PATCH 103/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 510 ++++++++++++++++++++--------------------- 1 file changed, 255 insertions(+), 255 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index b9dc1f5348..a0324a65d4 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -52,21 +52,21 @@ "HeaderUsers": "使用者", "HeaderVideos": "影片", "Help": "幫助", - "LabelAirsAfterSeason": "已播放劇集季度:", - "LabelAirsBeforeSeason": "尚未播放劇集季度:", - "LabelArtists": "藝人:", + "LabelAirsAfterSeason": "已播放劇集季度", + "LabelAirsBeforeSeason": "尚未播放劇集季度", + "LabelArtists": "藝人", "LabelArtistsHelp": "將多位藝人以「;」分隔。", - "LabelAudioLanguagePreference": "首選音訊語言:", - "LabelCache": "緩存:", - "LabelCachePath": "緩存路徑:", + "LabelAudioLanguagePreference": "首選音訊語言", + "LabelCache": "緩存", + "LabelCachePath": "緩存路徑", "LabelCachePathHelp": "選擇指定所需的緩存文件路徑;如圖像。保留空白以使用默認設定。", - "LabelCommunityRating": "討論區評分:", - "LabelContentType": "內容類型:", - "LabelCountry": "國家/地區:", - "LabelCurrentPassword": "目前密碼:", - "LabelCustomCss": "自訂 CSS:", + "LabelCommunityRating": "討論區評分", + "LabelContentType": "內容類型", + "LabelCountry": "國家/地區", + "LabelCurrentPassword": "目前密碼", + "LabelCustomCss": "自訂 CSS", "LabelCustomCssHelp": "於網頁介面套用您的自訂 CSS。", - "LabelDay": "星期:", + "LabelDay": "星期", "LabelDisplaySpecialsWithinSeasons": "顯示劇集季度中的特集", "LabelEnableAutomaticPortMap": "啟用自動連接埠映射", "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能不適用於某些路由器型號或網路設定。在伺服器重新啟動後才會進行更改。", @@ -78,61 +78,61 @@ "LabelEnableDlnaPlayToHelp": "在網絡內檢測裝置並遠程控制它們。", "LabelEnableRealtimeMonitor": "啟用實時監控", "LabelEnableRealtimeMonitorHelp": "檔案的更改將在支援的檔案系統上立即處理。", - "LabelEvent": "事件:", - "LabelEveryXMinutes": "每:", + "LabelEvent": "事件", + "LabelEveryXMinutes": "每", "LabelFailed": "失敗", "LabelFinish": "完成", "LabelServerNameHelp": "名稱將作為伺服器名稱,預設是伺服器的主機名稱。", - "LabelHttpsPort": "本地 HTTPS 連接埠號碼:", + "LabelHttpsPort": "本地 HTTPS 連接埠號碼", "LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 埠。", "LabelImageFetchersHelp": "啟用媒體圖片獲取來源的優先次序。", - "LabelLanguage": "語言:", - "LabelLocalHttpServerPortNumber": "本地 HTTP 連接埠:", + "LabelLanguage": "語言", + "LabelLocalHttpServerPortNumber": "本地 HTTP 連接埠", "LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 埠。", - "LabelLoginDisclaimer": "登入免責事項:", + "LabelLoginDisclaimer": "登入免責事項", "LabelLoginDisclaimerHelp": "顯示在登入頁面底部的訊息。", - "LabelLogs": "日誌:", - "LabelMaxBackdropsPerItem": "每個背景項目的最大數目:", - "LabelMaxParentalRating": "最大允許的家長評級:", - "LabelMaxResumePercentage": "最大恢復播放百分比:", + "LabelLogs": "日誌", + "LabelMaxBackdropsPerItem": "每個背景項目的最大數目", + "LabelMaxParentalRating": "最大允許的家長評級", + "LabelMaxResumePercentage": "最大恢復播放百分比", "LabelMaxResumePercentageHelp": "媒體如果在這個時間之後停止,會被認定為已播放。", "LabelMaxScreenshotsPerItem": "每件截圖物品的最大數量:", - "LabelMetadata": "資料屬性:", - "LabelMetadataDownloadLanguage": "偏好下載語言:", + "LabelMetadata": "資料屬性", + "LabelMetadataDownloadLanguage": "偏好下載語言", "LabelMetadataDownloadersHelp": "啟用媒體屬性下載器的優先次序,愈下次序只會用來填補缺少的信息。", - "LabelMetadataPath": "媒體資料屬性路徑:", + "LabelMetadataPath": "媒體資料屬性路徑", "LabelMetadataPathHelp": "選擇藝術作品和媒體資料屬性下載的自定位置。", - "LabelMetadataReaders": "資料屬性閱讀器:", + "LabelMetadataReaders": "資料屬性閱讀器", "LabelMetadataReadersHelp": "優先排序您的首選資料屬性來源。首個找到的文件將被讀取。", - "LabelMinBackdropDownloadWidth": "最小下載背景寬度:", - "LabelMinResumeDuration": "最少恢復播放時間:", + "LabelMinBackdropDownloadWidth": "最小下載背景寬度", + "LabelMinResumeDuration": "最少恢復播放時間", "LabelMinResumeDurationHelp": "以秒為單位的最短影片長度,它將保存播放位置並讓您繼續播放。", - "LabelMinResumePercentage": "最少恢復播放百分比:", + "LabelMinResumePercentage": "最少恢復播放百分比", "LabelMinResumePercentageHelp": "媒體如果在這個時間之前停止,會被認定為未播放。", "LabelMinScreenshotDownloadWidth": "最小下載截圖寬度:", - "LabelName": "名稱:", - "LabelNewPassword": "新密碼:", - "LabelNewPasswordConfirm": "新密碼確認:", - "LabelNumberOfGuideDays": "下載電視指南日數:", + "LabelName": "名稱", + "LabelNewPassword": "新密碼", + "LabelNewPasswordConfirm": "新密碼確認", + "LabelNumberOfGuideDays": "下載電視指南日數", "LabelNumberOfGuideDaysHelp": "下載更多電視指南資料會提供更詳細時間表,但將需要更長的下載時間。選擇自動將會基於頻道數目來設定。", - "LabelPassword": "密碼:", + "LabelPassword": "密碼", "LabelPath": "路徑", - "LabelPreferredDisplayLanguage": "首選語言:", - "LabelPublicHttpPort": "公開 HTTP 連接埠:", + "LabelPreferredDisplayLanguage": "首選語言", + "LabelPublicHttpPort": "公開 HTTP 連接埠", "LabelPublicHttpPortHelp": "公共連接埠應映射到本地 HTTP 連接埠。", - "LabelPublicHttpsPort": "公共 HTTPS 連接埠:", + "LabelPublicHttpsPort": "公共 HTTPS 連接埠", "LabelPublicHttpsPortHelp": "公共連接埠應映射到本地 HTTPS 連接埠。", "LabelSaveLocalMetadata": "儲存媒體圖片和資料屬性到媒體所屬的文件夾", "LabelSaveLocalMetadataHelp": "直接儲存媒體圖片和資料到媒體文件夾,讓編輯工作更容易。", - "LabelSelectUsers": "選擇使用者:", + "LabelSelectUsers": "選擇使用者", "LabelSkipIfAudioTrackPresentHelp": "取消此項,無論音訊語言是否一致,所有影片都會確保下載字幕。", "LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉碼的機會。", - "LabelStatus": "狀態:", - "LabelTime": "時間:", - "LabelTimeLimitHours": "時間限制(小時):", + "LabelStatus": "狀態", + "LabelTime": "時間", + "LabelTimeLimitHours": "時間限制(小時)", "LabelTranscodingTempPathHelp": "指定轉檔後的儲存路徑,留空將使用預設值。", - "LabelTriggerType": "觸發類別:", - "LabelUser": "使用者:", + "LabelTriggerType": "觸發類別", + "LabelUser": "使用者", "LabelVersionInstalled": "已安裝 {0}", "LabelYoureDone": "大功告成!", "LibraryAccessHelp": "選擇與此用戶共享媒體庫。管理員將能夠使用媒體資料瀏覽器以編輯所有文件夾。", @@ -484,108 +484,108 @@ "LastSeen": "上次觀看 {0}", "Large": "大", "LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。", - "LabelZipCode": "郵遞編號:", - "LabelYear": "年:", + "LabelZipCode": "郵遞編號", + "LabelYear": "年", "LabelXDlnaDocHelp": "決定在 'urn:schemas-dlna-org:device-1-0' namespace 中 'X-Dlna doc' 的內容。", - "LabelXDlnaDoc": "裝置 Class ID:", + "LabelXDlnaDoc": "裝置 Class ID", "LabelXDlnaCapHelp": "決定在 'urn:schemas-dlna-org:device-1-0' namespace 中 'X_DLNACAP' 的內容。", - "LabelXDlnaCap": "X-DLNA Capability ID:", - "LabelWeb": "網站:", - "LabelVideoResolution": "影片解像度:", - "LabelVideoRange": "動態範圍:", - "LabelVideoCodec": "影片編碼:", - "LabelVideoBitrate": "影片位元率:", - "LabelVersion": "版本:", - "LabelValue": "數值:", + "LabelXDlnaCap": "", + "LabelWeb": "網站", + "LabelVideoResolution": "影片解像度", + "LabelVideoRange": "動態範圍", + "LabelVideoCodec": "影片編碼", + "LabelVideoBitrate": "影片位元率", + "LabelVersion": "版本", + "LabelValue": "數值", "LabelVaapiDeviceHelp": "此渲染節點用來硬體加速。", - "LabelVaapiDevice": "VA-API 裝置:", + "LabelVaapiDevice": "VA-API 裝置", "LabelUserRemoteClientBitrateLimitHelp": "覆蓋伺服器設置的預設數值(控制台>播放>串流)。", - "LabelUsername": "使用者名稱:", - "LabelUserMaxActiveSessions": "最多同時工作階段數:", - "LabelUserLoginAttemptsBeforeLockout": "用戶登入失敗次數上限:", + "LabelUsername": "使用者名稱", + "LabelUserMaxActiveSessions": "最多同時工作階段數", + "LabelUserLoginAttemptsBeforeLockout": "用戶登入失敗次數上限", "LabelUserLibraryHelp": "選擇在裝置上顯示的使用者媒體庫,留空則使用預設設定值。", - "LabelUserLibrary": "使用者程式庫:", - "LabelUserAgent": "使用者代理:", - "LabelUseNotificationServices": "使用以下服務:", + "LabelUserLibrary": "使用者程式庫", + "LabelUserAgent": "使用者代理", + "LabelUseNotificationServices": "使用以下服務", "LabelUnstable": "不穩定", "LabelUDPPortRangeHelp": "進行 UDP 連線時,限制 Jellyfin 可使用的端口範圍。(預設值為 1024 - 65535)。
注意:某些功能需要固定端口,而這些端口可能不在此範圍內。", - "LabelUDPPortRange": "UDP 通訊範圍:", + "LabelUDPPortRange": "UDP 通訊範圍", "LabelTypeText": "文字", - "LabelTypeMetadataDownloaders": "個媒體資料下載器 ({0}):", + "LabelTypeMetadataDownloaders": "個媒體資料下載器 ({0})", "LabelProtocolInfoHelp": "當響應來自裝置的 GetProtocolInfo(獲取協議訊息)請求時,該值將被使用。", - "LabelProtocolInfo": "協議資訊:", - "LabelProtocol": "協議:", - "LabelProfileVideoCodecs": "影片編碼:", + "LabelProtocolInfo": "協議資訊", + "LabelProtocol": "協議", + "LabelProfileVideoCodecs": "影片編碼", "LabelProfileContainersHelp": "以逗號分隔,留空則適用於所有影片容器。", "LabelProfileContainer": "影片容器", "LabelProfileCodecsHelp": "以逗號分隔。留空則適用於所有編解碼器。", - "LabelProfileCodecs": "編碼:", - "LabelProfileAudioCodecs": "音訊編碼:", - "LabelPreferredSubtitleLanguage": "字幕語言偏好:", + "LabelProfileCodecs": "編碼", + "LabelProfileAudioCodecs": "音訊編碼", + "LabelPreferredSubtitleLanguage": "字幕語言偏好", "LabelPostProcessorArgumentsHelp": "使用 {path} 作為錄製檔案的路徑。", "LabelPostProcessorArguments": "處理器後命令行參數", "LabelPostProcessor": "後處理應用程式", "LabelPleaseRestart": "改動將在手動重啟用戶端後生效。", - "LabelPlayMethod": "播放方式:", - "LabelPlaylist": "播放清單:", - "LabelPlayerDimensions": "播放器尺寸:", - "LabelPlayer": "播放器:", + "LabelPlayMethod": "播放方式", + "LabelPlaylist": "播放清單", + "LabelPlayerDimensions": "播放器尺寸", + "LabelPlayer": "播放器", "LabelPlayDefaultAudioTrack": "無論如何都播放預設音軌", - "LabelPlaceOfBirth": "出生地:", + "LabelPlaceOfBirth": "出生地", "LabelPersonRoleHelp": "例如:冰淇淋車司機", - "LabelPersonRole": "角色:", - "LabelPasswordResetProvider": "密碼重設提供者:", - "LabelPasswordRecoveryPinCode": "PIN 碼:", - "LabelPasswordConfirm": "確認密碼:", - "LabelParentNumber": "父編號:", - "LabelParentalRating": "家長分級:", - "LabelOverview": "內容概述:", - "LabelOriginalTitle": "原始標題:", - "LabelOriginalAspectRatio": "原始長寬比:", + "LabelPersonRole": "角色", + "LabelPasswordResetProvider": "密碼重設提供者", + "LabelPasswordRecoveryPinCode": "PIN 碼", + "LabelPasswordConfirm": "確認密碼", + "LabelParentNumber": "父編號", + "LabelParentalRating": "家長分級", + "LabelOverview": "內容概述", + "LabelOriginalTitle": "原始標題", + "LabelOriginalAspectRatio": "原始長寬比", "LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他應用程式直接存取媒體檔案,例如 {0} 或者 {1}。", - "LabelOptionalNetworkPath": "分享的網路資料夾:", + "LabelOptionalNetworkPath": "分享的網路資料夾", "LabelOpenclDeviceHelp": "此 OpenCL 設備是用於色調映射。點的左側為平台號碼,右側為此平台上的設備號碼。預設值為 0.0。FFmpeg 需要具有 OpenCL 硬體加速功能。", - "LabelOpenclDevice": "OpenCL 裝置:", - "LabelNumber": "編號:", + "LabelOpenclDevice": "OpenCL 裝置", + "LabelNumber": "編號", "LabelNotificationEnabled": "啟用這個通知", - "LabelNewsCategories": "新分類:", - "LabelNewName": "新名稱:", + "LabelNewsCategories": "新分類", + "LabelNewName": "新名稱", "LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大位元率。", - "LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率:", - "LabelMovieRecordingPath": "電影錄製路徑:", + "LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率", + "LabelMovieRecordingPath": "電影錄製路徑", "LabelMoviePrefixHelp": "若前綴套用到電影標題,請在此處輸入它來方便伺服器能夠正確處理。", - "LabelMoviePrefix": "電影前綴:", - "LabelMovieCategories": "電影分類:", - "LabelMonitorUsers": "監控活動:", - "LabelModelUrl": "型號網址:", - "LabelModelNumber": "型號:", - "LabelModelName": "型號名稱:", - "LabelModelDescription": "型號描述:", + "LabelMoviePrefix": "電影前綴", + "LabelMovieCategories": "電影分類", + "LabelMonitorUsers": "監控活動", + "LabelModelUrl": "型號網址", + "LabelModelNumber": "型號", + "LabelModelName": "型號名稱", + "LabelModelDescription": "型號描述", "LabelMinAudiobookResumeHelp": "將在此時間前停止播放的媒體當作尚未播放。", - "LabelMinAudiobookResume": "恢復播放有聲書的最短時間:", - "LabelMethod": "方法:", + "LabelMinAudiobookResume": "恢復播放有聲書的最短時間", + "LabelMethod": "方法", "LabelMetadataSaversHelp": "選取媒體的中繼資料檔案格式。", - "LabelMetadataSavers": "媒體資料儲存方式:", - "LabelMessageTitle": "訊息標題:", - "LabelMessageText": "訊息文字:", + "LabelMetadataSavers": "媒體資料儲存方式", + "LabelMessageTitle": "訊息標題", + "LabelMessageText": "訊息文字", "LabelMaxStreamingBitrateHelp": "指定最大串流位元率。", - "LabelMaxStreamingBitrate": "最大串流畫質:", + "LabelMaxStreamingBitrate": "最大串流畫質", "LabelMaxMuxingQueueSizeHelp": "等待所有數據初始化時,可用作緩衝的最大封包數量。如果在 FFmpeg 日誌中仍然遇到「Too many packets buffered for output stream」錯誤,請嘗試增加數量。建議值為 2048。", - "LabelMaxMuxingQueueSize": "最大混合器佇列大小:", - "LabelMaxChromecastBitrate": "Google Cast 串流質素:", + "LabelMaxMuxingQueueSize": "最大混合器佇列大小", + "LabelMaxChromecastBitrate": "Google Cast 串流質素", "LabelMaxAudiobookResumeHelp": "將剩下的部分小於此時長後停止播放的媒體當作已播畢。", - "LabelMaxAudiobookResume": "恢復播放有聲書的剩餘時間:", - "LabelMatchType": "匹配的類型:", - "LabelManufacturerUrl": "製造商網址:", - "LabelManufacturer": "製造商:", + "LabelMaxAudiobookResume": "恢復播放有聲書的剩餘時間", + "LabelMatchType": "匹配的類型", + "LabelManufacturerUrl": "製造商網址", + "LabelManufacturer": "製造商", "LabelLockItemToPreventChanges": "鎖定此項目來避免被更改", "LabelLocalCustomCss": "自訂 CSS 樣式僅套用於此客戶端。你或需要停用伺服器自訂 CSS。", - "LabelLineup": "排隊:", + "LabelLineup": "排隊", "LabelLibraryPageSizeHelp": "設置媒體庫頁面每頁要顯示的最多媒體個數。設置為 0 來停用分頁。", - "LabelLibraryPageSize": "媒體庫分頁大小:", - "LabelLanNetworks": "區域網路:", + "LabelLibraryPageSize": "媒體庫分頁大小", + "LabelLanNetworks": "區域網路", "LabelKodiMetadataUserHelp": "儲存觀看資料到 NFO 檔案中以便其他應用程式使用。", - "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案中:", + "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案中", "LabelKodiMetadataSaveImagePathsHelp": "若如果您的圖片檔案名稱不符合 Kodi 規範,建議啟用。", "LabelKodiMetadataSaveImagePaths": "在 NFO 檔案中儲存圖片路徑", "LabelKodiMetadataEnablePathSubstitutionHelp": "允許將圖片的路徑以伺服器路徑取代。", @@ -593,24 +593,24 @@ "LabelKodiMetadataEnableExtraThumbsHelp": "為了相容 Kodi 主題,下載的圖片將被同時儲存在 extrafanart 和 extrathumbs 資料夾中。", "LabelKodiMetadataEnableExtraThumbs": "複製 extrafanart 到 extrathumbs 欄位", "LabelKodiMetadataDateFormatHelp": "NFO 檔案中的所有日期都將使用此格式。", - "LabelKodiMetadataDateFormat": "釋出日期格式:", - "LabelKnownProxies": "已知 Proxy:", - "LabelKidsCategories": "兒童分類:", - "LabelKeepUpTo": "最新:", + "LabelKodiMetadataDateFormat": "釋出日期格式", + "LabelKnownProxies": "已知 Proxy", + "LabelKidsCategories": "兒童分類", + "LabelKeepUpTo": "最新", "LabelIsForced": "強制", - "LabelInternetQuality": "網路畫質:", + "LabelInternetQuality": "網路畫質", "LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的家庭網路中使用你的簡易 PIN 登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN 碼留空,那麼在你的區域網路中便不需輸入密碼。", "LabelInNetworkSignInWithEasyPassword": "啟用以簡易 PIN 進行區域網路登入", "LabelImportOnlyFavoriteChannels": "僅限收藏的頻道", - "LabelImageType": "圖片格式:", + "LabelImageType": "圖片格式", "LabelIdentificationFieldHelp": "不區分大小寫的子字串或正則表達式。", - "LabelIconMaxWidth": "Icon 最寬寬度:", + "LabelIconMaxWidth": "Icon 最寬寬度", "LabelIconMaxResHelp": "透過「upnp:icon」屬性使用的圖示最高解析度。", - "LabelIconMaxHeight": "圖示最高高度:", - "LabelHomeScreenSectionValue": "主畫面模組 {0}:", - "LabelHomeNetworkQuality": "區域網路畫質:", + "LabelIconMaxHeight": "圖示最高高度", + "LabelHomeScreenSectionValue": "主畫面模組 {0}", + "LabelHomeNetworkQuality": "區域網路畫質", "LabelHDHomerunPortRangeHelp": "將 HDHomeRun UDP 端口範圍限制至該值內。(預設值為 1024 - 65535)。", - "LabelHDHomerunPortRange": "HDHomeRun 端口範圍:", + "LabelHDHomerunPortRange": "HDHomeRun 端口範圍", "LabelHardwareEncoding": "硬體加速", "LabelHardwareAccelerationTypeHelp": "硬體加速需要額外的設定。", "LabelHardwareAccelerationType": "硬體加速", @@ -618,21 +618,21 @@ "LabelH264Crf": "H.264 編碼 CRF", "LabelGroupMoviesIntoCollectionsHelp": "顯示電影清單時,屬於相同系列的電影將合併為單一項目顯示。", "LabelGroupMoviesIntoCollections": "按系列將電影分組", - "LabelFriendlyName": "好聽的名字:", - "LabelFormat": "格式:", + "LabelFriendlyName": "好聽的名字", + "LabelFormat": "格式", "LabelForgotPasswordUsernameHelp": "假如您還記得的話,請輸入您的使用者名稱。", - "LabelFont": "字體:", - "LabelFolder": "資料夾:", - "LabelFileOrUrl": "檔案或路徑:", + "LabelFont": "字體", + "LabelFolder": "資料夾", + "LabelFileOrUrl": "檔案或路徑", "LabelffmpegPathHelp": "FFmpeg 的路徑,或是包含 FFmpeg 的資料夾。", - "LabelffmpegPath": "FFmpeg 路徑:", + "LabelffmpegPath": "FFmpeg 路徑", "LabelExtractChaptersDuringLibraryScanHelp": "當媒體庫匯入影片並掃描時,將擷取章節圖片。否則,章節圖片將在之後的計畫任務中擷取,而媒體庫會更快完成掃描。", "LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片", - "LabelEpisodeNumber": "集:", - "LabelEndDate": "結束日期:", - "LabelEncoderPreset": "預設編碼:", + "LabelEpisodeNumber": "集", + "LabelEndDate": "結束日期", + "LabelEncoderPreset": "預設編碼", "LabelEnableSSDPTracingHelp": "將 SSDP 追蹤詳細資料記錄至日誌。
警告:這將導致效能嚴重損失。", - "LabelEnableSSDPTracing": "啟用 SSDP 追蹤:", + "LabelEnableSSDPTracing": "啟用 SSDP 追蹤", "LabelEnableSingleImageInDidlLimitHelp": "若在 DIDL 中嵌入多個圖片,某些裝置可能無法正常顯示。", "LabelEnableSingleImageInDidlLimit": "限制單個嵌入式圖片", "LabelEnableIP6Help": "啟用IPv6功能。", @@ -641,87 +641,87 @@ "LabelEnableIP4": "啟用IPv4", "LabelEnableHttpsHelp": "監聽指定的 HTTPS 埠。須設定有效的證書使其生效。", "LabelEnableHttps": "啟用 HTTPS", - "LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:", + "LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼", "LabelEnableDlnaServerHelp": "允許網路上的 UPnP 設備瀏覽和播放內容。", "LabelEnableDlnaServer": "啟用 DLNA 伺服器", "LabelEnableBlastAliveMessagesHelp": "若此伺服器無法被其他 UPnP 裝置偵測到,請啟用此選項。", "LabelEnableBlastAliveMessages": "活動訊息", "LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。", "LabelEmbedAlbumArtDidl": "於 DIDL 中嵌入專輯封面", - "LabelEasyPinCode": "簡易PIN代碼:", + "LabelEasyPinCode": "簡易PIN代碼", "LabelDynamicExternalId": "{0} Id", "LabelDropSubtitleHere": "將字幕檔拖動到這裡,或點擊瀏覽。", - "LabelDropShadow": "陰影:", - "LabelDroppedFrames": "丟棄的幀:", + "LabelDropShadow": "陰影", + "LabelDroppedFrames": "丟棄的幀", "LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。", "LabelDownMixAudioScaleHelp": "縮混時增強音訊。其中一個音軌將保持原始音量。", - "LabelDownMixAudioScale": "縮混時的音訊增強:", - "LabelDownloadLanguages": "下載語言:", - "LabelDisplayOrder": "顯示順序:", - "LabelDisplayName": "顯示名稱:", + "LabelDownMixAudioScale": "縮混時的音訊增強", + "LabelDownloadLanguages": "下載語言", + "LabelDisplayOrder": "顯示順序", + "LabelDisplayName": "顯示名稱", "LabelDisplayMode": "顯示模式", "LabelDisplayLanguageHelp": "翻譯 Jellyfin 是個進行中的專案。", - "LabelDisplayLanguage": "顯示語言:", - "LabelDiscNumber": "光碟編號:", + "LabelDisplayLanguage": "顯示語言", + "LabelDiscNumber": "光碟編號", "LabelDisableCustomCss": "停用由伺服器提供的自訂 CSS 代碼。", - "LabelDidlMode": "DIDL 模式:", - "LabelDeviceDescription": "裝置說明:", - "LabelDeinterlaceMethod": "反交錯方法:", + "LabelDidlMode": "DIDL 模式", + "LabelDeviceDescription": "裝置說明", + "LabelDeinterlaceMethod": "反交錯方法", "LabelDefaultUserHelp": "決定哪些使用者媒體庫顯示在已連接裝置上。這可以為每個裝置提供不同的使用者設定檔。", - "LabelDefaultUser": "預設使用者:", - "LabelDefaultScreen": "預設分頁:", - "LabelDeathDate": "死亡日期:", - "LabelDateTimeLocale": "設定時區:", + "LabelDefaultUser": "預設使用者", + "LabelDefaultScreen": "預設分頁", + "LabelDeathDate": "死亡日期", + "LabelDateTimeLocale": "設定時區", "LabelDateAddedBehaviorHelp": "若原本就有中繼資料,將會優先使用。", - "LabelDateAddedBehavior": "新內容加入的日期應使用:", - "LabelDateAdded": "新增日期:", - "LabelDashboardTheme": "控制台佈景主題:", - "LabelCustomRating": "自訂分級:", + "LabelDateAddedBehavior": "新內容加入的日期應使用", + "LabelDateAdded": "新增日期", + "LabelDashboardTheme": "控制台佈景主題", + "LabelCustomRating": "自訂分級", "LabelCustomDeviceDisplayNameHelp": "指定自訂的顯示名稱,或者留空以使用裝置的名稱。", "LabelCustomCertificatePathHelp": "提供包含證書和金鑰的 PKCS #12 文件的路徑以在自訂域名上啟用 TLS。", - "LabelCustomCertificatePath": "自訂 SSL 證書路徑:", - "LabelCurrentStatus": "目前狀態:", - "LabelCriticRating": "評論家評分:", + "LabelCustomCertificatePath": "自訂 SSL 證書路徑", + "LabelCurrentStatus": "目前狀態", + "LabelCriticRating": "評論家評分", "LabelCreateHttpPortMapHelp": "允許自動端口映射,為 HTTP 及 HTTPS 流量建立規則。", "LabelCreateHttpPortMap": "為 HTTP 與 HTTPS 流量啟用自動端口映射。", - "LabelCorruptedFrames": "損壞的幀:", - "LabelColorTransfer": "色彩轉換:", - "LabelColorSpace": "色域:", - "LabelColorPrimaries": "三原色:", + "LabelCorruptedFrames": "損壞的幀", + "LabelColorTransfer": "色彩轉換", + "LabelColorSpace": "色域", + "LabelColorPrimaries": "三原色", "LabelCollection": "系列", "LabelChromecastVersion": "Google Cast 版本", - "LabelChannels": "頻道:", + "LabelChannels": "頻道", "LabelCertificatePasswordHelp": "如果你的證書需要密碼,請在此輸入它。", - "LabelCertificatePassword": "證書密碼:", + "LabelCertificatePassword": "證書密碼", "LabelCancelled": "已取消", - "LabelBurnSubtitles": "燒錄字幕:", - "LabelBlockContentWithTags": "通過標籤鎖定內容:", + "LabelBurnSubtitles": "燒錄字幕", + "LabelBlockContentWithTags": "通過標籤鎖定內容", "LabelBlastMessageIntervalHelp": "決定伺服器活動消息之間的持續時間(秒)。", "LabelBlastMessageInterval": "活動信號的時間間隔", - "LabelBitrate": "位元率:", - "LabelBirthYear": "出生年:", - "LabelBirthDate": "出生日期:", + "LabelBitrate": "位元率", + "LabelBirthYear": "出生年", + "LabelBirthDate": "出生日期", "LabelBindToLocalNetworkAddressHelp": "(選用)覆蓋 HTTP 伺服器綁定的本地 IP 位址。留空則將監聽所有可用的位址。更改此欄位需重啟伺服器。", - "LabelBindToLocalNetworkAddress": "綁定本地網路地址:", + "LabelBindToLocalNetworkAddress": "綁定本地網路地址", "LabelBaseUrlHelp": "您可以在此處自訂伺服器 URL 路徑的子目錄,如:http://example.com/<baseurl>", - "LabelBaseUrl": "根路徑:", + "LabelBaseUrl": "根路徑", "LabelAutomaticDiscoveryHelp": "允許程式通過UDP 7359 連接埠自動偵測Jellyfin 。", "LabelAutomaticDiscovery": "啟動自動探索", - "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動抓取中繼資料:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動抓取中繼資料", "LabelAutoDiscoveryTracingHelp": "若啟用後,將會記錄自動探索連接埠的封包。", "LabelAutoDiscoveryTracing": "開啟自動追蹤。", - "LabelAuthProvider": "認證提供者:", - "LabelAudioSampleRate": "音訊取樣率:", - "LabelAudioCodec": "音訊編碼:", - "LabelAudioChannels": "音訊聲道:", - "LabelAudioBitrate": "音訊位元率:", - "LabelAudioBitDepth": "音訊位元深度:", + "LabelAuthProvider": "認證提供者", + "LabelAudioSampleRate": "音訊取樣率", + "LabelAudioCodec": "音訊編碼", + "LabelAudioChannels": "音訊聲道", + "LabelAudioBitrate": "音訊位元率", + "LabelAudioBitDepth": "音訊位元深度", "LabelAppNameExample": "例如:689的主機、777的 Jellyfin", "LabelAppName": "APP 名稱", "LabelAllowHWTranscoding": "允許硬體轉檔", - "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式:", - "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾:", - "LabelAlbumArtPN": "專輯封面 PN :", + "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式", + "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾", + "LabelAlbumArtPN": "專輯封面 PN", "LabelAlbumArtMaxWidth": "專輯封面最大寬度", "LabelAlbumArtMaxResHelp": "「upnp:albumArtURI」屬性設定專輯封面最高解析度。", "LabelAlbumArtMaxHeight": "專輯封面最大高度", @@ -884,40 +884,40 @@ "HeaderContainerProfile": "影片載體設定", "HeaderConnectToServer": "連接至伺服器", "HeaderConnectionFailure": "連接失敗", - "LabelType": "類型:", - "LabelTVHomeScreen": "電視模式主畫面:", - "LabelTunerType": "調解器類型:", - "LabelTunerIpAddress": "調諧器 IP 位址:", + "LabelType": "類型", + "LabelTVHomeScreen": "電視模式主畫面", + "LabelTunerType": "調解器類型", + "LabelTunerIpAddress": "調諧器 IP 位址", "LabelTranscodingThreadCountHelp": "選擇轉檔時要使用的最大執行緒數,減少執行緒數將降低 CPU 使用率,但轉換速度可能不足以提供流暢的播放體驗。", - "LabelTranscodingThreadCount": "轉檔執行緒數:", - "LabelTranscodingProgress": "轉檔進度:", - "LabelTranscodingFramerate": "轉檔幀率:", - "LabelTranscodes": "轉檔:", - "LabelTranscodePath": "轉檔路徑:", - "LabelTrackNumber": "追蹤編號:", + "LabelTranscodingThreadCount": "轉檔執行緒數", + "LabelTranscodingProgress": "轉檔進度", + "LabelTranscodingFramerate": "轉檔幀率", + "LabelTranscodes": "轉檔", + "LabelTranscodePath": "轉檔路徑", + "LabelTrackNumber": "追蹤編號", "LabelTonemappingThresholdHelp": "色調映射算法會對每個場景進行微調。此參數會被用作判斷畫面有無改變。如果當前的影格/幀的平均亮度及「移動平均值」高於閾值,畫面的峰值亮度及平均值將會被重新計算。建議閾值為0.8(預設:0.2)。", - "LabelTonemappingThreshold": "色調映射閾值:", - "LabelTonemappingRange": "色調映射範圍:", + "LabelTonemappingThreshold": "色調映射閾值", + "LabelTonemappingRange": "色調映射範圍", "LabelTonemappingPeakHelp": "用該值覆蓋信號/標稱/參考峰值。當顯示元數據中嵌入的峰值資訊不可靠時,或從較低範圍到較高範圍的色調映射時,此選項很有用。建議值和預設值分別為 100 和 0。", - "LabelTonemappingPeak": "色調映射峰值:", + "LabelTonemappingPeak": "色調映射峰值", "LabelTonemappingParamHelp": "調整色調映射算法。建議值和預設值均為 NaN。通常將其留空。", - "LabelTonemappingParam": "色調映射參數:", + "LabelTonemappingParam": "色調映射參數", "LabelTonemappingDesatHelp": "降低超過此亮度級別的亮部飽和度。此值越大,將保留更多的顏色資訊。此設置可以平滑地變成白色,從而有助於防止超高亮顯示出不自然的顏色。這使圖像感覺更自然,但以減少超出範圍的顏色的相關資訊為代價。建議值和預設值分別為 0 和 0.5。", - "LabelTonemappingDesat": "色調映射降低飽和度:", - "LabelTonemappingAlgorithm": "選擇要使用的色調映射算法:", - "LabelTitle": "標題:", - "LabelTheme": "主題:", - "LabelTextSize": "文字大小:", - "LabelTextColor": "文字顏色:", - "LabelTextBackgroundColor": "文字背景顏色:", - "LabelTagline": "個性宣言:", - "LabelTag": "標記:", - "LabelSyncPlayTimeSyncOffset": "時間偏移:", - "LabelSyncPlayTimeSyncDevice": "時間與某人同步:", - "LabelSyncPlaySyncMethod": "同步方式:", + "LabelTonemappingDesat": "色調映射降低飽和度", + "LabelTonemappingAlgorithm": "選擇要使用的色調映射算法", + "LabelTitle": "標題", + "LabelTheme": "主題", + "LabelTextSize": "文字大小", + "LabelTextColor": "文字顏色", + "LabelTextBackgroundColor": "文字背景顏色", + "LabelTagline": "個性宣言", + "LabelTag": "標記", + "LabelSyncPlayTimeSyncOffset": "時間偏移", + "LabelSyncPlayTimeSyncDevice": "時間與某人同步", + "LabelSyncPlaySyncMethod": "同步方式", "LabelSyncPlayResumePlaybackDescription": "加入播放群組", "LabelSyncPlayResumePlayback": "繼續本地播放", - "LabelSyncPlayPlaybackDiff": "播放時間差距:", + "LabelSyncPlayPlaybackDiff": "播放時間差距", "LabelSyncPlayNewGroupDescription": "建立新的群組", "LabelSyncPlayNewGroup": "建立群組", "LabelSyncPlayLeaveGroupDescription": "停用SyncPlay", @@ -928,47 +928,47 @@ "LabelSyncPlayAccessJoinGroups": "允許使用者加入群組", "LabelSyncPlayAccessCreateAndJoinGroups": "允許使用者建立與加入群組", "LabelSyncPlayAccess": "SyncPlay 存取控制", - "LabelSupportedMediaTypes": "支援的媒體類型:", - "LabelSubtitleVerticalPosition": "垂直位置:", + "LabelSupportedMediaTypes": "支援的媒體類型", + "LabelSubtitleVerticalPosition": "垂直位置", "LabelSubtitlePlaybackMode": "字幕播放模式", "LabelSubtitleFormatHelp": "如:SRT", - "LabelSubtitleDownloaders": "字幕下載器:", - "LabelStreamType": "串流類型:", - "LabelStopWhenPossible": "當可能時自動停止:", + "LabelSubtitleDownloaders": "字幕下載器", + "LabelStreamType": "串流類型", + "LabelStopWhenPossible": "當可能時自動停止", "LabelStopping": "停止", - "LabelStartWhenPossible": "當可能時自動開始:", + "LabelStartWhenPossible": "當可能時自動開始", "LabelStable": "穩定版", "LabelSSDPTracingFilterHelp": "自選 IP 地址,用於過濾記錄的 SSDP 流量。", - "LabelSSDPTracingFilter": "SSDP 篩選:", - "LabelSportsCategories": "體育分類:", - "LabelSpecialSeasonsDisplayName": "SP 季顯示名稱:", - "LabelSource": "來源:", - "LabelSortTitle": "排序標題:", - "LabelSortOrder": "排列順序:", - "LabelSortBy": "排序按照:", + "LabelSSDPTracingFilter": "SSDP 篩選", + "LabelSportsCategories": "體育分類", + "LabelSpecialSeasonsDisplayName": "SP 季顯示名稱", + "LabelSource": "來源", + "LabelSortTitle": "排序標題", + "LabelSortOrder": "排列順序", + "LabelSortBy": "排序按照", "LabelSonyAggregationFlagsHelp": "決定在「 urn:schemas-dlna-org:device-1-0」namespace 中的「aggregationFlags」元素的內容。", - "LabelSonyAggregationFlags": "Sony 整合標誌:", + "LabelSonyAggregationFlags": "Sony 整合標誌", "LabelSlowResponseTime": "反應緩慢判斷時間(毫秒)", "LabelSlowResponseEnabled": "當回應伺服器過慢時記錄警告訊息", "LabelSkipIfGraphicalSubsPresent": "跳過有內嵌字幕的影片", "LabelSkipIfAudioTrackPresent": "如果預設音軌的語言和下載語言一樣則跳過", - "LabelSkipForwardLength": "快轉長度:", - "LabelSkipBackLength": "跳過長度:", - "LabelSize": "大小:", - "LabelSimultaneousConnectionLimit": "同時串流限制:", - "LabelServerName": "伺服器名稱:", + "LabelSkipForwardLength": "快轉長度", + "LabelSkipBackLength": "跳過長度", + "LabelSize": "大小", + "LabelSimultaneousConnectionLimit": "同時串流限制", + "LabelServerName": "伺服器名稱", "LabelServerHostHelp": "192.168.1.100:8096 或是 https://myserver.com", - "LabelServerHost": "主機:", - "LabelSeriesRecordingPath": "影集錄影路徑:", - "LabelSerialNumber": "序號:", - "LabelSendNotificationToUsers": "傳送通知給:", - "LabelSelectVersionToInstall": "選擇要安裝的版本:", + "LabelServerHost": "主機", + "LabelSeriesRecordingPath": "影集錄影路徑", + "LabelSerialNumber": "序號", + "LabelSendNotificationToUsers": "傳送通知給", + "LabelSelectVersionToInstall": "選擇要安裝的版本", "LabelSelectFolderGroupsHelp": "未選中的資料夾將在其自己的檢視中顯示。", - "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組,例如電影、音樂和電視:", - "LabelSeasonNumber": "季:", - "LabelScreensaver": "螢幕保護程式:", + "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組,例如電影、音樂和電視", + "LabelSeasonNumber": "季", + "LabelScreensaver": "螢幕保護程式", "LabelScheduledTaskLastRan": "最後執行 {0},花費時間 {1}。", - "LabelRuntimeMinutes": "播放時間:", + "LabelRuntimeMinutes": "播放時間", "LabelRequireHttpsHelp": "開啟後伺服器將自動將所有 HTTP 請求導向 HTTPS。若伺服器沒有啟用 HTTPS 則不生效。", "LabelRequireHttps": "強制 HTTPS", "LabelRepositoryUrlHelp": "儲存庫的位置。", @@ -976,16 +976,16 @@ "LabelRepositoryNameHelp": "取一個能讓你辨識的名稱。", "LabelRepositoryName": "儲存庫名稱", "LabelRemoteClientBitrateLimitHelp": "所有網路裝置都能夠調整流位元率限制,這對於防止設備請求比網路連接所能處理的更高的位元率非常有用。這可能會導致伺服器上的 CPU 負載增加,以便將影片轉檔到較低的位元率。", - "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps):", - "LabelReleaseDate": "釋出日期:", - "LabelRefreshMode": "更新模式:", + "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps)", + "LabelReleaseDate": "釋出日期", + "LabelRefreshMode": "更新模式", "LabelRecordingPathHelp": "指定用於存儲轉檔的位置,留空將使用伺服器的程式根目錄。", - "LabelRecordingPath": "預設錄影路徑:", - "LabelRecord": "錄影:", - "LabelReasonForTranscoding": "轉檔原因:", - "LabelQuickConnectCode": "Quick Connect 代號:", + "LabelRecordingPath": "預設錄影路徑", + "LabelRecord": "錄影", + "LabelReasonForTranscoding": "轉檔原因", + "LabelQuickConnectCode": "Quick Connect 代號", "LabelPublishedServerUriHelp": "根據接口或客戶端 IP 位址,覆蓋 Jellyfin 使用的 URI。", - "LabelPublishedServerUri": "公開伺服器 URI:", + "LabelPublishedServerUri": "公開伺服器 URI", "HeaderConfirmRevokeApiKey": "撤銷 API 金鑰", "HeaderConfirmProfileDeletion": "確認刪除個人資料", "HeaderConfirmPluginInstallation": "確認附加元件安裝", @@ -997,7 +997,7 @@ "HeaderCastAndCrew": "演員與工作人員", "HeaderCancelSeries": "取消系列", "HeaderCancelRecording": "取消錄製", - "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容:", + "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容", "HeaderAutoDiscovery": "探索網域", "HeaderAudioSettings": "音訊設定", "HeaderAudioBooks": "有聲書", @@ -1060,7 +1060,7 @@ "MarkUnplayed": "標示為未觀看", "MarkPlayed": "標示為已觀看", "ManageRecording": "管理錄影", - "LabelAccessDay": "星期:", + "LabelAccessDay": "星期", "HeaderSyncPlayPlaybackSettings": "播放", "HeaderSyncPlaySettings": "同步播放設定", "ErrorPlayerNotFound": "找不到這個媒體所需的播放器。", @@ -1068,7 +1068,7 @@ "Arranger": "編曲", "LabelAutomaticallyAddToCollectionHelp": "當至少有兩部電影具有相同的系列名稱時,將自動加入到同一系列中。", "LabelAutomaticallyAddToCollection": "自動加入至系列", - "LabelAirsBeforeEpisode": "預告:", + "LabelAirsBeforeEpisode": "預告", "HeaderSyncPlayTimeSyncSettings": "時間同步", "ButtonExitApp": "離開應用程式", "Digital": "數碼", @@ -1080,11 +1080,11 @@ "ButtonClose": "關閉", "ButtonBackspace": "返回", "AddToFavorites": "添加至我的最愛", - "LabelSortName": "排列名稱:", - "LabelOriginalName": "原始名稱:", + "LabelSortName": "排列名稱", + "LabelOriginalName": "原始名稱", "LabelMaxVideoResolution": "轉檔影片的最高解象度", "LabelMaxDaysForNextUpHelp": "設定劇集在未觀看的狀態下,於「按下來」中顯示日數上限。", - "LabelMaxDaysForNextUp": "在「按下來」中顯示日數上限:", + "LabelMaxDaysForNextUp": "在「按下來」中顯示日數上限", "ItemDetails": "項目詳細資料", "GoogleCastUnsupported": "不支援 Google Cast", "EnableRewatchingNextUp": "允許「接下來」顯示重看的影片", @@ -1101,7 +1101,7 @@ "HeaderDummyChapter": "章節圖片", "IgnoreDtsHelp": "禁用此選項或可解決部份問題,如無法正常播放外部音訊。", "DownloadAll": "下載全部", - "LabelDummyChapterDuration": "間距:", + "LabelDummyChapterDuration": "間距", "LabelDummyChapterDurationHelp": "章節圖片擷取間距(秒)。", "DeletedScene": "刪減片段", "EnableSplashScreen": "啟用 「啟動畫面」(Splash Screen)", @@ -1129,14 +1129,14 @@ "MessageSyncPlayJoinGroupDenied": "無法加入群組。", "MessageSyncPlayLibraryAccessDenied": "內容存取受限。", "LabelStereoDownmixAlgorithm": "立體聲混縮算法(Stereo Downmix Algorithm)", - "LabelSyncPlaySettingsExtraTimeOffset": "額外時間修正:", + "LabelSyncPlaySettingsExtraTimeOffset": "額外時間修正", "MessageSyncPlayGroupDoesNotExist": "無法加入不存在的群組。", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下的資料夾路徑將會被移除:", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下的資料夾路徑將會被移除", "MessageUnableToConnectToServer": "無法連接到所選的伺服器,請先檢查伺服器的運作情況。", "MessageUnauthorizedUser": "您目前未被允許連接至伺服器。請聯繫伺服器的管理員查詢。", - "LabelDummyChapterCount": "上限:", + "LabelDummyChapterCount": "上限", "LabelDummyChapterCountHelp": "媒體的章節圖片的擷取數量上限。", - "LabelChapterImageResolution": "解像度:", + "LabelChapterImageResolution": "解像度", "LabelChapterImageResolutionHelp": "章節圖片擷取的解像度。", "HeaderRecordingMetadataSaving": "錄影節目元數據", "UseEpisodeImagesInNextUp": "在「接下來」及「繼續觀看」區中,以相關集數的圖片作顯示", From e89bb3448cde8d5107d861a6ab3f6bfdc4c2f184 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:30:53 +0000 Subject: [PATCH 104/147] Translated using Weblate (Chinese (Traditional)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 169a7d7974..3187e7e26c 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -401,7 +401,7 @@ "HeaderAddUpdateImage": "新增/更新圖片", "HeaderAlbumArtists": "專輯演出者", "HeaderAlert": "通知", - "HeaderAllowMediaDeletionFrom": "允許從以下位置刪除媒體:", + "HeaderAllowMediaDeletionFrom": "允許從以下位置刪除媒體", "HeaderApiKey": "API 金鑰", "HeaderApiKeys": "API 金鑰", "HeaderApiKeysHelp": "外部應用程式需要有一個 API 金鑰以用於和伺服器溝通。金鑰會在使用者登入時自動發行,也可以手動產生一個金鑰。", @@ -409,7 +409,7 @@ "HeaderAppearsOn": "同時出現於", "HeaderAudioBooks": "有聲書", "HeaderAudioSettings": "音訊設定", - "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容:", + "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容", "HeaderBranding": "品牌", "HeaderCancelRecording": "取消錄製", "HeaderCancelSeries": "取消系列", @@ -1611,7 +1611,7 @@ "AudioIsExternal": "外部音訊串流", "LabelVppTonemappingBrightness": "VPP 色調映射亮度增益", "EnableSplashScreen": "啟用啟動畫面", - "LabelVppTonemappingContrastHelp": "在 VPP 色調映射中使用對比度增益。 推薦值和預設值是 1。", + "LabelVppTonemappingContrastHelp": "在 VPP 色調映射中使用對比度增益。 推薦值和預設值是 1。", "Clip": "花絮", "Larger": "較大的", "Sample": "樣本", From 6f57af22404cb9d3d285d2ca16ef95f5b49073f1 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:49 +0000 Subject: [PATCH 105/147] Translated using Weblate (Japanese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/ --- src/strings/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ja.json b/src/strings/ja.json index acb3a7d78f..2f69db4268 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -251,7 +251,7 @@ "HeaderAppearsOn": "表示", "HeaderAudioBooks": "オーディオブック", "HeaderAudioSettings": "音声設定", - "HeaderBlockItemsWithNoRating": "評価情報がない、または認識できないアイテムをブロックします。", + "HeaderBlockItemsWithNoRating": "評価情報がない、または認識できないアイテムをブロックします", "HeaderBranding": "ブランディング", "HeaderCancelRecording": "録画の停止", "HeaderCancelSeries": "シリーズをキャンセル", From 43947204cd5cebc0e3c0fdeb47fda1530f0b4533 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:29:41 +0000 Subject: [PATCH 106/147] Translated using Weblate (Serbian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sr/ --- src/strings/sr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/sr.json b/src/strings/sr.json index 05d6d5d63b..e9bc2945c8 100644 --- a/src/strings/sr.json +++ b/src/strings/sr.json @@ -1598,7 +1598,7 @@ "Typewriter": "Писаћа машина", "TypeOptionPluralVideo": "видео снимци", "TypeOptionPluralMusicAlbum": "Музички албуми", - "EnableGamepadHelp": "Слушајте унос са било ког повезаног контролера.", + "EnableGamepadHelp": "Слушајте унос са било ког повезаног контролера", "AudioBitrateNotSupported": "Брзина у битовима звука није подржана", "VideoFramerateNotSupported": "Брзина кадрова видео снимка није подржана", "AudioProfileNotSupported": "Профил аудио кодека није подржан", From 3250ac78ff3b580dd73c482aa4be26c3ee472a1e Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:58 +0000 Subject: [PATCH 107/147] Translated using Weblate (Marathi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/mr/ --- src/strings/mr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/mr.json b/src/strings/mr.json index 02a5230106..5572b7bba8 100644 --- a/src/strings/mr.json +++ b/src/strings/mr.json @@ -274,7 +274,7 @@ "AudioBitrateNotSupported": "ऑडियो बिटरेट समर्थित नाही", "VideoCodecNotSupported": "व्हिडियो कोडेक समर्थित नाही", "AudioCodecNotSupported": "ऑडियो कोडेक समर्थित नाही", - "EnableGamepadHelp": "कोणत्याही जोडलेल्या कंट्रोलरपासून इन्पुट येतं का ऐका.", + "EnableGamepadHelp": "कोणत्याही जोडलेल्या कंट्रोलरपासून इन्पुट येतं का ऐका", "ContainerBitrateExceedsLimit": "व्हिडियोचा बिटरेट मर्यादेपेक्षा जास्त आहे", "LabelHardwareEncodingOptions": "हार्डवेअर एन्कोडिंग पर्याय", "Sync": "सिंक", From e4a4583c971d886b506d0d30add1c7ad5a07a747 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:13:08 +0000 Subject: [PATCH 108/147] Translated using Weblate (Urdu (Pakistan)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ur_PK/ --- src/strings/ur_PK.json | 556 ++++++++++++++++++++--------------------- 1 file changed, 278 insertions(+), 278 deletions(-) diff --git a/src/strings/ur_PK.json b/src/strings/ur_PK.json index 6ca45ad344..fb460d55ad 100644 --- a/src/strings/ur_PK.json +++ b/src/strings/ur_PK.json @@ -19,7 +19,7 @@ "ValueSpecialEpisodeName": "خصوصی - {0}", "Sync": "مطابقت پذیری", "Songs": "گانے", - "Shows": "دکھاتا ہے۔", + "Shows": "دکھاتا ہے", "Playlists": "پلے لسٹس", "Photos": "تصاویر", "MusicVideos": "میوزک ویڈیوز", @@ -31,20 +31,20 @@ "AllowedRemoteAddressesHelp": "کوما سے الگ کردہ IP پتوں کی فہرست یا نیٹ ورکس کے لیے IP/netmask اندراجات جنہیں دور سے جڑنے کی اجازت ہوگی۔ اگر خالی چھوڑ دیا جائے تو تمام ریموٹ پتوں کی اجازت ہوگی۔", "AllowFfmpegThrottlingHelp": "جب کوئی ٹرانس کوڈ یا ریمکس موجودہ پلے بیک پوزیشن سے کافی آگے نکل جاتا ہے، تو اس عمل کو روک دیں تاکہ یہ کم وسائل استعمال کرے۔ اکثر تلاش کیے بغیر دیکھتے وقت یہ سب سے زیادہ مفید ہے۔ اگر آپ پلے بیک کے مسائل کا سامنا کرتے ہیں تو اسے آف کریں۔", "AllowHWTranscodingHelp": "ٹیونر کو فلائی پر اسٹریمز کو ٹرانس کوڈ کرنے کی اجازت دیں۔ اس سے سرور کو درکار ٹرانس کوڈنگ کو کم کرنے میں مدد مل سکتی ہے۔", - "AllowMediaConversion": "میڈیا کی تبدیلی کی اجازت دیں۔", + "AllowMediaConversion": "میڈیا کی تبدیلی کی اجازت دیں", "AllowMediaConversionHelp": "کنورٹ میڈیا فیچر تک رسائی فراہم کریں یا انکار کریں۔", "AllowOnTheFlySubtitleExtractionHelp": "ایمبیڈڈ سب ٹائٹلز کو ویڈیوز سے نکالا جا سکتا ہے اور کلائنٹس کو سادہ متن میں پہنچایا جا سکتا ہے، تاکہ ویڈیو ٹرانس کوڈنگ کو روکنے میں مدد مل سکے۔ کچھ سسٹمز پر اس میں لمبا وقت لگ سکتا ہے اور نکالنے کے عمل کے دوران ویڈیو پلے بیک کو روک سکتا ہے۔ اسے غیر فعال کریں تاکہ ایمبیڈڈ سب ٹائٹلز کو ویڈیو ٹرانس کوڈنگ کے ساتھ جلا دیا جائے جب وہ کلائنٹ ڈیوائس کے ذریعہ مقامی طور پر تعاون یافتہ نہ ہوں۔", "AllowTonemappingHelp": "ٹون میپنگ تصویر کی تفصیلات اور رنگوں کو برقرار رکھتے ہوئے ویڈیو کی متحرک رینج کو HDR سے SDR میں تبدیل کر سکتی ہے، جو کہ اصل منظر کی نمائندگی کے لیے بہت اہم معلومات ہیں۔ فی الحال صرف HDR10 یا HLG ویڈیوز کے ساتھ کام کرتا ہے۔ اس کے لیے متعلقہ OpenCL یا CUDA رن ٹائم کی ضرورت ہے۔", "All": "تمام", - "AddToPlayQueue": "نشر کی قطار میں شامل کریں۔", + "AddToPlayQueue": "نشر کی قطار میں شامل کریں", "AirDate": "نشر کی تاریخ", "AllowFfmpegThrottling": "تھروٹل ٹرانس کوڈز", - "AllowRemoteAccess": "اس سرور سے ریموٹ کنکشن کی اجازت دیں۔", - "AddToCollection": "مجموعہ میں شامل کریں۔", + "AllowRemoteAccess": "اس سرور سے ریموٹ کنکشن کی اجازت دیں", + "AddToCollection": "مجموعہ میں شامل کریں", "AllLibraries": "تمام لائبریریاں", - "AllLanguages": "تمام زبانیں۔", - "AddToFavorites": "پسندیدہ میں شامل کریں۔", - "Aired": "نشر کیا گیا۔", + "AllLanguages": "تمام زبانیں", + "AddToFavorites": "پسندیدہ میں شامل کریں", + "Aired": "نشر کیا گیا", "Album": "البم", "AlbumArtist": "البم آرٹسٹ", "AllowRemoteAccessHelp": "اگر غیر نشان زد کیا گیا تو، تمام ریموٹ کنکشن بلاک ہو جائیں گے۔", @@ -52,26 +52,26 @@ "AllEpisodes": "تمام اقساط", "AllChannels": "تمام چینلز", "AnyLanguage": "کوئی بھی زبان", - "AlwaysPlaySubtitles": "ہمیشہ نشر کریں۔", + "AlwaysPlaySubtitles": "ہمیشہ نشر کریں", "AddToPlaylist": "پلے لسٹ میں شامل", "AdditionalNotificationServices": "اضافی اطلاعاتی خدمات کو انسٹال کرنے کے لیے پلگ ان کیٹلاگ کو براؤز کریں۔", - "AllowOnTheFlySubtitleExtraction": "فلائی پر سب ٹائٹل نکالنے کی اجازت دیں۔", + "AllowOnTheFlySubtitleExtraction": "فلائی پر سب ٹائٹل نکالنے کی اجازت دیں", "HeaderPassword": "پاس ورڈ", "LabelSyncPlayAccess": "SyncPlay رسائی", "Disc": "ڈسک", - "EnableQuickConnect": "اس سرور پر فوری کنیکٹ کو فعال کریں۔", + "EnableQuickConnect": "اس سرور پر فوری کنیکٹ کو فعال کریں", "LabelModelName": "ماڈل کا نام", "AroundTime": "تقریباً {0}", "LabelModelNumber": "ماڈل نمبر", "LabelModelDescription": "ماڈل کی تفصیل", "LabelSerialNumber": "سیریل نمبر", - "Unreleased": "ابھی تک جاری نہیں ہوا۔", + "Unreleased": "ابھی تک جاری نہیں ہوا", "AgeValue": "({0} سال پرانا)", "HeaderPlayback": "میڈیا پلے بیک", "HeaderRemoteControl": "ریموٹ کنٹرول", "ApiKeysCaption": "فی الحال فعال API کیز کی فہرست", "Arranger": "بندوبست کرنے والا", - "AsManyAsPossible": "جتنے بھی ہو سکتے ہیں۔", + "AsManyAsPossible": "جتنے بھی ہو سکتے ہیں", "Authorize": "اختیار دینا", "AuthProviderHelp": "اس صارف کے پاس ورڈ کی توثیق کرنے کے لیے ایک تصدیقی فراہم کنندہ کو منتخب کریں۔", "Backdrops": "پس منظر", @@ -80,20 +80,20 @@ "BookLibraryHelp": "آڈیو اور متنی کتابیں معاون ہیں۔ {0} کتاب کے نام کی گائیڈ {1} کا جائزہ لیں۔", "BurnSubtitlesHelp": "اس بات کا تعین کریں کہ کیا ویڈیوز کو ٹرانس کوڈنگ کرتے وقت سرور کو سب ٹائٹلز میں جلنا چاہیے۔ اس سے گریز کرنے سے کارکردگی بہت بہتر ہوگی۔ تصویر پر مبنی فارمیٹس (VobSub، PGS، SUB، IDX، وغیرہ) اور کچھ ASS یا SSA سب ٹائٹلز کو جلانے کے لیے آٹو کو منتخب کریں۔", "ButtonBackspace": "بیک اسپیس", - "ButtonChangeServer": "سرور کو تبدیل کریں۔", + "ButtonChangeServer": "سرور کو تبدیل کریں", "ButtonClose": "بند کریں", "ButtonMore": "مزید", "ButtonOk": "ٹھیک ہے", "ButtonQuickStartGuide": "جلدی شروعات کیلئے رہنمائی", - "ButtonExitApp": "درخواست سے باہر نکلیں۔", + "ButtonExitApp": "درخواست سے باہر نکلیں", "ButtonSpace": "خلا", - "CancelRecording": "ریکارڈنگ منسوخ کریں۔", + "CancelRecording": "ریکارڈنگ منسوخ کریں", "ChannelAccessHelp": "اس صارف کے ساتھ اشتراک کرنے کے لیے چینلز کو منتخب کریں۔ منتظمین میٹا ڈیٹا مینیجر کا استعمال کرتے ہوئے تمام چینلز میں ترمیم کر سکیں گے۔", "ChannelNameOnly": "صرف چینل {0}", "CinemaModeConfigurationHelp": "سینما موڈ مرکزی خصوصیت سے پہلے ٹریلرز اور حسب ضرورت تعارف چلانے کی صلاحیت کے ساتھ تھیٹر کے تجربے کو سیدھے آپ کے کمرے میں لاتا ہے۔", "ColorTransfer": "رنگ کی منتقلی", "Conductor": "موصل", - "ConfigureDateAdded": "سیٹ اپ کریں کہ ڈیش بورڈ > لائبریریز > NFO سیٹنگز میں 'تاریخ شامل کرنے' کے لیے میٹا ڈیٹا کا تعین کیسے کیا جاتا ہے۔", + "ConfigureDateAdded": "سیٹ اپ کریں کہ ڈیش بورڈ > لائبریریز > NFO سیٹنگز میں 'تاریخ شامل کرنے' کے لیے میٹا ڈیٹا کا تعین کیسے کیا جاتا ہے", "ConfirmDeleteItems": "ان آئٹمز کو حذف کرنے سے وہ فائل سسٹم اور آپ کی میڈیا لائبریری دونوں سے حذف ہو جائیں گے۔ کیا آپ واقعی جاری رکھنا چاہتے ہیں؟", "ConfirmEndPlayerSession": "کیا آپ جیلیفن کو {0} کو بند کرنا چاہیں گے؟", "CriticRating": "ناقدین کی درجہ بندی", @@ -107,16 +107,16 @@ "DeviceAccessHelp": "یہ صرف ان آلات پر لاگو ہوتا ہے جن کی منفرد شناخت کی جا سکتی ہے اور وہ براؤزر تک رسائی کو نہیں روکیں گے۔ صارف کے آلے تک رسائی کو فلٹر کرنے سے وہ نئے آلات استعمال کرنے سے روک دے گا جب تک کہ وہ یہاں منظور نہیں ہو جاتے۔", "Digital": "ڈیجیٹل", "DirectPlayHelp": "سورس فائل اس کلائنٹ کے ساتھ مکمل طور پر مطابقت رکھتی ہے، اور سیشن بغیر کسی ترمیم کے فائل وصول کر رہا ہے۔", - "OptionRequirePerfectSubtitleMatch": "صرف ان سب ٹائٹلز کو ڈاؤن لوڈ کریں جو ویڈیو فائلوں کے لیے بہترین ہیں۔", - "QuickConnectDeactivated": "لاگ ان کی درخواست منظور ہونے سے پہلے فوری کنیکٹ کو غیر فعال کر دیا گیا تھا۔", + "OptionRequirePerfectSubtitleMatch": "صرف ان سب ٹائٹلز کو ڈاؤن لوڈ کریں جو ویڈیو فائلوں کے لیے بہترین ہیں", + "QuickConnectDeactivated": "لاگ ان کی درخواست منظور ہونے سے پہلے فوری کنیکٹ کو غیر فعال کر دیا گیا تھا", "DirectStreamHelp1": "ویڈیو سٹریم ڈیوائس کے ساتھ مطابقت رکھتا ہے، لیکن اس میں غیر مطابقت پذیر آڈیو فارمیٹ (DTS، Dolby TrueHD، وغیرہ) یا آڈیو چینلز کی تعداد ہے۔ ڈیوائس پر بھیجے جانے سے پہلے ویڈیو اسٹریم کو بغیر کسی نقصان کے دوبارہ پیک کیا جائے گا۔ صرف آڈیو اسٹریم کو ٹرانس کوڈ کیا جائے گا۔", "EnablePlugin": "فعال", - "DisableCustomCss": "سرور کے فراہم کردہ حسب ضرورت CSS کوڈ کو غیر فعال کریں۔", + "DisableCustomCss": "سرور کے فراہم کردہ حسب ضرورت CSS کوڈ کو غیر فعال کریں", "Disconnect": "منقطع کرنا", "EasyPasswordHelp": "آپ کا آسان پن کوڈ معاون کلائنٹس پر آف لائن رسائی کے لیے استعمال کیا جاتا ہے اور اسے نیٹ ورک میں آسانی سے سائن ان کرنے کے لیے بھی استعمال کیا جا سکتا ہے۔", - "EnableDecodingColorDepth10Vp9": "VP9 کے لیے 10 بٹ ہارڈویئر ڈی کوڈنگ کو فعال کریں۔", - "EnableNextVideoInfoOverlay": "پلے بیک کے دوران اگلی ویڈیو کی معلومات دکھائیں۔", - "EnableRewatchingNextUp": "نیکسٹ اپ میں دوبارہ دیکھنے کو فعال کریں۔", + "EnableDecodingColorDepth10Vp9": "VP9 کے لیے 10 بٹ ہارڈویئر ڈی کوڈنگ کو فعال کریں", + "EnableNextVideoInfoOverlay": "پلے بیک کے دوران اگلی ویڈیو کی معلومات دکھائیں", + "EnableRewatchingNextUp": "نیکسٹ اپ میں دوبارہ دیکھنے کو فعال کریں", "EnableRewatchingNextUpHelp": "'Next Up' سیکشنز میں پہلے سے دیکھے گئے ایپی سوڈز دکھانے کو فعال کریں۔", "EnableThemeVideosHelp": "لائبریری کو براؤز کرتے وقت تھیم ویڈیوز کو پس منظر میں چلائیں۔", "Engineer": "ساؤنڈ انجینئر", @@ -138,15 +138,15 @@ "LabelKidsCategories": "بچوں کے زمرے", "LabelSeasonNumber": "سیزن نمبر", "MediaInfoTitle": "عنوان", - "UnknownAudioStreamInfo": "آڈیو اسٹریم کی معلومات نامعلوم ہے۔", + "UnknownAudioStreamInfo": "آڈیو اسٹریم کی معلومات نامعلوم ہے", "ExtractChapterImagesHelp": "باب کی تصاویر کو نکالنے سے کلائنٹس کو گرافیکل سین سلیکشن مینیو ڈسپلے کرنے کا موقع ملے گا۔ یہ عمل سست ہو سکتا ہے، بہت زیادہ وسائل ہو سکتے ہیں اور اس کے لیے کئی گیگا بائٹس کی جگہ درکار ہو سکتی ہے۔ یہ اس وقت چلتا ہے جب ویڈیوز دریافت ہوتے ہیں، اور رات کے وقت طے شدہ کام کے طور پر بھی۔ شیڈول طے شدہ کاموں کے علاقے میں قابل ترتیب ہے۔ اس کام کو زیادہ سے زیادہ استعمال کے اوقات میں چلانے کی سفارش نہیں کی جاتی ہے۔", "FFmpegSavePathNotFound": "ہم آپ کے داخل کردہ راستے کا استعمال کرتے ہوئے FFmpeg تلاش کرنے سے قاصر ہیں۔ FFprobe بھی ضروری ہے اور اسی فولڈر میں موجود ہونا چاہیے۔ یہ اجزاء عام طور پر ایک ہی ڈاؤن لوڈ میں ایک ساتھ بنڈل ہوتے ہیں۔ براہ کرم راستہ چیک کریں اور دوبارہ کوشش کریں۔", "Friday": "جمعہ", "Fullscreen": "مکمل اسکرین یا بڑی اسکرین", "GoogleCastUnsupported": "Google Cast غیر تعاون یافتہ", - "GroupBySeries": "سیریز کے لحاظ سے گروپ کریں۔", - "GuideProviderSelectListings": "فہرستیں منتخب کریں۔", - "DisablePlugin": "غیر فعال کریں۔", + "GroupBySeries": "سیریز کے لحاظ سے گروپ کریں", + "GuideProviderSelectListings": "فہرستیں منتخب کریں", + "DisablePlugin": "غیر فعال کریں", "H264CrfHelp": "'کنسٹنٹ ریٹ فیکٹر' (CRF) x264 اور x265 انکوڈر کے لیے ڈیفالٹ کوالٹی سیٹنگ ہے۔ آپ 0 اور 51 کے درمیان قدریں سیٹ کر سکتے ہیں، جہاں کم اقدار کے نتیجے میں بہتر معیار ہو گا (اعلی فائل سائز کی قیمت پر)۔ سنے اقدار 18 اور 28 کے درمیان ہیں۔ x264 کے لیے ڈیفالٹ 23 ہے، اور x265 کے لیے 28 ہے، لہذا آپ اسے نقطہ آغاز کے طور پر استعمال کر سکتے ہیں۔", "HardwareAccelerationWarning": "ہارڈویئر ایکسلریشن کو فعال کرنا کچھ ماحول میں عدم استحکام کا سبب بن سکتا ہے۔ یقینی بنائیں کہ آپ کا آپریٹنگ سسٹم اور ویڈیو ڈرائیور مکمل طور پر اپ ٹو ڈیٹ ہیں۔ اگر آپ کو اسے فعال کرنے کے بعد ویڈیو چلانے میں دشواری ہوتی ہے، تو آپ کو سیٹنگ کو واپس کوئی نہیں میں تبدیل کرنا ہوگا۔", "HeaderAddToPlaylist": "پلے لسٹ میں شامل", @@ -155,19 +155,19 @@ "HeaderBlockItemsWithNoRating": "بغیر یا غیر تسلیم شدہ درجہ بندی کی معلومات والے آئٹمز کو مسدود کریں", "HeaderBranding": "برانڈنگ", "HeaderCodecProfileHelp": "کوڈیک پروفائلز مخصوص کوڈیکس چلاتے وقت ڈیوائس کی حدود کی نشاندہی کرتے ہیں۔ اگر کوئی حد لاگو ہوتی ہے تو میڈیا کو ٹرانس کوڈ کیا جائے گا، چاہے کوڈیک براہ راست پلے بیک کے لیے ترتیب دیا گیا ہو۔", - "HeaderConfirmProfileDeletion": "پروفائل ڈیلیٹ کرنے کی تصدیق کریں۔", + "HeaderConfirmProfileDeletion": "پروفائل ڈیلیٹ کرنے کی تصدیق کریں", "HeaderContainerProfile": "کنٹینر پروفائل", "HeaderContainerProfileHelp": "مخصوص فارمیٹس چلاتے وقت کنٹینر پروفائلز ڈیوائس کی حدود کی نشاندہی کرتے ہیں۔ اگر کوئی حد لاگو ہوتی ہے تو میڈیا کو ٹرانس کوڈ کیا جائے گا، چاہے فارمیٹ براہ راست پلے بیک کے لیے ترتیب دیا گیا ہو۔", "HeaderContinueReading": "پڑھنا جاری رکھیے", "HeaderDebugging": "ڈیبگنگ اور ٹریسنگ", - "HeaderDeleteDevice": "ڈیوائس کو حذف کریں۔", - "HeaderDeleteItem": "آئٹم کو حذف کریں۔", + "HeaderDeleteDevice": "ڈیوائس کو حذف کریں", + "HeaderDeleteItem": "آئٹم کو حذف کریں", "HeaderDeviceAccess": "ڈیوائس تک رسائی", "HeaderDirectPlayProfile": "براہ راست پلے بیک پروفائل", "HeaderDirectPlayProfileHelp": "یہ بتانے کے لیے براہ راست پلے بیک پروفائلز شامل کریں کہ ڈیوائس کون سے فارمیٹس کو مقامی طور پر ہینڈل کر سکتی ہے۔", "HeaderDVR": "ڈی وی آر", "HeaderEnabledFieldsHelp": "کسی فیلڈ کو لاک کرنے اور اس کے ڈیٹا کو تبدیل ہونے سے روکنے کے لیے اسے غیر چیک کریں۔", - "HeaderFrequentlyPlayed": "اکثر کھیلا جاتا ہے۔", + "HeaderFrequentlyPlayed": "اکثر کھیلا جاتا ہے", "HeaderIdentificationCriteriaHelp": "کم از کم ایک شناختی معیار درج کریں۔", "HeaderInstantMix": "فوری مکس", "HeaderLibraries": "لائبریریاں", @@ -176,35 +176,35 @@ "HeaderNetworking": "آئی پی پروٹوکولز", "HeaderNewDevices": "نئے آلات", "HeaderNextEpisodePlayingInValue": "اگلی قسط {0} میں چل رہی ہے", - "HeaderPinCodeReset": "آسان پن کوڈ دوبارہ ترتیب دیں۔", + "HeaderPinCodeReset": "آسان پن کوڈ دوبارہ ترتیب دیں", "HeaderPluginInstallation": "پلگ ان کی تنصیب", "HeaderPortRanges": "فائر وال اور پراکسی سیٹنگز", - "HeaderRecentlyPlayed": "حال ہی میں کھیلا گیا۔", - "HeaderRemoveMediaFolder": "میڈیا فولڈر کو ہٹا دیں۔", - "HeaderSelectCertificatePath": "سرٹیفکیٹ کا راستہ منتخب کریں۔", + "HeaderRecentlyPlayed": "حال ہی میں کھیلا گیا", + "HeaderRemoveMediaFolder": "میڈیا فولڈر کو ہٹا دیں", + "HeaderSelectCertificatePath": "سرٹیفکیٹ کا راستہ منتخب کریں", "HeaderXmlSettings": "XML ترتیبات", - "LabelSyncPlayHaltPlayback": "مقامی پلے بیک کو روکیں۔", + "LabelSyncPlayHaltPlayback": "مقامی پلے بیک کو روکیں", "HeaderSelectServerCachePathHelp": "براؤز کریں یا سرور کیش فائلوں کے لیے استعمال کرنے کا راستہ درج کریں۔ فولڈر قابل تحریر ہونا چاہیے۔", - "HeaderStopRecording": "ریکارڈنگ بند کریں۔", + "HeaderStopRecording": "ریکارڈنگ بند کریں", "HeaderSubtitleProfiles": "سب ٹائٹل پروفائلز", "HeaderSyncPlaySettings": "SyncPlay کی ترتیبات", "HeaderSyncPlayPlaybackSettings": "پلے بیک", - "HeaderSyncPlayTimeSyncSettings": "وقت کی مطابقت پذیری۔", + "HeaderSyncPlayTimeSyncSettings": "وقت کی مطابقت پذیری", "HeaderTranscodingProfile": "ٹرانس کوڈنگ پروفائل", "HeaderTranscodingProfileHelp": "ٹرانس کوڈنگ پروفائلز شامل کریں یہ بتانے کے لیے کہ جب ٹرانس کوڈنگ کی ضرورت ہو تو کون سے فارمیٹس استعمال کیے جائیں۔", "HeaderUser": "صارف", "HttpsRequiresCert": "محفوظ کنکشنز کو فعال کرنے کے لیے، آپ کو ایک قابل اعتماد SSL سرٹیفکیٹ فراہم کرنے کی ضرورت ہوگی، جیسے Let's Encrypt۔ براہ کرم یا تو سرٹیفکیٹ فراہم کریں، یا محفوظ کنکشن کو غیر فعال کریں۔", "InstantMix": "فوری مکس", "Items": "اشیاء", - "DoNotRecord": "ریکارڈ نہ کریں۔", + "DoNotRecord": "ریکارڈ نہ کریں", "KnownProxiesHelp": "کوما سے الگ کردہ IP پتوں کی فہرست یا معلوم پراکسیز کے میزبان ناموں کی فہرست جو آپ کے Jellyfin مثال سے منسلک ہوتے وقت استعمال ہوتی ہے۔ یہ 'X-Forwarded-For' ہیڈر کا صحیح استعمال کرنے کے لیے ضروری ہے۔ محفوظ کرنے کے بعد دوبارہ شروع کرنے کی ضرورت ہے۔", "DrmChannelsNotImported": "DRM والے چینلز درآمد نہیں کیے جائیں گے۔", - "EnablePhotos": "تصاویر دکھائیں۔", + "EnablePhotos": "تصاویر دکھائیں", "LabelAlbumArtHelp": "PN البم آرٹ کے لیے استعمال کیا جاتا ہے، 'upnp:albumArtURI' پر 'dlna:profileID' وصف کے اندر۔ تصویر کے سائز سے قطع نظر، کچھ آلات کو ایک مخصوص قدر کی ضرورت ہوتی ہے۔", "LabelAlbumArtists": "البم کے فنکار", "LabelAlbumArtMaxHeight": "البم آرٹ کی زیادہ سے زیادہ اونچائی", "LabelAppNameExample": "مثال: Sickbeard، Sonarr", - "LabelSyncPlayLeaveGroupDescription": "SyncPlay کو غیر فعال کریں۔", + "LabelSyncPlayLeaveGroupDescription": "SyncPlay کو غیر فعال کریں", "LabelBaseUrlHelp": "سرور یو آر ایل میں ایک حسب ضرورت ذیلی ڈائرکٹری شامل کریں۔ مثال کے طور پر: http://example.com/<baseurl>", "LabelBlockContentWithTags": "ٹیگز والے آئٹمز کو مسدود کریں", "LabelCachePathHelp": "سرور کیش فائلوں جیسے امیجز کے لیے حسب ضرورت مقام کی وضاحت کریں۔ سرور ڈیفالٹ استعمال کرنے کے لیے خالی چھوڑ دیں۔", @@ -216,12 +216,12 @@ "LabelDashboardTheme": "سرور ڈیش بورڈ تھیم", "LabelDeathDate": "تاریخ وفات", "HeaderForKids": "بچوں کے لیے", - "ButtonResetEasyPassword": "ایزی پن کوڈ کو دوبارہ ترتیب دیں۔", + "ButtonResetEasyPassword": "ایزی پن کوڈ کو دوبارہ ترتیب دیں", "LabelSyncPlayPlaybackDiff": "پلے بیک وقت کا فرق", "LabelDefaultUserHelp": "اس بات کا تعین کریں کہ کنیکٹڈ ڈیوائسز پر کون سی صارف لائبریری ڈسپلے ہونی چاہیے۔ پروفائلز کا استعمال کرتے ہوئے ہر ڈیوائس کے لیے اسے اوور رائیڈ کیا جا سکتا ہے۔", "LabelDisableCustomCss": "سرور سے فراہم کردہ تھیمنگ/برانڈنگ کے لیے حسب ضرورت CSS کوڈ کو غیر فعال کریں۔", "EnableDisplayMirroring": "آئینہ دار ڈسپلے", - "ExitFullscreen": "پوری اسکرین سے باہر نکلیں۔", + "ExitFullscreen": "پوری اسکرین سے باہر نکلیں", "Favorite": "پسندیدہ", "Features": "خصوصیات", "HeaderEasyPinCode": "آسان پن کوڈ", @@ -244,18 +244,18 @@ "LabelHardwareAccelerationTypeHelp": "ہارڈ ویئر ایکسلریشن کے لیے اضافی کنفیگریشن کی ضرورت ہوتی ہے۔", "LabelHardwareEncoding": "ہارڈ ویئر انکوڈنگ", "ButtonBack": "پیچھے", - "ButtonCancel": "منسوخ کریں۔", + "ButtonCancel": "منسوخ کریں", "HeaderActiveDevices": "فعال آلات", "LabelIconMaxResHelp": "'upnp:icon' پراپرٹی کے ذریعے سامنے آنے والے آئیکنز کی زیادہ سے زیادہ ریزولوشن۔", - "LabelInNetworkSignInWithEasyPassword": "میرے ایزی پن کوڈ کے ساتھ ان نیٹ ورک سائن ان کو فعال کریں۔", - "ButtonRename": "نام تبدیل کریں۔", + "LabelInNetworkSignInWithEasyPassword": "میرے ایزی پن کوڈ کے ساتھ ان نیٹ ورک سائن ان کو فعال کریں", + "ButtonRename": "نام تبدیل کریں", "HeaderAdmin": "انتظامیہ", - "ButtonResume": "دوبارہ شروع کریں۔", + "ButtonResume": "دوبارہ شروع کریں", "HeaderApiKey": "API کلید", "EndsAtValue": "{0} پر ختم ہوتا ہے", - "ButtonSelectView": "منظر کو منتخب کریں۔", + "ButtonSelectView": "منظر کو منتخب کریں", "ButtonSend": "بھیجیں", - "HeaderCancelSeries": "سیریز منسوخ کریں۔", + "HeaderCancelSeries": "سیریز منسوخ کریں", "ButtonShutdown": "شٹ ڈاؤن", "HeaderCastAndCrew": "کاسٹ اور عملہ", "ButtonSignIn": "سائن ان", @@ -263,24 +263,24 @@ "ButtonSignOut": "باہر جائیں", "LabelInternetQuality": "انٹرنیٹ کا معیار", "LabelKeepUpTo": "تک رکھیں", - "LabelKodiMetadataEnablePathSubstitution": "راستے کے متبادل کو فعال کریں۔", + "LabelKodiMetadataEnablePathSubstitution": "راستے کے متبادل کو فعال کریں", "LabelLanguage": "زبان", "LabelLibraryPageSizeHelp": "لائبریری کے صفحے پر دکھانے کے لیے آئٹمز کی مقدار سیٹ کریں۔ صفحہ بندی کو غیر فعال کرنے کے لیے 0 پر سیٹ کریں۔", "LabelMaxDaysForNextUp": "'Next Up' میں زیادہ سے زیادہ دن", "LabelLocalCustomCss": "اسٹائل کے لیے حسب ضرورت CSS کوڈ جو صرف اس کلائنٹ پر لاگو ہوتا ہے۔ آپ سرور کسٹم سی ایس ایس کوڈ کو غیر فعال کرنا چاہتے ہیں۔", - "LabelLockItemToPreventChanges": "مستقبل میں ہونے والی تبدیلیوں کو روکنے کے لیے اس آئٹم کو لاک کریں۔", + "LabelLockItemToPreventChanges": "مستقبل میں ہونے والی تبدیلیوں کو روکنے کے لیے اس آئٹم کو لاک کریں", "LabelManufacturer": "مینوفیکچرر", "LabelMaxChromecastBitrate": "Google Cast سٹریمنگ کا معیار", "LabelMaxMuxingQueueSizeHelp": "پیکٹوں کی زیادہ سے زیادہ تعداد جو تمام اسٹریمز کے شروع ہونے کا انتظار کرتے ہوئے بفر کیے جا سکتے ہیں۔ اسے بڑھانے کی کوشش کریں اگر آپ ابھی بھی FFmpeg لاگز میں \"آؤٹ پٹ اسٹریم کے لیے بہت سارے پیکٹ بفر کیے گئے\" کی غلطی کو پورا کرتے ہیں۔ تجویز کردہ قیمت 2048 ہے۔", "LabelMaxResumePercentageHelp": "اگر اس وقت کے بعد روک دیا جائے تو عنوانات کو مکمل طور پر چلایا جاتا ہے۔", "LabelMessageTitle": "پیغام کا عنوان", "HeaderDateIssued": "تاریخ جاری کردی گئی ہے", - "ButtonUseQuickConnect": "کوئیک کنیکٹ استعمال کریں۔", - "ButtonAddServer": "سرور شامل کریں۔", + "ButtonUseQuickConnect": "کوئیک کنیکٹ استعمال کریں", + "ButtonAddServer": "سرور شامل کریں", "Box": "ڈبہ", - "ButtonAddImage": "تصویر شامل کریں۔", - "ButtonAddScheduledTaskTrigger": "ٹرگر شامل کریں۔", - "HeaderDeleteItems": "آئٹمز کو حذف کریں۔", + "ButtonAddImage": "تصویر شامل کریں", + "ButtonAddScheduledTaskTrigger": "ٹرگر شامل کریں", + "HeaderDeleteItems": "آئٹمز کو حذف کریں", "LabelMetadataDownloadersHelp": "اپنے پسندیدہ میٹا ڈیٹا ڈاؤنلوڈرز کو ترجیحی ترتیب میں فعال اور درجہ دیں۔ کم ترجیحی ڈاؤنلوڈرز کو صرف گمشدہ معلومات کو بھرنے کے لیے استعمال کیا جائے گا۔", "LabelMetadataDownloadLanguage": "ڈاؤن لوڈ کی ترجیحی زبان", "LabelMetadataReadersHelp": "اپنے ترجیحی مقامی میٹا ڈیٹا ذرائع کو ترجیحی ترتیب میں درجہ بندی کریں۔ پہلی فائل جو ملی ہے اسے پڑھ لیا جائے گا۔", @@ -289,9 +289,9 @@ "LabelMovieCategories": "فلم کے زمرے", "LabelMoviePrefixHelp": "اگر فلم کے عنوانات پر کوئی سابقہ لاگو ہوتا ہے تو اسے یہاں درج کریں تاکہ سرور اسے صحیح طریقے سے سنبھال سکے۔", "LabelMovieRecordingPath": "مووی ریکارڈنگ کا راستہ", - "LabelNotificationEnabled": "اس اطلاع کو فعال کریں۔", + "LabelNotificationEnabled": "اس اطلاع کو فعال کریں", "LabelNumber": "نمبر", - "HeaderDeleteTaskTrigger": "ٹاسک ٹرگر کو حذف کریں۔", + "HeaderDeleteTaskTrigger": "ٹاسک ٹرگر کو حذف کریں", "LabelNumberOfGuideDays": "ڈاؤن لوڈ کرنے کے لیے گائیڈ ڈیٹا کے دنوں کی تعداد", "LabelNumberOfGuideDaysHelp": "مزید دنوں کے قابل گائیڈ ڈیٹا کو ڈاؤن لوڈ کرنا پہلے سے مزید شیڈول کرنے اور مزید فہرستیں دیکھنے کی صلاحیت فراہم کرتا ہے، لیکن اسے ڈاؤن لوڈ ہونے میں بھی زیادہ وقت لگے گا۔ چینلز کی تعداد کی بنیاد پر آٹو چنے گا۔", "LabelOpenclDeviceHelp": "یہ اوپن سی ایل ڈیوائس ہے جو ٹون میپنگ کے لیے استعمال ہوتی ہے۔ ڈاٹ کی بائیں طرف پلیٹ فارم نمبر ہے، اور دائیں طرف پلیٹ فارم پر ڈیوائس نمبر ہے۔ پہلے سے طے شدہ قدر 0.0 ہے۔ OpenCL ہارڈویئر ایکسلریشن طریقہ پر مشتمل FFmpeg ایپلیکیشن فائل درکار ہے۔", @@ -302,7 +302,7 @@ "LabelPasswordConfirm": "پاس ورڈ کی تصدیق)", "LabelPlayerDimensions": "کھلاڑی کے طول و عرض", "LabelPlayMethod": "کھیلنے کا طریقہ", - "HeaderDetectMyDevices": "میرے آلات کا پتہ لگائیں۔", + "HeaderDetectMyDevices": "میرے آلات کا پتہ لگائیں", "LabelPostProcessor": "پوسٹ پروسیسنگ درخواست", "LabelProfileCodecs": "کوڈیکس", "LabelProfileCodecsHelp": "کوما سے الگ کیا گیا۔ اسے تمام کوڈیکس پر لاگو کرنے کے لیے خالی چھوڑا جا سکتا ہے۔", @@ -318,23 +318,23 @@ "ClientSettings": "کلائنٹ کی ترتیبات", "ColorSpace": "رنگین جگہ", "DeleteImageConfirmation": "کیا آپ واقعی اس تصویر کو حذف کرنا چاہتے ہیں؟", - "DeleteUser": "صارف کو حذف کریں۔", + "DeleteUser": "صارف کو حذف کریں", "LabelRemoteClientBitrateLimitHelp": "نیٹ ورک کے تمام آلات کے لیے ایک اختیاری فی اسٹریم بٹریٹ کی حد۔ یہ آلات کو آپ کے انٹرنیٹ کنکشن سے زیادہ بٹریٹ کی درخواست کرنے سے روکنے کے لیے مفید ہے۔ اس کے نتیجے میں آپ کے سرور پر سی پی یو کا بوجھ بڑھ سکتا ہے تاکہ پرواز پر ویڈیوز کو کم بٹریٹ پر ٹرانس کوڈ کیا جا سکے۔", "LabelRepositoryUrl": "ذخیرہ URL", "LabelRequireHttpsHelp": "اگر چیک کیا جاتا ہے، تو سرور خود بخود HTTP پر تمام درخواستوں کو HTTPS پر بھیج دے گا۔ اگر سرور HTTPS پر نہیں سن رہا ہے تو اس کا کوئی اثر نہیں ہوگا۔", "LabelSaveLocalMetadataHelp": "آرٹ ورک کو میڈیا فولڈرز میں محفوظ کرنے سے وہ ایسی جگہ پر رکھے جائیں گے جہاں ان میں آسانی سے ترمیم کی جا سکے۔", "LabelSize": "سائز", - "LabelSkipIfAudioTrackPresent": "اگر ڈیفالٹ آڈیو ٹریک ڈاؤن لوڈ کی زبان سے میل کھاتا ہے تو اسے چھوڑ دیں۔", + "LabelSkipIfAudioTrackPresent": "اگر ڈیفالٹ آڈیو ٹریک ڈاؤن لوڈ کی زبان سے میل کھاتا ہے تو اسے چھوڑ دیں", "LabelSkipIfAudioTrackPresentHelp": "آڈیو زبان سے قطع نظر تمام ویڈیوز کے ذیلی عنوانات کو یقینی بنانے کے لیے اس سے نشان ہٹا دیں۔", - "LabelSkipIfGraphicalSubsPresent": "اگر ویڈیو پہلے ہی ایمبیڈڈ سب ٹائٹلز پر مشتمل ہے تو اسے چھوڑ دیں۔", + "LabelSkipIfGraphicalSubsPresent": "اگر ویڈیو پہلے ہی ایمبیڈڈ سب ٹائٹلز پر مشتمل ہے تو اسے چھوڑ دیں", "LabelSkipIfGraphicalSubsPresentHelp": "ذیلی عنوانات کے متنی ورژن رکھنے کے نتیجے میں زیادہ موثر ترسیل ہوگی اور ویڈیو ٹرانس کوڈنگ کے امکانات کم ہوجائیں گے۔", - "LabelSlowResponseEnabled": "اگر سرور جواب دینے میں سست تھا تو انتباہی پیغام کو لاگ کریں۔", + "LabelSlowResponseEnabled": "اگر سرور جواب دینے میں سست تھا تو انتباہی پیغام کو لاگ کریں", "LabelSonyAggregationFlagsHelp": "'urn:schemas-sonycom:av' نام کی جگہ میں 'aggregationFlags' عنصر کے مواد کا تعین کریں۔", "LabelSubtitleDownloaders": "سب ٹائٹل ڈاؤنلوڈرز", "LabelSupportedMediaTypes": "تعاون یافتہ میڈیا کی اقسام", - "LabelSyncPlayAccessJoinGroups": "صارف کو گروپوں میں شامل ہونے کی اجازت دیں۔", - "LabelSyncPlayLeaveGroup": "گروپ چھوڑ دیں۔", - "LabelSyncPlayResumePlayback": "مقامی پلے بیک دوبارہ شروع کریں۔", + "LabelSyncPlayAccessJoinGroups": "صارف کو گروپوں میں شامل ہونے کی اجازت دیں", + "LabelSyncPlayLeaveGroup": "گروپ چھوڑ دیں", + "LabelSyncPlayResumePlayback": "مقامی پلے بیک دوبارہ شروع کریں", "LabelSyncPlayTimeSyncDevice": "وقت کے ساتھ مطابقت پذیری", "LabelSyncPlayTimeSyncOffset": "ٹائم آفسیٹ", "LabelSyncPlaySettingsExtraTimeOffset": "اضافی وقت آفسیٹ", @@ -349,7 +349,7 @@ "LabelSyncPlaySettingsMinDelaySkipToSync": "SkipToSync کم از کم تاخیر", "LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "پلے بیک میں کم از کم تاخیر (ms میں) جس کے بعد SkipToSync پلے بیک پوزیشن کو درست کرنے کی کوشش کرتا ہے۔", "LabelSyncPlaySettingsSpeedToSyncHelp": "مطابقت پذیری کی اصلاح کا طریقہ جو پلے بیک کو تیز کرنے پر مشتمل ہوتا ہے۔ مطابقت پذیری کی اصلاح کا فعال ہونا ضروری ہے۔", - "LabelSyncPlaySettingsSkipToSync": "SkipToSync کو فعال کریں۔", + "LabelSyncPlaySettingsSkipToSync": "SkipToSync کو فعال کریں", "LabelSyncPlaySettingsSkipToSyncHelp": "مطابقت پذیری کی اصلاح کا طریقہ جو تخمینہ شدہ پوزیشن کی تلاش پر مشتمل ہے۔ مطابقت پذیری کی اصلاح کا فعال ہونا ضروری ہے۔", "LabelTextColor": "متن کا رنگ", "LabelTextWeight": "متن کا وزن", @@ -358,7 +358,7 @@ "DeinterlaceMethodHelp": "سافٹ ویئر کو انٹر لیسڈ مواد کو ٹرانس کوڈنگ کرتے وقت استعمال کرنے کے لیے deinterlacing طریقہ منتخب کریں۔ جب ہارڈویئر ایکسلریشن کو سپورٹ کرنے والے ہارڈویئر ڈیانٹرلیسنگ کو فعال کیا جاتا ہے تو اس ترتیب کے بجائے ہارڈویئر ڈیینٹرلیسر استعمال کیا جائے گا۔", "HeaderSendMessage": "پیغام بھیجیں", "LabelXDlnaCapHelp": "'urn:schemas-dlna-org:device-1-0' نام کی جگہ میں 'X_DLNACAP' عنصر کے مواد کا تعین کریں۔", - "HeaderSetupLibrary": "اپنی میڈیا لائبریریاں ترتیب دیں۔", + "HeaderSetupLibrary": "اپنی میڈیا لائبریریاں ترتیب دیں", "HeaderUpcomingOnTV": "ٹی وی پر آنے والا", "HeaderVideoType": "ویڈیو کی قسم", "Help": "مدد", @@ -371,7 +371,7 @@ "LabelDiscNumber": "ڈسک نمبر", "LabelDropShadow": "ڈراپ شیڈو", "LabelEmbedAlbumArtDidlHelp": "کچھ آلات البم آرٹ حاصل کرنے کے لیے اس طریقہ کو ترجیح دیتے ہیں۔ دوسرے اس اختیار کے فعال ہونے کے ساتھ کھیلنے میں ناکام ہو سکتے ہیں۔", - "LabelEnableDlnaPlayTo": "DLNA خصوصیت 'Play To' کو فعال کریں۔", + "LabelEnableDlnaPlayTo": "DLNA خصوصیت 'Play To' کو فعال کریں", "LabelTonemappingDesatHelp": "چمک کی اس سطح سے تجاوز کرنے والی ہائی لائٹس کے لیے ڈی سیچوریشن کا اطلاق کریں۔ پیرامیٹر جتنا زیادہ ہوگا، رنگ کی معلومات اتنی ہی زیادہ محفوظ ہوں گی۔ یہ ترتیب سپر ہائی لائٹس کے لیے غیر فطری طور پر اڑنے والے رنگوں کو روکنے میں مدد کرتی ہے، اس کی بجائے (آسانی سے) سفید میں تبدیل ہو کر۔ یہ تصاویر کو زیادہ قدرتی محسوس کرتا ہے، حد سے باہر رنگوں کے بارے میں معلومات کو کم کرنے کی قیمت پر۔ تجویز کردہ اور طے شدہ اقدار 0 اور 0.5 ہیں۔", "LabelEnableHardwareDecodingFor": "اس کے لیے ہارڈویئر ڈی کوڈنگ کو فعال کریں", "LabelTonemappingParam": "ٹون میپنگ پیرم", @@ -440,13 +440,13 @@ "OptionAllowContentDownloadHelp": "صارفین میڈیا کو ڈاؤن لوڈ کر سکتے ہیں اور اسے اپنے آلات پر اسٹور کر سکتے ہیں۔ یہ مطابقت پذیری کی خصوصیت کی طرح نہیں ہے۔ کتابی لائبریریوں کو مناسب طریقے سے کام کرنے کے لیے اسے فعال کرنے کی ضرورت ہوتی ہے۔", "OptionAllowLinkSharingHelp": "صرف میڈیا کی معلومات پر مشتمل ویب صفحات کا اشتراک کیا جاتا ہے۔ میڈیا فائلوں کو کبھی بھی عوامی طور پر شیئر نہیں کیا جاتا ہے۔ شیئرز کا وقت محدود ہے اور {0} دنوں کے بعد ختم ہو جائے گا۔", "OptionAllowMediaPlaybackTranscodingHelp": "ٹرانس کوڈنگ تک رسائی کو محدود کرنا غیر تعاون یافتہ میڈیا فارمیٹس کی وجہ سے کلائنٹس میں پلے بیک کی ناکامی کا سبب بن سکتا ہے۔", - "OptionAllowRemoteControlOthers": "دوسرے صارفین کے ریموٹ کنٹرول کی اجازت دیں۔", + "OptionAllowRemoteControlOthers": "دوسرے صارفین کے ریموٹ کنٹرول کی اجازت دیں", "LabelMaxBackdropsPerItem": "فی آئٹم بیک ڈراپس کی زیادہ سے زیادہ تعداد", - "OptionAllowVideoPlaybackRemuxing": "ویڈیو پلے بیک کی اجازت دیں جس کو دوبارہ انکوڈنگ کے بغیر تبدیلی کی ضرورت ہے۔", - "OptionDateShowAdded": "تاریخ شو شامل کیا گیا۔", - "OptionDateAddedFileTime": "فائل بنانے کی تاریخ استعمال کریں۔", + "OptionAllowVideoPlaybackRemuxing": "ویڈیو پلے بیک کی اجازت دیں جس کو دوبارہ انکوڈنگ کے بغیر تبدیلی کی ضرورت ہے", + "OptionDateShowAdded": "تاریخ شو شامل کیا گیا", + "OptionDateAddedFileTime": "فائل بنانے کی تاریخ استعمال کریں", "OptionDisableUserHelp": "سرور اس صارف سے کسی بھی کنکشن کی اجازت نہیں دے گا۔ موجودہ رابطے اچانک ختم ہو جائیں گے۔", - "OptionEnableExternalContentInSuggestions": "تجاویز میں بیرونی مواد کو فعال کریں۔", + "OptionEnableExternalContentInSuggestions": "تجاویز میں بیرونی مواد کو فعال کریں", "LabelMaxStreamingBitrate": "زیادہ سے زیادہ سلسلہ بندی کا معیار", "LabelMaxStreamingBitrateHelp": "سلسلہ بندی کرتے وقت زیادہ سے زیادہ بٹ ریٹ کی وضاحت کریں۔", "LabelMessageText": "پیغام کا متن", @@ -468,42 +468,42 @@ "LabelMinAudiobookResumeHelp": "اگر اس وقت سے پہلے روک دیا جائے تو عنوانات کو بغیر کھیلے ہوئے فرض کیا جاتا ہے۔", "PlaybackErrorPlaceHolder": "یہ فزیکل میڈیا کے لیے پلیس ہولڈر ہے جسے جیلیفن نہیں چلا سکتا۔ براہ کرم چلانے کے لیے ڈسک داخل کریں۔", "PlaybackRate": "پلے بیک کی رفتار", - "PlayNextEpisodeAutomatically": "اگلا ایپی سوڈ خود بخود چلائیں۔", + "PlayNextEpisodeAutomatically": "اگلا ایپی سوڈ خود بخود چلائیں", "PleaseAddAtLeastOneFolder": "براہ کرم 'فولڈرز' سیکشن میں '+' بٹن پر کلک کرکے اس لائبریری میں کم از کم ایک فولڈر شامل کریں۔", "PleaseConfirmPluginInstallation": "براہ کرم ٹھیک پر کلک کریں اس بات کی تصدیق کرنے کے لیے کہ آپ نے اوپر پڑھ لیا ہے اور پلگ ان کی تنصیب کے ساتھ آگے بڑھنا چاہتے ہیں۔", "PosterCard": "پوسٹر کارڈ", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "اگر دستیاب ہو تو ایمبیڈڈ میٹا ڈیٹا سے ایپی سوڈ کی معلومات استعمال کریں۔", "LabelMusicStreamingTranscodingBitrate": "میوزک ٹرانس کوڈنگ بٹ ریٹ", "LabelNewPassword": "نیا پاس ورڈ", - "EnableTonemapping": "ٹون میپنگ کو فعال کریں۔", + "EnableTonemapping": "ٹون میپنگ کو فعال کریں", "PreferEmbeddedTitlesOverFileNamesHelp": "جب کوئی انٹرنیٹ میٹا ڈیٹا یا مقامی میٹا ڈیٹا دستیاب نہ ہو تو استعمال کرنے کے لیے ڈسپلے ٹائٹل کا تعین کریں۔", "AllowEmbeddedSubtitlesHelp": "میڈیا کنٹینرز میں پیک کیے گئے سب ٹائٹلز کو غیر فعال کریں۔ مکمل لائبریری ریفریش کی ضرورت ہے۔", "PluginFromRepo": "{0} مخزن سے {1}", "QuickConnectInvalidCode": "غلط کوئیک کنیکٹ کوڈ", - "QuickConnectNotActive": "Quick Connect اس سرور پر فعال نہیں ہے۔", - "QuickConnectNotAvailable": "اپنے سرور ایڈمنسٹریٹر سے فوری کنیکٹ کو فعال کرنے کے لیے کہیں۔", + "QuickConnectNotActive": "Quick Connect اس سرور پر فعال نہیں ہے", + "QuickConnectNotAvailable": "اپنے سرور ایڈمنسٹریٹر سے فوری کنیکٹ کو فعال کرنے کے لیے کہیں", "RecordingCancelled": "ریکارڈنگ منسوخ کر دی گئی۔", "Recordings": "ریکارڈنگز", "RecordingScheduled": "ریکارڈنگ کا شیڈول۔", "RecordSeries": "ریکارڈ سیریز", "RefreshDialogHelp": "میٹا ڈیٹا کو سیٹنگز اور انٹرنیٹ سروسز کی بنیاد پر ریفریش کیا جاتا ہے جو ڈیش بورڈ میں فعال ہیں۔", "ButtonLibraryAccess": "لائبریری تک رسائی", - "RememberAudioSelections": "پچھلی آئٹم کی بنیاد پر آڈیو ٹریک سیٹ کریں۔", + "RememberAudioSelections": "پچھلی آئٹم کی بنیاد پر آڈیو ٹریک سیٹ کریں", "RememberAudioSelectionsHelp": "آڈیو ٹریک کو آخری ویڈیو کے قریب ترین میچ پر سیٹ کرنے کی کوشش کریں۔", - "RememberSubtitleSelections": "پچھلی آئٹم کی بنیاد پر سب ٹائٹل ٹریک سیٹ کریں۔", + "RememberSubtitleSelections": "پچھلی آئٹم کی بنیاد پر سب ٹائٹل ٹریک سیٹ کریں", "LabelOriginalAspectRatio": "اصل پہلو تناسب", "LabelOverview": "جائزہ", "RememberSubtitleSelectionsHelp": "سب ٹائٹل ٹریک کو آخری ویڈیو کے قریب ترین میچ پر سیٹ کرنے کی کوشش کریں۔", - "RemoveFromCollection": "مجموعہ سے ہٹا دیں۔", + "RemoveFromCollection": "مجموعہ سے ہٹا دیں", "SaveChanges": "تبدیلیاں محفوظ کرو", - "ScanForNewAndUpdatedFiles": "نئی اور اپ ڈیٹ فائلوں کے لیے اسکین کریں۔", + "ScanForNewAndUpdatedFiles": "نئی اور اپ ڈیٹ فائلوں کے لیے اسکین کریں", "ScreenResolution": "سکرین ریزولوشن", - "SearchForMissingMetadata": "گمشدہ میٹا ڈیٹا کی تلاش کریں۔", + "SearchForMissingMetadata": "گمشدہ میٹا ڈیٹا کی تلاش کریں", "SearchResults": "تلاش کے نتائج", "Season": "موسم", "SeriesRecordingScheduled": "سیریز کی ریکارڈنگ شیڈول کی گئی۔", "SettingsWarning": "ان اقدار کو تبدیل کرنے سے عدم استحکام یا کنیکٹیویٹی کی ناکامی ہو سکتی ہے۔ اگر آپ کو کوئی مسئلہ درپیش ہے، تو ہم انہیں واپس ڈیفالٹ میں تبدیل کرنے کی تجویز کرتے ہیں۔", - "ShowTitle": "عنوان دکھائیں۔", + "ShowTitle": "عنوان دکھائیں", "Shuffle": "شفل", "SimultaneousConnectionLimitHelp": "ایک ساتھ چلنے والے اسٹریمز کی زیادہ سے زیادہ تعداد۔ بغیر کسی حد کے 0 درج کریں۔", "SkipEpisodesAlreadyInMyLibraryHelp": "ایپی سوڈز کا موازنہ سیزن اور ایپی سوڈ نمبرز کا استعمال کرتے ہوئے کیا جائے گا، جب دستیاب ہو۔", @@ -531,14 +531,14 @@ "TagsValue": "ٹیگز: {0}", "TextSent": "متن بھیج دیا گیا۔", "ThemeVideos": "تھیم ویڈیوز", - "TheseSettingsAffectSubtitlesOnThisDevice": "یہ ترتیبات اس ڈیوائس پر سب ٹائٹلز کو متاثر کرتی ہیں۔", + "TheseSettingsAffectSubtitlesOnThisDevice": "یہ ترتیبات اس ڈیوائس پر سب ٹائٹلز کو متاثر کرتی ہیں", "TitleHostingSettings": "ہوسٹنگ کی ترتیبات", "TitlePlayback": "پلے بیک", "TonemappingRangeHelp": "آؤٹ پٹ رنگ کی حد منتخب کریں۔ آٹو ان پٹ رینج کے برابر ہے۔", "TypeOptionPluralSeries": "ٹی وی کے پروگرام", "Typewriter": "ٹائپ رائٹر", - "Unmute": "چالو کریں۔", - "Unplayed": "کھیلا نہیں گیا۔", + "Unmute": "چالو کریں", + "Unplayed": "کھیلا نہیں گیا", "Unrated": "غیر درجہ بندی", "ButtonPause": "توقف", "LabelTonemappingDesat": "ٹون میپنگ ڈیسیٹ", @@ -546,14 +546,14 @@ "UnsupportedPlayback": "جیلیفن DRM کے ذریعے محفوظ کردہ مواد کو ڈکرپٹ نہیں کر سکتا لیکن تمام مواد کو اس سے قطع نظر آزمایا جائے گا، بشمول محفوظ عنوانات۔ کچھ فائلیں انکرپشن یا دیگر غیر تعاون یافتہ خصوصیات، جیسے انٹرایکٹو ٹائٹلز کی وجہ سے مکمل طور پر سیاہ دکھائی دے سکتی ہیں۔", "LabelServerHost": "میزبان", "LabelServerNameHelp": "یہ نام سرور کی شناخت کے لیے استعمال کیا جائے گا اور سرور کے میزبان نام پر ڈیفالٹ ہوگا۔", - "Upload": "اپ لوڈ کریں۔", + "Upload": "اپ لوڈ کریں", "LabelSkipForwardLength": "آگے کی لمبائی کو چھوڑیں", - "UseDoubleRateDeinterlacing": "ڈانٹرلیسنگ کرتے وقت فریم کی شرح کو دوگنا کریں۔", + "UseDoubleRateDeinterlacing": "ڈانٹرلیسنگ کرتے وقت فریم کی شرح کو دوگنا کریں", "HeaderIdentifyItemHelp": "تلاش کا ایک یا زیادہ معیار درج کریں۔ تلاش کے نتائج کو بڑھانے کے لیے معیار کو ہٹا دیں۔", "LabelSpecialSeasonsDisplayName": "خصوصی سیزن ڈسپلے نام", "LabelSSDPTracingFilter": "SSDP فلٹر", "LabelStartWhenPossible": "جب ممکن ہو شروع کریں", - "LabelEnableIP4": "IPv4 کو فعال کریں۔", + "LabelEnableIP4": "IPv4 کو فعال کریں", "EnableExternalVideoPlayersHelp": "ویڈیو پلے بیک شروع کرنے پر ایک بیرونی پلیئر مینو دکھایا جائے گا۔", "LabelWeb": "ویب", "UseDoubleRateDeinterlacingHelp": "یہ سیٹنگ ڈی انٹرلیسنگ کے وقت فیلڈ ریٹ کا استعمال کرتی ہے، جسے اکثر باب ڈانٹرلیسنگ کہا جاتا ہے، جو ویڈیو کے فریم ریٹ کو دوگنا کر دیتا ہے تاکہ مکمل حرکت فراہم کی جا سکے جیسا کہ آپ ٹی وی پر انٹر لیس ویڈیو دیکھتے وقت دیکھیں گے۔", @@ -567,18 +567,18 @@ "Writer": "لکھاری", "Writers": "لکھنے والے", "XmlDocumentAttributeListHelp": "یہ اوصاف ہر XML جواب کے بنیادی عنصر پر لاگو ہوتے ہیں۔", - "ButtonScanAllLibraries": "تمام لائبریریوں کو اسکین کریں۔", + "ButtonScanAllLibraries": "تمام لائبریریوں کو اسکین کریں", "Data": "ڈیٹا", "LabelPlaylist": "پلے لسٹ", "LabelUser": "صارف", "LabelUserMaxActiveSessions": "بیک وقت یوزر سیشنز کی زیادہ سے زیادہ تعداد", "XmlTvKidsCategoriesHelp": "ان زمروں والے پروگرام بچوں کے پروگرام کے طور پر دکھائے جائیں گے۔ متعدد کو '|' سے الگ کریں۔", - "Delete": "حذف کریں۔", + "Delete": "حذف کریں", "HeaderTracks": "ٹریکس", "XmlTvMovieCategoriesHelp": "ان زمروں والے پروگرام فلموں کے طور پر دکھائے جائیں گے۔ متعدد کو '|' سے الگ کریں۔", "XmlTvNewsCategoriesHelp": "ان زمروں کے پروگرام خبروں کے پروگرام کے طور پر دکھائے جائیں گے۔ متعدد کو '|' سے الگ کریں۔", "XmlTvSportsCategoriesHelp": "ان زمروں والے پروگرام کھیلوں کے پروگرام کے طور پر دکھائے جائیں گے۔ متعدد کو '|' سے الگ کریں۔", - "HeaderSelectFallbackFontPath": "فال بیک فونٹ فولڈر پاتھ منتخب کریں۔", + "HeaderSelectFallbackFontPath": "فال بیک فونٹ فولڈر پاتھ منتخب کریں", "Audio": "آڈیو", "CommunityRating": "کمیونٹی کی درجہ بندی", "LabelFallbackFontPath": "فال بیک فونٹ فولڈر کا راستہ", @@ -586,27 +586,27 @@ "List": "فہرست", "OptionEveryday": "ہر روز", "Movie": "فلم", - "CopyStreamURL": "سٹریم یو آر ایل کاپی کریں۔", + "CopyStreamURL": "سٹریم یو آر ایل کاپی کریں", "LabelAirsAfterSeason": "موسم کے بعد نشر", "Menu": "مینو", - "LabelEnableIP6": "IPv6 کو فعال کریں۔", + "LabelEnableIP6": "IPv6 کو فعال کریں", "LabelSyncPlayNewGroup": "نیا گروپ", "LabelTranscodingProgress": "ٹرانس کوڈنگ کی پیشرفت", "MessagePleaseEnsureInternetMetadata": "براہ کرم یقینی بنائیں کہ انٹرنیٹ میٹا ڈیٹا کی ڈاؤن لوڈنگ فعال ہے۔", "MessageConfirmDeleteTunerDevice": "کیا آپ واقعی اس آلہ کو حذف کرنا چاہتے ہیں؟", - "SaveSubtitlesIntoMediaFolders": "میڈیا فولڈرز میں سب ٹائٹلز محفوظ کریں۔", + "SaveSubtitlesIntoMediaFolders": "میڈیا فولڈرز میں سب ٹائٹلز محفوظ کریں", "HeaderSecondsValue": "{0} سیکنڈز", - "HeaderAppearsOn": "پر ظاہر ہوتا ہے۔", + "HeaderAppearsOn": "پر ظاہر ہوتا ہے", "LabelChromecastVersion": "گوگل کاسٹ ورژن", "ItemCount": "{0} آئٹمز", - "HeaderSelectServerCachePath": "سرور کیشے کا راستہ منتخب کریں۔", + "HeaderSelectServerCachePath": "سرور کیشے کا راستہ منتخب کریں", "ButtonGotIt": "یہ مل گیا", "HeaderProfileServerSettingsHelp": "یہ اقدار کنٹرول کرتی ہیں کہ سرور کس طرح اپنے آپ کو کلائنٹس کے سامنے پیش کرے گا۔", "LeaveBlankToNotSetAPassword": "آپ کوئی پاس ورڈ سیٹ نہ کرنے کے لیے اس فیلڈ کو خالی چھوڑ سکتے ہیں۔", - "DisplayMissingEpisodesWithinSeasons": "سیزن کے اندر غائب ایپی سوڈز دکھائیں۔", + "DisplayMissingEpisodesWithinSeasons": "سیزن کے اندر غائب ایپی سوڈز دکھائیں", "HeaderSeriesStatus": "سیریز کی حیثیت", "ButtonArrowRight": "دائیں", - "OptionIgnoreTranscodeByteRangeRequests": "ٹرانس کوڈ بائٹ رینج کی درخواستوں کو نظر انداز کریں۔", + "OptionIgnoreTranscodeByteRangeRequests": "ٹرانس کوڈ بائٹ رینج کی درخواستوں کو نظر انداز کریں", "MessageInvalidUser": "غلط صارف نام یا پاس ورڈ. دوبارہ کوشش کریں.", "LabelSyncPlaySyncMethod": "مطابقت پذیری کا طریقہ", "RecommendationStarring": "ستارہ {0}", @@ -619,9 +619,9 @@ "PasswordResetConfirmation": "کیا آپ واقعی پاس ورڈ دوبارہ ترتیب دینا چاہتے ہیں؟", "LabelDownMixAudioScale": "ڈاؤن مکسنگ کرتے وقت آڈیو بوسٹ", "MessageNoServersAvailable": "خودکار سرور دریافت کا استعمال کرتے ہوئے کوئی سرور نہیں ملا۔", - "HeaderAddUser": "صارف شامل کریں۔", + "HeaderAddUser": "صارف شامل کریں", "LabelEnableIP4Help": "IPv4 فعالیت کو فعال کریں۔", - "LabelGroupMoviesIntoCollections": "فلموں کو مجموعوں میں گروپ کریں۔", + "LabelGroupMoviesIntoCollections": "فلموں کو مجموعوں میں گروپ کریں", "LabelStatus": "حالت", "LabelDisplayName": "ڈسپلے کا نام", "HeaderIdentification": "شناخت", @@ -641,38 +641,38 @@ "LabelDirectStreamingInfo": "براہ راست سلسلہ بندی کی معلومات", "LabelRemuxingInfo": "Remuxing معلومات", "LabelSyncPlayInfo": "SyncPlay کی معلومات", - "ReplaceAllMetadata": "تمام میٹا ڈیٹا کو تبدیل کریں۔", - "PreferFmp4HlsContainer": "fMP4-HLS میڈیا کنٹینر کو ترجیح دیں۔", + "ReplaceAllMetadata": "تمام میٹا ڈیٹا کو تبدیل کریں", + "PreferFmp4HlsContainer": "fMP4-HLS میڈیا کنٹینر کو ترجیح دیں", "PreferFmp4HlsContainerHelp": "FMP4 کو HLS کے لیے بطور ڈیفالٹ کنٹینر استعمال کرنے کو ترجیح دیں، جس سے معاون آلات پر HEVC مواد کو براہ راست نشر کرنا ممکن ہو سکے۔", "LabelAllowedAudioChannels": "زیادہ سے زیادہ اجازت یافتہ آڈیو چینلز", "LabelSelectMono": "مونو", "YoutubeNotFound": "ویڈیو نہیں ملی.", "MessageChromecastConnectionError": "آپ کا Google Cast وصول کنندہ جیلیفن سرور سے رابطہ کرنے سے قاصر ہے۔ براہ کرم کنکشن چیک کریں اور دوبارہ کوشش کریں۔", "MessagePlaybackError": "آپ کے Google Cast وصول کنندہ پر اس فائل کو چلانے میں ایک خرابی تھی۔", - "EnableVppTonemapping": "VPP ٹون میپنگ کو فعال کریں۔", - "Controls": "کنٹرول کرتا ہے۔", - "LabelEnableGamepad": "گیم پیڈ کو فعال کریں۔", + "EnableVppTonemapping": "VPP ٹون میپنگ کو فعال کریں", + "Controls": "کنٹرول کرتا ہے", + "LabelEnableGamepad": "گیم پیڈ کو فعال کریں", "LabelPostProcessorArgumentsHelp": "{path} کو ریکارڈنگ فائل کے راستے کے طور پر استعمال کریں۔", - "AudioCodecNotSupported": "آڈیو کوڈیک تعاون یافتہ نہیں ہے۔", - "SubtitleCodecNotSupported": "سب ٹائٹل کوڈیک تعاون یافتہ نہیں ہے۔", - "VideoCodecNotSupported": "ویڈیو کوڈیک تعاون یافتہ نہیں ہے۔", - "AudioBitrateNotSupported": "آڈیو کا بٹ ریٹ تعاون یافتہ نہیں ہے۔", - "VideoResolutionNotSupported": "ویڈیو کی ریزولوشن تعاون یافتہ نہیں ہے۔", - "AudioProfileNotSupported": "آڈیو کوڈیک کا پروفائل تعاون یافتہ نہیں ہے۔", - "AudioSampleRateNotSupported": "آڈیو کے نمونے کی شرح تعاون یافتہ نہیں ہے۔", - "AnamorphicVideoNotSupported": "Anamorphic ویڈیو تعاون یافتہ نہیں ہے۔", - "InterlacedVideoNotSupported": "باہم منسلک ویڈیو تعاون یافتہ نہیں ہے۔", - "SecondaryAudioNotSupported": "ثانوی آڈیو ٹریکس تعاون یافتہ نہیں ہیں۔", - "RefFramesNotSupported": "حوالہ فریم تعاون یافتہ نہیں ہیں۔", - "VideoBitDepthNotSupported": "ویڈیو کی تھوڑا سا گہرائی تعاون یافتہ نہیں ہے۔", - "VideoFramerateNotSupported": "ویڈیو کا فریم ریٹ تعاون یافتہ نہیں ہے۔", - "VideoLevelNotSupported": "ویڈیو کوڈیک کی سطح تعاون یافتہ نہیں ہے۔", - "VideoProfileNotSupported": "ویڈیو کوڈیک کا پروفائل تعاون یافتہ نہیں ہے۔", + "AudioCodecNotSupported": "آڈیو کوڈیک تعاون یافتہ نہیں ہے", + "SubtitleCodecNotSupported": "سب ٹائٹل کوڈیک تعاون یافتہ نہیں ہے", + "VideoCodecNotSupported": "ویڈیو کوڈیک تعاون یافتہ نہیں ہے", + "AudioBitrateNotSupported": "آڈیو کا بٹ ریٹ تعاون یافتہ نہیں ہے", + "VideoResolutionNotSupported": "ویڈیو کی ریزولوشن تعاون یافتہ نہیں ہے", + "AudioProfileNotSupported": "آڈیو کوڈیک کا پروفائل تعاون یافتہ نہیں ہے", + "AudioSampleRateNotSupported": "آڈیو کے نمونے کی شرح تعاون یافتہ نہیں ہے", + "AnamorphicVideoNotSupported": "Anamorphic ویڈیو تعاون یافتہ نہیں ہے", + "InterlacedVideoNotSupported": "باہم منسلک ویڈیو تعاون یافتہ نہیں ہے", + "SecondaryAudioNotSupported": "ثانوی آڈیو ٹریکس تعاون یافتہ نہیں ہیں", + "RefFramesNotSupported": "حوالہ فریم تعاون یافتہ نہیں ہیں", + "VideoBitDepthNotSupported": "ویڈیو کی تھوڑا سا گہرائی تعاون یافتہ نہیں ہے", + "VideoFramerateNotSupported": "ویڈیو کا فریم ریٹ تعاون یافتہ نہیں ہے", + "VideoLevelNotSupported": "ویڈیو کوڈیک کی سطح تعاون یافتہ نہیں ہے", + "VideoProfileNotSupported": "ویڈیو کوڈیک کا پروفائل تعاون یافتہ نہیں ہے", "LabelHardwareEncodingOptions": "ہارڈ ویئر انکوڈنگ کے اختیارات", - "DirectPlayError": "براہ راست پلے بیک شروع کرنے میں ایک خرابی تھی۔", + "DirectPlayError": "براہ راست پلے بیک شروع کرنے میں ایک خرابی تھی", "LabelOriginalTitle": "اصل عنوان", "BehindTheScenes": "پردے کے پیچھے", - "OptionAllowVideoPlaybackTranscoding": "ویڈیو پلے بیک کی اجازت دیں جس میں ٹرانس کوڈنگ کی ضرورت ہوتی ہے۔", + "OptionAllowVideoPlaybackTranscoding": "ویڈیو پلے بیک کی اجازت دیں جس میں ٹرانس کوڈنگ کی ضرورت ہوتی ہے", "Settings": "ترتیبات", "DeletedScene": "حذف شدہ منظر", "Framerate": "فریم کی شرح", @@ -685,12 +685,12 @@ "LabelVppTonemappingBrightnessHelp": "وی پی پی ٹون میپنگ میں برائٹنس گین کا اطلاق کریں۔ تجویز کردہ اور طے شدہ دونوں قدریں 0 ہیں۔", "LabelVppTonemappingContrast": "VPP ٹون میپنگ کے برعکس فائدہ", "LabelVppTonemappingContrastHelp": "VPP ٹون میپنگ میں کنٹراسٹ گین کا اطلاق کریں۔ تجویز کردہ اور پہلے سے طے شدہ اقدار 1.2 اور 1 ہیں۔", - "VideoRangeTypeNotSupported": "ویڈیو کی رینج کی قسم تعاون یافتہ نہیں ہے۔", + "VideoRangeTypeNotSupported": "ویڈیو کی رینج کی قسم تعاون یافتہ نہیں ہے", "LabelVideoRangeType": "ویڈیو رینج کی قسم", "MediaInfoVideoRangeType": "ویڈیو رینج کی قسم", "MediaInfoDoViTitle": "ڈی وی ٹائٹل", "MediaInfoRpuPresentFlag": "DV rpu پیش سیٹ پرچم", - "OptionAutomaticallyGroupSeries": "خودکار طور پر سیریز کو ضم کریں جو متعدد فولڈرز میں پھیلی ہوئی ہیں۔", + "OptionAutomaticallyGroupSeries": "خودکار طور پر سیریز کو ضم کریں جو متعدد فولڈرز میں پھیلی ہوئی ہیں", "MediaInfoBlPresentFlag": "DV bl پیش سیٹ پرچم", "LabelUseNotificationServices": "درج ذیل خدمات کا استعمال کریں", "MediaInfoDvBlSignalCompatibilityId": "DV bl سگنل مطابقت کی شناخت", @@ -699,10 +699,10 @@ "HeaderLatestRecordings": "تازہ ترین ریکارڈنگز", "LabelSubtitlePlaybackMode": "سب ٹائٹل موڈ", "LabelHardwareAccelerationType": "ہارڈ وئر کی صلاحیت بہتر بنانا", - "PreferEmbeddedTitlesOverFileNames": "فائل ناموں پر ایمبیڈڈ ٹائٹلز کو ترجیح دیں۔", + "PreferEmbeddedTitlesOverFileNames": "فائل ناموں پر ایمبیڈڈ ٹائٹلز کو ترجیح دیں", "OptionPlayCount": "گنتی کھیلیں", "LabelEnableDlnaPlayToHelp": "اپنے نیٹ ورک کے اندر موجود آلات کا پتہ لگائیں اور انہیں دور سے کنٹرول کرنے کی صلاحیت پیش کریں۔", - "HeaderUploadSubtitle": "سب ٹائٹل اپ لوڈ کریں۔", + "HeaderUploadSubtitle": "سب ٹائٹل اپ لوڈ کریں", "LabelUserLoginAttemptsBeforeLockout": "صارف کے لاک آؤٹ ہونے سے پہلے لاگ ان کی ناکام کوشش", "EnablePhotosHelp": "تصاویر کا پتہ لگایا جائے گا اور دیگر میڈیا فائلوں کے ساتھ دکھایا جائے گا۔", "LabelColorPrimaries": "رنگ پرائمری", @@ -712,7 +712,7 @@ "MessageSyncPlayCreateGroupDenied": "گروپ بنانے کے لیے اجازت درکار ہے۔", "MediaInfoBitrate": "بٹریٹ", "EnableBlurHashHelp": "وہ تصاویر جو اب بھی لوڈ ہو رہی ہیں ایک منفرد پلیس ہولڈر کے ساتھ دکھائی جائیں گی۔", - "ButtonCast": "ڈیوائس پر کاسٹ کریں۔", + "ButtonCast": "ڈیوائس پر کاسٹ کریں", "Played": "کھیلا", "PlayFromBeginning": "شروع سے کھیلیں", "LabelNewsCategories": "خبروں کے زمرے", @@ -726,38 +726,38 @@ "Restart": "دوبارہ شروع کریں", "MoreUsersCanBeAddedLater": "بعد میں ڈیش بورڈ کے اندر سے مزید صارفین کو شامل کیا جا سکتا ہے۔", "HeaderKodiMetadataHelp": "NFO میٹا ڈیٹا کو فعال یا غیر فعال کرنے کے لیے، ایک لائبریری میں ترمیم کریں اور 'میٹا ڈیٹا سیور' سیکشن تلاش کریں۔", - "LabelEnableDlnaServer": "DLNA سرور کو فعال کریں۔", - "QuickConnectAuthorizeCode": "لاگ ان کرنے کے لیے کوڈ {0} درج کریں۔", + "LabelEnableDlnaServer": "DLNA سرور کو فعال کریں", + "QuickConnectAuthorizeCode": "لاگ ان کرنے کے لیے کوڈ {0} درج کریں", "LabelTVHomeScreen": "ٹی وی موڈ ہوم اسکرین", "LabelContentType": "مواد کی قسم", "ServerNameIsShuttingDown": "{0} پر سرور بند ہو رہا ہے۔", "ExtraLarge": "اضافی بڑا", - "HeaderDownloadSync": "ڈاؤن لوڈ اور مطابقت پذیری کریں۔", + "HeaderDownloadSync": "ڈاؤن لوڈ اور مطابقت پذیری کریں", "HeaderAdditionalParts": "اضافی حصے", "ShowIndicatorsFor": "کے لیے اشارے دکھائیں", "LabelDateAddedBehavior": "نئے مواد کے لیے تاریخ شامل کی گئی رویہ", "LabelReleaseDate": "تاریخ رہائی", "LabelFriendlyName": "دوستانہ نام", - "ButtonUninstall": "ان انسٹال کریں۔", + "ButtonUninstall": "ان انسٹال کریں", "PlayCount": "گنتی کھیلیں", "OptionReleaseDate": "تاریخ رہائی", - "OptionAllowContentDownload": "میڈیا ڈاؤن لوڈ کی اجازت دیں۔", + "OptionAllowContentDownload": "میڈیا ڈاؤن لوڈ کی اجازت دیں", "EnableAutoCast": "ڈیفالٹ کے طور پر مقرر", "HeaderParentalRatings": "والدین کی درجہ بندی", "HeaderYears": "سال", - "OptionReportByteRangeSeekingWhenTranscoding": "رپورٹ کریں کہ سرور ٹرانس کوڈنگ کرتے وقت بائٹ کی تلاش کو سپورٹ کرتا ہے۔", + "OptionReportByteRangeSeekingWhenTranscoding": "رپورٹ کریں کہ سرور ٹرانس کوڈنگ کرتے وقت بائٹ کی تلاش کو سپورٹ کرتا ہے", "MediaInfoColorTransfer": "رنگ کی منتقلی", "LabelEnableDlnaDebugLoggingHelp": "بڑی لاگ فائلیں بنائیں اور ان کا استعمال صرف خرابیوں کا سراغ لگانے کے مقاصد کے لیے کیا جانا چاہیے۔", "HeaderDefaultRecordingSettings": "پہلے سے طے شدہ ریکارڈنگ کی ترتیبات", - "HeaderSyncPlayEnabled": "SyncPlay فعال ہے۔", - "LabelSaveLocalMetadata": "آرٹ ورک کو میڈیا فولڈر میں محفوظ کریں۔", + "HeaderSyncPlayEnabled": "SyncPlay فعال ہے", + "LabelSaveLocalMetadata": "آرٹ ورک کو میڈیا فولڈر میں محفوظ کریں", "MessageSyncPlayGroupWait": "{0} بفرنگ کر رہا ہے…", - "Browse": "براؤز کریں۔", + "Browse": "براؤز کریں", "HeaderSortOrder": "ترتیب", "Preview": "پیش نظارہ", "LabelValue": "قدر", "Image": "تصویر", - "DateAdded": "تاریخ شامل کی گئی۔", + "DateAdded": "تاریخ شامل کی گئی", "SettingsSaved": "ترتیبات محفوظ ہو گئیں۔", "OptionForceRemoteSourceTranscoding": "ریموٹ میڈیا ذرائع جیسے لائیو ٹی وی کی زبردستی ٹرانس کوڈنگ", "EnableCinemaMode": "سنیما موڈ", @@ -773,7 +773,7 @@ "InstallingPackage": "انسٹال ہو رہا ہے {0} (ورژن {1})", "LabelServerHostHelp": "192.168.1.100:8096 یا https://myserver.com", "ServerNameIsRestarting": "{0} پر سرور دوبارہ شروع ہو رہا ہے۔", - "HeaderAddUpdateImage": "تصویر شامل/اپ ڈیٹ کریں۔", + "HeaderAddUpdateImage": "تصویر شامل/اپ ڈیٹ کریں", "HeaderContinueListening": "سننا جاری رکھیں", "FileNotFound": "فائل نہیں ملی.", "HeaderRecordingPostProcessing": "ریکارڈنگ پوسٹ پروسیسنگ", @@ -782,18 +782,18 @@ "ButtonWebsite": "ویب سائٹ", "Share": "بانٹیں", "HeaderSeasons": "موسم", - "LabelEnableDlnaDebugLogging": "DLNA ڈیبگ لاگنگ کو فعال کریں۔", + "LabelEnableDlnaDebugLogging": "DLNA ڈیبگ لاگنگ کو فعال کریں", "LabelAlbumArtPN": "البم آرٹ PN", - "RemoveFromPlaylist": "پلے لسٹ سے ہٹا دیں۔", - "AllowEmbeddedSubtitles": "ایمبیڈڈ سب ٹائٹلز کی مختلف اقسام کو غیر فعال کریں۔", + "RemoveFromPlaylist": "پلے لسٹ سے ہٹا دیں", + "AllowEmbeddedSubtitles": "ایمبیڈڈ سب ٹائٹلز کی مختلف اقسام کو غیر فعال کریں", "LabelEndDate": "آخری تاریخ", "OptionMaxActiveSessionsHelp": "0 کی قدر خصوصیت کو غیر فعال کر دے گی۔", "HeaderTaskTriggers": "ٹاسک ٹرگرز", "RememberMe": "مجھے پہچانتے ہو", - "HeaderCancelRecording": "ریکارڈنگ منسوخ کریں۔", + "HeaderCancelRecording": "ریکارڈنگ منسوخ کریں", "MediaInfoInterlaced": "آپس میں جڑا ہوا", "FastForward": "تیزی سے آگے", - "LabelEmbedAlbumArtDidl": "ڈی آئی ڈی ایل میں البم آرٹ ایمبیڈ کریں۔", + "LabelEmbedAlbumArtDidl": "ڈی آئی ڈی ایل میں البم آرٹ ایمبیڈ کریں", "LabelDisplayLanguageHelp": "جیلیفن کا ترجمہ ایک جاری منصوبہ ہے۔", "AspectRatio": "پہلو کا تناسب", "LabelRepositoryNameHelp": "اس ذخیرے کو آپ کے سرور میں شامل کردہ کسی دوسرے سے ممتاز کرنے کے لیے ایک حسب ضرورت نام۔", @@ -803,23 +803,23 @@ "HeaderPreferredMetadataLanguage": "ترجیحی میٹا ڈیٹا زبان", "BoxRear": "باکس (پیچھے)", "LastSeen": "آخری بار دیکھا گیا {0}", - "Connect": "جڑیں۔", + "Connect": "جڑیں", "LabelTimeLimitHours": "وقت کی حد (گھنٹے)", "LabelTime": "وقت", "OptionCriticRating": "ناقدین کی درجہ بندی", "OptionDisplayFolderViewHelp": "اپنی دوسری میڈیا لائبریریوں کے ساتھ فولڈرز ڈسپلے کریں۔ اگر آپ سادہ فولڈر کا نظارہ کرنا چاہتے ہیں تو یہ مفید ہو سکتا ہے۔", "MoreFromValue": "{0} سے مزید", "LabelYoureDone": "آپ کا کام ہو گیا!", - "Refresh": "ریفریش کریں۔", + "Refresh": "ریفریش کریں", "ButtonManualLogin": "دستی لاگ ان", "Large": "بڑا", "LabelProfileContainer": "کنٹینر", "LabelTriggerType": "محرک کی قسم", "LabelProtocolInfo": "پروٹوکول کی معلومات", - "ClearQueue": "قطار صاف کریں۔", + "ClearQueue": "قطار صاف کریں", "LabelRuntimeMinutes": "رن ٹائم", "LabelAudioLanguagePreference": "ترجیحی آڈیو زبان", - "ShowLess": "کم دکھائیں۔", + "ShowLess": "کم دکھائیں", "HeaderTuners": "ٹیونرز", "News": "خبریں", "OptionNew": "نئی…", @@ -831,20 +831,20 @@ "RefreshQueued": "ریفریش قطار۔", "Photo": "تصویر", "LabelEpisodeNumber": "قسط نمبر", - "HeaderSyncPlaySelectGroup": "ایک گروپ میں شامل ہوں۔", + "HeaderSyncPlaySelectGroup": "ایک گروپ میں شامل ہوں", "LabelEncoderPreset": "انکوڈنگ پیش سیٹ", "HeaderPleaseSignIn": "سائن ان کریں", "MediaInfoProfile": "پروفائل", "LabelRecord": "ریکارڈ", - "Ended": "ختم ہوا۔", - "HeaderSelectTranscodingPath": "ٹرانس کوڈنگ عارضی راستہ منتخب کریں۔", + "Ended": "ختم ہوا", + "HeaderSelectTranscodingPath": "ٹرانس کوڈنگ عارضی راستہ منتخب کریں", "LabelAirDays": "ہوا کے دن", "LabelAlbumArtMaxWidth": "البم آرٹ کی زیادہ سے زیادہ چوڑائی", - "EditMetadata": "میٹا ڈیٹا میں ترمیم کریں۔", + "EditMetadata": "میٹا ڈیٹا میں ترمیم کریں", "HeaderServerSettings": "سرور کی ترتیبات", "SelectAdminUsername": "براہ کرم ایڈمن اکاؤنٹ کے لیے صارف نام منتخب کریں۔", "DirectPlaying": "براہ راست کھیلنا", - "PreviousTrack": "پچھلے پر جائیں۔", + "PreviousTrack": "پچھلے پر جائیں", "LabelFont": "فونٹ", "OptionDaily": "روزانہ", "LabelSimultaneousConnectionLimit": "بیک وقت سلسلہ کی حد", @@ -853,7 +853,7 @@ "MessageSyncPlayPlaybackPermissionRequired": "پلے بیک کی اجازت درکار ہے۔", "OptionHlsSegmentedSubtitles": "HLS سیگمنٹڈ سب ٹائٹلز", "LabelCreateHttpPortMap": "HTTP ٹریفک کے ساتھ ساتھ HTTPS کے لیے خودکار پورٹ میپنگ کو فعال کریں۔", - "RepeatEpisodes": "اقساط کو دہرائیں۔", + "RepeatEpisodes": "اقساط کو دہرائیں", "LabelAccessStart": "وقت آغاز", "HeaderServerAddressSettings": "سرور ایڈریس کی ترتیبات", "LabelRecordingPath": "پہلے سے طے شدہ ریکارڈنگ کا راستہ", @@ -861,7 +861,7 @@ "LabelMetadata": "میٹا ڈیٹا", "Play": "کھیلیں", "LabelEnableDlnaServerHelp": "اپنے نیٹ ورک پر موجود UPnP آلات کو مواد کو براؤز کرنے اور چلانے کی اجازت دیں۔", - "SelectServer": "سرور کو منتخب کریں۔", + "SelectServer": "سرور کو منتخب کریں", "LabelPublishedServerUri": "شائع شدہ سرور URIs", "LabelChannels": "چینلز", "LabelH265Crf": "H.265 انکوڈنگ CRF", @@ -874,13 +874,13 @@ "AskAdminToCreateLibrary": "ایک منتظم سے لائبریری بنانے کو کہیں۔", "Auto": "آٹو", "EncoderPresetHelp": "کارکردگی کو بہتر بنانے کے لیے ایک تیز قدر یا معیار کو بہتر بنانے کے لیے ایک سست قدر منتخب کریں۔", - "HeaderDeleteDevices": "تمام آلات کو حذف کریں۔", - "HeaderThisUserIsCurrentlyDisabled": "یہ صارف فی الحال غیر فعال ہے۔", + "HeaderDeleteDevices": "تمام آلات کو حذف کریں", + "HeaderThisUserIsCurrentlyDisabled": "یہ صارف فی الحال غیر فعال ہے", "LabelAccessDay": "ہفتے کا دن", "LabelNewName": "نیا نام", "LabelParentalRating": "والدین کی درجہ بندی", "LabelXDlnaDoc": "ڈیوائس کلاس ID", - "OptionAllowUserToManageServer": "اس صارف کو سرور کا نظم کرنے کی اجازت دیں۔", + "OptionAllowUserToManageServer": "اس صارف کو سرور کا نظم کرنے کی اجازت دیں", "HeaderGuideProviders": "ٹی وی گائیڈ ڈیٹا فراہم کرنے والے", "SeriesYearToPresent": "{0} - حاضر", "Small": "چھوٹا", @@ -905,22 +905,22 @@ "HeaderDevices": "آلات", "ContinueWatching": "دیکھنا جاری رکھیں", "OptionTrackName": "ٹریک کا نام", - "HeaderConfirmPluginInstallation": "پلگ ان کی تنصیب کی تصدیق کریں۔", + "HeaderConfirmPluginInstallation": "پلگ ان کی تنصیب کی تصدیق کریں", "HeaderUploadImage": "تصویر انٹرنیٹ پر ڈالنا", "MediaInfoBitDepth": "بٹ گہرائی", "LabelScheduledTaskLastRan": "آخری دوڑ {0}، لے کر {1}۔", "LabelAuthProvider": "تصدیق فراہم کنندہ", - "ReplaceExistingImages": "موجودہ تصاویر کو تبدیل کریں۔", + "ReplaceExistingImages": "موجودہ تصاویر کو تبدیل کریں", "LabelLibraryPageSize": "لائبریری صفحہ کا سائز", "Saturday": "ہفتہ", - "HeaderUninstallPlugin": "پلگ ان ان انسٹال کریں۔", + "HeaderUninstallPlugin": "پلگ ان ان انسٹال کریں", "HeaderRevisionHistory": "نظرثانی کی تاریخ", "ButtonOpen": "کھولیں۔", "PasswordSaved": "پاس ورڈ محفوظ ہو گیا۔", "NoSubtitleSearchResultsFound": "کوئی نتیجہ نہیں.", "LabelManufacturerUrl": "مینوفیکچرر URL", "MillisecondsUnit": "MS", - "LabelKodiMetadataEnableExtraThumbs": "ایکسٹرافانارٹ کو ایکسٹرا تھمبس فیلڈ میں کاپی کریں۔", + "LabelKodiMetadataEnableExtraThumbs": "ایکسٹرافانارٹ کو ایکسٹرا تھمبس فیلڈ میں کاپی کریں", "Directors": "ڈائریکٹرز", "DropShadow": "ڈراپ شیڈو", "New": "نئی", @@ -929,26 +929,26 @@ "RepeatMode": "ریپیٹ موڈ", "LabelCustomRating": "حسب ضرورت درجہ بندی", "LabelBaseUrl": "بنیادی URL", - "Search": "تلاش کریں۔", + "Search": "تلاش کریں", "LabelRefreshMode": "ریفریش موڈ", "LabelSubtitleFormatHelp": "مثال: srt", "Bwdif": "BWDIF", "HeaderApiKeys": "API کیز", - "HeaderPasswordReset": "پاس ورڈ ری سیٹ کریں۔", + "HeaderPasswordReset": "پاس ورڈ ری سیٹ کریں", "HeaderResponseProfileHelp": "رسپانس پروفائلز مخصوص قسم کا میڈیا چلاتے وقت ڈیوائس پر بھیجی گئی معلومات کو حسب ضرورت بنانے کا طریقہ فراہم کرتے ہیں۔", "HeaderSubtitleDownloads": "سب ٹائٹل ڈاؤن لوڈز", "EnableDetailsBanner": "تفصیلات کا بینر", "LabelHDHomerunPortRangeHelp": "HDHomeRun UDP پورٹ رینج کو اس قدر تک محدود کرتا ہے۔ (پہلے سے طے شدہ 1024 - 645535 ہے)۔", "Edit": "ترمیم", "LabelTonemappingThreshold": "ٹون میپنگ کی حد", - "HeaderRemoveMediaLocation": "میڈیا کی جگہ کو ہٹا دیں۔", + "HeaderRemoveMediaLocation": "میڈیا کی جگہ کو ہٹا دیں", "RecommendationBecauseYouLike": "کیونکہ آپ کو {0} پسند ہے", - "HeaderAddUpdateSubtitle": "سب ٹائٹل شامل کریں/اپ ڈیٹ کریں۔", + "HeaderAddUpdateSubtitle": "سب ٹائٹل شامل کریں/اپ ڈیٹ کریں", "LabelEnableDlnaClientDiscoveryIntervalHelp": "دو SSDP تلاشوں کے درمیان سیکنڈوں میں دورانیہ کا تعین کریں۔", "No": "نہیں", "MessageConfirmDeleteGuideProvider": "کیا آپ واقعی اس گائیڈ فراہم کنندہ کو حذف کرنا چاہتے ہیں؟", "ImportFavoriteChannelsHelp": "صرف وہی چینلز درآمد کیے جائیں گے جنہیں ٹیونر ڈیوائس پر پسندیدہ کے بطور نشان زد کیا گیا ہے۔", - "OptionAllowMediaPlayback": "میڈیا پلے بیک کی اجازت دیں۔", + "OptionAllowMediaPlayback": "میڈیا پلے بیک کی اجازت دیں", "PerfectMatch": "کامل میچ", "OnlyImageFormats": "صرف تصویری فارمیٹس (VobSub, PGS, SUB)", "HeaderXmlDocumentAttribute": "XML دستاویز کی خصوصیت", @@ -956,31 +956,31 @@ "LabelImportOnlyFavoriteChannels": "پسندیدہ کے بطور نشان زد چینلز تک محدود رکھیں", "HeaderAlert": "الرٹ", "LabelTonemappingRange": "ٹون میپنگ کی حد", - "EditImages": "تصاویر میں ترمیم کریں۔", + "EditImages": "تصاویر میں ترمیم کریں", "HeaderHttpsSettings": "HTTPS ترتیبات", - "LabelDisplaySpecialsWithinSeasons": "ان سیزن میں خصوصی ڈسپلے کریں جن میں وہ نشر ہوئے تھے۔", + "LabelDisplaySpecialsWithinSeasons": "ان سیزن میں خصوصی ڈسپلے کریں جن میں وہ نشر ہوئے تھے", "LabelKodiMetadataDateFormatHelp": "NFO فائلوں میں موجود تمام تاریخوں کو اس فارمیٹ کا استعمال کرتے ہوئے پارس کیا جائے گا۔", - "LabelExtractChaptersDuringLibraryScan": "لائبریری اسکین کے دوران باب کی تصاویر نکالیں۔", + "LabelExtractChaptersDuringLibraryScan": "لائبریری اسکین کے دوران باب کی تصاویر نکالیں", "HeaderPaths": "راستے", "SeriesDisplayOrderHelp": "اقساط کو ہوا کی تاریخ، DVD آرڈر، یا مطلق نمبر کے ذریعے ترتیب دیں۔", "MediaIsBeingConverted": "میڈیا کو ایک ایسے فارمیٹ میں تبدیل کیا جا رہا ہے جو میڈیا کو چلانے والے آلے کے ساتھ مطابقت رکھتا ہے۔", "PathNotFound": "راستہ نہ مل سکا۔ براہ کرم یقینی بنائیں کہ راستہ درست ہے اور دوبارہ کوشش کریں۔", "QuickConnectDescription": "Quick Connect کے ساتھ سائن ان کرنے کے لیے، اس ڈیوائس پر 'Quick Connect' بٹن کو منتخب کریں جس سے آپ لاگ ان ہو رہے ہیں اور نیچے دکھایا گیا کوڈ درج کریں۔", - "EnableBlurHash": "تصاویر کے لیے دھندلے پلیس ہولڈرز کو فعال کریں۔", - "LabelEnableBlastAliveMessages": "زندہ پیغامات کو دھماکے سے اڑا دیں۔", + "EnableBlurHash": "تصاویر کے لیے دھندلے پلیس ہولڈرز کو فعال کریں", + "LabelEnableBlastAliveMessages": "زندہ پیغامات کو دھماکے سے اڑا دیں", "HeaderMusicQuality": "میوزک کوالٹی", "MessageNoMovieSuggestionsAvailable": "فلم کی کوئی تجویز فی الحال دستیاب نہیں ہے۔ اپنی فلمیں دیکھنا اور درجہ بندی کرنا شروع کریں، اور پھر اپنی سفارشات دیکھنے کے لیے واپس آئیں۔", "LabelBindToLocalNetworkAddress": "مقامی نیٹ ورک ایڈریس سے منسلک کریں", "LabelPleaseRestart": "تبدیلیاں ویب کلائنٹ کو دستی طور پر دوبارہ لوڈ کرنے کے بعد لاگو ہوں گی۔", "HeaderSeriesOptions": "سیریز کے اختیارات", - "OptionAllowRemoteSharedDevices": "مشترکہ آلات کے ریموٹ کنٹرول کی اجازت دیں۔", + "OptionAllowRemoteSharedDevices": "مشترکہ آلات کے ریموٹ کنٹرول کی اجازت دیں", "HeaderSubtitleProfile": "سب ٹائٹل پروفائل", "MusicArtist": "میوزک آرٹسٹ", "HDPrograms": "ایچ ڈی پروگرام", "HeaderOnNow": "ابھی پر", "LabelAirsBeforeEpisode": "قسط سے پہلے نشر", - "RepeatOne": "ایک دہرائیں۔", - "OptionEnableAccessToAllChannels": "تمام چینلز تک رسائی کو فعال کریں۔", + "RepeatOne": "ایک دہرائیں", + "OptionEnableAccessToAllChannels": "تمام چینلز تک رسائی کو فعال کریں", "AllComplexFormats": "تمام پیچیدہ فارمیٹس (ASS, SSA, VobSub, PGS, SUB, IDX, …)", "LabelAutomaticDiscovery": "آٹو ڈسکوری کو فعال کریں", "OptionDvd": "ڈی وی ڈی", @@ -992,7 +992,7 @@ "HeaderAccessSchedule": "رسائی کا شیڈول", "ServerUpdateNeeded": "اس سرور کو اپ ڈیٹ کرنے کی ضرورت ہے۔ تازہ ترین ورژن ڈاؤن لوڈ کرنے کے لیے، براہ کرم ملاحظہ کریں {0}", "LabelMinResumeDuration": "دوبارہ شروع کرنے کا کم از کم دورانیہ", - "UseEpisodeImagesInNextUp": "'Next Up' اور 'Continue Watching' سیکشنز میں ایپی سوڈ کی تصاویر استعمال کریں۔", + "UseEpisodeImagesInNextUp": "'Next Up' اور 'Continue Watching' سیکشنز میں ایپی سوڈ کی تصاویر استعمال کریں", "HeaderVideos": "ویڈیوز", "SeriesSettings": "سیریز کی ترتیبات", "OptionWeekly": "ہفتہ وار", @@ -1000,7 +1000,7 @@ "MusicAlbum": "میوزک البم", "MediaInfoContainer": "کنٹینر", "LabelDateTimeLocale": "تاریخ وقت کا مقام", - "ButtonStart": "شروع کریں۔", + "ButtonStart": "شروع کریں", "RecentlyWatched": "حال ہی میں دیکھا", "HeaderFetcherSettings": "فیچر کی ترتیبات", "HeaderSubtitleProfilesHelp": "سب ٹائٹل پروفائلز ان سب ٹائٹل فارمیٹس کی وضاحت کرتے ہیں جو ڈیوائس کے ذریعے تعاون یافتہ ہیں۔", @@ -1013,14 +1013,14 @@ "HeaderLibraryOrder": "لائبریری آرڈر", "LabelKodiMetadataUserHelp": "دیگر ایپلیکیشنز کے استعمال کے لیے گھڑی کا ڈیٹا NFO فائلوں میں محفوظ کریں۔", "LabelPath": "راستہ", - "ShowParentImages": "سیریز کی تصاویر دکھائیں۔", + "ShowParentImages": "سیریز کی تصاویر دکھائیں", "Suggestions": "تجاویز", "Up": "اوپر", "LabelHomeNetworkQuality": "ہوم نیٹ ورک کا معیار", - "LabelPlayDefaultAudioTrack": "زبان سے قطع نظر ڈیفالٹ آڈیو ٹریک چلائیں۔", + "LabelPlayDefaultAudioTrack": "زبان سے قطع نظر ڈیفالٹ آڈیو ٹریک چلائیں", "MediaInfoRefFrames": "ریفری فریمز", "ConfirmDeleteImage": "تصویر کو حذف کریں؟", - "SearchForCollectionInternetMetadata": "آرٹ ورک اور میٹا ڈیٹا کے لیے انٹرنیٹ پر تلاش کریں۔", + "SearchForCollectionInternetMetadata": "آرٹ ورک اور میٹا ڈیٹا کے لیے انٹرنیٹ پر تلاش کریں", "MessageConfirmRemoveMediaLocation": "کیا آپ واقعی اس مقام کو ہٹانا چاہتے ہیں؟", "MessageSyncPlayGroupDoesNotExist": "گروپ میں شامل ہونے میں ناکام کیونکہ یہ موجود نہیں ہے۔", "MessageCreateAccountAt": "{0} پر ایک اکاؤنٹ بنائیں", @@ -1039,19 +1039,19 @@ "ButtonTogglePlaylist": "پلے لسٹ", "LabelParentNumber": "والدین کا نمبر", "LabelCorruptedFrames": "خراب فریم", - "OptionPlainStorageFolders": "تمام فولڈرز کو سادہ اسٹوریج فولڈر کے طور پر ڈسپلے کریں۔", + "OptionPlainStorageFolders": "تمام فولڈرز کو سادہ اسٹوریج فولڈر کے طور پر ڈسپلے کریں", "DailyAt": "روزانہ {0} پر", "Raised": "اٹھایا", "LabelEvent": "تقریب", "LabelMethod": "طریقہ", - "ManageLibrary": "لائبریری کا انتظام کریں۔", + "ManageLibrary": "لائبریری کا انتظام کریں", "HeaderPlayAll": "سارے کھیلو", "LabelTag": "ٹیگ", "LabelIdentificationFieldHelp": "کیس غیر حساس ذیلی اسٹرنگ یا ریجیکس اظہار۔", "MessageConfirmRevokeApiKey": "کیا آپ واقعی اس API کلید کو منسوخ کرنا چاہتے ہیں؟ اس سرور سے ایپلیکیشن کا کنکشن اچانک ختم ہو جائے گا۔", "YoutubeDenied": "درخواست کردہ ویڈیو کو ایمبیڈڈ پلیئرز میں چلانے کی اجازت نہیں ہے۔", "MediaInfoTimestamp": "ٹائم اسٹیمپ", - "MarkPlayed": "مارک نے کھیلا۔", + "MarkPlayed": "مارک نے کھیلا", "LabelRemoteClientBitrateLimit": "انٹرنیٹ اسٹریمنگ بٹریٹ کی حد (Mbps)", "HeaderKeepRecording": "ریکارڈنگ کرتے رہیں", "ButtonSplit": "تقسیم", @@ -1061,12 +1061,12 @@ "MessageConfirmShutdown": "کیا آپ واقعی سرور کو بند کرنا چاہتے ہیں؟", "HeaderStartNow": "اب شروع کریں", "Sports": "کھیل", - "HeaderDeleteProvider": "فراہم کنندہ کو حذف کریں۔", + "HeaderDeleteProvider": "فراہم کنندہ کو حذف کریں", "MessageConfirmProfileDeletion": "کیا آپ واقعی اس پروفائل کو حذف کرنا چاہتے ہیں؟", "OptionWeekdays": "ہفتے کے دن", "LabelName": "نام", "LabelSelectFolderGroupsHelp": "غیر چیک شدہ فولڈرز خود ان کے اپنے نظارے میں ظاہر ہوں گے۔", - "RepeatAll": "سب کو دہرائیں۔", + "RepeatAll": "سب کو دہرائیں", "HeaderSystemDlnaProfiles": "سسٹم پروفائلز", "HeaderFetchImages": "تصاویر حاصل کریں", "TabLogs": "نوشتہ جات", @@ -1078,9 +1078,9 @@ "HeaderHttpHeaders": "HTTP ہیڈر", "TabCatalog": "تفصیلی فہر ست", "LabelVaapiDeviceHelp": "یہ رینڈر نوڈ ہے جو ہارڈویئر ایکسلریشن کے لیے استعمال ہوتا ہے۔", - "SearchForSubtitles": "سب ٹائٹلز تلاش کریں۔", + "SearchForSubtitles": "سب ٹائٹلز تلاش کریں", "LabelHomeScreenSectionValue": "ہوم اسکرین سیکشن {0}", - "LabelSyncPlayAccessCreateAndJoinGroups": "صارف کو گروپ بنانے اور ان میں شامل ہونے کی اجازت دیں۔", + "LabelSyncPlayAccessCreateAndJoinGroups": "صارف کو گروپ بنانے اور ان میں شامل ہونے کی اجازت دیں", "LabelUnstable": "غیر مستحکم", "Rate": "شرح", "DownloadsValue": "{0} ڈاؤن لوڈز", @@ -1093,7 +1093,7 @@ "TabParentalControl": "والدین کا کنٹرول", "HeaderOtherItems": "دیگر اشیاء", "MessageImageTypeNotSelected": "براہ کرم ڈراپ ڈاؤن مینو سے تصویر کی قسم منتخب کریں۔", - "HeaderPlaybackError": "پلے بیک کی خرابی۔", + "HeaderPlaybackError": "پلے بیک کی خرابی", "MetadataManager": "میٹا ڈیٹا مینیجر", "DashboardServerName": "سرور: {0}", "LabelDefaultUser": "پہلے سے طے شدہ صارف", @@ -1106,7 +1106,7 @@ "LabelProtocol": "پروٹوکول", "HeaderIdentificationHeader": "شناختی ہیڈر", "General": "جنرل", - "OptionDateEpisodeAdded": "تاریخ قسط شامل کر دی گئی۔", + "OptionDateEpisodeAdded": "تاریخ قسط شامل کر دی گئی", "LabelProfileAudioCodecs": "آڈیو کوڈیکس", "OptionEnableM2tsModeHelp": "MPEG-TS میں انکوڈنگ کرتے وقت M2TS موڈ کو فعال کریں۔", "PleaseRestartServerName": "براہ کرم جیلیفن کو {0} پر دوبارہ شروع کریں۔", @@ -1114,17 +1114,17 @@ "ValueVideoCodec": "ویڈیو کوڈیک: {0}", "WeeklyAt": "{1} پر {0}", "Episodes": "اقساط", - "EnableEnhancedNvdecDecoder": "بہتر NVDEC ڈیکوڈر کو فعال کریں۔", + "EnableEnhancedNvdecDecoder": "بہتر NVDEC ڈیکوڈر کو فعال کریں", "MessageReenableUser": "دوبارہ فعال کرنے کے لیے نیچے دیکھیں", "IntelLowPowerEncHelp": "کم پاور انکوڈنگ غیر ضروری CPU-GPU مطابقت پذیری کو برقرار رکھ سکتی ہے۔ اگر i915 HuC فرم ویئر کو کنفیگر نہیں کیا گیا ہے تو لینکس پر ان کا غیر فعال ہونا ضروری ہے۔", "MediaInfoDvVersionMajor": "ڈی وی ورژن میجر", "MediaInfoDvVersionMinor": "DV ورژن معمولی", "MediaInfoDvProfile": "ڈی وی پروفائل", "MediaInfoDvLevel": "ڈی وی کی سطح", - "MoveLeft": "بائیں منتقل کریں۔", + "MoveLeft": "بائیں منتقل کریں", "MediaInfoElPresentFlag": "ڈی وی ایل پیش سیٹ پرچم", "Subtitle": "ذیلی عنوان", - "EnableFallbackFont": "فال بیک فونٹس کو فعال کریں۔", + "EnableFallbackFont": "فال بیک فونٹس کو فعال کریں", "LabelMusicStreamingTranscodingBitrateHelp": "میوزک اسٹریم کرتے وقت زیادہ سے زیادہ بٹ ریٹ متعین کریں۔", "HeaderPhotoAlbums": "فوٹو البمز", "NewCollectionNameExample": "مثال: سٹار وار مجموعہ", @@ -1136,7 +1136,7 @@ "Save": "محفوظ کریں۔", "LabelMaxMuxingQueueSize": "زیادہ سے زیادہ مکسنگ قطار کا سائز", "HeaderConnectionFailure": "کنکشن کی ناکامی", - "HeaderConnectToServer": "سرور سے جڑیں۔", + "HeaderConnectToServer": "سرور سے جڑیں", "UninstallPluginConfirmation": "کیا آپ واقعی {0} کو اَن انسٹال کرنا چاہتے ہیں؟", "LabelPasswordRecoveryPinCode": "خفیہ نمبر", "LabelDefaultScreen": "ڈیفالٹ اسکرین", @@ -1153,15 +1153,15 @@ "Smaller": "چھوٹا", "ChangingMetadataImageSettingsNewContent": "میٹا ڈیٹا یا آرٹ ورک ڈاؤن لوڈ کرنے کی ترتیبات میں تبدیلیاں صرف آپ کی لائبریری میں شامل کردہ نئے مواد پر لاگو ہوں گی۔ موجودہ عنوانات میں تبدیلیوں کو لاگو کرنے کے لیے، آپ کو ان کے میٹا ڈیٹا کو دستی طور پر تازہ کرنا ہوگا۔", "MoreMediaInfo": "میڈیا کی معلومات", - "HeaderConfigureRemoteAccess": "ریموٹ رسائی سیٹ اپ کریں۔", + "HeaderConfigureRemoteAccess": "ریموٹ رسائی سیٹ اپ کریں", "HeaderRunningTasks": "رننگ ٹاسکس", "ValueCodec": "کوڈیک: {0}", "ValueDiscNumber": "ڈسک {0}", - "MessageNoRepositories": "کوئی ذخیرہ نہیں", + "MessageNoRepositories": "کوئی ذخیرہ نہی۔", "HeaderChannelAccess": "چینل تک رسائی", "LabelVideoResolution": "ویڈیو ریزولوشن", - "EnableGamepadHelp": "کسی بھی منسلک کنٹرولرز سے ان پٹ کے لیے سنیں۔", - "AudioChannelsNotSupported": "آڈیو چینلز کی تعداد تعاون یافتہ نہیں ہے۔", + "EnableGamepadHelp": "کسی بھی منسلک کنٹرولرز سے ان پٹ کے لیے سنیں", + "AudioChannelsNotSupported": "آڈیو چینلز کی تعداد تعاون یافتہ نہیں ہے", "OnlyForcedSubtitles": "صرف مجبور", "Overview": "جائزہ", "HeaderLibrarySettings": "لائبریری کی ترتیبات", @@ -1170,21 +1170,21 @@ "ButtonParentalControl": "والدین کا کنٹرول", "LabelAirTime": "ہوا کا وقت", "OptionParentalRating": "والدین کی درجہ بندی", - "HeaderSelectMetadataPath": "میٹا ڈیٹا پاتھ منتخب کریں۔", + "HeaderSelectMetadataPath": "میٹا ڈیٹا پاتھ منتخب کریں", "MediaInfoColorSpace": "رنگین جگہ", - "OptionEstimateContentLength": "ٹرانس کوڈنگ کرتے وقت مواد کی لمبائی کا اندازہ لگائیں۔", + "OptionEstimateContentLength": "ٹرانس کوڈنگ کرتے وقت مواد کی لمبائی کا اندازہ لگائیں", "OptionUnairedEpisode": "غیر نشر شدہ اقساط", "MessageNoPluginConfiguration": "اس پلگ ان میں سیٹ اپ کرنے کے لیے کوئی سیٹنگ نہیں ہے۔", "LabelTranscodingThreadCount": "ٹرانس کوڈنگ تھریڈ کی گنتی", "MediaInfoLevel": "سطح", "LabelCurrentPassword": "موجودہ خفیہ لفظ", - "LabelEnableRealtimeMonitor": "حقیقی وقت کی نگرانی کو فعال کریں۔", + "LabelEnableRealtimeMonitor": "حقیقی وقت کی نگرانی کو فعال کریں", "LabelSelectVersionToInstall": "انسٹال کرنے کے لیے ورژن منتخب کریں", "Premieres": "پریمیئرز", "FileReadError": "فائل پڑھتے وقت ایک خرابی پیش آگئی۔", "MessageNoPluginsInstalled": "آپ کے پاس کوئی پلگ ان انسٹال نہیں ہے۔", "Extras": "اضافی", - "LabelEnableAutomaticPortMap": "خودکار پورٹ میپنگ کو فعال کریں۔", + "LabelEnableAutomaticPortMap": "خودکار پورٹ میپنگ کو فعال کریں", "HeaderMetadataSettings": "میٹا ڈیٹا کی ترتیبات", "HeaderUsers": "صارفین", "LabelDownloadLanguages": "زبانیں ڈاؤن لوڈ کریں", @@ -1193,27 +1193,27 @@ "ValueOneEpisode": "1 ایپی سوڈ", "TabCodecs": "کوڈیکس", "Guide": "رہنما", - "LabelEnableHttps": "HTTPS کو فعال کریں۔", + "LabelEnableHttps": "HTTPS کو فعال کریں", "MessageSyncPlayIsDisabled": "SyncPlay استعمال کرنے کے لیے اجازت درکار ہے۔", "Yesterday": "کل", "MessageSyncPlayUserLeft": "{0} نے گروپ چھوڑ دیا ہے۔", "HeaderLatestMedia": "تازہ ترین میڈیا", - "PreferEmbeddedEpisodeInfosOverFileNames": "فائل ناموں پر ایمبیڈڈ ایپی سوڈ کی معلومات کو ترجیح دیں۔", + "PreferEmbeddedEpisodeInfosOverFileNames": "فائل ناموں پر ایمبیڈڈ ایپی سوڈ کی معلومات کو ترجیح دیں", "LabelCancelled": "منسوخ", "LabelPublicHttpPort": "عوامی HTTP پورٹ نمبر", "LabelSonyAggregationFlags": "سونی جمع جھنڈے", - "ButtonRefreshGuideData": "گائیڈ ڈیٹا ریفریش کریں۔", + "ButtonRefreshGuideData": "گائیڈ ڈیٹا ریفریش کریں", "OptionProtocolHttp": "HTTP", "Series": "سلسلہ", "Backdrop": "پس منظر", "TrackCount": "{0} ٹریکس", "Mute": "خاموش", "TabRepositories": "مخزن", - "ButtonAddMediaLibrary": "میڈیا لائبریری شامل کریں۔", + "ButtonAddMediaLibrary": "میڈیا لائبریری شامل کریں", "MediaInfoPath": "راستہ", "Runtime": "رن ٹائم", - "CancelSeries": "سیریز منسوخ کریں۔", - "MarkUnplayed": "غیر چلائے گئے نشان زد کریں۔", + "CancelSeries": "سیریز منسوخ کریں", + "MarkUnplayed": "غیر چلائے گئے نشان زد کریں", "ButtonEditOtherUserPreferences": "اس صارف کے پروفائل، تصویر اور ذاتی ترجیحات میں ترمیم کریں۔", "HeaderMoreLikeThis": "مزید اس طرح", "LabelVaapiDevice": "VA-API ڈیوائس", @@ -1222,14 +1222,14 @@ "ButtonStop": "رک جاؤ", "MessageLeaveEmptyToInherit": "پیرنٹ آئٹم یا عالمی ڈیفالٹ قدر سے وراثت کی ترتیبات کو خالی چھوڑ دیں۔", "SpecialFeatures": "خاص خوبیاں", - "Identify": "شناخت کریں۔", + "Identify": "شناخت کریں", "LabelStopping": "روکنا", - "SkipEpisodesAlreadyInMyLibrary": "وہ اقساط ریکارڈ نہ کریں جو میری لائبریری میں پہلے سے موجود ہیں۔", - "HeaderInstall": "انسٹال کریں۔", + "SkipEpisodesAlreadyInMyLibrary": "وہ اقساط ریکارڈ نہ کریں جو میری لائبریری میں پہلے سے موجود ہیں", + "HeaderInstall": "انسٹال کریں", "OptionIgnoreTranscodeByteRangeRequestsHelp": "ان درخواستوں کا احترام کیا جائے گا لیکن بائٹ رینج ہیڈر کو نظر انداز کر دیا جائے گا۔", "TellUsAboutYourself": "کچھ اپنے بارے میں بتائیں", "OptionIsHD": "ایچ ڈی", - "OptionAllowAudioPlaybackTranscoding": "آڈیو پلے بیک کی اجازت دیں جس کے لیے ٹرانس کوڈنگ کی ضرورت ہے۔", + "OptionAllowAudioPlaybackTranscoding": "آڈیو پلے بیک کی اجازت دیں جس کے لیے ٹرانس کوڈنگ کی ضرورت ہے", "LabelIconMaxHeight": "آئیکن کی زیادہ سے زیادہ اونچائی", "LabelLoginDisclaimer": "لاگ ان دستبرداری", "LabelSSDPTracingFilterHelp": "اختیاری IP پتہ جس پر لاگ ان SSDP ٹریفک کو فلٹر کرنا ہے۔", @@ -1240,7 +1240,7 @@ "DashboardArchitecture": "فن تعمیر: {0}", "LabelUserLibrary": "یوزر لائبریری", "HeaderTypeImageFetchers": "تصویر لانے والے ({0})", - "LabelSyncPlayHaltPlaybackDescription": "اور موجودہ پلے لسٹ اپ ڈیٹس کو نظر انداز کریں۔", + "LabelSyncPlayHaltPlaybackDescription": "اور موجودہ پلے لسٹ اپ ڈیٹس کو نظر انداز کریں", "LabelUserAgent": "صارف ایجنٹ", "LabelLocalHttpServerPortNumberHelp": "HTTP سرور کے لیے TCP پورٹ نمبر۔", "LabelAutomaticDiscoveryHelp": "ایپلی کیشنز کو UDP پورٹ 7359 کا استعمال کر کے خود بخود جیلیفن کا پتہ لگانے کی اجازت دیں۔", @@ -1252,8 +1252,8 @@ "Name": "نام", "LabelImageFetchersHelp": "ترجیحی ترتیب کے لحاظ سے اپنے پسندیدہ امیج فیچرز کو فعال اور درجہ دیں۔", "AllowVppTonemappingHelp": "مکمل انٹیل ڈرائیور پر مبنی ٹون میپنگ۔ فی الحال HDR10 ویڈیوز کے ساتھ صرف مخصوص ہارڈ ویئر پر کام کرتا ہے۔ دوسرے OpenCL نفاذ کے مقابلے میں اس کی ترجیح زیادہ ہے۔", - "NextTrack": "اگلے پر جائیں۔", - "EnableStreamLooping": "لائیو سٹریمز کو آٹو لوپ کریں۔", + "NextTrack": "اگلے پر جائیں", + "EnableStreamLooping": "لائیو سٹریمز کو آٹو لوپ کریں", "LabelPlaybackInfo": "پلے بیک کی معلومات", "LabelffmpegPathHelp": "FFmpeg ایپلیکیشن فائل یا FFmpeg پر مشتمل فولڈر کا راستہ۔", "ValueTimeLimitSingleHour": "وقت کی حد: 1 گھنٹہ", @@ -1270,7 +1270,7 @@ "LabelBirthDate": "تاریخ پیدائش", "HeaderAudioSettings": "آڈیو کی ترتیبات", "MediaInfoAnamorphic": "انامورفک", - "AllowHevcEncoding": "HEVC فارمیٹ میں انکوڈنگ کی اجازت دیں۔", + "AllowHevcEncoding": "HEVC فارمیٹ میں انکوڈنگ کی اجازت دیں", "ButtonAudioTracks": "آڈیو ٹریکس", "LabelTextBackgroundColor": "متن کے پس منظر کا رنگ", "ConfirmDeleteItem": "اس آئٹم کو حذف کرنے سے یہ فائل سسٹم اور آپ کی میڈیا لائبریری دونوں سے حذف ہو جائے گا۔ کیا آپ واقعی جاری رکھنا چاہتے ہیں؟", @@ -1284,8 +1284,8 @@ "HeaderLatestMusic": "تازہ ترین موسیقی", "Vertical": "عمودی", "OptionHideUserFromLoginHelp": "نجی یا پوشیدہ ایڈمنسٹریٹر اکاؤنٹس کے لیے مفید ہے۔ صارف کو اپنا صارف نام اور پاس ورڈ درج کرکے دستی طور پر سائن ان کرنے کی ضرورت ہوگی۔", - "OptionAllowSyncTranscoding": "میڈیا کو ڈاؤن لوڈ اور مطابقت پذیری کی اجازت دیں جس کے لیے ٹرانس کوڈنگ کی ضرورت ہے۔", - "EditSubtitles": "ذیلی عنوانات میں ترمیم کریں۔", + "OptionAllowSyncTranscoding": "میڈیا کو ڈاؤن لوڈ اور مطابقت پذیری کی اجازت دیں جس کے لیے ٹرانس کوڈنگ کی ضرورت ہے", + "EditSubtitles": "ذیلی عنوانات میں ترمیم کریں", "OptionExternallyDownloaded": "بیرونی ڈاؤن لوڈ", "GuestStar": "مہمان ستارہ", "RecommendationDirectedBy": "ہدایت کار {0}", @@ -1295,20 +1295,20 @@ "MessageNoTrailersFound": "انٹرنیٹ ٹریلرز کی لائبریری شامل کر کے اپنے مووی کے تجربے کو بڑھانے کے لیے ٹریلرز چینل انسٹال کریں۔", "LabelTheme": "خیالیہ", "LabelDisplayOrder": "ڈسپلے آرڈر", - "OptionAllowLinkSharing": "سوشل میڈیا شیئرنگ کی اجازت دیں۔", + "OptionAllowLinkSharing": "سوشل میڈیا شیئرنگ کی اجازت دیں", "MediaInfoSize": "سائز", "LabelAirsBeforeSeason": "موسم سے پہلے نشر", "Copied": "کاپی", "Copy": "کاپی", "CopyFailed": "کاپی نہیں ہو سکا", "HeaderExternalIds": "بیرونی IDs", - "LabelKodiMetadataSaveImagePaths": "NFO فائلوں میں تصویری راستے محفوظ کریں۔", - "OptionEmbedSubtitles": "کنٹینر کے اندر سرایت کریں۔", - "OptionEnableForAllTuners": "تمام ٹیونر آلات کے لیے فعال کریں۔", - "OptionEquals": "برابر ہے۔", + "LabelKodiMetadataSaveImagePaths": "NFO فائلوں میں تصویری راستے محفوظ کریں", + "OptionEmbedSubtitles": "کنٹینر کے اندر سرایت کریں", + "OptionEnableForAllTuners": "تمام ٹیونر آلات کے لیے فعال کریں", + "OptionEquals": "برابر ہے", "HeaderSelectMetadataPathHelp": "وہ راستہ براؤز کریں یا داخل کریں جسے آپ میٹا ڈیٹا کے لیے استعمال کرنا چاہتے ہیں۔ فولڈر قابل تحریر ہونا چاہیے۔", "ReleaseGroup": "ریلیز گروپ", - "Repeat": "دہرائیں۔", + "Repeat": "دہرائیں", "LabelSubtitleVerticalPosition": "عمودی پوزیشن", "Sort": "ترتیب دیں", "StopPlayback": "پلے بیک بند کرو", @@ -1318,7 +1318,7 @@ "Tuesday": "منگل", "LabelSyncPlayAccessNone": "اس صارف کے لیے غیر فعال", "ValueOneAlbum": "1 البم", - "OptionDisableUser": "اس صارف کو غیر فعال کریں۔", + "OptionDisableUser": "اس صارف کو غیر فعال کریں", "OptionRegex": "ریجیکس", "OptionDatePlayed": "کھیلے جانے کی تاریخ", "XmlTvPathHelp": "XMLTV فائل کا راستہ۔ جیلیفن اس فائل کو پڑھے گا اور وقتاً فوقتاً اسے اپ ڈیٹس کے لیے چیک کرے گا۔ آپ فائل بنانے اور اپ ڈیٹ کرنے کے ذمہ دار ہیں۔", @@ -1342,13 +1342,13 @@ "PasswordResetComplete": "پاس ورڈ دوبارہ ترتیب دیا گیا ہے۔", "LabelMoviePrefix": "فلم کا سابقہ", "LabelUserLibraryHelp": "منتخب کریں کہ کون سی صارف لائبریری کو آلہ پر ڈسپلے کرنا ہے۔ پہلے سے طے شدہ ترتیب کو وراثت میں لینے کے لیے خالی چھوڑ دیں۔", - "DeleteImage": "تصویر کو حذف کریں۔", - "LabelSyncPlayResumePlaybackDescription": "بیک گروپ پلے بیک میں شامل ہوں۔", + "DeleteImage": "تصویر کو حذف کریں", + "LabelSyncPlayResumePlaybackDescription": "بیک گروپ پلے بیک میں شامل ہوں", "HeaderImageOptions": "تصویری اختیارات", "TabOther": "دیگر", - "LabelRequireHttps": "HTTPS کی ضرورت ہے۔", + "LabelRequireHttps": "HTTPS کی ضرورت ہے", "HeaderSelectFallbackFontPathHelp": "ASS/SSA سب ٹائٹلز پیش کرنے کے لیے استعمال کرنے کے لیے فال بیک فونٹ فولڈر کا راستہ براؤز کریں یا داخل کریں۔", - "DisplayInMyMedia": "ہوم اسکرین پر ڈسپلے کریں۔", + "DisplayInMyMedia": "ہوم اسکرین پر ڈسپلے کریں", "LabelCurrentStatus": "موجودہ صورت حال", "OptionAdminUsers": "منتظمین", "MessageSyncPlayJoinGroupDenied": "گروپ میں شامل نہیں ہو سکتا۔", @@ -1364,14 +1364,14 @@ "LabelImageType": "تصویر کی قسم", "MessageDeleteTaskTrigger": "کیا آپ واقعی اس ٹاسک ٹرگر کو حذف کرنا چاہتے ہیں؟", "HeaderStatus": "حالت", - "ManageRecording": "ریکارڈنگ کا انتظام کریں۔", + "ManageRecording": "ریکارڈنگ کا انتظام کریں", "ButtonTrailer": "ٹریلر", "HeaderProfileInformation": "ذاتی معلومات", "HeaderLiveTvTunerSetup": "لائیو ٹی وی ٹونر سیٹ اپ", "PlayNext": "اگلا کھیلیں", "LabelPlaceOfBirth": "جائے پیدائش", "PlaceFavoriteChannelsAtBeginning": "شروع میں پسندیدہ چینلز رکھیں", - "ConfirmDeletion": "حذف کرنے کی تصدیق کریں۔", + "ConfirmDeletion": "حذف کرنے کی تصدیق کریں", "MediaInfoCodec": "کوڈیک", "YoutubePlaybackError": "درخواست کردہ ویڈیو نہیں چلائی جا سکتی۔", "LabelCache": "کیش", @@ -1379,13 +1379,13 @@ "TabNotifications": "اطلاعات", "HeaderResponseProfile": "جوابی پروفائل", "PasswordMatchError": "پاس ورڈ اور پاس ورڈ کی تصدیق مماثل ہونی چاہیے۔", - "HeaderAddToCollection": "مجموعہ میں شامل کریں۔", + "HeaderAddToCollection": "مجموعہ میں شامل کریں", "OptionAllowRemoteSharedDevicesHelp": "DLNA ڈیوائسز کو اس وقت تک مشترکہ سمجھا جاتا ہے جب تک کہ صارف ان کو کنٹرول کرنا شروع نہیں کرتا ہے۔", - "OptionEnableM2tsMode": "M2TS موڈ کو فعال کریں۔", + "OptionEnableM2tsMode": "M2TS موڈ کو فعال کریں", "EnableNextVideoInfoOverlayHelp": "ویڈیو کے آخر میں، موجودہ پلے لسٹ میں آنے والی اگلی ویڈیو کے بارے میں معلومات دکھائیں۔", "LabelStopWhenPossible": "جب ممکن ہو روکیں", "LabelZipCode": "زپ کوڈ", - "DeleteMedia": "میڈیا کو حذف کریں۔", + "DeleteMedia": "میڈیا کو حذف کریں", "LabelTunerIpAddress": "ٹونر آئی پی ایڈریس", "LabelDeinterlaceMethod": "ڈانٹرلیسنگ کا طریقہ", "ViewPlaybackInfo": "پلے بیک کی معلومات دیکھیں", @@ -1394,7 +1394,7 @@ "MediaInfoResolution": "قرارداد", "Images": "امیجز", "OptionOnInterval": "وقفے پر", - "QuickConnectAuthorizeSuccess": "درخواست کی اجازت دی گئی۔", + "QuickConnectAuthorizeSuccess": "درخواست کی اجازت دی گئی", "TabStreaming": "سلسلہ بندی", "HeaderActiveRecordings": "فعال ریکارڈنگز", "MessagePleaseWait": "برائے مہربانی انتظار کریں. اس میں ایک منٹ لگ سکتا ہے۔", @@ -1415,12 +1415,12 @@ "MediaInfoColorPrimaries": "رنگین پرائمریز", "HeaderSortBy": "ترتیب دیں", "Label3DFormat": "3D فارمیٹ", - "HeaderConfirmRevokeApiKey": "API کلید کو منسوخ کریں۔", + "HeaderConfirmRevokeApiKey": "API کلید کو منسوخ کریں", "LabelDisplayMode": "ڈسپلے موڈ", "LabelCollection": "مجموعہ", "Subtitles": "سب ٹائٹلز", "LabelSendNotificationToUsers": "اطلاع بھیجیں", - "LabelAutomaticallyAddToCollection": "خودکار طور پر مجموعہ میں شامل کریں۔", + "LabelAutomaticallyAddToCollection": "خودکار طور پر مجموعہ میں شامل کریں", "TabContainers": "کنٹینرز", "LabelAutomaticallyAddToCollectionHelp": "جب کم از کم 2 فلموں کا ایک ہی مجموعہ کا نام ہوگا، تو وہ خودکار طور پر مجموعہ میں شامل ہو جائیں گی۔", "LabelBlastMessageInterval": "زندہ پیغام کا وقفہ", @@ -1429,14 +1429,14 @@ "LabelDateAddedBehaviorHelp": "اگر میٹا ڈیٹا ویلیو موجود ہے، تو یہ ہمیشہ ان میں سے کسی ایک آپشن سے پہلے استعمال کی جائے گی۔", "LabelEasyPinCode": "آسان پن کوڈ", "LabelEnableIP6Help": "IPv6 فعالیت کو فعال کریں۔", - "Continuing": "جاری ہے۔", + "Continuing": "جاری ہے", "ChannelNumber": "چینل نمبر", - "LabelSyncPlaySettingsDescription": "SyncPlay کی ترجیحات کو تبدیل کریں۔", + "LabelSyncPlaySettingsDescription": "SyncPlay کی ترجیحات کو تبدیل کریں", "HeaderSubtitleAppearance": "ذیلی عنوان کی ظاہری شکل", "HeaderVideoTypes": "ویڈیو کی اقسام", "Filters": "فلٹرز", "LabelAccessEnd": "اختتامی وقت", - "LabelSyncPlaySettingsSpeedToSync": "SpeedToSync کو فعال کریں۔", + "LabelSyncPlaySettingsSpeedToSync": "SpeedToSync کو فعال کریں", "Never": "کبھی نہیں", "PreviousChapter": "پچھلا باب", "HeaderCodecProfile": "کوڈیک پروفائل", @@ -1446,17 +1446,17 @@ "MediaInfoVideoRange": "ویڈیو کی حد", "TypeOptionPluralMusicArtist": "موسیقی کے فنکار", "HeaderDeveloperInfo": "ڈویلپر کی معلومات", - "LabelVersionInstalled": "{0} انسٹال ہوا۔", - "HeaderEditImages": "امیجز میں ترمیم کریں۔", + "LabelVersionInstalled": "{0} انسٹال ہوا", + "HeaderEditImages": "امیجز میں ترمیم کریں", "OptionMissingEpisode": "مسنگ ایپی سوڈز", "ViewAlbum": "البم دیکھیں", "ViewAlbumArtist": "البم آرٹسٹ دیکھیں", - "LabelAllowHWTranscoding": "ہارڈویئر ٹرانس کوڈنگ کی اجازت دیں۔", + "LabelAllowHWTranscoding": "ہارڈویئر ٹرانس کوڈنگ کی اجازت دیں", "DashboardOperatingSystem": "آپریٹنگ سسٹم: {0}", - "ContainerNotSupported": "کنٹینر تعاون یافتہ نہیں ہے۔", - "HeaderSelectPath": "راستہ منتخب کریں۔", + "ContainerNotSupported": "کنٹینر تعاون یافتہ نہیں ہے", + "HeaderSelectPath": "راستہ منتخب کریں", "LabelBitrate": "بٹریٹ", - "AudioBitDepthNotSupported": "آڈیو کی تھوڑا سا گہرائی تعاون یافتہ نہیں ہے۔", + "AudioBitDepthNotSupported": "آڈیو کی تھوڑا سا گہرائی تعاون یافتہ نہیں ہے", "People": "لوگ", "Depressed": "اداس", "Horizontal": "افقی", @@ -1465,25 +1465,25 @@ "Anytime": "کسی بھی وقت", "LabelSelectStereo": "سٹیریو", "ValueEpisodeCount": "{0} ایپی سوڈز", - "EnableHardwareEncoding": "ہارڈویئر انکوڈنگ کو فعال کریں۔", + "EnableHardwareEncoding": "ہارڈویئر انکوڈنگ کو فعال کریں", "TabNetworking": "نیٹ ورکنگ", "LabelRepositoryName": "مخزن کا نام", "OnApplicationStartup": "درخواست کے آغاز پر", "ThemeSongs": "تھیم گانے", "Next": "اگلے", - "OptionDisplayFolderView": "سادہ میڈیا فولڈرز دکھانے کے لیے فولڈر کا منظر دکھائیں۔", + "OptionDisplayFolderView": "سادہ میڈیا فولڈرز دکھانے کے لیے فولڈر کا منظر دکھائیں", "Home": "گھر", "HeaderRecordingOptions": "ریکارڈنگ کے اختیارات", "ThumbCard": "انگوٹھا کارڈ", "LabelCustomCertificatePath": "حسب ضرورت SSL سرٹیفکیٹ کا راستہ", "Categories": "اقسام", - "ButtonRevoke": "منسوخ کریں۔", + "ButtonRevoke": "منسوخ کریں", "TabDashboard": "ڈیش بورڈ", "LabelAudioBitrate": "آڈیو بٹریٹ", "SeriesCancelled": "سیریز منسوخ کر دی گئی۔", "LabelHttpsPort": "مقامی HTTPS پورٹ نمبر", "OptionRandom": "بے ترتیب", - "ButtonAddUser": "صارف شامل کریں۔", + "ButtonAddUser": "صارف شامل کریں", "RecommendationBecauseYouWatched": "کیونکہ آپ نے {0} دیکھا", "LabelTranscodePath": "ٹرانس کوڈ کا راستہ", "LabelProfileContainersHelp": "کوما سے الگ کیا گیا۔ اسے تمام کنٹینرز پر لاگو کرنے کے لیے خالی چھوڑا جا سکتا ہے۔", @@ -1506,7 +1506,7 @@ "ResetPassword": "پاس ورڈ ری سیٹ", "Ascending": "صعودی", "OptionProtocolHls": "HTTP لائیو سٹریمنگ (HLS)", - "OptionAllowBrowsingLiveTv": "لائیو ٹی وی تک رسائی کی اجازت دیں۔", + "OptionAllowBrowsingLiveTv": "لائیو ٹی وی تک رسائی کی اجازت دیں", "OnlyForcedSubtitlesHelp": "صرف ان سب ٹائٹلز کو لوڈ کیا جائے گا جنہیں زبردستی کے بطور نشان زد کیا گیا ہے۔", "Uniform": "وردی", "LabelTranscodes": "ٹرانس کوڈز", @@ -1514,13 +1514,13 @@ "LabelUDPPortRange": "UDP کمیونیکیشن رینج", "LabelIsForced": "مجبور", "SendMessage": "پیغام بھیجیں", - "HeaderTypeText": "متن درج کریں۔", + "HeaderTypeText": "متن درج کریں", "Desktop": "ڈیسک ٹاپ", "LabelNewPasswordConfirm": "نئے پاس ورڈ کی تصدیق", - "EnableDecodingColorDepth10Hevc": "HEVC کے لیے 10 بٹ ہارڈویئر ڈی کوڈنگ کو فعال کریں۔", + "EnableDecodingColorDepth10Hevc": "HEVC کے لیے 10 بٹ ہارڈویئر ڈی کوڈنگ کو فعال کریں", "LabelVideoCodec": "ویڈیو کوڈیک", "LabelAllowedRemoteAddresses": "ریموٹ آئی پی ایڈریس فلٹر", - "ButtonSelectDirectory": "ڈائرکٹری منتخب کریں۔", + "ButtonSelectDirectory": "ڈائرکٹری منتخب کریں", "SortName": "ترتیب دیں نام", "Casual": "آرام دہ اور پرسکون", "Console": "تسلی", @@ -1537,11 +1537,11 @@ "Bold": "بولڈ", "OptionReportByteRangeSeekingWhenTranscodingHelp": "یہ کچھ ایسے آلات کے لیے درکار ہے جو وقت کی اچھی طرح تلاش نہیں کرتے ہیں۔", "OptionTvdbRating": "ٹی وی ڈی بی کی درجہ بندی", - "RefreshMetadata": "میٹا ڈیٹا ریفریش کریں۔", + "RefreshMetadata": "میٹا ڈیٹا ریفریش کریں", "UserAgentHelp": "ایک حسب ضرورت 'یوزر-ایجنٹ' HTTP ہیڈر فراہم کریں۔", "Remuxing": "Remuxing", "YoutubeBadRequest": "غلط فرمائش.", - "EnableCardLayout": "بصری کارڈ باکس ڈسپلے کریں۔", + "EnableCardLayout": "بصری کارڈ باکس ڈسپلے کریں", "EnableStreamLoopingHelp": "اگر لائیو اسٹریمز میں صرف چند سیکنڈ کا ڈیٹا ہوتا ہے اور اسے مسلسل درخواست کرنے کی ضرورت ہوتی ہے تو اسے فعال کریں۔ ضرورت نہ ہونے پر اسے فعال کرنے سے مسائل پیدا ہو سکتے ہیں۔", "LabelDay": "ہفتے کا دن", "LabelSource": "ذریعہ", @@ -1568,9 +1568,9 @@ "OptionAutomaticallyGroupSeriesHelp": "اس لائبریری کے اندر متعدد فولڈرز میں پھیلی ہوئی سیریز خود بخود ایک سیریز میں ضم ہو جائیں گی۔", "OptionBluray": "بی ڈی", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", - "OptionDateAddedImportTime": "لائبریری میں اسکین شدہ تاریخ کا استعمال کریں۔", - "OptionEnableAccessFromAllDevices": "تمام آلات سے رسائی کو فعال کریں۔", - "OptionEnableAccessToAllLibraries": "تمام لائبریریوں تک رسائی کو فعال کریں۔", + "OptionDateAddedImportTime": "لائبریری میں اسکین شدہ تاریخ کا استعمال کریں", + "OptionEnableAccessFromAllDevices": "تمام آلات سے رسائی کو فعال کریں", + "OptionEnableAccessToAllLibraries": "تمام لائبریریوں تک رسائی کو فعال کریں", "OptionHasThemeSong": "مرکزی نغمہ", "OptionLoginAttemptsBeforeLockoutHelp": "صفر کی قدر کا مطلب ہے کہ عام صارفین کے لیے تین اور منتظمین کے لیے پانچ کا ڈیفالٹ وراثت میں ملنا۔ اسے -1 پر سیٹ کرنے سے فیچر غیر فعال ہو جائے گا۔", "OptionMax": "زیادہ سے زیادہ", @@ -1578,20 +1578,20 @@ "OtherArtist": "دوسرے فنکار", "PackageInstallCompleted": "{0} (ورژن {1}) کی تنصیب مکمل ہو گئی۔", "PlaybackData": "پلے بیک کی معلومات", - "AllowEmbeddedSubtitlesAllowAllOption": "سب کو اجازت دیں۔", - "AllowEmbeddedSubtitlesAllowNoneOption": "کسی کو اجازت نہ دیں۔", - "AllowEmbeddedSubtitlesAllowImageOption": "تصویر کی اجازت دیں۔", - "AllowEmbeddedSubtitlesAllowTextOption": "متن کی اجازت دیں۔", + "AllowEmbeddedSubtitlesAllowAllOption": "سب کو اجازت دیں", + "AllowEmbeddedSubtitlesAllowNoneOption": "کسی کو اجازت نہ دیں", + "AllowEmbeddedSubtitlesAllowImageOption": "تصویر کی اجازت دیں", + "AllowEmbeddedSubtitlesAllowTextOption": "متن کی اجازت دیں", "Premiere": "پریمیئر", "Print": "پرنٹ کریں", "Production": "پیداوار", "Quality": "معیار", "QuickConnect": "فوری کنیکٹ", - "QuickConnectActivationSuccessful": "کامیابی سے چالو ہو گیا۔", + "QuickConnectActivationSuccessful": "کامیابی سے چالو ہو گیا", "Record": "ریکارڈ", - "ShowYear": "سال دکھائیں۔", - "ContainerBitrateExceedsLimit": "ویڈیو کا بٹ ریٹ حد سے زیادہ ہے۔", - "PreferSystemNativeHwDecoder": "OS مقامی DXVA یا VA-API ہارڈویئر ڈیکوڈرز کو ترجیح دیں۔", + "ShowYear": "سال دکھائیں", + "ContainerBitrateExceedsLimit": "ویڈیو کا بٹ ریٹ حد سے زیادہ ہے", + "PreferSystemNativeHwDecoder": "OS مقامی DXVA یا VA-API ہارڈویئر ڈیکوڈرز کو ترجیح دیں", "ItemDetails": "آئٹم کی تفصیلات", "LabelDisplayLanguage": "ڈسپلے کی زبان", "LabelFailed": "ناکام", @@ -1600,9 +1600,9 @@ "LabelMetadataPathHelp": "ڈاؤن لوڈ کردہ آرٹ ورک اور میٹا ڈیٹا کے لیے اپنی مرضی کے مطابق مقام کی وضاحت کریں۔", "LabelSortName": "ترتیب دیں نام", "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "کم از کم پلے بیک تاخیر (ms میں) جس کے بعد SpeedToSync پلے بیک پوزیشن کو درست کرنے کی کوشش کرتا ہے۔", - "OptionAllowManageLiveTv": "لائیو ٹی وی ریکارڈنگ کے انتظام کی اجازت دیں۔", - "OptionExtractChapterImage": "باب کی تصویر نکالنے کو فعال کریں۔", - "OptionHideUser": "اس صارف کو لاگ ان اسکرینوں سے چھپائیں۔", + "OptionAllowManageLiveTv": "لائیو ٹی وی ریکارڈنگ کے انتظام کی اجازت دیں", + "OptionExtractChapterImage": "باب کی تصویر نکالنے کو فعال کریں", + "OptionHideUser": "اس صارف کو لاگ ان اسکرینوں سے چھپائیں", "OptionIsSD": "ایس ڈی", "TabMyPlugins": "میرے پلگ انز", "TvLibraryHelp": "{0}ٹی وی کے نام کی گائیڈ{1} کا جائزہ لیں۔", @@ -1619,11 +1619,11 @@ "LabelSlowResponseTime": "ms میں وقت جس کے بعد جواب سست سمجھا جاتا ہے", "TabAdvanced": "اعلی درجے کی", "HeaderAccessScheduleHelp": "مخصوص اوقات تک رسائی کو محدود کرنے کے لیے رسائی کا شیڈول بنائیں۔", - "EnableSplashScreen": "سپلیش اسکرین کو فعال کریں۔", + "EnableSplashScreen": "سپلیش اسکرین کو فعال کریں", "OptionLoginAttemptsBeforeLockout": "لاک آؤٹ ہونے سے پہلے اس بات کا تعین کریں کہ لاگ ان کی کتنی غلط کوششیں کی جا سکتی ہیں۔", "OptionPremiereDate": "پریمیئر کی تاریخ", "OptionResElement": "'res' عنصر", - "OptionSaveMetadataAsHidden": "میٹا ڈیٹا اور امیجز کو پوشیدہ فائلوں کے طور پر محفوظ کریں۔", + "OptionSaveMetadataAsHidden": "میٹا ڈیٹا اور امیجز کو پوشیدہ فائلوں کے طور پر محفوظ کریں", "OptionSaveMetadataAsHiddenHelp": "اسے تبدیل کرنے کا اطلاق مستقبل میں محفوظ کیے گئے نئے میٹا ڈیٹا پر ہوگا۔ موجودہ میٹا ڈیٹا فائلوں کو اگلی بار سرور کے ذریعہ محفوظ کرنے پر اپ ڈیٹ کیا جائے گا۔", "Schedule": "شیڈول", "TonemappingAlgorithmHelp": "ٹون میپنگ کو ٹھیک بنایا جا سکتا ہے۔ اگر آپ ان اختیارات سے واقف نہیں ہیں تو صرف ڈیفالٹ رکھیں۔ تجویز کردہ قدر 'BT.2390' ہے۔", @@ -1646,11 +1646,11 @@ "WelcomeToProject": "جیلیفن میں خوش آمدید!", "Whitelist": "وائٹ لسٹ", "WriteAccessRequired": "جیلیفن کو اس فولڈر تک تحریری رسائی درکار ہے۔ براہ کرم تحریری رسائی کو یقینی بنائیں اور دوبارہ کوشش کریں۔", - "EnableIntelLowPowerH264HwEncoder": "Intel Low-Power H.264 ہارڈویئر انکوڈر کو فعال کریں۔", - "EnableIntelLowPowerHevcHwEncoder": "Intel Low-Power HEVC ہارڈویئر انکوڈر کو فعال کریں۔", - "AudioIsExternal": "آڈیو سلسلہ بیرونی ہے۔", - "VideoBitrateNotSupported": "ویڈیو کا بٹ ریٹ تعاون یافتہ نہیں ہے۔", - "UnknownVideoStreamInfo": "ویڈیو اسٹریم کی معلومات نامعلوم ہے۔", + "EnableIntelLowPowerH264HwEncoder": "Intel Low-Power H.264 ہارڈویئر انکوڈر کو فعال کریں", + "EnableIntelLowPowerHevcHwEncoder": "Intel Low-Power HEVC ہارڈویئر انکوڈر کو فعال کریں", + "AudioIsExternal": "آڈیو سلسلہ بیرونی ہے", + "VideoBitrateNotSupported": "ویڈیو کا بٹ ریٹ تعاون یافتہ نہیں ہے", + "UnknownVideoStreamInfo": "ویڈیو اسٹریم کی معلومات نامعلوم ہے", "SelectAll": "تمام منتخب کریں", "Clip": "فیچرٹی", "MessageUnauthorizedUser": "آپ اس وقت سرور تک رسائی کے مجاز نہیں ہیں۔ مزید معلومات کے لیے براہ کرم اپنے سرور ایڈمنسٹریٹر سے رابطہ کریں۔", @@ -1669,6 +1669,6 @@ "LiveTV": "لائیو ٹی وی", "Localization": "لوکلائزیشن", "OptionDateAdded": "شامل کرنے کی تاریخ", - "OptionPlainVideoItems": "تمام ویڈیوز کو سادہ ویڈیو آئٹمز کے طور پر ڈسپلے کریں۔", + "OptionPlainVideoItems": "تمام ویڈیوز کو سادہ ویڈیو آئٹمز کے طور پر ڈسپلے کریں", "MessageRenameMediaFolder": "میڈیا لائبریری کا نام تبدیل کرنے سے تمام میٹا ڈیٹا ضائع ہو جائے گا، احتیاط کے ساتھ آگے بڑھیں۔" } From 0ae6a89c1b9149c7302d8fd17e27415e9e8018d8 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:20 +0000 Subject: [PATCH 109/147] Translated using Weblate (Esperanto) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/eo/ --- src/strings/eo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/eo.json b/src/strings/eo.json index 387fd4f994..eefb15d5ac 100644 --- a/src/strings/eo.json +++ b/src/strings/eo.json @@ -1243,7 +1243,7 @@ "OnlyForcedSubtitlesHelp": "Nur subtekstoj ŝarĝitos markitaj kiel forcitaj.", "LabelSelectFolderGroupsHelp": "Dosierujoj malelektitaj montriĝos mem laŭ sia propra vido.", "AllowRemoteAccessHelp": "Se malelektita, ĉiuj foraj konektoj estos blokitaj.", - "EnableGamepadHelp": "Aŭskulti pri enigo de iuj konektitaj regiloj.", + "EnableGamepadHelp": "Aŭskulti pri enigo de iuj konektitaj regiloj", "OptionEnableM2tsModeHelp": "Ebligi M2TS-reĝimon dum kodado al MPEG-TS.", "SubtitleAppearanceSettingsDisclaimer": "La sekvaj parametroj ne validas por la grafikaj subtekstoj menciitaj supre aŭ ASS/SSA subtekstoj kiuj enigas siajn proprajn stilojn.", "KnownProxiesHelp": "Komo apartigita listo de IP-adresoj aŭ gastignomoj de konataj prokuriloj uzataj kiam vi konektas al via Jellyfin-ekzemplo. Ĉi tio estas bezonata por ĝuste uzi \"X-Forwarded-For\" ĉapojn. Necesas relanĉon post savado.", From b3d5298a4d59ae01d00f3ee4c99ea33d3e3d5de7 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:29:44 +0000 Subject: [PATCH 110/147] Translated using Weblate (Tamil) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ta/ --- src/strings/ta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ta.json b/src/strings/ta.json index 3e2c2e3a9b..803171e6f1 100644 --- a/src/strings/ta.json +++ b/src/strings/ta.json @@ -1525,7 +1525,7 @@ "Framerate": "பிரேம் வீதம்", "DirectPlayHelp": "மூல கோப்பு இந்த கிளையனுடன் முற்றிலும் ஒத்துப்போகும், மேலும் அமர்வு மாற்றங்கள் இல்லாமல் கோப்பைப் பெறுகிறது.", "HeaderContinueReading": "தொடர்ந்து படிக்க", - "EnableGamepadHelp": "இணைக்கப்பட்ட எந்த கட்டுப்படுத்திகளிடமிருந்தும் உள்ளீட்டைக் கேளுங்கள்.", + "EnableGamepadHelp": "இணைக்கப்பட்ட எந்த கட்டுப்படுத்திகளிடமிருந்தும் உள்ளீட்டைக் கேளுங்கள்", "LabelEnableGamepad": "கேம்பேட்டை இயக்கு", "Controls": "கட்டுப்பாடுகள்", "TextSent": "உரை அனுப்பப்பட்டது.", From e6729af9425def5d58d6fc81311289f222b0ddbc Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:25 +0000 Subject: [PATCH 111/147] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/et.json b/src/strings/et.json index c3e153e2f3..810edcea6d 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -1567,7 +1567,7 @@ "TypeOptionPluralMusicAlbum": "Muusika albumid", "TypeOptionPluralMovie": "Filmid", "SortByValue": "Järjesta {0}", - "EnableGamepadHelp": "Kuula ühendatud juhtseadmete sisendit.", + "EnableGamepadHelp": "Kuula ühendatud juhtseadmete sisendit", "LabelOriginalMediaInfo": "Algsed meedia andmed", "RemuxHelp2": "Remuksimine kasutab väga vähe jõudlust, ilma et meedia kvaliteet väheneks.", "WeeklyAt": "{0}s kell {1}", From 4e24a2b2b5ae9b653274e7d11d943b66c1588586 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:28 +0000 Subject: [PATCH 112/147] Translated using Weblate (Basque) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/eu/ --- src/strings/eu.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/eu.json b/src/strings/eu.json index c6dde7d0fc..07059abc46 100644 --- a/src/strings/eu.json +++ b/src/strings/eu.json @@ -48,7 +48,7 @@ "SubtitleCodecNotSupported": "Azpitituluen kodea ez da bateragarria", "ContainerNotSupported": "Ez da onartzen edukiontzia", "AudioCodecNotSupported": "Audio-kodea ez da bateragarria", - "EnableGamepadHelp": "Entzun konektatutako edozein kontrolatzaileren sarrera.", + "EnableGamepadHelp": "Entzun konektatutako edozein kontrolatzaileren sarrera", "LabelEnableGamepad": "Gaikuntza Agintea", "Controls": "Kontrolak", "AllowVppTonemappingHelp": "Hardwarean oinarritutako tonuen mapaketa osoa, OpenCL iragazkia erabili gabe. Une honetan txertatutako HDR10 metadatuekin bideoak transkodifikatzean bakarrik funtzionatzen du.", @@ -305,8 +305,8 @@ "Record": "Grabatu", "RecommendationStarring": "Protagonista: {0}", "RecommendationDirectedBy": "Zuzendaria: {0}", - "RecommendationBecauseYouWatched": "{0} ikusi duzunez…", - "RecommendationBecauseYouLike": "{0} gustatu zaizunez…", + "RecommendationBecauseYouWatched": "{0} ikusi duzunez", + "RecommendationBecauseYouLike": "{0} gustatu zaizunez", "RecentlyWatched": "Duela gutxi ikusitakoak", "Rate": "Kalifikatzen du", "Raised": "Goratuak", From 5f86d89ca6410de7486fa86b4af5fdfc05208952 Mon Sep 17 00:00:00 2001 From: Alan Azar Date: Fri, 5 May 2023 11:28:55 +0000 Subject: [PATCH 113/147] Translated using Weblate (Malagasy) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/mg/ --- src/strings/mg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/mg.json b/src/strings/mg.json index 54e2956c06..9cb6c466f8 100644 --- a/src/strings/mg.json +++ b/src/strings/mg.json @@ -35,7 +35,7 @@ "AllowHevcEncoding": "Avela hamadika format HEVC", "AllowHWTranscodingHelp": "Avela ny tuner hiasa sady mamadika format. Mety hanampy amin'ny fampihenana ny asa takian'ny serveur izany.", "AllowMediaConversionHelp": "Avela na lavina ny fidirana amin'ny asa famadihana format.", - "AllowOnTheFlySubtitleExtraction": "Avela hamaky dikanteny eny ampandehanana.", + "AllowOnTheFlySubtitleExtraction": "Avela hamaky dikanteny eny ampandehanana", "AllowOnTheFlySubtitleExtractionHelp": "Azo alaina avy amin'ilay video ny dikanteny ao anatiny ary aseho amin'ny soratra tsotra, mba hisorohana ny famadihana video. Mety haharitra ela izany ka hampiato ny famakiana horonan-tsary mandritra ny dingan'ny fitrandrahana. Atsaharo raha avela ho dikanteny miaraka amin'ny famadihana horonan-tsary.", "AllowRemoteAccess": "Avela hifandray amin'ny hafa ity serveur ity", "AllowRemoteAccessHelp": "Raha tsy marihina dia ho voasakana ny fifandraisana lavitra rehetra." From 6e057f07f9371b5b27dc35e989d6e6155d63f283 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 4 May 2023 23:45:03 -0400 Subject: [PATCH 114/147] Add prefer string starts/ends with eslint rule --- .eslintrc.js | 3 ++- src/components/metadataEditor/metadataEditor.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c089d3ac0e..c1a86d8904 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -245,7 +245,8 @@ module.exports = { 'Windows': 'readonly' }, rules: { - '@typescript-eslint/no-floating-promises': ['warn'] + '@typescript-eslint/no-floating-promises': ['warn'], + '@typescript-eslint/prefer-string-starts-ends-with': ['error'] } }, // TypeScript source files diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index dfe7a99237..b21c615cdd 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -108,7 +108,7 @@ function getDateValue(form, element, property) { const parts = date.toISOString().split('T'); // If the date is the same, preserve the time - if (parts[0].indexOf(val) === 0) { + if (parts[0].startsWith(val)) { const iso = parts[1]; val += 'T' + iso; From 865df884fda10a229782656ffb7ff6fa8069cc73 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Fri, 5 May 2023 11:47:08 -0400 Subject: [PATCH 115/147] Add useWebConfig hook --- src/RootApp.tsx | 17 +++++++++------- src/hooks/useWebConfig.tsx | 40 ++++++++++++++++++++++++++++++++++++++ src/types/webConfig.ts | 20 +++++++++++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/hooks/useWebConfig.tsx create mode 100644 src/types/webConfig.ts diff --git a/src/RootApp.tsx b/src/RootApp.tsx index 0159b155ab..a44e25d565 100644 --- a/src/RootApp.tsx +++ b/src/RootApp.tsx @@ -5,6 +5,7 @@ import React from 'react'; import StableApp from './apps/stable/App'; import { HistoryRouter } from './components/router/HistoryRouter'; import { ApiProvider } from './hooks/useApi'; +import { WebConfigProvider } from './hooks/useWebConfig'; const ExperimentalApp = loadable(() => import('./apps/experimental/App')); @@ -13,13 +14,15 @@ const RootApp = ({ history }: { history: History }) => { return ( - - { - layoutMode === 'experimental' ? - : - - } - + + + { + layoutMode === 'experimental' ? + : + + } + + ); }; diff --git a/src/hooks/useWebConfig.tsx b/src/hooks/useWebConfig.tsx new file mode 100644 index 0000000000..528afcee0f --- /dev/null +++ b/src/hooks/useWebConfig.tsx @@ -0,0 +1,40 @@ +import React, { createContext, FC, useContext, useEffect, useState } from 'react'; + +import type { WebConfig } from '../types/webConfig'; +import defaultConfig from '../config.json'; +import fetchLocal from '../utils/fetchLocal'; + +export const WebConfigContext = createContext(defaultConfig); +export const useWebConfig = () => useContext(WebConfigContext); + +export const WebConfigProvider: FC = ({ children }) => { + const [ config, setConfig ] = useState(defaultConfig); + + useEffect(() => { + const fetchConfig = async () => { + try { + const response = await fetchLocal('config.json', { cache: 'no-cache' }); + + if (!response.ok) { + throw new Error('network response was not ok'); + } + + const configData = await response.json(); + setConfig(configData); + } catch (err) { + console.warn('[WebConfigProvider] failed to fetch config file', err); + } + }; + + fetchConfig() + .catch(() => { + // This should never happen since fetchConfig catches errors internally + }); + }, [ setConfig ]); + + return ( + + {children} + + ); +}; diff --git a/src/types/webConfig.ts b/src/types/webConfig.ts new file mode 100644 index 0000000000..5ef164c247 --- /dev/null +++ b/src/types/webConfig.ts @@ -0,0 +1,20 @@ +interface Theme { + name: string + id: string + color: string +} + +interface MenuLink { + name: string + icon?: string + url: string +} + +export interface WebConfig { + includeCorsCredentials?: boolean + multiserver?: boolean + themes?: Theme[] + menuLinks?: MenuLink[] + servers?: string[] + plugins?: string[] +} From 7bbddba9ff76868ae33d0a356d5e815d0c46d527 Mon Sep 17 00:00:00 2001 From: rushmash Date: Fri, 5 May 2023 23:24:31 +0000 Subject: [PATCH 116/147] Translated using Weblate (Belarusian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/ --- src/strings/be-by.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 8155444794..d00ed700a3 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -72,7 +72,7 @@ "AllowFfmpegThrottlingHelp": "Калі перакадзіраванне або рэмукс будзе дастаткова далёка ад бягучай пазіцыі прайгравання, прыпыніце працэс, каб ён спажываў менш рэсурсаў. Гэта найбольш карысна пры праглядзе без частага пошуку. Выключыце гэта, калі ўзнікнуць праблемы з прайграваннем.", "AllowOnTheFlySubtitleExtractionHelp": "Убудаваныя субтытры можна атрымаць з відэа і даставіць кліентам у выглядзе звычайнага тэксту, каб прадухіліць перакадзіраванне відэа. У некаторых сістэмах гэта можа заняць шмат часу і прывесці да спынення прайгравання відэа падчас працэсу здабывання. Адключыце гэта, каб убудаваныя субтытры запісваліся пры перакадзіраванні відэа, калі яны не падтрымліваюцца кліенцкай прыладай.", "AllowRemoteAccessHelp": "Калі не пазначыць, усе аддаленыя злучэнні будуць заблакіраваны.", - "AllowTonemappingHelp": "Адлюстраванне тонаў можа пераўтварыць дынамічны дыяпазон відэа з HDR у SDR, захоўваючы дэталі выявы і колеры, якія з'яўляюцца вельмі важнай інфармацыяй для прадстаўлення арыгінальнай сцэны. У цяперашні час працуе толькі з відэа HDR10 або HLG. Для гэтага патрабуецца адпаведнае асяроддзе выканання OpenCL або CUDA.", + "AllowTonemappingHelp": "Адлюстраванне тонаў можа пераўтварыць дынамічны дыяпазон відэа з HDR у SDR, захоўваючы дэталі выявы і колеры, якія з'яўляюцца вельмі важнай інфармацыяй для прадстаўлення арыгінальнай сцэны. У цяперашні час працуе толькі з відэа 10bit HDR10, HLG і DoVi. Для гэтага патрабуецца адпаведнае асяроддзе выканання OpenCL або CUDA.", "AlwaysPlaySubtitles": "Заўсёды граць", "ApiKeysCaption": "Спіс уключаных на дадзены момант ключоў API", "AroundTime": "Каля {0}", @@ -1383,9 +1383,9 @@ "Clip": "Кліп", "Sample": "Прыклад", "LabelVppTonemappingBrightness": "Узмацненне яркасці танальнага адлюстравання VPP", - "LabelVppTonemappingBrightnessHelp": "Прымяніць узмацненне яркасці ў танальным адлюстраванні VPP. І рэкамендаванае, і стандартнае значэнне роўна 0.", + "LabelVppTonemappingBrightnessHelp": "Прымяніць узмацненне яркасці ў танальным адлюстраванні VPP. Рэкамендаванае значэнне 16, значэнне па змаўчанні 0.", "LabelVppTonemappingContrast": "Узмацненне кантраснасці танальнага адлюстравання VPP", - "LabelVppTonemappingContrastHelp": "Прымяніць узмацненне кантрасту ў танальным адлюстраванні VPP. Рэкамендуемыя значэнні і значэнні па змаўчанні - 1,2 і 1.", + "LabelVppTonemappingContrastHelp": "Прымяніць узмацненне кантрасту ў танальным адлюстраванні VPP. Рэкамендуемыя значэнні і значэнні па змаўчанні - 1.", "VideoRangeTypeNotSupported": "Тып дыяпазону відэа не падтрымліваецца", "LabelVideoRangeType": "Тып дыяпазону відэа", "MediaInfoVideoRangeType": "Тып дыяпазону відэа", @@ -1707,5 +1707,8 @@ "LabelParallelImageEncodingLimit": "Ліміт паралельнага кадавання выявы", "LabelParallelImageEncodingLimitHelp": "Максімальная колькасць кадавання малюнкаў, якія могуць працаваць паралельна. Пры ўсталёўцы 0 вы выбіраеце ліміт на аснове спецыфікацый вашай сістэмы.", "LabelEnableAudioVbr": "Уключыць кадыроўку гуку VBR", - "LabelEnableAudioVbrHelp": "Пераменны бітрэйт забяспечвае лепшае суадносіны якасці да сярэдняга, але ў некаторых рэдкіх выпадках можа выклікаць праблемы з буферызацыяй і сумяшчальнасцю." + "LabelEnableAudioVbrHelp": "Пераменны бітрэйт забяспечвае лепшае суадносіны якасці да сярэдняга, але ў некаторых рэдкіх выпадках можа выклікаць праблемы з буферызацыяй і сумяшчальнасцю.", + "TonemappingModeHelp": "Выберыце рэжым танальнага адлюстравання. Калі вы бачыце, што блікі блякнуць, паспрабуйце пераключыцца ў рэжым RGB.", + "LabelTonemappingMode": "Рэжым танальнага адлюстравання", + "Select": "Выбраць" } From 226cdb1a4fa5dd71d076aa7b7cf8a090e6d4571e Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Sat, 6 May 2023 13:09:40 +0000 Subject: [PATCH 117/147] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index baffd15217..2400d65478 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1334,7 +1334,7 @@ "LabelTonemappingDesat": "Khử bão hòa tông màu", "LabelTonemappingDesatHelp": "Áp dụng khử bão hòa cho các điểm sáng vượt quá độ sáng này. Thông số này càng cao thì thông tin màu càng được bảo toàn. Cài đặt này giúp ngăn các màu bị lóa không tự nhiên để tạo ra những vùng siêu nổi bật, bằng cách chuyển thành màu trắng (mềm mại). Nó làm cho hình ảnh trông tự nhiên, với hao phí giảm thông tin về các màu nằm ngoài phạm vi. Các giá trị được đề xuất và mặc định là 0 và 0,5.", "LabelTonemappingRange": "Phạm vi ánh xạ tông màu", - "AllowTonemappingHelp": "Ánh xạ tông màu có thể biến đổi dải động video từ HDR sang SDR mà vẫn duy trì chi tiết và màu sắc hình ảnh, đây là thông tin rất quan trọng để thể hiện cảnh gốc. Hiện chỉ hoạt động với video HDR10 hoặc HLG. Điều này yêu cầu thời gian chạy OpenCL hoặc CUDA tương ứng.", + "AllowTonemappingHelp": "Ánh xạ tông màu có thể biến đổi dải động video từ HDR sang SDR mà vẫn giữ chi tiết và màu sắc hình ảnh, đó là thông tin rất quan trọng để thể hiện cảnh gốc. Hiện chỉ hoạt động với video 10bit HDR10, HLG và DoVi. Việc này yêu cầu OpenCL hoặc CUDA runtime tương ứng.", "EnableTonemapping": "Bật Ánh xạ tông màu", "LabelOpenclDevice": "Thiết bị OpenCL", "LabelColorPrimaries": "Màu cơ bản", @@ -1652,9 +1652,9 @@ "MediaInfoDoViTitle": "Tiêu đề DV", "MediaInfoVideoRangeType": "Loại dải động video", "LabelVideoRangeType": "Loại dải động video", - "LabelVppTonemappingContrastHelp": "Áp dụng độ tăng tương phản trong ánh xạ tông màu VPP. Giá trị đề xuất và mặc định là 1,2 và 1.", + "LabelVppTonemappingContrastHelp": "Áp dụng tăng tương phản trong ánh xạ tông màu VPP. Cả giá trị đề xuất và mặc định đều là 1.", "LabelVppTonemappingContrast": "Độ tương phản ánh xạ tông màu VPP", - "LabelVppTonemappingBrightnessHelp": "Áp dụng tăng độ sáng trong ánh xạ tông màu VPP. Giá trị đề xuất và giá trị mặc định đều là 0.", + "LabelVppTonemappingBrightnessHelp": "Áp dụng tăng độ sáng trong ánh xạ tông màu VPP. Giá trị đề xuất và mặc định là 16 và 0.", "LabelVppTonemappingBrightness": "Tăng độ sáng ánh xạ tông màu VPP", "ScreenResolution": "Độ Phân Giải Màn Hình", "RememberSubtitleSelectionsHelp": "Cố gắng đặt phụ đề phù hợp nhất với video cuối cùng.", @@ -1712,5 +1712,9 @@ "LabelParallelImageEncodingLimit": "Giới hạn mã hóa hình ảnh song song", "MediaInfoDvBlSignalCompatibilityId": "Id tương thích tính hiệu DV bl", "LabelEnableAudioVbr": "Bật mã hóa âm thanh VBR", - "LabelEnableAudioVbrHelp": "Tốc độ bit thay đổi mang lại chất lượng tốt hơn so với tỷ lệ bit trung bình, nhưng trong một số trường hợp hiếm gặp, có thể gây ra sự cố về khả năng tương thích và bộ đệm." + "LabelEnableAudioVbrHelp": "Tốc độ bit thay đổi mang lại chất lượng tốt hơn so với tỷ lệ bit trung bình, nhưng trong một số trường hợp hiếm gặp, có thể gây ra sự cố về khả năng tương thích và bộ đệm.", + "LabelTonemappingMode": "Chế độ ánh xạ tông màu", + "Short": "Ngắn", + "Select": "Chọn", + "TonemappingModeHelp": "Chọn chế độ ánh xạ tông màu. Nếu bạn thấy các điểm sáng bị cháy sáng, hãy thử chuyển sang chế độ RGB." } From ed79a9a5fd7e156272a9d706f224a7711874af20 Mon Sep 17 00:00:00 2001 From: TheSharingBrother Date: Sat, 6 May 2023 15:53:18 +0000 Subject: [PATCH 118/147] Translated using Weblate (Hindi) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hi/ --- src/strings/hi-in.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 32dab32ead..2607740cfe 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -149,5 +149,6 @@ "Larger": "और बड़ा", "ListPaging": "{2} का {0}-{1}", "Shows": "शो", - "ValueSpecialEpisodeName": "विशेष" + "ValueSpecialEpisodeName": "विशेष - {0}", + "Sync": "समाकलयति" } From 7ddfdb02debeca6316e5e035621acc05c266a3f9 Mon Sep 17 00:00:00 2001 From: Brett Healey Date: Sat, 6 May 2023 18:44:41 +0000 Subject: [PATCH 119/147] Translated using Weblate (Welsh) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cy/ --- src/strings/cy.json | 50 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/strings/cy.json b/src/strings/cy.json index fd7bf7474b..61954c975b 100644 --- a/src/strings/cy.json +++ b/src/strings/cy.json @@ -594,5 +594,53 @@ "HeaderLatestRecordings": "Recordiadau Diweddaraf", "HeaderLatestMusic": "Cerddoriaeth Diweddaraf", "HeaderLatestMovies": "Ffilmiau Diweddaraf", - "MixedMoviesShows": "Rhaglenni teledu a Ffilmiau Cymysg" + "MixedMoviesShows": "Rhaglenni teledu a Ffilmiau Cymysg", + "Featurette": "Nodwedd", + "LabelVideoInfo": "Gwybodaeth Fideo", + "SubtitleCyan": "Cyan", + "YoutubePlaybackError": "Ni ellir chwarae fideo y gofynnwyd amdani.", + "TypeOptionPluralMusicAlbum": "Albymau Cerddoriaeth", + "AllowedRemoteAddressesHelp": "Rhestr o gyfeiriadau IP wedi'u gwahanu gan goma neu gofnodion IP/mwgwd rhwyd ar gyfer rhwydweithiau y caniateir iddynt gysylltu o bell. Os caiff ei adael yn wag, bydd pob cyfeiriad o bell yn cael ei ganiatáu.", + "AllowFfmpegThrottlingHelp": "Pan fydd trawsgod neu remux yn mynd yn ddigon pell o'r sefyllfa chwarae bresennol, stopiwch y broses fel y bydd yn defnyddio llai o adnoddau.Mae hyn yn fwyaf defnyddiol wrth wylio heb geisio yn aml.Diffoddwch hwn os ydych chi'n profi problemau chwarae.", + "AllowHWTranscodingHelp": "Caniatáu i'r tiwniwr drawsgodio ffrydiau ar y hedfan.Gall hyn helpu i leihau'r trawsgodio sydd ei angen ar y gweinydd.", + "AllowOnTheFlySubtitleExtractionHelp": "Gellir echdynnu is-deitlau mewnosodedig o fideos a'u cyflwyno i gleientiaid mewn testun plaen, er mwyn helpu i atal trawsgodio fideo. Ar rai systemau gall hyn gymryd amser hir ac achosi i chwarae fideo stopio yn ystod y broses echdynnu. Analluoga hwn i gael is-deitlau wedi'u mewnosod wedi'u llosgi i mewn gyda thrawsgodio fideo pan nad ydynt yn cael eu cefnogi'n frodorol gan ddyfais y cleient.", + "AllowTonemappingHelp": "Gall mapio tôn drawsnewid ystod ddeinamig fideo o HDR i SDR wrth gynnal manylion delwedd a lliwiau, sy'n wybodaeth bwysig iawn ar gyfer cynrychioli'r olygfa wreiddiol. Ar hyn o bryd yn gweithio dim ond gyda fideos 10bit HDR10, HLG a DoVi. Mae hyn yn gofyn am yr amser rhedeg OpenCL neu CUDA cyfatebol.", + "LabelTonemappingMode": "Modd mapio tôn", + "Short": "Byr", + "SubtitleLightGray": "Llwyd Ysgafn", + "StopRecording": "Stopio recordio", + "SubtitleRed": "Coch", + "SubtitleMagenta": "Magenta", + "TabDirectPlay": "Chwarae Uniongyrchol", + "SubtitleWhite": "Gwyn", + "TitleHardwareAcceleration": "Cyflymiad Caledwedd", + "TabParentalControl": "Rheolaeth Rhieni", + "DeletedScene": "Golygfa wedi'i dileu", + "ContainerNotSupported": "Nid yw'r cynhwysydd yn cael ei gefnogi", + "EnableIntelLowPowerH264HwEncoder": "Galluogi amgodiwr caledwedd Intel Low-Power H.264.", + "Sample": "Sampl", + "BehindTheScenes": "Tu ôl i'r Llenni", + "Clip": "Clip", + "Select": "Dewiswch", + "LabelVppTonemappingContrastHelp": "Cymhwyso cynnydd cyferbyniad wrth fapio tôn VPP. Y gwerthoedd a argymhellir a'r gwerthoedd diofyn yw 1.", + "SelectAll": "Dewiswch Pawb", + "VideoLevelNotSupported": "Ni chefnogir lefel y codec fideo", + "YoutubeBadRequest": "Cais drwg.", + "Remuxing": "Remuxing", + "LabelPlaybackInfo": "Gwybodaeth Chwarae", + "LabelAudioInfo": "Gwybodaeth Sain", + "HeaderSelectFallbackFontPath": "Dewiswch Llwybr Ffolder Ffontiau Fallback", + "WelcomeToProject": "Croeso i Jellyfin!", + "ValueSongCount": "{0} Caneuon", + "ValueContainer": "Cynhwysydd: {0}", + "UnsupportedPlayback": "Ni all Jellyfin ddadgryptio cynnwys sydd wedi'i warchod gan DRM ond bydd yr holl gynnwys yn cael ei roi ar brawf beth bynnag, gan gynnwys teitlau gwarchodedig. Gall rhai ffeiliau ymddangos yn hollol ddu oherwydd amgryptio neu nodweddion eraill nad ydynt yn cael eu cefnogi, megis teitlau rhyngweithiol.", + "TypeOptionPluralBoxSet": "Setiau Blwch", + "TellUsAboutYourself": "Dywedwch wrthym amdanoch chi'ch hun", + "SubtitleBlack": "Du", + "SubtitleBlue": "Glas", + "SubtitleGray": "Llwyd", + "SubtitleYellow": "Melyn", + "SubtitleGreen": "Gwyrdd", + "SmallCaps": "Capiau Bach", + "ShowAdvancedSettings": "Dangos gosodiadau uwch" } From 63dac9915ba88948bca495777cbeaf6cc7060a9a Mon Sep 17 00:00:00 2001 From: Hadi Charara Date: Sat, 6 May 2023 21:09:25 -0400 Subject: [PATCH 120/147] Fixed the bug --- src/components/remotecontrol/remotecontrol.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 3c421aa81e..f6af1a864f 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -472,8 +472,8 @@ export default function () { } } - context.querySelector('.positionTime').innerHTML = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); - context.querySelector('.runtime').innerHTML = runtimeTicks != null ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; + context.querySelector('.positionTime').innerHTML = Number.isFinite(positionTicks) ? datetime.getDisplayRunningTime(positionTicks) : '--:--'; + context.querySelector('.runtime').innerHTML = Number.isFinite(runtimeTicks) ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; } function getPlaylistItems(player) { From 89a004a56850691b303829acf41ade4a5b451bcf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 7 May 2023 03:01:38 +0000 Subject: [PATCH 121/147] Update dependency date-fns to v2.30.0 --- package-lock.json | 32 +++++++++++++++++++------------- package.json | 2 +- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..44633e9b31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.30.1", - "date-fns": "2.29.3", + "date-fns": "2.30.0", "dompurify": "3.0.1", "epubjs": "0.3.93", "escape-html": "1.0.3", @@ -1807,9 +1807,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -5903,9 +5903,12 @@ "dev": true }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -21199,9 +21202,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "requires": { "regenerator-runtime": "^0.13.11" } @@ -24177,9 +24180,12 @@ "dev": true }, "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } }, "debug": { "version": "4.3.4", diff --git a/package.json b/package.json index efe32ce651..901fc4b91f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", "core-js": "3.30.1", - "date-fns": "2.29.3", + "date-fns": "2.30.0", "dompurify": "3.0.1", "epubjs": "0.3.93", "escape-html": "1.0.3", From c8e71c5c1a37dd5fa2c532773586ef0351033dea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 7 May 2023 10:15:35 +0000 Subject: [PATCH 122/147] Update dependency cssnano to v6.0.1 --- package-lock.json | 69 ++++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..605b314f3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", - "cssnano": "6.0.0", + "cssnano": "6.0.1", "es-check": "7.1.1", "eslint": "8.39.0", "eslint-plugin-compat": "4.1.4", @@ -5762,12 +5762,12 @@ } }, "node_modules/cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^6.0.0", + "cssnano-preset-default": "^6.0.1", "lilconfig": "^2.1.0" }, "engines": { @@ -5782,14 +5782,14 @@ } }, "node_modules/cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", + "postcss-calc": "^9.0.0", "postcss-colormin": "^6.0.0", "postcss-convert-values": "^6.0.0", "postcss-discard-comments": "^6.0.0", @@ -5797,7 +5797,7 @@ "postcss-discard-empty": "^6.0.0", "postcss-discard-overridden": "^6.0.0", "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", + "postcss-merge-rules": "^6.0.1", "postcss-minify-font-values": "^6.0.0", "postcss-minify-gradients": "^6.0.0", "postcss-minify-params": "^6.0.0", @@ -11869,14 +11869,17 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } @@ -12704,9 +12707,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -24066,24 +24069,24 @@ "dev": true }, "cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "requires": { - "cssnano-preset-default": "^6.0.0", + "cssnano-preset-default": "^6.0.1", "lilconfig": "^2.1.0" } }, "cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "requires": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", + "postcss-calc": "^9.0.0", "postcss-colormin": "^6.0.0", "postcss-convert-values": "^6.0.0", "postcss-discard-comments": "^6.0.0", @@ -24091,7 +24094,7 @@ "postcss-discard-empty": "^6.0.0", "postcss-discard-overridden": "^6.0.0", "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", + "postcss-merge-rules": "^6.0.1", "postcss-minify-font-values": "^6.0.0", "postcss-minify-gradients": "^6.0.0", "postcss-minify-params": "^6.0.0", @@ -28681,12 +28684,12 @@ } }, "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" } }, @@ -29239,9 +29242,9 @@ } }, "postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "requires": { "browserslist": "^4.21.4", diff --git a/package.json b/package.json index efe32ce651..0f33b1599d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", - "cssnano": "6.0.0", + "cssnano": "6.0.1", "es-check": "7.1.1", "eslint": "8.39.0", "eslint-plugin-compat": "4.1.4", From f747a57a439143c759d35356cf956d283e638374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Sun, 7 May 2023 19:13:47 +0000 Subject: [PATCH 123/147] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index ae924414cb..58ae15c951 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -86,8 +86,8 @@ "Composer": "Skladatel", "ConfigureDateAdded": "Nastavení způsobu, jakým je určeno datum přidání v nastavení knihovny v sekci Nástěnka > Knihovny > Nastavení NFO", "ConfirmDeleteImage": "Odstranit obrázek?", - "ConfirmDeleteItem": "Smazáním položky odstraníte soubor jak z knihovny médií tak ze souborového systému. Jste si jisti, že chcete pokračovat?", - "ConfirmDeleteItems": "Odstraněním těchto položek odstraníte vaše média jak z knihovny médií, tak i ze souborového systému. Jste si jisti, že chcete pokračovat?", + "ConfirmDeleteItem": "Smazáním položky odstraníte soubor jak z knihovny médií tak ze souborového systému. Opravdu chcete pokračovat?", + "ConfirmDeleteItems": "Odstraněním těchto položek odstraníte vaše média jak z knihovny médií, tak i ze souborového systému. Opravdu chcete pokračovat?", "ConfirmDeletion": "Potvrdit smazání", "ConfirmEndPlayerSession": "Chcete vypnout Jellyfin na {0}?", "Connect": "Připojit", @@ -102,9 +102,9 @@ "DefaultMetadataLangaugeDescription": "Toto jsou vaše výchozí hodnoty a lze je přizpůsobit na základě jednotlivých knihoven.", "DefaultSubtitlesHelp": "Titulky jsou načteny na základě výchozích a vynucených nastavení ve vložených metadatech. Jazykové preference jsou vzaty v úvahu, pokud je k dispozici více možností.", "Delete": "Odstranit", - "DeleteDeviceConfirmation": "Jste si jisti, že chcete smazat tento přístroj? Objeví se při dalším přihlášení uživatele.", + "DeleteDeviceConfirmation": "Opravdu chcete smazat tento přístroj? Objeví se při dalším přihlášení uživatele.", "DeleteImage": "Odstranit obrázek", - "DeleteImageConfirmation": "Jste si jisti, že chcete odstranit tento obrázek?", + "DeleteImageConfirmation": "Opravdu chcete odstranit tento obrázek?", "DeleteMedia": "Odstranit média", "DeleteUser": "Odstranit uživatele", "DeleteUserConfirmation": "Jste si jist, že chcete smazat tohoto uživatele?", @@ -663,19 +663,19 @@ "MediaInfoTimestamp": "Časové razítko", "Menu": "Nabídka", "MessageAlreadyInstalled": "Tato verze je již nainstalována.", - "MessageAreYouSureDeleteSubtitles": "Jste si jisti, že chcete smazat tyto titulky?", - "MessageAreYouSureYouWishToRemoveMediaFolder": "Jste si jist, že chcete odstranit tuto složku médií?", - "MessageConfirmDeleteGuideProvider": "Jste si jisti, že chcete smazat tohoto poskytovatele programového průvodce?", - "MessageConfirmDeleteTunerDevice": "Jste si jisti, že chcete smazat tento přístroj?", - "MessageConfirmProfileDeletion": "Jste si jisti, že chcete smazat tento profil?", + "MessageAreYouSureDeleteSubtitles": "Opravdu chcete smazat tyto titulky?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "Opravdu chcete odstranit tuto složku médií?", + "MessageConfirmDeleteGuideProvider": "Opravdu chcete smazat tohoto poskytovatele programového průvodce?", + "MessageConfirmDeleteTunerDevice": "Opravdu chcete smazat tento přístroj?", + "MessageConfirmProfileDeletion": "Opravdu chcete smazat tento profil?", "MessageConfirmRecordingCancellation": "Zrušit nahrávání?", - "MessageConfirmRemoveMediaLocation": "Jste si jist, že chcete odstranit toto umístění?", + "MessageConfirmRemoveMediaLocation": "Opravdu chcete odstranit toto umístění?", "MessageConfirmRestart": "Opravdu chcete restartovat Jellyfin?", "MessageConfirmRevokeApiKey": "Opravdu chcete zrušit tento klíč k API? Připojení dané aplikace k tomuto serveru bude náhle ukončeno.", - "MessageConfirmShutdown": "Jste si jisti, že chcete server vypnout?", + "MessageConfirmShutdown": "Opravdu chcete server vypnout?", "MessageContactAdminToResetPassword": "Kontaktujte, prosím, vašeho systémového administrátora k obnovení vašeho hesla.", "MessageCreateAccountAt": "Vytvořit účet v {0}", - "MessageDeleteTaskTrigger": "Opravdu si přejete odebrat spouštění úlohy?", + "MessageDeleteTaskTrigger": "Opravdu chcete odebrat spouštění úlohy?", "MessageDirectoryPickerBSDInstruction": "U BSD může být potřeba nakonfigurovat úložiště přímo pomocí izolační funkce jail v FreeNAS, aby měl Jellyfin přístup k vašim médiím.", "MessageDirectoryPickerLinuxInstruction": "Pro systémy Linux jako Arch Linux, CentOS, Debian, Fedora, OpenSUSE nebo Ubuntu musíte udělit uživateli služby oprávnění alespoň pro čtení.", "MessageDownloadQueued": "Stažení zařazeno.", @@ -827,7 +827,7 @@ "ParentalRating": "Rodičovské hodnocení", "PasswordMatchError": "Heslo a potvrzení hesla musí souhlasit.", "PasswordResetComplete": "Heslo bylo obnoveno.", - "PasswordResetConfirmation": "Jste si jisti, že chcete obnovit heslo?", + "PasswordResetConfirmation": "Opravdu chcete obnovit heslo?", "PasswordSaved": "Heslo uloženo.", "People": "Lidé", "PerfectMatch": "Přesná shoda", @@ -964,7 +964,7 @@ "TrackCount": "{0} stop", "Transcoding": "Překódování", "Tuesday": "Úterý", - "UninstallPluginConfirmation": "Jste si jisti, že chcete odinstalovat {0}?", + "UninstallPluginConfirmation": "Opravdu chcete odinstalovat {0}?", "HeaderUninstallPlugin": "Odinstalovat zásuvný modul", "Unmute": "Povolit zvuk", "Unrated": "Nehodnoceno", From 193f84ad22eb98399ae0fd6aae3fa3359113731c Mon Sep 17 00:00:00 2001 From: Marcinbar Date: Mon, 8 May 2023 12:47:47 +0000 Subject: [PATCH 124/147] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index f02ab5eefd..fb198e7844 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1664,9 +1664,9 @@ "MediaInfoVideoRangeType": "Typ zakresu wideo", "LabelVideoRangeType": "Typ zakresu wideo", "VideoRangeTypeNotSupported": "Typ zakresu wideo nie jest obsługiwany", - "LabelVppTonemappingContrastHelp": "Zastosuj wzmocnienie kontrastu w mapowaniu tonów VPP. Zalecane i domyślne wartości to 1.2 i 1.", + "LabelVppTonemappingContrastHelp": "Zastosuj wzmocnienie kontrastu w mapowaniu tonów VPP. Zalecane jak i domyślne wartości to 1.", "LabelVppTonemappingContrast": "VPP Wzmocnienie kontrastu mapowania tonów", - "LabelVppTonemappingBrightnessHelp": "Zastosuj wzmocnienie jasności w mapowaniu tonów VPP. Zarówno zalecane, jak i domyślne wartości to 0.", + "LabelVppTonemappingBrightnessHelp": "Zastosuj wzmocnienie jasności w mapowaniu tonów VPP. Zalecane, i domyślne wartości to 16 i 0.", "LabelVppTonemappingBrightness": "Wzmocnienie jasności mapowania tonów VPP", "EnableSplashScreen": "Włącz ekran powitalny", "ScreenResolution": "Rozdzielczość ekranu", @@ -1721,5 +1721,6 @@ "LabelParallelImageEncodingLimitHelp": "Maksymalna liczba kodowań obrazów, które mogą być uruchomione równolegle. Ustawienie wartości na 0 spowoduje wybór limitu w oparciu o specyfikacje Twojego systemu.", "LabelParallelImageEncodingLimit": "Limit kodowań obrazów, które mogą być uruchomione równolegle", "LabelEnableAudioVbrHelp": "Zmienna przepływność bitów oferuje lepsze proporcje jakości do przepustowości w porównaniu z przepływnością średnią, ale w niektórych rzadkich przypadkach może powodować problemy z buforowaniem i zgodnością.", - "LabelEnableAudioVbr": "Włącz kodowanie audio VBR" + "LabelEnableAudioVbr": "Włącz kodowanie audio VBR", + "LabelTonemappingMode": "Tryb mapowania tonów" } From cd71fa7aa2692b9ce41ccd8594d7bb557b8484b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Mon, 8 May 2023 18:30:47 +0000 Subject: [PATCH 125/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 0b94f633dd..a8c5b565e4 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -82,7 +82,7 @@ "ButtonSelectDirectory": "选择目录", "ButtonSelectView": "选择视图", "ButtonSend": "发送", - "ButtonShutdown": "关机", + "ButtonShutdown": "关闭服务器", "ButtonSignIn": "登录", "ButtonSignOut": "退出", "ButtonStart": "开始", From 76ccd6b214e491393f3712f48ef17979adcd4d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Mon, 8 May 2023 19:19:12 +0000 Subject: [PATCH 126/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index a8c5b565e4..4d3b2008bd 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -193,7 +193,7 @@ "Friday": "星期五", "Fullscreen": "全屏", "General": "常规", - "Genres": "风格", + "Genres": "类型", "GuestStar": "特邀明星", "GuideProviderLogin": "登入", "GuideProviderSelectListings": "选择列表", @@ -256,11 +256,11 @@ "HeaderEnabledFields": "已启用的栏", "HeaderEnabledFieldsHelp": "反选栏以锁定并不让其数据被更改。", "HeaderError": "错误", - "HeaderExternalIds": "外部 ID", + "HeaderExternalIds": "影视数据库编号:", "HeaderFeatureAccess": "可使用的功能", "HeaderFetchImages": "获取图像", "HeaderFetcherSettings": "读取器设置", - "HeaderForKids": "给儿童", + "HeaderForKids": "儿童", "HeaderFrequentlyPlayed": "多次播放", "HeaderGuideProviders": "电视指南数据提供方", "HeaderHttpHeaders": "HTTP 头部", @@ -1115,7 +1115,7 @@ "XmlTvSportsCategoriesHelp": "这些类别的节目将显示为体育节目。用 \"|\" 分隔多个。", "Yes": "是", "Yesterday": "昨天", - "Absolute": "绝对", + "Absolute": "绝对顺序", "AnyLanguage": "任何语言", "Art": "艺术图", "AspectRatio": "长宽比", @@ -1125,12 +1125,12 @@ "ColorSpace": "色彩空间", "Directors": "导演", "ColorTransfer": "色彩传递", - "ConfirmDeleteItem": "从媒体库中删除此项时,也会同时从文件系统中删除。确定要删除吗?", - "ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?", + "ConfirmDeleteItem": "从媒体库中删除此项时,也会同时从文件系统中删除。确定要删除吗?(播放列表与合集除外)", + "ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?(播放列表与合集除外)", "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", "ValueSeconds": "{0}秒", "Features": "功能", - "Genre": "风格", + "Genre": "类型", "Guide": "指南", "HeaderCancelRecording": "取消录制", "HeaderVideoType": "视频类型", @@ -1153,7 +1153,7 @@ "HeaderKeepSeries": "保持系列", "HeaderMusicQuality": "音频质量", "HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放", - "HeaderNextVideoPlayingInValue": "下一个视频将在{0}播放", + "HeaderNextVideoPlayingInValue": "下一个视频将在 {0} 播放", "HeaderPlayOn": "播放在", "HeaderSeriesStatus": "系列状态", "HeaderStopRecording": "停止录制", @@ -1276,7 +1276,7 @@ "LabelLibraryPageSize": "媒体库分页阈值", "LabelLibraryPageSizeHelp": "设置媒体库页面每页要显示的最多媒体个数。设置为 0 以禁用分页。", "UnsupportedPlayback": "Jellyfin无法解密被DRM保护的内容,但仍然会尝试播放包括受保护内容在内的所有内容。某些文件由于被加密或包含不受支持的特性(如互动标题),在播放时可能显示为黑屏。", - "Filter": "过滤", + "Filter": "筛选", "New": "新建", "ButtonTogglePlaylist": "播放列表", "HeaderServerAddressSettings": "服务器地址设置", @@ -1334,7 +1334,7 @@ "EnableDecodingColorDepth10Hevc": "启用 HEVC 10-Bit 硬件解码", "HeaderNewRepository": "新建存储库", "TabRepositories": "存储库", - "MessageNoGenresAvailable": "启用一些元数据提供程序以便从互联网获取媒体风格。", + "MessageNoGenresAvailable": "启用一些元数据提供程序以便从互联网获取媒体类型。", "MessageAddRepository": "如果要添加存储库,请单击标题旁边的按钮,然后填写所需的信息。", "LabelRepositoryNameHelp": "一个自定义名称,用于区分该存储库和添加到服务器的任何其他存储库。", "LabelRepositoryName": "存储库名称", @@ -1652,7 +1652,7 @@ "EnableEnhancedNvdecDecoderHelp": "实验性的 NVDEC 实现,除非你遇到了解码错误,否则不要启用此选项。", "HomeVideosPhotos": "主页视频及照片", "Bold": "粗体", - "LabelTextWeight": "文字大小", + "LabelTextWeight": "文字粗细", "EnableSplashScreen": "显示启动画面", "MediaInfoDvBlSignalCompatibilityId": "杜比视界 BL 兼容性序号", "MediaInfoBlPresentFlag": "杜比视界 BL 存在标记", From 84c4ea31ef90d623d5eb725f51c7e80f967bb350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Mon, 8 May 2023 20:00:29 +0000 Subject: [PATCH 127/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 78 +++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 4d3b2008bd..69b99336e3 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -41,7 +41,7 @@ "BirthLocation": "出生地", "BirthPlaceValue": "出生地:{0}", "Blacklist": "黑名单", - "BookLibraryHelp": "现已支持音频和文本书籍。浏览{0}有声读物命名指南{1}。", + "BookLibraryHelp": "现已支持音频和文本书籍。查看 {0} 有声读物命名指南 {1}。", "Books": "书籍", "Browse": "浏览", "MessageBrowsePluginCatalog": "浏览我们的插件目录来查看现有插件。", @@ -92,11 +92,11 @@ "ButtonUninstall": "卸载", "ButtonWebsite": "网站", "CancelRecording": "取消录制", - "CancelSeries": "取消系列", + "CancelSeries": "取消节目", "Categories": "分类", "ChangingMetadataImageSettingsNewContent": "更改元数据或媒体图像的下载设置仅对以后添加至库中的新内容生效,如要将更改应用于现有内容,您需要手动刷新其元数据。", "ChannelAccessHelp": "选择共享给此用户的频道。管理员能使用媒体资料管理器来编辑所有频道。", - "ChannelNameOnly": "只在频道 {0}", + "ChannelNameOnly": "仅限频道 {0}", "Channels": "频道", "CinemaModeConfigurationHelp": "影院模式直接为您的客厅带来剧场级体验,同时还可以播放预告片和自定义介绍。", "Collections": "合集", @@ -234,11 +234,11 @@ "HeaderConnectionFailure": "连接失败", "HeaderContainerProfile": "媒体载体配置", "HeaderContainerProfileHelp": "媒体载体的配置文件标明了设备播放特定媒体格式时的限制。如果在限制之内则媒体将被转码,否则媒体格式将被配置为直接播放。", - "HeaderContinueListening": "继续听", + "HeaderContinueListening": "继续收听", "HeaderContinueWatching": "继续观看", "HeaderCustomDlnaProfiles": "自定义配置", "HeaderDateIssued": "发布日期", - "HeaderDefaultRecordingSettings": "默认录制设定", + "HeaderDefaultRecordingSettings": "默认录制设置", "HeaderDeleteDevice": "删除设备", "HeaderDeleteItem": "删除项目", "HeaderDeleteItems": "删除项目", @@ -256,7 +256,7 @@ "HeaderEnabledFields": "已启用的栏", "HeaderEnabledFieldsHelp": "反选栏以锁定并不让其数据被更改。", "HeaderError": "错误", - "HeaderExternalIds": "影视数据库编号:", + "HeaderExternalIds": "影视数据库编号", "HeaderFeatureAccess": "可使用的功能", "HeaderFetchImages": "获取图像", "HeaderFetcherSettings": "读取器设置", @@ -332,7 +332,7 @@ "HeaderSelectTranscodingPath": "选择临时解码路径", "HeaderSelectTranscodingPathHelp": "浏览或输入一个路径用于转码文件,此文件夹必须可写。", "HeaderSendMessage": "发送消息", - "HeaderSeriesOptions": "系列选项", + "HeaderSeriesOptions": "节目选项", "HeaderServerSettings": "服务器设置", "HeaderSetupLibrary": "设置你的媒体库", "HeaderSortBy": "排序方式", @@ -403,7 +403,7 @@ "LabelArtistsHelp": "将多个艺术家用分号分隔。", "LabelAudioLanguagePreference": "首选音频语言", "LabelAutomaticallyAddToCollection": "自动添加到合集", - "LabelAutomaticallyAddToCollectionHelp": "当至少有2个电影拥有相同的合集名称时,它们将会自动添加到合集中.", + "LabelAutomaticallyAddToCollectionHelp": "至少有2个电影属于相同的合集时,它们将会自动添加到合集中.", "LabelAutomaticallyRefreshInternetMetadataEvery": "自动从互联网获取元数据并刷新", "LabelBindToLocalNetworkAddress": "监听的本地网络地址", "LabelBindToLocalNetworkAddressHelp": "覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。重启后生效。", @@ -476,7 +476,7 @@ "LabelEnableDlnaServerHelp": "允许你网络上的 UPnP 设备浏览并播放内容。", "LabelEnableHardwareDecodingFor": "启用硬件解码", "LabelEnableRealtimeMonitor": "启用实时监控", - "LabelEnableRealtimeMonitorHelp": "在支持的文件系统中,文件更改将即时处理。", + "LabelEnableRealtimeMonitorHelp": "实时刷新媒体库,立即处理支持的文件格式和文件更改。", "LabelEnableSingleImageInDidlLimit": "仅限单一的嵌入式图像", "LabelEnableSingleImageInDidlLimitHelp": "如果多个图像嵌入在DIDL,某些设备将无法正确渲染。", "LabelEndDate": "结束日期", @@ -634,7 +634,7 @@ "LabelSelectVersionToInstall": "选择安装版本", "LabelSendNotificationToUsers": "发送通知至", "LabelSerialNumber": "序列号", - "LabelSeriesRecordingPath": "电视剧录制路径", + "LabelSeriesRecordingPath": "电视节目录制路径", "LabelServerHost": "主机", "LabelServerHostHelp": "192.168.1.100:8096 或 https://myserver.com", "LabelSimultaneousConnectionLimit": "并发流限制", @@ -793,15 +793,15 @@ "MoreMediaInfo": "媒体信息", "MoveLeft": "左移", "MoveRight": "右移", - "MovieLibraryHelp": "回顾{0}电影命名指南{1}。", + "MovieLibraryHelp": "查看 {0} 电影命名指南 {1}。", "Movies": "电影", "Mute": "静音", "MySubtitles": "我的字幕", "Name": "名称", "Never": "从不", "NewCollection": "新集合", - "NewCollectionHelp": "“收藏”允许你为电影和其他媒体库内容创建个性化分组。", - "NewCollectionNameExample": "例如:星球大战收藏", + "NewCollectionHelp": "“合集”允许你为电影和其他媒体库内容创建个性化分组。", + "NewCollectionNameExample": "例如:星球大战 合集", "NewEpisodes": "新剧集", "NewEpisodesOnly": "只新集", "News": "新闻", @@ -837,8 +837,8 @@ "OptionAllowUserToManageServer": "允许此用户管理服务器", "OptionAllowVideoPlaybackRemuxing": "允许播放需转换但无需重新编码的视频", "OptionAllowVideoPlaybackTranscoding": "允许播放需要转码的视频", - "OptionAutomaticallyGroupSeries": "自动合并分布在不同文件夹的电视剧", - "OptionAutomaticallyGroupSeriesHelp": "在这个媒体库的多个文件夹中的同一部电视剧将会自动整合成一部电视剧。", + "OptionAutomaticallyGroupSeries": "自动合并分布在不同文件夹的电视节目", + "OptionAutomaticallyGroupSeriesHelp": "在这个媒体库的多个文件夹中的同一部电视节目将会自动整合成一部电视节目。", "OptionBluray": "蓝光", "OptionCaptionInfoExSamsung": "CaptionInfoEx(三星)", "OptionCommunityRating": "公众评分", @@ -943,7 +943,7 @@ "PleaseSelectTwoItems": "请至少选择2个项目。", "MessagePluginInstalled": "此插件已成功安装。服务器需要重启以使该插件生效。", "PreferEmbeddedTitlesOverFileNames": "优先使用内置的标题而不是文件名", - "PreferEmbeddedTitlesOverFileNamesHelp": "这将在没有 internet 元数据或本地元数据可用时确定默认显示标题。", + "PreferEmbeddedTitlesOverFileNamesHelp": "这将在没有互联网元数据或本地元数据可用时,要使用的显示标题。", "Premiere": "首映", "Previous": "上一个", "Primary": "封面图", @@ -958,7 +958,7 @@ "RecommendationDirectedBy": "导演 {0}", "RecommendationStarring": "主演 {0}", "Record": "录制", - "RecordSeries": "录制电视剧", + "RecordSeries": "录制电视节目", "RecordingCancelled": "录制已取消。", "MessageChangeRecordingPath": "更改录制文件夹不会将现有录制从旧位置迁移到新的。您需要手动移动它们 (如果需要)。", "RecordingScheduled": "录制预设。", @@ -991,10 +991,10 @@ "SearchForSubtitles": "搜索字幕", "SearchResults": "搜索结果", "SendMessage": "发送消息", - "Series": "电视剧", - "SeriesCancelled": "电视剧已取消。", - "SeriesRecordingScheduled": "电视剧录制计划。", - "SeriesSettings": "系列设定", + "Series": "电视节目", + "SeriesCancelled": "电视节目已取消。", + "SeriesRecordingScheduled": "电视节目录制计划。", + "SeriesSettings": "节目设置", "SeriesYearToPresent": "{0} - 现在", "ServerNameIsRestarting": "服务器- {0} 重启中。", "ServerNameIsShuttingDown": "服务器 - {0} 正在关闭。", @@ -1020,7 +1020,7 @@ "Sports": "体育", "StopRecording": "停止录制", "Studios": "工作室", - "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "这些设定也会被应用于任何通过此设备发起的 Google Cast 播放。", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "这些设置也会被应用于任何通过此设备发起的 Google Cast 播放。", "SubtitleAppearanceSettingsDisclaimer": "以下设置不适用于上述图形字幕或嵌入其自身样式的 ASS/SSA 字幕。", "SubtitleDownloadersHelp": "按优先顺序启用并排列您的首选字幕下载程序。", "Subtitles": "字幕", @@ -1041,7 +1041,7 @@ "TabMusic": "音乐", "TabMyPlugins": "我的插件", "TabNetworks": "网络", - "TabNfoSettings": "NFO 设定", + "TabNfoSettings": "NFO 设置", "TabNotifications": "通知", "TabOther": "其他", "TabParentalControl": "家长控制", @@ -1067,7 +1067,7 @@ "Trailers": "预告片", "Transcoding": "转码", "Tuesday": "星期二", - "TvLibraryHelp": "回顾{0}电视节目命名指南{1}。", + "TvLibraryHelp": "查看 {0} 电视节目命名指南 {1}。", "UninstallPluginConfirmation": "你确定要卸载 {0}?", "HeaderUninstallPlugin": "卸载插件", "Unmute": "取消静音", @@ -1091,9 +1091,9 @@ "ValueOneEpisode": "1 集", "ValueOneMovie": "1 个电影", "ValueOneMusicVideo": "1个音乐视频", - "ValueOneSeries": "1 个系列", + "ValueOneSeries": "1 个节目", "ValueOneSong": "1首歌", - "ValueSeriesCount": "{0} 个系列", + "ValueSeriesCount": "{0} 个节目", "ValueSongCount": "{0} 首歌", "ValueSpecialEpisodeName": "特典 - {0}", "ValueTimeLimitMultiHour": "时间限制:{0} 小时", @@ -1125,10 +1125,10 @@ "ColorSpace": "色彩空间", "Directors": "导演", "ColorTransfer": "色彩传递", - "ConfirmDeleteItem": "从媒体库中删除此项时,也会同时从文件系统中删除。确定要删除吗?(播放列表与合集除外)", - "ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?(播放列表与合集除外)", - "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", - "ValueSeconds": "{0}秒", + "ConfirmDeleteItem": "删除此项目会将其从文件系统和媒体库中删除。您确定要继续吗(删除播放列表与合集不会删除文件)?", + "ConfirmDeleteItems": "删除这些项目会将它们从文件系统和媒体库中删除。您确定要继续吗(删除播放列表与合集不会删除文件)?", + "ConfirmEndPlayerSession": "您要在 {0} 上关闭 Jellyfin 吗?", + "ValueSeconds": "{0} 秒", "Features": "功能", "Genre": "类型", "Guide": "指南", @@ -1144,18 +1144,18 @@ "DisplayModeHelp": "选择您想要的界面布局风格。", "EnableColorCodedBackgrounds": "彩色背景", "ErrorDeletingItem": "从服务器删除项目时出错。请检查Jellyfin是否拥有对媒体目录的写权限,然后重试。", - "GroupBySeries": "按系列分组", + "GroupBySeries": "按节目分组", "HeaderApp": "应用程序", "DirectStreamHelp1": "视频流与设备兼容,但具有不兼容的音频格式(DTS、Dolby TrueHD 等)或音频通道数。 视频流将在发送到设备之前即时无损地重新打包。 只有音频流将被转码。", "HeaderAppearsOn": "同时出现于", - "HeaderCancelSeries": "取消系列", + "HeaderCancelSeries": "取消节目", "HeaderKeepRecording": "继续录制", - "HeaderKeepSeries": "保持系列", + "HeaderKeepSeries": "保持节目", "HeaderMusicQuality": "音频质量", "HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放", "HeaderNextVideoPlayingInValue": "下一个视频将在 {0} 播放", "HeaderPlayOn": "播放在", - "HeaderSeriesStatus": "系列状态", + "HeaderSeriesStatus": "节目状态", "HeaderStopRecording": "停止录制", "Horizontal": "横向", "LabelAuthProvider": "认证提供者", @@ -1171,7 +1171,7 @@ "LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。", "LiveBroadcasts": "直播", "LiveTV": "电视直播", - "Logo": "商标", + "Logo": "徽标", "ManageRecording": "管理录音", "Menu": "菜单", "MessageImageFileTypeAllowed": "只支持JPEG和PNG格式的文件。", @@ -1235,7 +1235,7 @@ "LabelPlayer": "播放器", "LabelBaseUrl": "基础 URL", "LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:http://example.com/<baseurl>", - "MusicLibraryHelp": "重播 {0}音乐命名指南{1}。", + "MusicLibraryHelp": "查看 {0} 音乐命名指南 {1}。", "OptionRandom": "随机", "ButtonSplit": "分割", "SelectAdminUsername": "请为管理员账户选择一个用户名。", @@ -1275,7 +1275,7 @@ "DeinterlaceMethodHelp": "选择对隔行扫描内容进行软转码时所用的反交错方法。当启用支持硬件反交错的硬件加速后,将使用硬件解码器代替此设置。", "LabelLibraryPageSize": "媒体库分页阈值", "LabelLibraryPageSizeHelp": "设置媒体库页面每页要显示的最多媒体个数。设置为 0 以禁用分页。", - "UnsupportedPlayback": "Jellyfin无法解密被DRM保护的内容,但仍然会尝试播放包括受保护内容在内的所有内容。某些文件由于被加密或包含不受支持的特性(如互动标题),在播放时可能显示为黑屏。", + "UnsupportedPlayback": "Jellyfin 无法解密被DRM保护的内容,但仍然会尝试播放包括受保护内容在内的所有内容。某些文件由于被加密或包含不受支持的特性(如互动标题),在播放时可能显示为黑屏。", "Filter": "筛选", "New": "新建", "ButtonTogglePlaylist": "播放列表", @@ -1631,7 +1631,7 @@ "AllowEmbeddedSubtitlesHelp": "禁用媒体容器中封装的字幕。 需要对媒体库进行全面刷新。", "AllowEmbeddedSubtitles": "禁用不同类型的嵌入字幕", "NextUpRewatching": "重新观看", - "MixedMoviesShows": "混合电影和电视剧", + "MixedMoviesShows": "混合电影和电视节目", "AddToFavorites": "加入收藏", "CopyFailed": "无法复制", "Copy": "复制", @@ -1650,7 +1650,7 @@ "Digital": "数字的", "MessageUnauthorizedUser": "您目前无权访问服务器。请联系您的服务器管理员以获取更多信息。", "EnableEnhancedNvdecDecoderHelp": "实验性的 NVDEC 实现,除非你遇到了解码错误,否则不要启用此选项。", - "HomeVideosPhotos": "主页视频及照片", + "HomeVideosPhotos": "家庭视频和照片", "Bold": "粗体", "LabelTextWeight": "文字粗细", "EnableSplashScreen": "显示启动画面", From 0e0b089f12eeb6fdad0cdd3049c21e4e2cd9fab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Mon, 8 May 2023 20:33:08 +0000 Subject: [PATCH 128/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 69b99336e3..65445d17d8 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -371,7 +371,7 @@ "HideWatchedContentFromLatestMedia": "隐藏来自“新增媒体”的已观看内容", "Home": "首页", "HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 如 \"Let's Encrypt\"。请提供证书或禁用安全连接。", - "Identify": "识别", + "Identify": "刮削元数据", "Images": "图片", "ImportFavoriteChannelsHelp": "只有在协调器设备中被标记为我的最爱的频道才会被导入。", "InstallingPackage": "正在安装 {0}(版本 {1})", From e02d325f71db8e614cd24aedaa35d52e62c8efa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Tue, 9 May 2023 03:12:10 +0000 Subject: [PATCH 129/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 65445d17d8..1d0f84e37f 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -34,9 +34,9 @@ "Ascending": "升序", "Audio": "音频", "Auto": "自动", - "Backdrop": "背景", - "Backdrops": "背景", - "Banner": "横幅", + "Backdrop": "背景图", + "Backdrops": "背景图", + "Banner": "横幅图", "BirthDateValue": "出生:{0}", "BirthLocation": "出生地", "BirthPlaceValue": "出生地:{0}", @@ -114,7 +114,7 @@ "DeathDateValue": "去世:{0}", "Default": "默认", "ErrorDefault": "处理请求时发生错误。请稍后尝试。", - "DefaultMetadataLangaugeDescription": "这些是你的默认设置并且可以在你的每个媒体库中被单独自定义。", + "DefaultMetadataLangaugeDescription": "这些是你的默认设置,并且可以在你的每个媒体库中被单独自定义设置。", "DefaultSubtitlesHelp": "字幕将基于内嵌元数据中的“默认”标志和“强制”标志来载入。当多个选项可用时,将根据语言偏好决定。", "Delete": "删除", "DeleteDeviceConfirmation": "你确定你希望删除这个设备吗?当下一次有用户通过这个设备登录时,这个设备会再次出现。", @@ -131,7 +131,7 @@ "DirectStreamHelp2": "直接串流占用的 CPU 资源通常取决于音频规格。只有视频流是无损的。", "DirectStreaming": "直接串流", "Director": "导演", - "Disc": "光盘", + "Disc": "光盘封面图", "Disconnect": "断开连接", "Display": "显示", "DisplayInMyMedia": "在主屏幕显示", @@ -1119,8 +1119,8 @@ "AnyLanguage": "任何语言", "Art": "艺术图", "AspectRatio": "长宽比", - "Box": "盒子", - "BoxRear": "盒子(背面)", + "Box": "包装盒正面", + "BoxRear": "包装盒背面", "ChannelNumber": "频道号码", "ColorSpace": "色彩空间", "Directors": "导演", @@ -1173,7 +1173,7 @@ "LiveTV": "电视直播", "Logo": "徽标", "ManageRecording": "管理录音", - "Menu": "菜单", + "Menu": "菜单图", "MessageImageFileTypeAllowed": "只支持JPEG和PNG格式的文件。", "MessageImageTypeNotSelected": "请在下拉菜单中选择图片类型。", "MessageNoCollectionsAvailable": "分组能够让您享受个性化的视频、剧集和专辑组。点击+按钮开始创建分组。", @@ -1312,7 +1312,7 @@ "HeaderSyncPlaySelectGroup": "加入群组", "EnableDetailsBannerHelp": "在项目详细信息页面的顶部显示横幅图片。", "LabelSyncPlayLeaveGroupDescription": "关闭同步播放", - "EnableDetailsBanner": "详细信息页面的横幅", + "EnableDetailsBanner": "详细信息页面的横幅图", "ButtonCast": "投屏", "ButtonSyncPlay": "同步播放", "EnableBlurHashHelp": "仍在加载的图片将以独特的的占位符显示。", @@ -1623,7 +1623,7 @@ "Trailer": "预告片", "Clip": "片段", "ButtonExitApp": "退出应用", - "ShowParentImages": "显示系列图片", + "ShowParentImages": "显示节目图片", "AllowEmbeddedSubtitlesAllowTextOption": "允许文本", "AllowEmbeddedSubtitlesAllowImageOption": "允许图像", "AllowEmbeddedSubtitlesAllowNoneOption": "允许无", From 4c8f376109483905aab549a7053c78f7c9627e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Tue, 9 May 2023 03:22:52 +0000 Subject: [PATCH 130/147] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 1d0f84e37f..2535a8c533 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1644,10 +1644,10 @@ "Localization": "本地化", "ItemDetails": "文件详情", "EnableRewatchingNextUp": "在接下来界面中启用重新播放", - "Production": "作品", + "Production": "制片", "StoryArc": "故事线", - "OriginalAirDate": "原始播出日期", - "Digital": "数字的", + "OriginalAirDate": "初始播出日期", + "Digital": "数字", "MessageUnauthorizedUser": "您目前无权访问服务器。请联系您的服务器管理员以获取更多信息。", "EnableEnhancedNvdecDecoderHelp": "实验性的 NVDEC 实现,除非你遇到了解码错误,否则不要启用此选项。", "HomeVideosPhotos": "家庭视频和照片", From 71179653876d03a13c2b8bceeafcdcde4d69bc0a Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Tue, 9 May 2023 05:24:04 +0000 Subject: [PATCH 131/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index a0324a65d4..25201aaf7d 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -251,7 +251,7 @@ "Photos": "相片", "Movies": "電影", "HeaderContinueWatching": "繼續觀看", - "HeaderAlbumArtists": "專輯藝人", + "HeaderAlbumArtists": "專輯歌手", "Genres": "風格", "Folders": "資料夾", "Favorites": "我的最愛", @@ -1003,16 +1003,16 @@ "HeaderAudioBooks": "有聲書", "HeaderAppearsOn": "出現於", "HeaderApp": "應用程式", - "HeaderApiKeysHelp": "外部應用程式需要有一個 API 金鑰以用於和伺服器溝通。金鑰會在使用者登入時自動發行,也可以手動產生一個金鑰。", + "HeaderApiKeysHelp": "第三方應用程式需要API 金鑰才能連接伺服器。金鑰會在使用者登入時自動產生,亦可以手動建立一個金鑰。", "HeaderApiKeys": "API 金鑰", "HeaderApiKey": "API 金鑰", "HeaderAllowMediaDeletionFrom": "允許刪除媒體", "HeaderAlert": "通知", "HeaderAdmin": "管理", - "HeaderAddUser": "新增使用者", - "HeaderAddUpdateSubtitle": "新增/更新 字幕", - "HeaderAddUpdateImage": "新增/更新圖片", - "HeaderAddToPlaylist": "加到播放清單", + "HeaderAddUser": "新增用戶", + "HeaderAddUpdateSubtitle": "新增/更新 字幕", + "HeaderAddUpdateImage": "新增/更新圖片", + "HeaderAddToPlaylist": "加至播放清單", "HeaderActivity": "活動", "HeaderAccessScheduleHelp": "建立一個使用時間表以限制用戶可以使用的時段。", "HeaderAccessSchedule": "使用時間表", From 9e5a58b861716fa8a7c5e7776daebf6ffc594170 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Tue, 9 May 2023 08:57:20 +0000 Subject: [PATCH 132/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 107 +++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 25201aaf7d..6af0fe872c 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -1,6 +1,6 @@ { "Add": "添加", - "ButtonAddScheduledTaskTrigger": "新增觸發點", + "ButtonAddScheduledTaskTrigger": "新增觸發條件", "ButtonAddUser": "新增用戶", "ButtonCancel": "取消", "ButtonManualLogin": "手動登入", @@ -27,23 +27,23 @@ "HeaderAddToCollection": "加入至系列", "HeaderAdditionalParts": "附加部份", "HeaderBranding": "品牌", - "HeaderCustomDlnaProfiles": "自定設定檔", - "HeaderDeviceAccess": "允許裝置存取", + "HeaderCustomDlnaProfiles": "自訂設定檔", + "HeaderDeviceAccess": "裝置存取", "HeaderDevices": "裝置", "HeaderEasyPinCode": "簡易 PIN 碼", "HeaderFeatureAccess": "可以使用的功能", - "HeaderFetchImages": "獲取圖像", + "HeaderFetchImages": "擷取圖像", "HeaderFrequentlyPlayed": "經常播放", - "HeaderImageSettings": "圖像設置", + "HeaderImageSettings": "圖像設定", "HeaderLatestEpisodes": "新增的劇集", "HeaderLatestMovies": "新增的電影", "HeaderLatestRecordings": "新增的錄影節目", - "HeaderMediaFolders": "媒體文件夾", + "HeaderMediaFolders": "媒體資料夾", "HeaderPaths": "路徑", "HeaderPleaseSignIn": "請登入", "HeaderRecentlyPlayed": "最近播放", "HeaderRemoteControl": "遙控器", - "HeaderRunningTasks": "運行中任務", + "HeaderRunningTasks": "運行中工作", "HeaderScenes": "場景", "HeaderSeasons": "季度劇集", "HeaderSetupLibrary": "建立你的媒體資料庫", @@ -270,7 +270,7 @@ "AlwaysPlaySubtitlesHelp": "優先使用符合語言偏好設定的字幕。", "AllowedRemoteAddressesHelp": "輸入以逗號(,)分隔的 IP 地址或 IP/網絡遮罩(Netmask),以允許相關網絡進行遠程存取。 如果留空不填,將允許所有非本地網絡的連接。", "AllowRemoteAccessHelp": "如果沒有勺選,所有不是來自本地網絡的連接將會被阻擋。", - "AllowRemoteAccess": "允許從非本網絡連接至此伺服器", + "AllowRemoteAccess": "允許從非本地網絡連接至此伺服器", "AllowFfmpegThrottlingHelp": "當轉碼或重新封裝的進度遠超於目前的播放位置時,暫停轉碼以減少資源消耗。 建議可在不經常快轉/更改播放位置的情況啟用。 如果遇到播放問題,請關閉此功能。", "AllowOnTheFlySubtitleExtractionHelp": "在播放影片時,將影片和內置字幕分別傳送至播放裝置來避免轉檔。在某些系統上或需要較長進行提取而導致播放停頓情況。如果播放裝置不支援內置字幕,則可以禁用此功能以通過轉碼內合成字幕至影片中。", "AllowOnTheFlySubtitleExtraction": "允許實時提取字幕", @@ -626,7 +626,7 @@ "LabelFileOrUrl": "檔案或路徑", "LabelffmpegPathHelp": "FFmpeg 的路徑,或是包含 FFmpeg 的資料夾。", "LabelffmpegPath": "FFmpeg 路徑", - "LabelExtractChaptersDuringLibraryScanHelp": "當媒體庫匯入影片並掃描時,將擷取章節圖片。否則,章節圖片將在之後的計畫任務中擷取,而媒體庫會更快完成掃描。", + "LabelExtractChaptersDuringLibraryScanHelp": "進行媒體庫掃描時,為新增的影片建立章節圖片。否則,章節圖片將在之後的排程工作中擷取,而媒體庫會掃描亦會更快完成。", "LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片", "LabelEpisodeNumber": "集", "LabelEndDate": "結束日期", @@ -719,8 +719,8 @@ "LabelAppNameExample": "例如:689的主機、777的 Jellyfin", "LabelAppName": "APP 名稱", "LabelAllowHWTranscoding": "允許硬體轉檔", - "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式", - "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾", + "LabelAllowedRemoteAddressesMode": "遠端 IP 地址過濾模式", + "LabelAllowedRemoteAddresses": "遠端 IP 地址過濾", "LabelAlbumArtPN": "專輯封面 PN", "LabelAlbumArtMaxWidth": "專輯封面最大寬度", "LabelAlbumArtMaxResHelp": "「upnp:albumArtURI」屬性設定專輯封面最高解析度。", @@ -769,7 +769,7 @@ "HeaderTranscodingProfile": "轉檔設定", "HeaderTracks": "軌", "HeaderThisUserIsCurrentlyDisabled": "這個使用者目前停用", - "HeaderTaskTriggers": "任務觸發", + "HeaderTaskTriggers": "工作觸發條片", "HeaderSyncPlaySelectGroup": "加入群組", "HeaderSyncPlayEnabled": "已啟用SyncPlay", "HeaderSubtitleProfilesHelp": "字幕設定檔描述設備所支援的字幕格式。", @@ -798,17 +798,17 @@ "HeaderSecondsValue": "{0} 秒", "HeaderRevisionHistory": "更改紀錄", "HeaderResponseProfileHelp": "當播放某些類型的媒體時,回覆設定檔提供一種方法來發送自定訊息到裝置。", - "HeaderResponseProfile": "回覆設定檔", - "HeaderRemoveMediaLocation": "刪除媒體位址", + "HeaderResponseProfile": "回應設定檔", + "HeaderRemoveMediaLocation": "刪除媒體位置", "HeaderRemoveMediaFolder": "刪除媒體資料夾", "HeaderRemoteAccessSettings": "遠端存取設定", "HeaderRecordingPostProcessing": "錄影後製", "HeaderRecordingOptions": "錄影選項", - "HeaderProfileServerSettingsHelp": "這些數值將控制伺服器如何呈現給裝置。", - "HeaderProfileInformation": "設定檔訊息", - "HeaderPreferredMetadataLanguage": "首選中繼資料資料語言", + "HeaderProfileServerSettingsHelp": "這些數值將會影響伺服器如何顯示給裝置。", + "HeaderProfileInformation": "設定檔資料", + "HeaderPreferredMetadataLanguage": "中繼資料首選語言", "HeaderPortRanges": "Proxy 和防火牆設定", - "HeaderPluginInstallation": "附加元件安裝", + "HeaderPluginInstallation": "插件安裝", "HeaderPlayOn": "播放在", "HeaderPlaybackError": "播放錯誤", "HeaderPlayback": "媒體播放", @@ -820,14 +820,14 @@ "HeaderParentalRatings": "家長指引", "HeaderOtherItems": "其他項目", "HeaderOnNow": "現正播放", - "HeaderNextVideoPlayingInValue": "下一部影片在 {0} 後播放", - "HeaderNextEpisodePlayingInValue": "下一集在 {0} 後播放", - "HeaderNewRepository": "新增儲存庫", - "HeaderNewDevices": "新裝置", - "HeaderNewApiKey": "新 API 金鑰", - "HeaderNetworking": "網際網路協定", + "HeaderNextVideoPlayingInValue": "下一條影片將在{0}後播放", + "HeaderNextEpisodePlayingInValue": "下一集將在{0}後播放", + "HeaderNewRepository": "新增資源庫(repository)", + "HeaderNewDevices": "新增裝置", + "HeaderNewApiKey": "新增 API 金鑰", + "HeaderNetworking": "IP 協定", "HeaderNavigation": "導覽", - "HeaderMyMediaSmall": "我的媒體(小)", + "HeaderMyMediaSmall": "我的媒體(小)", "HeaderMyMedia": "我的媒體", "HeaderMyDevice": "我的裝置", "HeaderMusicQuality": "音質", @@ -835,7 +835,7 @@ "HeaderMetadataSettings": "中繼資料設定", "HeaderMedia": "媒體", "HeaderLoginFailure": "登入失敗", - "HeaderLiveTvTunerSetup": "電視直播調解器安裝", + "HeaderLiveTvTunerSetup": "電視調解器安裝", "HeaderLibrarySettings": "媒體庫設定", "HeaderLibraryOrder": "媒體庫排序", "HeaderLibraryFolders": "媒體庫資料夾", @@ -843,10 +843,10 @@ "HeaderLibraries": "媒體庫", "HeaderLatestMusic": "新增的音樂", "HeaderLatestMedia": "新增的媒體", - "HeaderKodiMetadataHelp": "要啟用或停用 NFO 中繼資料,請在設中的「建立媒體庫」頁面中編輯「中繼資料儲存」部分。", - "HeaderKeepSeries": "保存系列", - "HeaderKeepRecording": "繼續錄製", - "HeaderInstantMix": "瞬時混播", + "HeaderKodiMetadataHelp": "要啟用或停用 NFO 中繼資料,請在設定中的「建立媒體庫」頁面中編輯「中繼資料儲存」部分。", + "HeaderKeepSeries": "保留系列", + "HeaderKeepRecording": "繼續錄影", + "HeaderInstantMix": "即時混播", "HeaderInstall": "安裝", "HeaderImageOptions": "圖片選項", "HeaderIdentifyItemHelp": "輸入一個或多個搜索條件。刪除條件可得到更多搜索結果。", @@ -858,30 +858,30 @@ "HeaderGuideProviders": "節目表提供者", "HeaderForKids": "兒童向", "HeaderFetcherSettings": "擷取器設置", - "HeaderExternalIds": "外部ID", + "HeaderExternalIds": "影片資料庫 ID", "HeaderError": "錯誤", - "HeaderEnabledFieldsHelp": "反選欄位以鎖定並不讓其數據被更改。", + "HeaderEnabledFieldsHelp": "取消選擇以鎖定欄位,避免其數據被更改。", "HeaderEnabledFields": "已啟用的欄位", "HeaderEditImages": "編輯圖片", "HeaderDVR": "DVR", - "HeaderDownloadSync": "下載與同步", + "HeaderDownloadSync": "下載&同步", "HeaderDetectMyDevices": "偵測我的裝置", - "HeaderDirectPlayProfileHelp": "新增直接播放設定檔,標明哪些媒體格式裝置可以自行處理。", + "HeaderDirectPlayProfileHelp": "新增直接播放設定檔,列明裝置支援哪些媒體格式。", "HeaderDirectPlayProfile": "直接播放設定檔", "HeaderDeveloperInfo": "開發者資訊", - "HeaderDeleteTaskTrigger": "刪除任務觸發條件", + "HeaderDeleteTaskTrigger": "刪除工作觸發條件", "HeaderDeleteProvider": "刪除供應者", "HeaderDeleteItems": "刪除項目", "HeaderDeleteItem": "刪除項目", "HeaderDeleteDevices": "刪除所有裝置", "HeaderDeleteDevice": "刪除裝置", - "HeaderDefaultRecordingSettings": "預設錄製設定", + "HeaderDefaultRecordingSettings": "預設錄影設定", "HeaderDebugging": "偵錯和追蹤", "HeaderDateIssued": "發佈日期", "HeaderContinueReading": "繼續閱讀", "HeaderContinueListening": "繼續聆聽", - "HeaderContainerProfileHelp": "影片容器的設定檔標明了設備播放特定媒體格式時的限制。如果在限制之內則媒體將被轉檔,否則媒體格式將被設定為直接播放。", - "HeaderContainerProfile": "影片載體設定", + "HeaderContainerProfileHelp": "影片容器(container)設定列明播放設備不支援的媒體格式。當播放不支援的媒體格式時,媒體將會被轉檔,否則將會使用直接播放模式。", + "HeaderContainerProfile": "影片容器設定", "HeaderConnectToServer": "連接至伺服器", "HeaderConnectionFailure": "連接失敗", "LabelType": "類型", @@ -967,14 +967,14 @@ "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組,例如電影、音樂和電視", "LabelSeasonNumber": "季", "LabelScreensaver": "螢幕保護程式", - "LabelScheduledTaskLastRan": "最後執行 {0},花費時間 {1}。", + "LabelScheduledTaskLastRan": "在{0}前執行,合共執行了{1}。", "LabelRuntimeMinutes": "播放時間", "LabelRequireHttpsHelp": "開啟後伺服器將自動將所有 HTTP 請求導向 HTTPS。若伺服器沒有啟用 HTTPS 則不生效。", "LabelRequireHttps": "強制 HTTPS", - "LabelRepositoryUrlHelp": "儲存庫的位置。", - "LabelRepositoryUrl": "儲存庫 URL", + "LabelRepositoryUrlHelp": "資源庫的位置。", + "LabelRepositoryUrl": "資源庫 URL", "LabelRepositoryNameHelp": "取一個能讓你辨識的名稱。", - "LabelRepositoryName": "儲存庫名稱", + "LabelRepositoryName": "資源庫名稱", "LabelRemoteClientBitrateLimitHelp": "所有網路裝置都能夠調整流位元率限制,這對於防止設備請求比網路連接所能處理的更高的位元率非常有用。這可能會導致伺服器上的 CPU 負載增加,以便將影片轉檔到較低的位元率。", "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps)", "LabelReleaseDate": "釋出日期", @@ -987,23 +987,23 @@ "LabelPublishedServerUriHelp": "根據接口或客戶端 IP 位址,覆蓋 Jellyfin 使用的 URI。", "LabelPublishedServerUri": "公開伺服器 URI", "HeaderConfirmRevokeApiKey": "撤銷 API 金鑰", - "HeaderConfirmProfileDeletion": "確認刪除個人資料", - "HeaderConfirmPluginInstallation": "確認附加元件安裝", + "HeaderConfirmProfileDeletion": "確認刪除設定檔", + "HeaderConfirmPluginInstallation": "確認安裝插件", "HeaderConfigureRemoteAccess": "設定遠端控制", - "HeaderCodecProfileHelp": "編碼/解碼器的設定檔標明了設備播放特定編碼時的限制,如果在限制之內則媒體將被轉檔,否則編碼/解碼器將被設定為直接播放。", + "HeaderCodecProfileHelp": "編碼設定檔列明播放設備不支援的編碼。當播放不支援的編碼時,媒體將會被轉檔,否則將會使用直接播放模式。", "HeaderCodecProfile": "編碼設定檔", "HeaderChapterImages": "章節圖片", - "HeaderChannelAccess": "節目存取", - "HeaderCastAndCrew": "演員與工作人員", + "HeaderChannelAccess": "頻道存取", + "HeaderCastAndCrew": "演員&工作人員", "HeaderCancelSeries": "取消系列", - "HeaderCancelRecording": "取消錄製", - "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容", - "HeaderAutoDiscovery": "探索網域", + "HeaderCancelRecording": "取消錄影", + "HeaderBlockItemsWithNoRating": "封鎖沒有或無法識別評級的內容", + "HeaderAutoDiscovery": "網路探索", "HeaderAudioSettings": "音訊設定", "HeaderAudioBooks": "有聲書", "HeaderAppearsOn": "出現於", "HeaderApp": "應用程式", - "HeaderApiKeysHelp": "第三方應用程式需要API 金鑰才能連接伺服器。金鑰會在使用者登入時自動產生,亦可以手動建立一個金鑰。", + "HeaderApiKeysHelp": "第三方應用程式需要API 金鑰才能連接伺服器。金鑰會在用戶登入時自動產生,亦可以手動建立一個金鑰。", "HeaderApiKeys": "API 金鑰", "HeaderApiKey": "API 金鑰", "HeaderAllowMediaDeletionFrom": "允許刪除媒體", @@ -1147,5 +1147,8 @@ "NewCollectionHelp": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至同一個系列中。", "RemoveFromCollection": "從系列中移除", "MessageNoCollectionsAvailable": "「系列」功能讓你可以自訂電影、劇集和音樂組合,將不同的媒體加至系列/集合中。點撃「+」以新增系列。", - "HeaderPerformance": "效能" + "HeaderPerformance": "效能", + "MessageAddRepository": "如果你想新增一個資源庫,請點擊標題旁邊的「+」按鈕並填寫所需的資料。", + "MessageDeleteTaskTrigger": "您是否確認刪除這個工作觸發條件?", + "PluginFromRepo": "來自{1}的{0}" } From e730f1a17c719028ca4b8fa09894f9d9b76f82bd Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 9 May 2023 10:28:29 -0400 Subject: [PATCH 133/147] Add enum for library tab values --- .../homeScreenSettings/homeScreenSettings.js | 51 ++++++++++--------- src/controllers/livetv/livetvsuggested.js | 11 ++-- src/controllers/movies/moviesrecommended.js | 9 ++-- src/controllers/music/musicrecommended.js | 16 +++--- src/controllers/shows/tvrecommended.js | 11 ++-- src/types/libraryTab.ts | 23 +++++++++ 6 files changed, 75 insertions(+), 46 deletions(-) create mode 100644 src/types/libraryTab.ts diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 64bc69a810..5a192905b8 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -13,6 +13,7 @@ import '../../elements/emby-checkbox/emby-checkbox'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './homeScreenSettings.template.html'; +import { LibraryTab } from '../../types/libraryTab.ts'; const numConfigurableSections = 7; @@ -48,110 +49,110 @@ function getLandingScreenOptions(type) { if (type === 'movies') { list.push({ name: globalize.translate('Movies'), - value: 'movies', + value: LibraryTab.Movies, isDefault: true }); list.push({ name: globalize.translate('Suggestions'), - value: 'suggestions' + value: LibraryTab.Suggestions }); list.push({ name: globalize.translate('Trailers'), - value: 'trailers' + value: LibraryTab.Trailers }); list.push({ name: globalize.translate('Favorites'), - value: 'favorites' + value: LibraryTab.Favorites }); list.push({ name: globalize.translate('Collections'), - value: 'collections' + value: LibraryTab.Collections }); list.push({ name: globalize.translate('Genres'), - value: 'genres' + value: LibraryTab.Genres }); } else if (type === 'tvshows') { list.push({ name: globalize.translate('Shows'), - value: 'shows', + value: LibraryTab.Shows, isDefault: true }); list.push({ name: globalize.translate('Suggestions'), - value: 'suggestions' + value: LibraryTab.Suggestions }); list.push({ name: globalize.translate('TabUpcoming'), - value: 'upcoming' + value: LibraryTab.Upcoming }); list.push({ name: globalize.translate('Genres'), - value: 'genres' + value: LibraryTab.Genres }); list.push({ name: globalize.translate('TabNetworks'), - value: 'networks' + value: LibraryTab.Networks }); list.push({ name: globalize.translate('Episodes'), - value: 'episodes' + value: LibraryTab.Episodes }); } else if (type === 'music') { list.push({ name: globalize.translate('Albums'), - value: 'albums', + value: LibraryTab.Albums, isDefault: true }); list.push({ name: globalize.translate('Suggestions'), - value: 'suggestions' + value: LibraryTab.Suggestions }); list.push({ name: globalize.translate('HeaderAlbumArtists'), - value: 'albumartists' + value: LibraryTab.AlbumArtists }); list.push({ name: globalize.translate('Artists'), - value: 'artists' + value: LibraryTab.Artists }); list.push({ name: globalize.translate('Playlists'), - value: 'playlists' + value: LibraryTab.Playlists }); list.push({ name: globalize.translate('Songs'), - value: 'songs' + value: LibraryTab.Songs }); list.push({ name: globalize.translate('Genres'), - value: 'genres' + value: LibraryTab.Genres }); } else if (type === 'livetv') { list.push({ name: globalize.translate('Programs'), - value: 'programs', + value: LibraryTab.Programs, isDefault: true }); list.push({ name: globalize.translate('Guide'), - value: 'guide' + value: LibraryTab.Guide }); list.push({ name: globalize.translate('Channels'), - value: 'channels' + value: LibraryTab.Channels }); list.push({ name: globalize.translate('Recordings'), - value: 'recordings' + value: LibraryTab.Recordings }); list.push({ name: globalize.translate('Schedule'), - value: 'schedule' + value: LibraryTab.Schedule }); list.push({ name: globalize.translate('Series'), - value: 'series' + value: LibraryTab.Series }); } diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 8446838df5..eb604b2d29 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -10,6 +10,7 @@ import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-button/emby-button'; +import { LibraryTab } from '../../types/libraryTab.ts'; import Dashboard from '../../utils/dashboard'; function enableScrollX() { @@ -201,15 +202,15 @@ function setScrollClasses(elem, scrollX) { function getDefaultTabIndex(folderId) { switch (userSettings.get('landing-' + folderId)) { - case 'guide': + case LibraryTab.Guide: return 1; - case 'channels': + case LibraryTab.Channels: return 2; - case 'recordings': + case LibraryTab.Recordings: return 3; - case 'schedule': + case LibraryTab.Schedule: return 4; - case 'series': + case LibraryTab.Series: return 5; default: return 0; diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index a7fab00085..2d6aa223cb 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -9,6 +9,7 @@ import dom from '../../scripts/dom'; import imageLoader from '../../components/images/imageLoader'; import { playbackManager } from '../../components/playback/playbackmanager'; import globalize from '../../scripts/globalize'; +import { LibraryTab } from '../../types/libraryTab.ts'; import Dashboard from '../../utils/dashboard'; import Events from '../../utils/events.ts'; @@ -249,16 +250,16 @@ function getTabs() { function getDefaultTabIndex(folderId) { switch (userSettings.get('landing-' + folderId)) { - case 'suggestions': + case LibraryTab.Suggestions: return 1; - case 'favorites': + case LibraryTab.Favorites: return 3; - case 'collections': + case LibraryTab.Collections: return 4; - case 'genres': + case LibraryTab.Genres: return 5; default: diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 07946897c7..3599ecedc8 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -9,12 +9,14 @@ import imageLoader from '../../components/images/imageLoader'; import libraryMenu from '../../scripts/libraryMenu'; import * as mainTabsManager from '../../components/maintabsmanager'; import globalize from '../../scripts/globalize'; +import { LibraryTab } from '../../types/libraryTab.ts'; +import Dashboard from '../../utils/dashboard'; + import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-button/emby-button'; import '../../styles/flexstyles.scss'; -import Dashboard from '../../utils/dashboard'; function itemsPerRow() { const screenWidth = dom.getWindowSize().innerWidth; @@ -194,22 +196,22 @@ function getTabs() { function getDefaultTabIndex(folderId) { switch (userSettings.get('landing-' + folderId)) { - case 'suggestions': + case LibraryTab.Suggestions: return 1; - case 'albumartists': + case LibraryTab.AlbumArtists: return 2; - case 'artists': + case LibraryTab.Artists: return 3; - case 'playlists': + case LibraryTab.Playlists: return 4; - case 'songs': + case LibraryTab.Songs: return 5; - case 'genres': + case LibraryTab.Genres: return 6; default: diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 944a75260c..68019511ba 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -12,6 +12,7 @@ import globalize from '../../scripts/globalize'; import '../../styles/scrollstyles.scss'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-button/emby-button'; +import { LibraryTab } from '../../types/libraryTab.ts'; import Dashboard from '../../utils/dashboard'; import Events from '../../utils/events.ts'; import autoFocuser from '../../components/autoFocuser'; @@ -34,19 +35,19 @@ function getTabs() { function getDefaultTabIndex(folderId) { switch (userSettings.get('landing-' + folderId)) { - case 'suggestions': + case LibraryTab.Suggestions: return 1; - case 'upcoming': + case LibraryTab.Upcoming: return 2; - case 'genres': + case LibraryTab.Genres: return 3; - case 'networks': + case LibraryTab.Networks: return 4; - case 'episodes': + case LibraryTab.Episodes: return 5; default: diff --git a/src/types/libraryTab.ts b/src/types/libraryTab.ts new file mode 100644 index 0000000000..8ccf93663e --- /dev/null +++ b/src/types/libraryTab.ts @@ -0,0 +1,23 @@ +export enum LibraryTab { + Albums = 'albums', + AlbumArtists = 'albumartists', + Artists = 'artists', + Channels = 'channels', + Collections = 'collections', + Episodes = 'episodes', + Favorites = 'favorites', + Genres = 'genres', + Guide = 'guide', + Movies = 'movies', + Networks = 'networks', + Playlists = 'playlists', + Programs = 'programs', + Recordings = 'recordings', + Schedule = 'schedule', + Series = 'series', + Shows = 'shows', + Songs = 'songs', + Suggestions = 'suggestions', + Trailers = 'trailers', + Upcoming = 'upcoming' +} From a928b12c447d301d851b7b6796d1342fe00734dc Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Mon, 8 May 2023 21:40:08 +0200 Subject: [PATCH 134/147] Fix white background on video refresh When refreshing a /video page, since no player is available, `getCurrentPlayer` will be empty and `bindToPlayer` will crash leading to a redirect with `appRouter.goHome();` This is also the case when navigating with previous then next in the browser. Before that that, the background is set in `viewbeforeshow` using `setBackdropTransparency(TRANSPARENCY_LEVEL.Full);` This will leave unexpected classes in the dom leading to a white background on the main page. This fixes proposes to reset the transparency before going to home using `setBackdropTransparency(TRANSPARENCY_LEVEL.None);` Anyway, this looks a little fragile and a deeper fix may be preferable in the future. Another solution would be to move the `setBackdropTransparency(TRANSPARENCY_LEVEL.Full);` when the player is ready but my understanding of the flow is not enough to now if it would have any unexpected results. --- src/controllers/playback/video/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index c4c662cb9c..3574b5847e 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1496,6 +1496,7 @@ export default function (view) { dom.addEventListener(document, 'click', onClickCapture, { capture: true }); } } catch (e) { + setBackdropTransparency(TRANSPARENCY_LEVEL.None); // reset state set in viewbeforeshow appRouter.goHome(); } }); From 219d3422efb892a78cf0ab0fa768686d7fb1a237 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 17:10:45 +0000 Subject: [PATCH 135/147] Update Babel --- package-lock.json | 443 ++++++++++++++++++++++++---------------------- package.json | 4 +- 2 files changed, 235 insertions(+), 212 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..92e50f3a7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,11 +55,11 @@ "workbox-precaching": "6.5.4" }, "devDependencies": { - "@babel/core": "7.21.4", + "@babel/core": "7.21.8", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", - "@babel/preset-env": "7.21.4", + "@babel/preset-env": "7.21.5", "@babel/preset-react": "7.18.6", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", @@ -185,30 +185,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -224,12 +224,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -264,12 +264,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", + "@babel/compat-data": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -353,9 +353,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -411,31 +411,31 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -454,9 +454,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -498,12 +498,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -534,9 +534,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -576,14 +576,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -604,9 +604,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -974,6 +974,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1104,12 +1116,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1189,12 +1201,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" }, "engines": { @@ -1267,12 +1279,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1345,14 +1357,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1538,12 +1550,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -1645,12 +1657,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1676,14 +1688,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", + "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/compat-data": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", @@ -1708,6 +1720,7 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1717,22 +1730,22 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-arrow-functions": "^7.21.5", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", @@ -1740,17 +1753,17 @@ "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1832,19 +1845,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1853,12 +1866,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -20080,27 +20093,27 @@ } }, "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "dev": true }, "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -20109,12 +20122,12 @@ } }, "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "requires": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -20140,12 +20153,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", + "@babel/compat-data": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -20210,9 +20223,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -20253,28 +20266,28 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/helper-optimise-call-expression": { @@ -20287,9 +20300,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -20319,12 +20332,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -20346,9 +20359,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true }, "@babel/helper-validator-identifier": { @@ -20376,14 +20389,14 @@ } }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "requires": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/highlight": { @@ -20398,9 +20411,9 @@ } }, "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -20636,6 +20649,15 @@ "@babel/helper-plugin-utils": "^7.19.0" } }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -20727,12 +20749,12 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-async-to-generator": { @@ -20782,12 +20804,12 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" } }, @@ -20830,12 +20852,12 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-function-name": { @@ -20878,14 +20900,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, "@babel/plugin-transform-modules-systemjs": { @@ -20999,12 +21021,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" } }, @@ -21064,12 +21086,12 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-unicode-regex": { @@ -21083,14 +21105,14 @@ } }, "@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", + "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/compat-data": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", @@ -21115,6 +21137,7 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -21124,22 +21147,22 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-arrow-functions": "^7.21.5", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", @@ -21147,17 +21170,17 @@ "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -21218,30 +21241,30 @@ } }, "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } diff --git a/package.json b/package.json index efe32ce651..086e5df209 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,11 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.21.4", + "@babel/core": "7.21.8", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", "@babel/plugin-transform-modules-umd": "7.18.6", - "@babel/preset-env": "7.21.4", + "@babel/preset-env": "7.21.5", "@babel/preset-react": "7.18.6", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", From b163979c9722567cff749554e20fba0734980037 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 22:12:50 +0000 Subject: [PATCH 136/147] Update Linters --- package-lock.json | 371 +++++++++++++++++++--------------------------- package.json | 8 +- 2 files changed, 157 insertions(+), 222 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..de27d83d8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.20", - "@typescript-eslint/eslint-plugin": "5.59.1", - "@typescript-eslint/parser": "5.59.1", + "@typescript-eslint/eslint-plugin": "5.59.2", + "@typescript-eslint/parser": "5.59.2", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", @@ -100,11 +100,11 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.6.0", + "stylelint": "15.6.1", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.6.0", + "stylelint-scss": "4.7.0", "ts-loader": "9.4.2", "typescript": "5.0.4", "webpack": "5.79.0", @@ -2509,15 +2509,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", @@ -3289,9 +3280,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/serve-index": { @@ -3365,15 +3356,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", - "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", + "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/type-utils": "5.59.1", - "@typescript-eslint/utils": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/type-utils": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3414,14 +3405,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", - "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" }, "engines": { @@ -3441,13 +3432,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", - "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/visitor-keys": "5.59.1" + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3458,13 +3449,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", - "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", + "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.1", - "@typescript-eslint/utils": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3485,9 +3476,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", - "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3498,13 +3489,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", - "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/visitor-keys": "5.59.1", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3569,17 +3560,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", - "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", + "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3610,12 +3601,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", - "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/types": "5.59.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3626,18 +3617,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@uupaa/dynamic-import-polyfill": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@uupaa/dynamic-import-polyfill/-/dynamic-import-polyfill-1.0.2.tgz", @@ -6209,12 +6188,6 @@ "node": ">=8" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -7200,6 +7173,18 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7299,18 +7284,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -7498,18 +7471,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -13385,9 +13346,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -15395,9 +15356,9 @@ } }, "node_modules/stylelint": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", - "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.1.tgz", + "integrity": "sha512-d8icFBlVl93Elf3Z5ABQNOCe4nx69is3D/NZhDLAie1eyYnpxfeKe7pCfqzT5W4F8vxHCLSDfV8nKNJzogvV2Q==", "dev": true, "dependencies": { "@csstools/css-parser-algorithms": "^2.1.1", @@ -15427,11 +15388,11 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.22", + "postcss": "^8.4.23", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-selector-parser": "^6.0.12", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -15441,7 +15402,7 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^5.0.0" + "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.js" @@ -17691,12 +17652,11 @@ } }, "node_modules/stylelint-scss": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", - "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", + "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, "dependencies": { - "dlv": "^1.1.3", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-selector-parser": "^6.0.11", @@ -19930,23 +19890,29 @@ } }, "node_modules/write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/write-file-stdout": { "version": "0.0.2", @@ -21577,14 +21543,6 @@ "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - } } }, "@eslint-community/regexpp": { @@ -22236,9 +22194,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/serve-index": { @@ -22311,15 +22269,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", - "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", + "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/type-utils": "5.59.1", - "@typescript-eslint/utils": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/type-utils": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -22340,53 +22298,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", - "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", - "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/visitor-keys": "5.59.1" + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" } }, "@typescript-eslint/type-utils": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", - "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", + "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.1", - "@typescript-eslint/utils": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", - "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", - "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/visitor-keys": "5.59.1", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -22426,17 +22384,17 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", - "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", + "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.1", - "@typescript-eslint/types": "5.59.1", - "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -22453,21 +22411,13 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", - "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/types": "5.59.2", "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - } } }, "@uupaa/dynamic-import-polyfill": { @@ -24407,12 +24357,6 @@ "path-type": "^4.0.0" } }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -24954,12 +24898,6 @@ "estraverse": "^5.2.0" } }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -25370,6 +25308,12 @@ "estraverse": "^4.1.1" } }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, "espree": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", @@ -25379,14 +25323,6 @@ "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - } } }, "esprima": { @@ -29665,9 +29601,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -31219,9 +31155,9 @@ } }, "stylelint": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.0.tgz", - "integrity": "sha512-Cqzpc8tvJm77KaM8qUbhpJ/UYK55Ia0whQXj4b9IId9dlPICO7J8Lyo15SZWiHxKjlvy3p5FQor/3n6i8ignXg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.6.1.tgz", + "integrity": "sha512-d8icFBlVl93Elf3Z5ABQNOCe4nx69is3D/NZhDLAie1eyYnpxfeKe7pCfqzT5W4F8vxHCLSDfV8nKNJzogvV2Q==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^2.1.1", @@ -31251,11 +31187,11 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.22", + "postcss": "^8.4.23", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-selector-parser": "^6.0.12", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -31265,7 +31201,7 @@ "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^5.0.0" + "write-file-atomic": "^5.0.1" }, "dependencies": { "argparse": { @@ -33153,12 +33089,11 @@ } }, "stylelint-scss": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", - "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", + "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, "requires": { - "dlv": "^1.1.3", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-selector-parser": "^6.0.11", @@ -34743,19 +34678,19 @@ } }, "write-file-atomic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "dependencies": { "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", "dev": true } } diff --git a/package.json b/package.json index efe32ce651..7a04db2c13 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "@types/lodash-es": "4.17.7", "@types/react": "17.0.58", "@types/react-dom": "17.0.20", - "@typescript-eslint/eslint-plugin": "5.59.1", - "@typescript-eslint/parser": "5.59.1", + "@typescript-eslint/eslint-plugin": "5.59.2", + "@typescript-eslint/parser": "5.59.2", "@uupaa/dynamic-import-polyfill": "1.0.2", "autoprefixer": "10.4.14", "babel-loader": "9.1.2", @@ -50,11 +50,11 @@ "sass-loader": "13.2.2", "source-map-loader": "4.0.1", "style-loader": "3.3.2", - "stylelint": "15.6.0", + "stylelint": "15.6.1", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.6.0", + "stylelint-scss": "4.7.0", "ts-loader": "9.4.2", "typescript": "5.0.4", "webpack": "5.79.0", From 831ecfe909b35bfbe725957c66c79f82f8353726 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Wed, 10 May 2023 02:37:59 +0000 Subject: [PATCH 137/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 58 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 6af0fe872c..df249f67c4 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -43,13 +43,13 @@ "HeaderPleaseSignIn": "請登入", "HeaderRecentlyPlayed": "最近播放", "HeaderRemoteControl": "遙控器", - "HeaderRunningTasks": "運行中工作", + "HeaderRunningTasks": "執行中的工作", "HeaderScenes": "場景", - "HeaderSeasons": "季度劇集", - "HeaderSetupLibrary": "建立你的媒體資料庫", + "HeaderSeasons": "季度", + "HeaderSetupLibrary": "建立你的媒體庫", "HeaderStatus": "狀態", "HeaderSystemDlnaProfiles": "系統設定", - "HeaderUsers": "使用者", + "HeaderUsers": "用戶", "HeaderVideos": "影片", "Help": "幫助", "LabelAirsAfterSeason": "已播放劇集季度", @@ -85,7 +85,7 @@ "LabelServerNameHelp": "名稱將作為伺服器名稱,預設是伺服器的主機名稱。", "LabelHttpsPort": "本地 HTTPS 連接埠號碼", "LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 埠。", - "LabelImageFetchersHelp": "啟用媒體圖片獲取來源的優先次序。", + "LabelImageFetchersHelp": "啟用並設定圖片擷取來源的優先次序。", "LabelLanguage": "語言", "LabelLocalHttpServerPortNumber": "本地 HTTP 連接埠", "LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 埠。", @@ -756,48 +756,48 @@ "HeaderVideoTypes": "影片類型", "HeaderVideoType": "影片類型", "HeaderVideoQuality": "影片畫質", - "HeaderUser": "使用者", + "HeaderUser": "用戶", "HeaderUploadSubtitle": "上傳字幕", "HeaderUploadImage": "上傳圖片", "HeaderUpcomingOnTV": "即將播放", - "HeaderUninstallPlugin": "解除安裝附加元件", + "HeaderUninstallPlugin": "解除安裝插件", "HeaderTypeText": "輸入文字", - "HeaderTypeImageFetchers": "圖片獲取程序 ({0})", + "HeaderTypeImageFetchers": "圖片擷取器 ({0})", "HeaderTuners": "調解器", "HeaderTunerDevices": "調解器裝置", - "HeaderTranscodingProfileHelp": "新增轉檔設定檔標明哪些媒體格式需要轉檔處理。", - "HeaderTranscodingProfile": "轉檔設定", + "HeaderTranscodingProfileHelp": "新增轉碼設定列明哪些媒體格式需要轉碼。", + "HeaderTranscodingProfile": "轉碼設定", "HeaderTracks": "軌", - "HeaderThisUserIsCurrentlyDisabled": "這個使用者目前停用", - "HeaderTaskTriggers": "工作觸發條片", + "HeaderThisUserIsCurrentlyDisabled": "此用戶已被停用", + "HeaderTaskTriggers": "工作觸發條件", "HeaderSyncPlaySelectGroup": "加入群組", - "HeaderSyncPlayEnabled": "已啟用SyncPlay", - "HeaderSubtitleProfilesHelp": "字幕設定檔描述設備所支援的字幕格式。", + "HeaderSyncPlayEnabled": "已啟用 SyncPlay", + "HeaderSubtitleProfilesHelp": "字幕設定檔設定裝置所支援的字幕格式。", "HeaderSubtitleProfiles": "字幕設定檔", "HeaderSubtitleProfile": "字幕設定檔", - "HeaderSubtitleDownloads": "字幕下載", + "HeaderSubtitleDownloads": "下載字幕", "HeaderSubtitleAppearance": "字幕外觀", "HeaderStopRecording": "停止錄影", "HeaderStartNow": "開始播放", - "HeaderSpecialEpisodeInfo": "特集資訊", - "HeaderSortOrder": "分類順序", - "HeaderSortBy": "分類", + "HeaderSpecialEpisodeInfo": "特輯資訊", + "HeaderSortOrder": "順序", + "HeaderSortBy": "排序", "HeaderServerSettings": "伺服器設定", - "HeaderServerAddressSettings": "伺服器位址設定", + "HeaderServerAddressSettings": "伺服器地址設定", "HeaderSeriesStatus": "系列狀態", "HeaderSeriesOptions": "系列選項", "HeaderSendMessage": "傳送訊息", - "HeaderSelectTranscodingPathHelp": "瀏覽或輸入轉檔用來存暫時資料的位址。資料夾需具寫入權限。", - "HeaderSelectTranscodingPath": "選擇轉檔暫存位址", - "HeaderSelectServerCachePathHelp": "瀏覽或者輸入路徑以用於伺服器快取檔案。請確保該資料夾可以被寫入。", + "HeaderSelectTranscodingPathHelp": "瀏覽或者輸入用作儲存轉碼檔案的路徑。請確保資料夾可以寫入數據。", + "HeaderSelectTranscodingPath": "選擇轉碼暫存檔路徑", + "HeaderSelectServerCachePathHelp": "瀏覽或者輸入用作儲存伺服器快取的路徑。請確保資料夾可以寫入數據。", "HeaderSelectServerCachePath": "選擇伺服器快取路徑", - "HeaderSelectPath": "選擇位址", - "HeaderSelectMetadataPathHelp": "瀏覽或者輸入路徑以用於保存中繼資料,請確保資料夾可以寫入。", - "HeaderSelectMetadataPath": "選擇中繼資料路徑", + "HeaderSelectPath": "選擇路徑", + "HeaderSelectMetadataPathHelp": "瀏覽或者輸入用作儲存元數據的路徑。請確保資料夾可以寫入數據。", + "HeaderSelectMetadataPath": "選擇元數據路徑", "HeaderSelectCertificatePath": "選擇證書路徑", - "HeaderSecondsValue": "{0} 秒", - "HeaderRevisionHistory": "更改紀錄", - "HeaderResponseProfileHelp": "當播放某些類型的媒體時,回覆設定檔提供一種方法來發送自定訊息到裝置。", + "HeaderSecondsValue": "{0}秒", + "HeaderRevisionHistory": "修改紀錄", + "HeaderResponseProfileHelp": "回應(response )設定檔允許自訂在播放特定媒體時,傳送至裝置的資訊。", "HeaderResponseProfile": "回應設定檔", "HeaderRemoveMediaLocation": "刪除媒體位置", "HeaderRemoveMediaFolder": "刪除媒體資料夾", @@ -1062,7 +1062,7 @@ "ManageRecording": "管理錄影", "LabelAccessDay": "星期", "HeaderSyncPlayPlaybackSettings": "播放", - "HeaderSyncPlaySettings": "同步播放設定", + "HeaderSyncPlaySettings": "SyncPlay 設定", "ErrorPlayerNotFound": "找不到這個媒體所需的播放器。", "Engineer": "聲音工程師", "Arranger": "編曲", From f7d387f565b05140f8b42849593071a59fec7306 Mon Sep 17 00:00:00 2001 From: kiberOgur4ik Date: Wed, 10 May 2023 05:05:32 +0000 Subject: [PATCH 138/147] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index 610becf14c..cc6b14c73c 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1424,7 +1424,7 @@ "LabelTonemappingPeakHelp": "Этим значением перекрывается сигнальный/номинальный/эталонный пик. Полезно, когда встроенная информация о пиках в метаданных дисплея ненадёжна или при тонмаппинге из узкого диапазона в более широкий. Значения рекомендуемое и по умолчанию - 100 и 0.", "LabelTonemappingThresholdHelp": "Параметры алгоритма тонмаппинга подстраиваются для каждой сцены. А порог используется, чтобы определить, изменилась ли сцена или нет. Если дистанция между средней яркостью текущего кадра и текущим скользящим средним превышает пороговое значение, мы пересчитаем среднюю и пиковую яркость сцены. Значения рекомендуемое и по умолчанию - 0.8 и 0.2.", "TonemappingAlgorithmHelp": "Тонмаппинг можно подстроить. Если вы не уверены с этими параметрами, оставьте значения по умолчанию. Рекомендуемое значение - \"BT.2390\".", - "AllowTonemappingHelp": "Тонмаппинг может преобразовать динамический диапазон видео из HDR в SDR, сохраняя детали изображения и цвета, которые являются очень важной информацией для представления исходной сцены. В настоящее время работает только с видео HDR10 или HLG. Для этого требуется соответствующая среда выполнения OpenCL или CUDA.", + "AllowTonemappingHelp": "Тонмаппинг может преобразовать динамический диапазон видео из HDR в SDR, сохраняя детали изображения и цвета, которые являются очень важной информацией для представления исходной сцены. В настоящее время работает только с 10-бит HDR10, HLGи DoVi видео. Для этого требуется соответствующая среда выполнения OpenCL или CUDA.", "LabelOpenclDeviceHelp": "Это устройство OpenCL, которое используется для тонмаппинга. Слева от точки - номер платформы, а справа - это номер устройства на платформе. Значение по умолчанию - 0.0. Требуется файл приложения FFmpeg, содержащий метод аппаратного ускорения OpenCL.", "OptionAllowContentDownloadHelp": "Пользователи могут загружать медиафайлы и хранить их на своих устройствах. Это не то же самое, как функция синхронизации. Для правильной работы книжных медиатек это необходимо.", "HeaderDeleteDevices": "Удалить все устройства", @@ -1702,5 +1702,6 @@ "LabelParallelImageEncodingLimitHelp": "Максимальное количество кодировок изображений, которые разрешено выполнять параллельно. Установив это значение равным 0, вы выберете ограничение, основанное на характеристиках вашей системы.", "HeaderPerformance": "Производительность", "LabelDummyChapterDurationHelp": "Интервал извлечения изображения главы в секундах.", - "LabelChapterImageResolutionHelp": "Разрешение извлеченных изображений глав." + "LabelChapterImageResolutionHelp": "Разрешение извлеченных изображений глав.", + "ResolutionMatchSource": "Соответствовать источнику" } From 4a8800d77f8258db0d714f524371ce8101726171 Mon Sep 17 00:00:00 2001 From: SuperDumbTM Date: Wed, 10 May 2023 07:19:08 +0000 Subject: [PATCH 139/147] Translated using Weblate (Chinese (Traditional, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index df249f67c4..18cb9f01e1 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -470,7 +470,7 @@ "ConfigureDateAdded": "在控制台 > 媒體庫 > NFO 設定中,設定判斷「新增日期」的方法", "ClearQueue": "清空佇列", "Bwdif": "BWDIF", - "AllowTonemappingHelp": "色調映射(Tone-mapping)可以將影片的動態範圍從 HDR 轉換為 SDR,同時保留原始畫面的關鍵數據(細節和顏色)。目前僅適用於使用 HDR10 或 HLG 的影片。(注:而此功能需要相應的 OpenCL 或 CUDA。)", + "AllowTonemappingHelp": "色調映射(Tone-mapping)可以將影片的動態範圍從 HDR 轉換為 SDR,同時保留原始畫面的關鍵數據(細節和顏色)。目前僅適用於使用 HDR10、HLG及 DoVi 的影片。而此功能需要相應的 OpenCL 或 CUDA 執行程序。", "ManageLibrary": "管理媒體庫", "Logo": "標誌", "LiveTV": "電視直播", @@ -1121,7 +1121,7 @@ "Cursive": "手寫體", "MessageSyncPlayUserJoined": "{0} 已加入至群組。", "MetadataManager": "元數據管理員", - "MessageSyncPlayGroupWait": "正在緩衝 {0}", + "MessageSyncPlayGroupWait": "{0}正在緩衝中…", "MessageSyncPlayPlaybackPermissionRequired": "需要播放權限。", "MessageUnsetContentHelp": "所有內容將會以資料夾分類及顯示。建議使用元數據管理員來編輯子資料夾的內容類型。", "MessageSyncPlayIsDisabled": "需要授權才能使用 SyncPlay。", @@ -1150,5 +1150,9 @@ "HeaderPerformance": "效能", "MessageAddRepository": "如果你想新增一個資源庫,請點擊標題旁邊的「+」按鈕並填寫所需的資料。", "MessageDeleteTaskTrigger": "您是否確認刪除這個工作觸發條件?", - "PluginFromRepo": "來自{1}的{0}" + "PluginFromRepo": "來自{1}的{0}", + "MinutesAfter": "分鐘後", + "ValueMinutes": "{0}分", + "MinutesBefore": "分鐘前", + "MessagePleaseWait": "請稍等。" } From 57e441d3ce01a33e5995a7797eaba0d7b151d040 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 10 May 2023 09:50:30 -0400 Subject: [PATCH 140/147] Add path checking for canGoBack --- src/components/router/appRouter.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/router/appRouter.js b/src/components/router/appRouter.js index 72102393c4..7c0d8e86c1 100644 --- a/src/components/router/appRouter.js +++ b/src/components/router/appRouter.js @@ -17,6 +17,7 @@ export const history = createHashHistory(); * Page types of "no return" (when "Go back" should behave differently, probably quitting the application). */ const START_PAGE_TYPES = ['home', 'login', 'selectserver']; +const START_PAGE_PATHS = ['/home.html', '/login.html', '/selectserver.html']; class AppRouter { allRoutes = new Map(); @@ -165,12 +166,13 @@ class AppRouter { } canGoBack() { - const curr = this.currentRouteInfo?.route; - if (!curr) { + const { path, route } = this.currentRouteInfo; + + if (!route) { return false; } - if (!document.querySelector('.dialogContainer') && START_PAGE_TYPES.includes(curr.type)) { + if (!document.querySelector('.dialogContainer') && (START_PAGE_TYPES.includes(route.type) || START_PAGE_PATHS.includes(path))) { return false; } From fab09259c946045e74a899c29592228674c91942 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 10 May 2023 10:31:41 -0400 Subject: [PATCH 141/147] Remove error logs for checks expected to fail --- src/components/scrollManager.js | 4 ++-- src/legacy/focusPreventScroll.js | 4 ++-- src/scripts/dom.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 52c46bcaf7..49c2cebc32 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -46,8 +46,8 @@ try { }); elem.scrollTo(opts); -} catch (e) { - console.error('error checking ScrollToOptions support'); +} catch { + // no scroll to options support } /** diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js index 6ed7d6d017..ad2f12a4b7 100644 --- a/src/legacy/focusPreventScroll.js +++ b/src/legacy/focusPreventScroll.js @@ -19,8 +19,8 @@ if (HTMLElement.prototype.nativeFocus === undefined) { }); focusElem.focus(opts); - } catch (e) { - console.error('error checking preventScroll support'); + } catch { + // no preventScroll supported } if (!supportsPreventScrollOption) { diff --git a/src/scripts/dom.js b/src/scripts/dom.js index 35ff2078a6..9488c7e16d 100644 --- a/src/scripts/dom.js +++ b/src/scripts/dom.js @@ -93,8 +93,8 @@ try { } }); window.addEventListener('test', null, opts); -} catch (e) { - console.debug('error checking capture support'); +} catch { + // no capture support } /** From 5db8e6ef1dfdc7c29960addb727bbbfff38ed4fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 23:51:41 +0000 Subject: [PATCH 142/147] Update Webpack --- package-lock.json | 742 +++++++++++++++------------------------------- package.json | 6 +- 2 files changed, 234 insertions(+), 514 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..53ceca309c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.23", - "postcss-loader": "7.2.4", + "postcss-loader": "7.3.0", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", "sass": "1.62.1", @@ -107,8 +107,8 @@ "stylelint-scss": "4.6.0", "ts-loader": "9.4.2", "typescript": "5.0.4", - "webpack": "5.79.0", - "webpack-cli": "5.0.1", + "webpack": "5.82.0", + "webpack-cli": "5.0.2", "webpack-dev-server": "4.13.3", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", @@ -1875,30 +1875,6 @@ "node": ">=0.1.90" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.2.tgz", @@ -3009,33 +2985,12 @@ "node": ">=10.13.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true - }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -3645,148 +3600,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -3817,9 +3772,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", "dev": true, "engines": { "node": ">=14.15.0" @@ -3909,16 +3864,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -4055,13 +4000,6 @@ "node": ">= 6" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5492,13 +5430,6 @@ "node": ">=4" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -6187,16 +6118,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6480,9 +6401,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -10083,6 +10004,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jquery": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", @@ -10519,13 +10449,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -12374,13 +12297,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", + "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", "dev": true, "dependencies": { "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", + "jiti": "^1.18.2", "klona": "^2.0.6", "semver": "^7.3.8" }, @@ -12393,17 +12316,7 @@ }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", - "ts-node": ">=10", - "typescript": ">=4", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } } }, "node_modules/postcss-loader/node_modules/argparse": { @@ -12430,22 +12343,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, "node_modules/postcss-loader/node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -18553,50 +18450,6 @@ "node": ">=8" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -19017,13 +18870,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -19115,21 +18961,21 @@ "dev": true }, "node_modules/webpack": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", - "integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", + "version": "5.82.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.0.tgz", + "integrity": "sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.13.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -19139,7 +18985,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -19162,17 +19008,17 @@ } }, "node_modules/webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.0.1", "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", "colorette": "^2.0.14", - "commander": "^9.4.1", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", @@ -19207,18 +19053,18 @@ } }, "node_modules/webpack-cli/node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/webpack-cli/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/webpack-dev-middleware": { @@ -20005,16 +19851,6 @@ "node": ">=10" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -21252,29 +21088,6 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, "@csstools/cascade-layer-name-parser": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.2.tgz", @@ -21957,33 +21770,12 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true - }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -22477,148 +22269,148 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -22637,9 +22429,9 @@ "requires": {} }, "@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", "dev": true, "requires": {} }, @@ -22702,13 +22494,6 @@ "dev": true, "requires": {} }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": true - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -22808,13 +22593,6 @@ } } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -23894,13 +23672,6 @@ "parse-json": "^4.0.0" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -24391,13 +24162,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -24621,9 +24385,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -27311,6 +27075,12 @@ } } }, + "jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true + }, "jquery": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", @@ -27683,13 +27453,6 @@ "semver": "^6.0.0" } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -28989,13 +28752,13 @@ } }, "postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", + "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", "dev": true, "requires": { "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", + "jiti": "^1.18.2", "klona": "^2.0.6", "semver": "^7.3.8" }, @@ -29018,13 +28781,6 @@ "path-type": "^4.0.0" } }, - "cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "requires": {} - }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -33662,28 +33418,6 @@ } } }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -34005,13 +33739,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -34088,21 +33815,21 @@ "dev": true }, "webpack": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", - "integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", + "version": "5.82.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.0.tgz", + "integrity": "sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.13.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -34112,7 +33839,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -34164,17 +33891,17 @@ } }, "webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.0.1", "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", "colorette": "^2.0.14", - "commander": "^9.4.1", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", @@ -34185,15 +33912,15 @@ }, "dependencies": { "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } @@ -34797,13 +34524,6 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index efe32ce651..759fa65318 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "html-webpack-plugin": "5.5.1", "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.23", - "postcss-loader": "7.2.4", + "postcss-loader": "7.3.0", "postcss-preset-env": "8.3.2", "postcss-scss": "4.0.6", "sass": "1.62.1", @@ -57,8 +57,8 @@ "stylelint-scss": "4.6.0", "ts-loader": "9.4.2", "typescript": "5.0.4", - "webpack": "5.79.0", - "webpack-cli": "5.0.1", + "webpack": "5.82.0", + "webpack-cli": "5.0.2", "webpack-dev-server": "4.13.3", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", From 4a7edbf9610d4c32884168837063af058c4f7d08 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 23:52:04 +0000 Subject: [PATCH 143/147] Update dependency react-router-dom to v6.11.1 --- package-lock.json | 50 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e802f36c..cb8a506ddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "pdfjs-dist": "3.5.141", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.10.0", + "react-router-dom": "6.11.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", @@ -2902,9 +2902,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==", "engines": { "node": ">=14" } @@ -13708,11 +13708,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", "dependencies": { - "@remix-run/router": "1.5.0" + "@remix-run/router": "1.6.1" }, "engines": { "node": ">=14" @@ -13722,12 +13722,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", "dependencies": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" }, "engines": { "node": ">=14" @@ -21882,9 +21882,9 @@ } }, "@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -29902,20 +29902,20 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", "requires": { - "@remix-run/router": "1.5.0" + "@remix-run/router": "1.6.1" } }, "react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", "requires": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" } }, "read-file-stdin": { diff --git a/package.json b/package.json index efe32ce651..bcf465485a 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "pdfjs-dist": "3.5.141", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.10.0", + "react-router-dom": "6.11.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", From f7138e2ddc830e29851fb4ea7d6c1c6db299f2e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 May 2023 00:55:57 +0000 Subject: [PATCH 144/147] Update dependency stylelint-scss to v5 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0ee79f1dd..bee71ddd6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.7.0", + "stylelint-scss": "5.0.0", "ts-loader": "9.4.2", "typescript": "5.0.4", "webpack": "5.79.0", @@ -17652,9 +17652,9 @@ } }, "node_modules/stylelint-scss": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", - "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.0.0.tgz", + "integrity": "sha512-5Ee5kG3JIcP2jk2PMoFMiNmW/815V+wK5o37X5ke90ihWMpPXI9iyqeA6zEWipWSRXeQc0kqbd7hKqiR+wPKNA==", "dev": true, "dependencies": { "postcss-media-query-parser": "^0.2.3", @@ -33089,9 +33089,9 @@ } }, "stylelint-scss": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", - "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.0.0.tgz", + "integrity": "sha512-5Ee5kG3JIcP2jk2PMoFMiNmW/815V+wK5o37X5ke90ihWMpPXI9iyqeA6zEWipWSRXeQc0kqbd7hKqiR+wPKNA==", "dev": true, "requires": { "postcss-media-query-parser": "^0.2.3", diff --git a/package.json b/package.json index 6c48ac8eda..a1d28f2425 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.7.0", + "stylelint-scss": "5.0.0", "ts-loader": "9.4.2", "typescript": "5.0.4", "webpack": "5.79.0", From 6155524e2c8adb62704eba09e8e03766ef224560 Mon Sep 17 00:00:00 2001 From: NickSkier Date: Thu, 11 May 2023 00:42:51 +0000 Subject: [PATCH 145/147] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index cc6b14c73c..a945392a01 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -64,7 +64,7 @@ "ButtonChangeServer": "Сменить сервер", "ButtonEditOtherUserPreferences": "Править профиль, изображение и персональные настройки этого пользователя.", "ButtonForgotPassword": "Напомнить пароль", - "ButtonFullscreen": "Полный экран", + "ButtonFullscreen": "Во весь экран", "ButtonGotIt": "Понятно", "ButtonInfo": "Сведения", "ButtonLibraryAccess": "Доступ к медиатеке", From 80156fb883c846a4a1e6240168b3ddaf56195dd1 Mon Sep 17 00:00:00 2001 From: Marcinbar Date: Thu, 11 May 2023 08:59:28 +0000 Subject: [PATCH 146/147] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index fb198e7844..42bd7d3805 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1722,5 +1722,7 @@ "LabelParallelImageEncodingLimit": "Limit kodowań obrazów, które mogą być uruchomione równolegle", "LabelEnableAudioVbrHelp": "Zmienna przepływność bitów oferuje lepsze proporcje jakości do przepustowości w porównaniu z przepływnością średnią, ale w niektórych rzadkich przypadkach może powodować problemy z buforowaniem i zgodnością.", "LabelEnableAudioVbr": "Włącz kodowanie audio VBR", - "LabelTonemappingMode": "Tryb mapowania tonów" + "LabelTonemappingMode": "Tryb mapowania tonów", + "Select": "Wybierz", + "TonemappingModeHelp": "Wybierz tryb mapowania tonalnego. Jeśli zauważysz artefakty, spróbuj przełączyć się na tryb RGB." } From 4475b742d325eb1663d2a7e552a1f5559a1e9b26 Mon Sep 17 00:00:00 2001 From: Gustavs Date: Thu, 11 May 2023 13:45:35 +0000 Subject: [PATCH 147/147] Translated using Weblate (Latvian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lv/ --- src/strings/lv.json | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/strings/lv.json b/src/strings/lv.json index 4343045b25..8c567c71a9 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -520,7 +520,7 @@ "AllChannels": "Visi kanāli", "All": "Viss/i", "Alerts": "Paziņojumi", - "Albums": "Albūmi", + "Albums": "Albumi", "AddedOnValue": "Pievienots {0}", "AddToPlaylist": "Pievienot atskaņošanas sarakstam", "AddToPlayQueue": "Pievienot atskaņošanas rindai", @@ -1070,7 +1070,7 @@ "EnableDetailsBanner": "Informācijas reklāmkarogs", "ButtonPlayer": "Atskaņotājs", "ButtonCast": "Raidīt uz Ierīci", - "AllowTonemappingHelp": "Toņu kartēšana var pārveidot video dinamisko diapazonu no HDR uz SDR, saglabājot attēla detaļas un krāsas, kas ir ļoti svarīga informācija, lai attēlotu sākotnējo ainu. Pašlaik strādā tikai, kad tiek pārkodēti video ar iegultiem HDR10 vai HLG metadatiem. Ja atskaņošana nav vienmērīga vai tā neizdotas, lūdzu, apsveriet atbilstošā aparatūras dekodētāja izslēgšanu.", + "AllowTonemappingHelp": "Toņu kartēšana var pārveidot video dinamisko diapazonu no HDR uz SDR, saglabājot attēla detaļas un krāsas, kas ir ļoti svarīga informācija, lai attēlotu sākotnējo ainu. Pašlaik strādā tikai, kad tiek pārkodēti video ar iegultiem 10-bitu HDR10, HLG vai DoVi metadatiem. Ja atskaņošana nav vienmērīga vai tā neizdodas, lūdzu, apsveriet atbilstošā aparatūras dekodētāja izslēgšanu.", "LabelChromecastVersion": "Chromecast Versija", "HeaderUploadSubtitle": "Augšupielādēt Subtitrus", "HeaderRemoteAccessSettings": "Attālinātas Pieejas Iestatījumi", @@ -1318,5 +1318,38 @@ "OptionReleaseDate": "Izlaiduma gads", "OptionUnairedEpisode": "Neizlaistās epizodes", "DownloadAll": "Lejuplādēt visu", - "AllowEmbeddedSubtitlesAllowAllOption": "Atļaut visu" + "AllowEmbeddedSubtitlesAllowAllOption": "Atļaut visu", + "LabelStereoDownmixAlgorithm": "Stereo Lejupmiksēšanas Algoritms", + "MessageDirectoryPickerLinuxInstruction": "Priekš Linux uz Arch Linux, CentOS, Debian, Fedora, openSUSE vai Ubuntu, tev jāatļauj pakalpojuma lietotājam vismaz lasīšanas piekļuvi tavām glabātuvēm.", + "Larger": "Lielāks", + "IgnoreDts": "Ignorēt DTS (dekodēšanas laikzīmogu)", + "Lyricist": "Vārdu autors", + "MediaInfoBitDepth": "Bitu dziļums", + "MediaInfoColorSpace": "Krāsu telpa", + "ItemDetails": "Sīkāka Informācija Par Priekšmetu", + "Localization": "Lokalizācija", + "MediaInfoVideoRange": "Video diapazons", + "MessageForgotPasswordFileCreated": "Sekojošais fails ir ticis izveidots uz tava servera un satur instrukcijas tālākai rīcībai", + "LabelMaxVideoResolution": "Maksimālā Atļautā Video Transkodēšanas Izšķirtspēja", + "MessageAddRepository": "Ja tu vēlies pievienot repozitoriju, nospied pogu, kas atrodas blakus galvenei un aizpildi prasīto informāciju.", + "HomeVideosPhotos": "Mājas Video un Fotogrāfijas", + "MediaInfoBitrate": "Datu pārraides ātrums", + "LabelEnableAudioVbr": "Iespējot VBR skaņas kodēšanu", + "LabelEnableAudioVbrHelp": "Mainīgs bitreits sneidz labāku kvalitāti lai izlīdzinātu bitreita attiecību, bet dažos retos gadījumos var izraisīt ilgus bufera laikus un savietojamības problēmas.", + "Bold": "Treknreksts", + "LanNetworksHelp": "Ar komatu atdalīts saraksts, kas satur IP adreses vai IP/apakštīkla maskas priekš tīkliem, kas tiks uztverti kā atrodamies lokālajā tīklā, īstenojot tīkla ātruma ierobežojumus. Ja iestatīts, visas citas IP adreses tiks uztvertas kā ārēja tīkla un tām tiks īstenotas ārēja tīkla ātruma ierobežojumi. Ja atstāts tukšs, tikai servera apakštīkls tiks uztverts kā atrodamies lokālajā tīklā.", + "ListPaging": "{0}-{1} no {2}", + "MapChannels": "Kanālu kartēšana", + "MediaInfoColorPrimaries": "Primārās krāsas", + "MediaInfoColorTransfer": "Krāsu pārnešana", + "MessageChangeRecordingPath": "Ierakstu mapes maiņa automātiski nepārvietos jau pastāvošus ierakstus no vecās uz jauno atrašanās vietu. Tev vajadzēs pašam tos manuāli pārvietot vajadzības gadījumā.", + "MessageEnablingOptionLongerScans": "Šīs opcijas iespējošana var izraisīt krienti ilgākas krātuves skenēšanas.", + "HeaderPerformance": "Veiktspēja", + "LabelDummyChapterDurationHelp": "Nodaļas attēla ekstrakcijas intervāls sekundēs.", + "LabelDummyChapterCountHelp": "Maksimālais nodaļu attēlu skaits, kas tiks ekstraktēts no katra multivides faila.", + "LabelChapterImageResolutionHelp": "Ekstraktēto attēlu izšķirtspēja.", + "LabelParallelImageEncodingLimit": "Paralēlas attēlu kodēšanas limits", + "LabelParallelImageEncodingLimitHelp": "Maksimālais daudzums ar attēlu kodēšanas procesiem, kas drīkst darboties vienlaicīgi. Iestatot šo uz 0, limits automātiski tiks izvēlēts balstoties uz jūsu sistēmas specifikācijām.", + "HeaderDummyChapter": "Nodaļu Attēli", + "EnableCardLayout": "Padarīt redzamu CardBox" }