mirror of
https://github.com/nimbold/Firelink.git
synced 2026-08-10 19:47:42 +00:00
feat(torrents): harden network identity settings
This commit is contained in:
@@ -11,4 +11,4 @@ import type { SiteLogin } from "./SiteLogin";
|
||||
import type { Theme } from "./Theme";
|
||||
import type { WindowControlStyle } from "./WindowControlStyle";
|
||||
|
||||
export type PersistedSettings = { theme: Theme, fontFamily: FontFamily, windowControlStyle: WindowControlStyle, calendarPreference: CalendarPreference, language: string, baseDownloadFolder: string, categorySubfoldersEnabled: boolean, categorySubfolders: { [key in string]: string }, categoryDirectoryOverrides: { [key in string]: string }, approvedDownloadRoots: Array<string>, maxConcurrentDownloads: number, globalSpeedLimit: string, speedLimitPresetValues: Array<number>, logsEnabled: boolean, isSidebarVisible: boolean, sidebarPosition: string, activeSettingsTab: SettingsTab, scheduler: SchedulerSettings, schedulerRunning: boolean, schedulerActiveDownloadIds: Array<string>, schedulerLastStartKey: string, schedulerLastStopKey: string, lastCustomSpeedLimitKiB: number, lastCustomSpeedLimitUnit: string, perServerConnections: number, maxAutomaticRetries: number, showNotifications: boolean, playCompletionSound: boolean, autoAddClipboardLinks: boolean, appFontSize: AppFontSize, listRowDensity: ListRowDensity, showDockBadge: boolean, showMenuBarIcon: boolean, proxyMode: ProxyMode, proxyHost: string, proxyPort: number, torrentEnableDht: boolean, torrentEnableDht6: boolean, torrentEnablePex: boolean, torrentEnableLpd: boolean, torrentMaxOpenFiles: number, customUserAgent: string, askWhereToSaveEachFile: boolean, rememberLastUsedDownloadDirectory: boolean, preventsSleepWhileDownloading: boolean, preventsDisplaySleepWhileDownloading: boolean, mediaCookieSource: MediaCookieSource, siteLogins: Array<SiteLogin>, autoCheckUpdates: boolean, keychainAccessGranted: boolean, };
|
||||
export type PersistedSettings = { theme: Theme, fontFamily: FontFamily, windowControlStyle: WindowControlStyle, calendarPreference: CalendarPreference, language: string, baseDownloadFolder: string, categorySubfoldersEnabled: boolean, categorySubfolders: { [key in string]: string }, categoryDirectoryOverrides: { [key in string]: string }, approvedDownloadRoots: Array<string>, maxConcurrentDownloads: number, globalSpeedLimit: string, speedLimitPresetValues: Array<number>, logsEnabled: boolean, isSidebarVisible: boolean, sidebarPosition: string, activeSettingsTab: SettingsTab, scheduler: SchedulerSettings, schedulerRunning: boolean, schedulerActiveDownloadIds: Array<string>, schedulerLastStartKey: string, schedulerLastStopKey: string, lastCustomSpeedLimitKiB: number, lastCustomSpeedLimitUnit: string, perServerConnections: number, maxAutomaticRetries: number, showNotifications: boolean, playCompletionSound: boolean, autoAddClipboardLinks: boolean, appFontSize: AppFontSize, listRowDensity: ListRowDensity, showDockBadge: boolean, showMenuBarIcon: boolean, proxyMode: ProxyMode, proxyHost: string, proxyPort: number, torrentEnableDht: boolean, torrentEnableDht6: boolean, torrentEnablePex: boolean, torrentEnableLpd: boolean, torrentMaxOpenFiles: number, torrentListenPort: string, torrentDhtListenPort: string, torrentExternalIp: string, torrentDhtEntryPoint: string, torrentDhtEntryPoint6: string, torrentDhtListenAddr6: string, torrentLpdInterface: string, torrentPeerIdPrefix: string, torrentPeerAgent: string, customUserAgent: string, askWhereToSaveEachFile: boolean, rememberLastUsedDownloadDirectory: boolean, preventsSleepWhileDownloading: boolean, preventsDisplaySleepWhileDownloading: boolean, mediaCookieSource: MediaCookieSource, siteLogins: Array<SiteLogin>, autoCheckUpdates: boolean, keychainAccessGranted: boolean, };
|
||||
|
||||
@@ -1241,6 +1241,141 @@ runEngineChecks(false);
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h2 className="settings-section-title">{t($ => $.settings.network.torrentNetwork)}</h2>
|
||||
<div className="mac-settings-group">
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentListenPort)}</span>
|
||||
<small>{t($ => $.settings.network.torrentListenPortDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentListenPort}
|
||||
onChange={(event) => settings.setTorrentListenPort(event.target.value)}
|
||||
placeholder="6881-6999"
|
||||
className="app-control settings-port-input text-center"
|
||||
aria-label={t($ => $.settings.network.torrentListenPort)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentDhtListenPort)}</span>
|
||||
<small>{t($ => $.settings.network.torrentDhtListenPortDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentDhtListenPort}
|
||||
onChange={(event) => settings.setTorrentDhtListenPort(event.target.value)}
|
||||
placeholder="6881-6999"
|
||||
className="app-control settings-port-input text-center"
|
||||
aria-label={t($ => $.settings.network.torrentDhtListenPort)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentExternalIp)}</span>
|
||||
<small>{t($ => $.settings.network.torrentExternalIpDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentExternalIp}
|
||||
onChange={(event) => settings.setTorrentExternalIp(event.target.value)}
|
||||
placeholder={t($ => $.settings.network.torrentExternalIpPlaceholder)}
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentExternalIp)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentDhtEntryPoint)}</span>
|
||||
<small>{t($ => $.settings.network.torrentDhtEntryPointDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentDhtEntryPoint}
|
||||
onChange={(event) => settings.setTorrentDhtEntryPoint(event.target.value)}
|
||||
placeholder="router.example:6881"
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentDhtEntryPoint)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentDhtEntryPoint6)}</span>
|
||||
<small>{t($ => $.settings.network.torrentDhtEntryPoint6Description)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentDhtEntryPoint6}
|
||||
onChange={(event) => settings.setTorrentDhtEntryPoint6(event.target.value)}
|
||||
placeholder="[2001:db8::1]:6881"
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentDhtEntryPoint6)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentDhtListenAddr6)}</span>
|
||||
<small>{t($ => $.settings.network.torrentDhtListenAddr6Description)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentDhtListenAddr6}
|
||||
onChange={(event) => settings.setTorrentDhtListenAddr6(event.target.value)}
|
||||
placeholder="2001:db8::2"
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentDhtListenAddr6)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentLpdInterface)}</span>
|
||||
<small>{t($ => $.settings.network.torrentLpdInterfaceDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentLpdInterface}
|
||||
onChange={(event) => settings.setTorrentLpdInterface(event.target.value)}
|
||||
placeholder="en0"
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentLpdInterface)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentPeerIdPrefix)}</span>
|
||||
<small>{t($ => $.settings.network.torrentPeerIdPrefixDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentPeerIdPrefix}
|
||||
onChange={(event) => settings.setTorrentPeerIdPrefix(event.target.value)}
|
||||
placeholder="-FL-1-3-1-"
|
||||
maxLength={20}
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentPeerIdPrefix)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
<div className="settings-row-label">
|
||||
<span>{t($ => $.settings.network.torrentPeerAgent)}</span>
|
||||
<small>{t($ => $.settings.network.torrentPeerAgentDescription)}</small>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={settings.torrentPeerAgent}
|
||||
onChange={(event) => settings.setTorrentPeerAgent(event.target.value)}
|
||||
placeholder="Firelink/1.3.1"
|
||||
maxLength={128}
|
||||
className="app-control settings-network-input"
|
||||
aria-label={t($ => $.settings.network.torrentPeerAgent)}
|
||||
/>
|
||||
</div>
|
||||
<p className="settings-group-footer">
|
||||
{t($ => $.settings.network.torrentNetworkRestartNote)}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h2 className="settings-section-title">{t($ => $.settings.network.torrentResourceLimits)}</h2>
|
||||
<div className="mac-settings-group">
|
||||
<div className="mac-settings-row settings-network-row">
|
||||
|
||||
@@ -799,6 +799,27 @@ const common = {
|
||||
torrentLpd: 'Local Peer Discovery (LPD)',
|
||||
torrentLpdDescription: 'Discover compatible peers on the local network. This increases local network visibility.',
|
||||
torrentPeerDiscoveryRestartNote: 'These options are global to Aria2 and take effect after Firelink restarts. Aria2 still disables peer discovery for private torrents.',
|
||||
torrentNetwork: 'BitTorrent network binding',
|
||||
torrentListenPort: 'TCP peer ports',
|
||||
torrentListenPortDescription: 'TCP ports for incoming BitTorrent peer connections. Leave blank for Aria2’s default range.',
|
||||
torrentDhtListenPort: 'UDP/DHT ports',
|
||||
torrentDhtListenPortDescription: 'UDP ports for DHT and UDP trackers. Leave blank for Aria2’s default range.',
|
||||
torrentExternalIp: 'External IP address',
|
||||
torrentExternalIpDescription: 'Address announced to peers and trackers when the host is behind NAT. Leave blank unless you know the reachable address.',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'IPv4 DHT entry point',
|
||||
torrentDhtEntryPointDescription: 'Optional bootstrap host and port, for example router.example:6881.',
|
||||
torrentDhtEntryPoint6: 'IPv6 DHT entry point',
|
||||
torrentDhtEntryPoint6Description: 'Optional IPv6 bootstrap address and port in bracketed form, for example [2001:db8::1]:6881.',
|
||||
torrentDhtListenAddr6: 'IPv6 DHT listen address',
|
||||
torrentDhtListenAddr6Description: 'IPv6 address for the DHT socket. Leave blank to let Aria2 choose.',
|
||||
torrentLpdInterface: 'LPD interface',
|
||||
torrentLpdInterfaceDescription: 'Network interface name or address used for Local Peer Discovery. Leave blank for the default interface.',
|
||||
torrentPeerIdPrefix: 'Peer ID prefix',
|
||||
torrentPeerIdPrefixDescription: 'Overrides the BitTorrent peer-ID prefix. Use only if you understand the privacy and protocol-identity impact; leave blank for Aria2’s default.',
|
||||
torrentPeerAgent: 'Peer agent',
|
||||
torrentPeerAgentDescription: 'Overrides the client string sent in the BitTorrent extended handshake. This changes protocol identity and may affect compatibility; leave blank for Aria2’s default.',
|
||||
torrentNetworkRestartNote: 'These settings are launch-scoped and apply after Firelink restarts. Opening ports may require router port forwarding and an operating-system firewall rule; availability depends on the platform and network.',
|
||||
torrentResourceLimits: 'BitTorrent resource limits',
|
||||
torrentMaxOpenFiles: 'Maximum open Torrent files',
|
||||
torrentMaxOpenFilesDescription: 'Global Aria2 limit for files open at once in multi-file Torrents. Lower values reduce file-descriptor use; the default is 100. Changes apply to new Torrents without restarting Aria2, and this does not raise your operating system limit.',
|
||||
|
||||
@@ -799,6 +799,27 @@ const fa = {
|
||||
torrentLpd: 'کشف همتای محلی (LPD)',
|
||||
torrentLpdDescription: 'همتاهای سازگار در شبکه محلی را پیدا میکند و دیدهشدن ترافیک در شبکه محلی را افزایش میدهد.',
|
||||
torrentPeerDiscoveryRestartNote: 'این گزینهها سراسری و مربوط به Aria2 هستند و پس از راهاندازی مجدد Firelink اعمال میشوند. Aria2 همچنان کشف همتا را برای تورنتهای خصوصی خاموش میکند.',
|
||||
torrentNetwork: 'اتصال شبکه بیتتورنت',
|
||||
torrentListenPort: 'پورتهای همتای TCP',
|
||||
torrentListenPortDescription: 'پورتهای TCP برای اتصالهای ورودی همتاهای بیتتورنت. برای محدوده پیشفرض Aria2 خالی بگذارید.',
|
||||
torrentDhtListenPort: 'پورتهای UDP/DHT',
|
||||
torrentDhtListenPortDescription: 'پورتهای UDP برای DHT و ترکرهای UDP. برای محدوده پیشفرض Aria2 خالی بگذارید.',
|
||||
torrentExternalIp: 'آدرس IP خارجی',
|
||||
torrentExternalIpDescription: 'آدرسی که هنگام قرار گرفتن میزبان پشت NAT به همتاها و ترکرها اعلام میشود. مگر از آدرس قابل دسترس مطمئن باشید، خالی بگذارید.',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'نقطه ورود DHT نسخه IPv4',
|
||||
torrentDhtEntryPointDescription: 'میزبان و پورت اختیاری برای شروع DHT؛ مانند router.example:6881.',
|
||||
torrentDhtEntryPoint6: 'نقطه ورود DHT نسخه IPv6',
|
||||
torrentDhtEntryPoint6Description: 'آدرس و پورت اختیاری IPv6 برای شروع؛ مانند [2001:db8::1]:6881.',
|
||||
torrentDhtListenAddr6: 'آدرس شنود DHT نسخه IPv6',
|
||||
torrentDhtListenAddr6Description: 'آدرس IPv6 سوکت DHT. برای انتخاب خودکار توسط Aria2 خالی بگذارید.',
|
||||
torrentLpdInterface: 'رابط LPD',
|
||||
torrentLpdInterfaceDescription: 'نام رابط شبکه یا آدرس مورد استفاده برای کشف همتای محلی. برای رابط پیشفرض خالی بگذارید.',
|
||||
torrentPeerIdPrefix: 'پیشوند شناسه همتا',
|
||||
torrentPeerIdPrefixDescription: 'پیشوند شناسه همتای بیتتورنت را تغییر میدهد. فقط در صورت آگاهی از پیامدهای حریم خصوصی و هویت پروتکل استفاده کنید؛ برای پیشفرض Aria2 خالی بگذارید.',
|
||||
torrentPeerAgent: 'عامل همتا',
|
||||
torrentPeerAgentDescription: 'رشته کلاینت ارسالشده در دستدهی توسعهیافته بیتتورنت را تغییر میدهد. این کار هویت پروتکل را تغییر میدهد و ممکن است بر سازگاری اثر بگذارد؛ برای پیشفرض Aria2 خالی بگذارید.',
|
||||
torrentNetworkRestartNote: 'این تنظیمات هنگام راهاندازی اعمال میشوند و پس از راهاندازی مجدد Firelink اثر میکنند. باز کردن پورتها ممکن است به port forwarding روتر و قانون فایروال سیستمعامل نیاز داشته باشد؛ دسترسی به آنها به سیستمعامل و شبکه بستگی دارد.',
|
||||
torrentResourceLimits: 'محدودیت منابع بیتتورنت',
|
||||
torrentMaxOpenFiles: 'حداکثر فایلهای باز تورنت',
|
||||
torrentMaxOpenFilesDescription: 'حداکثر سراسری Aria2 برای تعداد فایلهای همزمان باز در تورنتهای چندفایلی. مقدار کمتر مصرف file descriptor را کم میکند؛ پیشفرض ۱۰۰ است. تغییرات برای تورنتهای جدید و بدون راهاندازی مجدد Aria2 اعمال میشوند و محدودیت سیستمعامل را افزایش نمیدهند.',
|
||||
|
||||
@@ -799,6 +799,27 @@ const he = {
|
||||
torrentLpd: 'גילוי עמיתים מקומיים (LPD)',
|
||||
torrentLpdDescription: 'מאתר עמיתים תואמים ברשת המקומית ומגדיל את החשיפה המקומית של התעבורה.',
|
||||
torrentPeerDiscoveryRestartNote: 'האפשרויות האלה הן כלליות ל-Aria2 ונכנסות לתוקף לאחר הפעלה מחדש של Firelink. Aria2 עדיין משבית גילוי עמיתים בטורנטים פרטיים.',
|
||||
torrentNetwork: 'קישור רשת BitTorrent',
|
||||
torrentListenPort: 'יציאות עמיתי TCP',
|
||||
torrentListenPortDescription: 'יציאות TCP לחיבורי עמיתים נכנסים של BitTorrent. השאר ריק כדי להשתמש בטווח ברירת המחדל של Aria2.',
|
||||
torrentDhtListenPort: 'יציאות UDP/DHT',
|
||||
torrentDhtListenPortDescription: 'יציאות UDP עבור DHT ועוקבי UDP. השאר ריק כדי להשתמש בטווח ברירת המחדל של Aria2.',
|
||||
torrentExternalIp: 'כתובת IP חיצונית',
|
||||
torrentExternalIpDescription: 'הכתובת שמוכרזת לעמיתים ולעוקבים כשהמחשב מאחורי NAT. השאר ריק אלא אם ידועה לך הכתובת הנגישה.',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'נקודת כניסה ל-DHT IPv4',
|
||||
torrentDhtEntryPointDescription: 'מארח ויציאה אופציונליים לאתחול, לדוגמה router.example:6881.',
|
||||
torrentDhtEntryPoint6: 'נקודת כניסה ל-DHT IPv6',
|
||||
torrentDhtEntryPoint6Description: 'כתובת ויציאת IPv6 אופציונליות לאתחול בסוגריים, לדוגמה [2001:db8::1]:6881.',
|
||||
torrentDhtListenAddr6: 'כתובת האזנה ל-DHT IPv6',
|
||||
torrentDhtListenAddr6Description: 'כתובת IPv6 לשקע DHT. השאר ריק כדי לאפשר ל-Aria2 לבחור.',
|
||||
torrentLpdInterface: 'ממשק LPD',
|
||||
torrentLpdInterfaceDescription: 'שם ממשק הרשת או כתובת עבור גילוי עמיתים מקומי. השאר ריק כדי להשתמש בממשק ברירת המחדל.',
|
||||
torrentPeerIdPrefix: 'קידומת מזהה עמית',
|
||||
torrentPeerIdPrefixDescription: 'עוקף את קידומת מזהה העמית של BitTorrent. השתמש רק אם ברורות לך השלכות הפרטיות וזהות הפרוטוקול; השאר ריק עבור ברירת המחדל של Aria2.',
|
||||
torrentPeerAgent: 'סוכן עמית',
|
||||
torrentPeerAgentDescription: 'עוקף את מחרוזת הלקוח שנשלחת בלחיצת היד המורחבת של BitTorrent. הדבר משנה את זהות הפרוטוקול ועלול להשפיע על תאימות; השאר ריק עבור ברירת המחדל של Aria2.',
|
||||
torrentNetworkRestartNote: 'הגדרות אלה חלות בעת הפעלת המנוע ונכנסות לתוקף לאחר הפעלה מחדש של Firelink. פתיחת יציאות עשויה לדרוש העברת יציאות בנתב וכלל בחומת האש של מערכת ההפעלה; הזמינות תלויה בפלטפורמה וברשת.',
|
||||
torrentResourceLimits: 'מגבלות משאבי BitTorrent',
|
||||
torrentMaxOpenFiles: 'מספר קובצי Torrent פתוחים מרבי',
|
||||
torrentMaxOpenFilesDescription: 'מגבלה כללית של Aria2 על מספר הקבצים הפתוחים בו-זמנית בטורנטים מרובי קבצים. ערך נמוך יותר מפחית שימוש ב-file descriptors; ברירת המחדל היא 100. השינויים חלים על טורנטים חדשים ללא הפעלה מחדש של Aria2, ואינם מגדילים את מגבלת מערכת ההפעלה.',
|
||||
|
||||
@@ -799,6 +799,27 @@ const ru = {
|
||||
torrentLpd: 'Локальное обнаружение пиров (LPD)',
|
||||
torrentLpdDescription: 'Ищет подходящие пиры в локальной сети и увеличивает видимость трафика в ней.',
|
||||
torrentPeerDiscoveryRestartNote: 'Эти параметры являются глобальными для Aria2 и применяются после перезапуска Firelink. Aria2 по-прежнему отключает обнаружение пиров для приватных торрентов.',
|
||||
torrentNetwork: 'Сетевые параметры BitTorrent',
|
||||
torrentListenPort: 'TCP-порты пиров',
|
||||
torrentListenPortDescription: 'TCP-порты для входящих соединений BitTorrent. Оставьте пустым, чтобы использовать диапазон Aria2 по умолчанию.',
|
||||
torrentDhtListenPort: 'Порты UDP/DHT',
|
||||
torrentDhtListenPortDescription: 'UDP-порты для DHT и UDP-трекеров. Оставьте пустым, чтобы использовать диапазон Aria2 по умолчанию.',
|
||||
torrentExternalIp: 'Внешний IP-адрес',
|
||||
torrentExternalIpDescription: 'Адрес, объявляемый пирам и трекерам, если хост находится за NAT. Оставьте пустым, если не уверены в доступном адресе.',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'Точка входа IPv4 DHT',
|
||||
torrentDhtEntryPointDescription: 'Необязательные хост и порт для начальной загрузки, например router.example:6881.',
|
||||
torrentDhtEntryPoint6: 'Точка входа IPv6 DHT',
|
||||
torrentDhtEntryPoint6Description: 'Необязательные адрес и порт IPv6 в скобках, например [2001:db8::1]:6881.',
|
||||
torrentDhtListenAddr6: 'Адрес прослушивания IPv6 DHT',
|
||||
torrentDhtListenAddr6Description: 'Адрес IPv6 для сокета DHT. Оставьте пустым, чтобы Aria2 выбрала его автоматически.',
|
||||
torrentLpdInterface: 'Интерфейс LPD',
|
||||
torrentLpdInterfaceDescription: 'Имя сетевого интерфейса или адрес для поиска локальных пиров. Оставьте пустым для интерфейса по умолчанию.',
|
||||
torrentPeerIdPrefix: 'Префикс ID пира',
|
||||
torrentPeerIdPrefixDescription: 'Переопределяет префикс ID пира BitTorrent. Используйте только понимая последствия для приватности и идентичности протокола; оставьте пустым для значения Aria2 по умолчанию.',
|
||||
torrentPeerAgent: 'Агент пира',
|
||||
torrentPeerAgentDescription: 'Переопределяет строку клиента в расширенном рукопожатии BitTorrent. Это меняет идентичность протокола и может повлиять на совместимость; оставьте пустым для значения Aria2 по умолчанию.',
|
||||
torrentNetworkRestartNote: 'Эти параметры применяются при запуске и вступают в силу после перезапуска Firelink. Для открытия портов могут потребоваться перенаправление портов на маршрутизаторе и правило системного брандмауэра; доступность зависит от платформы и сети.',
|
||||
torrentResourceLimits: 'Ограничения ресурсов BitTorrent',
|
||||
torrentMaxOpenFiles: 'Максимум открытых файлов Torrent',
|
||||
torrentMaxOpenFilesDescription: 'Глобальный лимит Aria2 на одновременно открытые файлы в многофайловых торрентах. Меньшие значения снижают расход дескрипторов; по умолчанию 100. Изменения применяются к новым торрентам без перезапуска Aria2 и не повышают лимит операционной системы.',
|
||||
|
||||
@@ -799,6 +799,27 @@ const uk = {
|
||||
torrentLpd: 'Локальний пошук пірів (LPD)',
|
||||
torrentLpdDescription: 'Шукає сумісних пірів у локальній мережі та збільшує видимість трафіку в ній.',
|
||||
torrentPeerDiscoveryRestartNote: 'Ці параметри є глобальними для Aria2 і застосовуються після перезапуску Firelink. Aria2 і надалі вимикає пошук пірів для приватних торрентів.',
|
||||
torrentNetwork: 'Мережеві параметри BitTorrent',
|
||||
torrentListenPort: 'TCP-порти пірів',
|
||||
torrentListenPortDescription: 'TCP-порти для вхідних з’єднань BitTorrent. Залиште порожнім, щоб використати типовий діапазон Aria2.',
|
||||
torrentDhtListenPort: 'Порти UDP/DHT',
|
||||
torrentDhtListenPortDescription: 'UDP-порти для DHT і UDP-трекерів. Залиште порожнім, щоб використати типовий діапазон Aria2.',
|
||||
torrentExternalIp: 'Зовнішня IP-адреса',
|
||||
torrentExternalIpDescription: 'Адреса, яку оголошують пірам і трекерам, коли хост перебуває за NAT. Залиште порожнім, якщо не знаєте доступну адресу.',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'Точка входу IPv4 DHT',
|
||||
torrentDhtEntryPointDescription: 'Необов’язкові хост і порт для початкового підключення, наприклад router.example:6881.',
|
||||
torrentDhtEntryPoint6: 'Точка входу IPv6 DHT',
|
||||
torrentDhtEntryPoint6Description: 'Необов’язкові адреса й порт IPv6 у дужках, наприклад [2001:db8::1]:6881.',
|
||||
torrentDhtListenAddr6: 'Адреса прослуховування IPv6 DHT',
|
||||
torrentDhtListenAddr6Description: 'IPv6-адреса для сокета DHT. Залиште порожнім, щоб Aria2 вибрала її автоматично.',
|
||||
torrentLpdInterface: 'Інтерфейс LPD',
|
||||
torrentLpdInterfaceDescription: 'Назва мережевого інтерфейсу або адреса для пошуку локальних пірів. Залиште порожнім для типового інтерфейсу.',
|
||||
torrentPeerIdPrefix: 'Префікс ID піра',
|
||||
torrentPeerIdPrefixDescription: 'Перевизначає префікс ID піра BitTorrent. Використовуйте лише з розумінням наслідків для приватності та ідентичності протоколу; залиште порожнім для типового значення Aria2.',
|
||||
torrentPeerAgent: 'Агент піра',
|
||||
torrentPeerAgentDescription: 'Перевизначає рядок клієнта в розширеному рукостисканні BitTorrent. Це змінює ідентичність протоколу й може вплинути на сумісність; залиште порожнім для типового значення Aria2.',
|
||||
torrentNetworkRestartNote: 'Ці параметри застосовуються під час запуску й набувають чинності після перезапуску Firelink. Для відкриття портів можуть знадобитися перенаправлення портів на маршрутизаторі та правило брандмауера ОС; доступність залежить від платформи й мережі.',
|
||||
torrentResourceLimits: 'Обмеження ресурсів BitTorrent',
|
||||
torrentMaxOpenFiles: 'Максимум відкритих файлів Torrent',
|
||||
torrentMaxOpenFilesDescription: 'Глобальне обмеження Aria2 на одночасно відкриті файли в багатофайлових торрентах. Менші значення зменшують використання дескрипторів; типове значення — 100. Зміни застосовуються до нових торрентів без перезапуску Aria2 і не підвищують обмеження операційної системи.',
|
||||
|
||||
@@ -799,6 +799,27 @@ const zhCN = {
|
||||
torrentLpd: '本地节点发现(LPD)',
|
||||
torrentLpdDescription: '在本地网络中发现兼容节点,这会增加本地网络中的流量可见性。',
|
||||
torrentPeerDiscoveryRestartNote: '这些选项是 Aria2 的全局设置,需要重启 Firelink 后生效。Aria2 仍会对私有 Torrent 禁用节点发现。',
|
||||
torrentNetwork: 'BitTorrent 网络绑定',
|
||||
torrentListenPort: 'TCP 节点端口',
|
||||
torrentListenPortDescription: '用于传入 BitTorrent 节点连接的 TCP 端口。留空以使用 Aria2 的默认范围。',
|
||||
torrentDhtListenPort: 'UDP/DHT 端口',
|
||||
torrentDhtListenPortDescription: '用于 DHT 和 UDP 跟踪器的 UDP 端口。留空以使用 Aria2 的默认范围。',
|
||||
torrentExternalIp: '外部 IP 地址',
|
||||
torrentExternalIpDescription: '主机位于 NAT 后时向节点和跟踪器公布的地址。如果不确定可访问地址,请留空。',
|
||||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||||
torrentDhtEntryPoint: 'IPv4 DHT 入口',
|
||||
torrentDhtEntryPointDescription: '可选的引导主机和端口,例如 router.example:6881。',
|
||||
torrentDhtEntryPoint6: 'IPv6 DHT 入口',
|
||||
torrentDhtEntryPoint6Description: '可选的 IPv6 引导地址和端口,请使用方括号格式,例如 [2001:db8::1]:6881。',
|
||||
torrentDhtListenAddr6: 'IPv6 DHT 监听地址',
|
||||
torrentDhtListenAddr6Description: 'DHT 套接字使用的 IPv6 地址。留空以让 Aria2 自动选择。',
|
||||
torrentLpdInterface: 'LPD 接口',
|
||||
torrentLpdInterfaceDescription: '用于本地节点发现的网络接口名称或地址。留空以使用默认接口。',
|
||||
torrentPeerIdPrefix: '节点 ID 前缀',
|
||||
torrentPeerIdPrefixDescription: '覆盖 BitTorrent 节点 ID 前缀。只有了解其隐私和协议身份影响时才应修改;留空以使用 Aria2 默认值。',
|
||||
torrentPeerAgent: '节点代理标识',
|
||||
torrentPeerAgentDescription: '覆盖 BitTorrent 扩展握手中发送的客户端字符串。这会改变协议身份并可能影响兼容性;留空以使用 Aria2 默认值。',
|
||||
torrentNetworkRestartNote: '这些设置在启动时应用,并在重启 Firelink 后生效。开放端口可能需要路由器端口转发和操作系统防火墙规则;可用性取决于平台和网络。',
|
||||
torrentResourceLimits: 'BitTorrent 资源限制',
|
||||
torrentMaxOpenFiles: 'Torrent 最大打开文件数',
|
||||
torrentMaxOpenFilesDescription: 'Aria2 对多文件 Torrent 同时打开文件数的全局限制。较低的值可减少文件描述符占用;默认值为 100。修改会在不重启 Aria2 的情况下应用于新 Torrent,且不会提高操作系统的限制。',
|
||||
|
||||
@@ -111,6 +111,7 @@ describe('translation catalogs', () => {
|
||||
'settings.network.firefoxWindows',
|
||||
'settings.network.firefoxMacos',
|
||||
'settings.network.safariMacos',
|
||||
'settings.network.torrentExternalIpPlaceholder',
|
||||
]);
|
||||
|
||||
const unexpectedDuplicates = duplicates
|
||||
|
||||
@@ -246,6 +246,15 @@ export interface SettingsState {
|
||||
torrentEnablePex: boolean;
|
||||
torrentEnableLpd: boolean;
|
||||
torrentMaxOpenFiles: number;
|
||||
torrentListenPort: string;
|
||||
torrentDhtListenPort: string;
|
||||
torrentExternalIp: string;
|
||||
torrentDhtEntryPoint: string;
|
||||
torrentDhtEntryPoint6: string;
|
||||
torrentDhtListenAddr6: string;
|
||||
torrentLpdInterface: string;
|
||||
torrentPeerIdPrefix: string;
|
||||
torrentPeerAgent: string;
|
||||
customUserAgent: string;
|
||||
askWhereToSaveEachFile: boolean;
|
||||
preventsSleepWhileDownloading: boolean;
|
||||
@@ -301,6 +310,15 @@ export interface SettingsState {
|
||||
setTorrentEnablePex: (enabled: boolean) => void;
|
||||
setTorrentEnableLpd: (enabled: boolean) => void;
|
||||
setTorrentMaxOpenFiles: (value: number) => Promise<void>;
|
||||
setTorrentListenPort: (value: string) => void;
|
||||
setTorrentDhtListenPort: (value: string) => void;
|
||||
setTorrentExternalIp: (value: string) => void;
|
||||
setTorrentDhtEntryPoint: (value: string) => void;
|
||||
setTorrentDhtEntryPoint6: (value: string) => void;
|
||||
setTorrentDhtListenAddr6: (value: string) => void;
|
||||
setTorrentLpdInterface: (value: string) => void;
|
||||
setTorrentPeerIdPrefix: (value: string) => void;
|
||||
setTorrentPeerAgent: (value: string) => void;
|
||||
setCustomUserAgent: (userAgent: string) => void;
|
||||
setAskWhereToSaveEachFile: (ask: boolean) => void;
|
||||
setPreventsSleepWhileDownloading: (prevent: boolean) => void;
|
||||
@@ -382,6 +400,15 @@ export const useSettingsStore = create<SettingsState>()(
|
||||
torrentEnablePex: true,
|
||||
torrentEnableLpd: false,
|
||||
torrentMaxOpenFiles: DEFAULT_TORRENT_MAX_OPEN_FILES,
|
||||
torrentListenPort: '',
|
||||
torrentDhtListenPort: '',
|
||||
torrentExternalIp: '',
|
||||
torrentDhtEntryPoint: '',
|
||||
torrentDhtEntryPoint6: '',
|
||||
torrentDhtListenAddr6: '',
|
||||
torrentLpdInterface: '',
|
||||
torrentPeerIdPrefix: '',
|
||||
torrentPeerAgent: '',
|
||||
customUserAgent: '',
|
||||
askWhereToSaveEachFile: false,
|
||||
preventsSleepWhileDownloading: true,
|
||||
@@ -480,6 +507,15 @@ export const useSettingsStore = create<SettingsState>()(
|
||||
setTorrentEnableDht6: (torrentEnableDht6) => set({ torrentEnableDht6 }),
|
||||
setTorrentEnablePex: (torrentEnablePex) => set({ torrentEnablePex }),
|
||||
setTorrentEnableLpd: (torrentEnableLpd) => set({ torrentEnableLpd }),
|
||||
setTorrentListenPort: (torrentListenPort) => set({ torrentListenPort }),
|
||||
setTorrentDhtListenPort: (torrentDhtListenPort) => set({ torrentDhtListenPort }),
|
||||
setTorrentExternalIp: (torrentExternalIp) => set({ torrentExternalIp }),
|
||||
setTorrentDhtEntryPoint: (torrentDhtEntryPoint) => set({ torrentDhtEntryPoint }),
|
||||
setTorrentDhtEntryPoint6: (torrentDhtEntryPoint6) => set({ torrentDhtEntryPoint6 }),
|
||||
setTorrentDhtListenAddr6: (torrentDhtListenAddr6) => set({ torrentDhtListenAddr6 }),
|
||||
setTorrentLpdInterface: (torrentLpdInterface) => set({ torrentLpdInterface }),
|
||||
setTorrentPeerIdPrefix: (torrentPeerIdPrefix) => set({ torrentPeerIdPrefix }),
|
||||
setTorrentPeerAgent: (torrentPeerAgent) => set({ torrentPeerAgent }),
|
||||
setTorrentMaxOpenFiles: (value) => {
|
||||
const normalized = normalizeTorrentMaxOpenFiles(value);
|
||||
if (normalized === undefined) {
|
||||
@@ -682,6 +718,15 @@ export const useSettingsStore = create<SettingsState>()(
|
||||
torrentEnablePex: state.torrentEnablePex,
|
||||
torrentEnableLpd: state.torrentEnableLpd,
|
||||
torrentMaxOpenFiles: state.torrentMaxOpenFiles,
|
||||
torrentListenPort: state.torrentListenPort,
|
||||
torrentDhtListenPort: state.torrentDhtListenPort,
|
||||
torrentExternalIp: state.torrentExternalIp,
|
||||
torrentDhtEntryPoint: state.torrentDhtEntryPoint,
|
||||
torrentDhtEntryPoint6: state.torrentDhtEntryPoint6,
|
||||
torrentDhtListenAddr6: state.torrentDhtListenAddr6,
|
||||
torrentLpdInterface: state.torrentLpdInterface,
|
||||
torrentPeerIdPrefix: state.torrentPeerIdPrefix,
|
||||
torrentPeerAgent: state.torrentPeerAgent,
|
||||
customUserAgent: state.customUserAgent,
|
||||
askWhereToSaveEachFile: state.askWhereToSaveEachFile,
|
||||
preventsSleepWhileDownloading: state.preventsSleepWhileDownloading,
|
||||
@@ -733,6 +778,33 @@ export const useSettingsStore = create<SettingsState>()(
|
||||
torrentEnableLpd: persistedBoolean(persisted.torrentEnableLpd, currentState.torrentEnableLpd),
|
||||
torrentMaxOpenFiles: normalizeTorrentMaxOpenFiles(persisted.torrentMaxOpenFiles)
|
||||
?? currentState.torrentMaxOpenFiles,
|
||||
torrentListenPort: typeof persisted.torrentListenPort === 'string'
|
||||
? persisted.torrentListenPort
|
||||
: currentState.torrentListenPort,
|
||||
torrentDhtListenPort: typeof persisted.torrentDhtListenPort === 'string'
|
||||
? persisted.torrentDhtListenPort
|
||||
: currentState.torrentDhtListenPort,
|
||||
torrentExternalIp: typeof persisted.torrentExternalIp === 'string'
|
||||
? persisted.torrentExternalIp
|
||||
: currentState.torrentExternalIp,
|
||||
torrentDhtEntryPoint: typeof persisted.torrentDhtEntryPoint === 'string'
|
||||
? persisted.torrentDhtEntryPoint
|
||||
: currentState.torrentDhtEntryPoint,
|
||||
torrentDhtEntryPoint6: typeof persisted.torrentDhtEntryPoint6 === 'string'
|
||||
? persisted.torrentDhtEntryPoint6
|
||||
: currentState.torrentDhtEntryPoint6,
|
||||
torrentDhtListenAddr6: typeof persisted.torrentDhtListenAddr6 === 'string'
|
||||
? persisted.torrentDhtListenAddr6
|
||||
: currentState.torrentDhtListenAddr6,
|
||||
torrentLpdInterface: typeof persisted.torrentLpdInterface === 'string'
|
||||
? persisted.torrentLpdInterface
|
||||
: currentState.torrentLpdInterface,
|
||||
torrentPeerIdPrefix: typeof persisted.torrentPeerIdPrefix === 'string'
|
||||
? persisted.torrentPeerIdPrefix
|
||||
: currentState.torrentPeerIdPrefix,
|
||||
torrentPeerAgent: typeof persisted.torrentPeerAgent === 'string'
|
||||
? persisted.torrentPeerAgent
|
||||
: currentState.torrentPeerAgent,
|
||||
sidebarPosition: isAllowedSetting(SIDEBAR_POSITION_VALUES, persisted.sidebarPosition)
|
||||
? persisted.sidebarPosition
|
||||
: currentState.sidebarPosition,
|
||||
|
||||
Reference in New Issue
Block a user